WoW:Tooltip Pseudo Code: Difference between revisions

From AddOn Studio
Jump to navigation Jump to search
 
m (Move page script moved page Tooltip Pseudo Code to Tooltip Pseudo Code without leaving a redirect)
 
(One intermediate revision by one other user not shown)
Line 1: Line 1:
#REDIRECT [[Tooltip pseudo code]]
{{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

Latest revision as of 04:49, 15 August 2023

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