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