49
edits
(moved Tooltip Pseudo Code to Tooltip pseudo code) |
(Created page with "{{uitech}} 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 ...") |
||
| Line 1: | Line 1: | ||
{{uitech}} | |||
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 | |||