WoW:Tooltip Pseudo Code
Tooltips are notoriously difficult to handle in WoW UI code. This page contains Lua-style pseudo code that attempts to represent the behaviour and interaction of various GameTooltip widget methods. (Currently it's not complete, yet to include details about line-wrapping behaviour). See UIOBJECT GameTooltip for notes about GameTooltips. See Widget API for a reference list about GameTooltip methods and their uses.
Note: This is not actual working Lua code, you can't copy/paste it. It is a representation of what the game's engine does internally, to help understand tooltips' behaviour. No such Lua code actually exists anywhere.
(Valid for patch 1.10)
-- Hiding a tooltip's parent causes tooltip:ClearTooltip() to be called -- Showing a tooltip's parent causes tooltip:Show() to be called tooltip = { owner = nil; anchor = nil; fading = nil; numLines = 0; } -- Note: this function is not accessible via the Widget API, only available internally function tooltip:ClearTooltip() self.owner = nil; self.fading = nil; self:ClearLines(); end function tooltip:SetOwner(owner, anchor) self:Hide() self:ClearAllPoints(); self.owner = owner; self.anchor = anchor; end function tooltip:SetX(info) if (not self.owner) then self:Hide(); return; end -- Note: CheckValidity() varies slightly between SetX methods -- * Empty Bag slots are considered invalid -- * Empty Inventory are considered invalid -- * Empty Actions *are* considered valid, and therefore clear the lines of the tooltip -- details on others not researched... if (CheckValidity(info)) then self:ClearLines(); FillInTooltipData(info); -- Fill in TextLeftX and TextRightX fontstrings self.numLines = NumberOfFilledInLines(); if (self.numLines > 0) then self:Show(); end end end function tooltip:Show() if (not self.owner) then MakeTooltipNotShown(); -- Hides the tooltip, IsShown returns 0. return; end if (self.numLines > 0) then if (self.anchor ~= "ANCHOR_NONE") then self:ClearAllPoints(); SetPointsBasedOnAnchor(anchor); -- Call SetPoint appropriate to the anchoring elseif (NoAnchorPointExists()) -- Check if any points have been set yet -- Note that this SetPoint with the infinite x-offset is responsible for making a tooltip -- "hidden" in the sense of not appearing on-screen, despite both IsVisible/IsShown returning 1. -- It also causes the tooltip to appear corrupt on screen if SetPoint is explicitly called on -- it with anything other than "TOPLEFT" after this, because of conflicting Points constraints. -- In all cases the tooltip's fontstrings can still be read properly. self:SetPoint("TOPLEFT", UIParent, 1.#INF, 0); end LayoutTooltip(); -- Resize tooltip based on shown fontstrings MakeTooltipShown(); -- Shows the tooltip, IsShown returns 1 self.fading = nil; else self.owner = nil; MakeTooltipNotShown(); -- Hides the tooltip, IsShown returns 0 end end function tooltip:Hide() self:ClearTooltip(); MakeTooltipNotShown(); -- Hides the tooltip, IsShown returns 0 end function tooltip:FadeOut() self.fading = true; GraduallyStartFadingOutTooltip(); if (TimeIsUp() and self.fading) then self:Hide(); end end function tooltip:AppendText(text, etc) AddToFirstLine(text) -- Appends the text to the first line self:Show() end function tooltip:AddLine(text, etc) AddExtraLine(text, etc); -- Fills out the next TextLefti and show it self.numLines = self.numLines + 1; end function tooltip:AddDoubleLine(data) AddExtraLineLeftRight(data); -- Fills out the next TextLefti and TextRighti and show them self.numLines = self.numLines + 1; end function tooltip:ClearLines() for i=1, MAX do tooltipTextLefti:Hide(); tooltipTextLefti:SetText(nil); tooltipTextRighti:Hide(); end self.numLines = 0; end function tooltip:NumLines() return self.numLines; end function tooltip:IsOwned(frame) if (frame == self.owner) then return 1; end end