local mod = StarTip:NewModule("Fade", "AceHook-3.0") mod.name = "Fade" local _G = _G local GameTooltip = _G.GameTooltip local StarTip = _G.StarTip local UnitExists = _G.UnitExists local self = mod local L = StarTip.L local defaults = { profile = { unitFrames = 2, otherFrames = 1, units = 2, objects = 2, } } local choices = { "Hide", "Fade out" } local get = function(info) return self.db.profile[info[#info]] end local set = function(info, v) self.db.profile[info[#info]] = v end local options = { units = { name = L["World Units"], desc = L["What to do with tooltips for world frames"], type = "select", values = choices, get = get, set = set, order = 4 }, unitFrames = { name = L["Unit Frames"], desc = L["What to do with tooltips for unit frames"], type = "select", values = choices, get = get, set = set, order = 5 }, otherFrames = { name = L["Other Frames"], desc = L["What to do with tooltips for other frames (spells, macros, items, etc..)"], type = "select", values = choices, get = get, set = set, order = 6 }, objects = { name = L["World Objects"], desc = L["What to do with tooltips for world objects (mailboxes, portals, etc..)"], type = "select", values = choices, get = get, set = set, order = 7 } } function mod:OnInitialize() self.db = StarTip.db:RegisterNamespace(self:GetName(), defaults) StarTip:SetOptionsDisabled(options, true) self:SecureHook("GameTooltip_SetDefaultAnchor") end function mod:OnEnable() StarTip:SetOptionsDisabled(options, false) end function mod:OnDisable() StarTip:SetOptionsDisabled(options, true) end function mod:GetOptions() return options end function mod:GameTooltip_SetDefaultAnchor(this, owner) if owner ~= UIParent and mod.isUnit then -- This is terrible. Fixes a bug, but it likely introduces another bug related to passing over unit frames. Didn't seem to bother anything in a BG test. StarTip.tooltipMain:Hide() end end -- CowTip's solution below local updateExistenceFrame = CreateFrame("Frame") local updateAlphaFrame = CreateFrame("Frame") local checkExistence = function() if not UnitExists(StarTip.unit) and mod.isUnit then updateExistenceFrame:SetScript("OnUpdate", nil) local kind if GameTooltip:GetOwner() == UIParent then kind = self.db.profile.units else kind = self.db.profile.unitFrames end if kind == 2 then GameTooltip:FadeOut() StarTip.tooltipMain:FadeOut() else GameTooltip:Hide() StarTip.tooltipMain:Hide() end end end local checkTooltipAlpha = function() if GameTooltip:GetAlpha() < 1 then updateAlphaFrame:SetScript("OnUpdate", nil) local kind if GameTooltip:IsOwned(UIParent) then kind = self.db.profile.objects else kind = self.db.profile.otherFrames end if kind == 2 then GameTooltip:FadeOut() StarTip.tooltipMain:FadeOut() else GameTooltip:Hide() StarTip.tooltipMain:Hide() end end end function mod:OnShow() if self.isUnit and UnitExists(StarTip.unit) then updateExistenceFrame:SetScript("OnUpdate", checkExistence) else updateAlphaFrame:SetScript("OnUpdate", checkTooltipAlpha) end end function mod:OnFadeOut(this, ...) if self.justFade then self.justFade = nil return true end local kind if self.isUnit then if GameTooltip:IsOwned(UIParent) then kind = self.db.profile.units else kind = self.db.profile.unitFrames end else if GameTooltip:IsOwned(UIParent) then kind = self.db.profile.objects else kind = self.db.profile.otherFrames end end self.isUnit = false if kind == 2 then return true else self.justHide = true GameTooltip:Hide() StarTip.tooltipMain:Hide() end end function mod:GameTooltipHide(this, ...) if self.justHide then self.justHide = nil return true end local kind if self.isUnit then if GameTooltip:IsOwned(UIParent) then kind = self.db.profile.units else kind = self.db.profile.unitFrames end else if GameTooltip:IsOwned(UIParent) then kind = self.db.profile.objects else kind = self.db.profile.otherFrames end end self.isUnit = false if kind == 2 then self.justFade = true GameTooltip:FadeOut() StarTip.tooltipMain:FadeOut() else return true end end function mod:SetUnit() self.isUnit = true updateExistenceFrame:SetScript("OnUpdate", checkExistence) end function mod:SetItem() self.isUnit = false updateExistenceFrame:SetScript("OnUpdate", nil) end function mod:SetSpell() self.isUnit = false updateExistenceFrame:SetScript("OnUpdate", nil) end