WoW:Tooltip Pseudo Code: Difference between revisions

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 ..."
 
(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:
#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