WoW:Tooltip Pseudo Code: Difference between revisions
Jump to navigation
Jump to search
(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 |
Revision as of 01:49, 17 December 2020
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