vanilla-wow-addons – Rev 1

Subversion Repositories:
Rev:
-- Do graph stuff
-- This should be a separate addon someday

GraphHandler = {};
GraphHandler.Legend = {};

GraphHandler.Legend.OnEnter = function()
   if( this.item or this.tooltop ) then
      GameTooltip:SetOwner(this, "ANCHOR_RIGHT");
      if (this.item and this.item ~= "") then
         GameTooltip:SetHyperlink("item:"..this.item);
      elseif (this.tooltip) then
         GameTooltip:SetText(this.tooltip);
      end
   end
end

GraphHandler.Legend.OnLeave = function()
   if( this.item or this.tooltop ) then
      this.updateToolTip = nil;
      GameTooltip:Hide();
   end
end

GraphHandler.Legend.OnClick = function(button)
   if ( button == "LeftButton" ) then
      if( IsShiftKeyDown() and this.item ) then
         GraphHandler.Legend.ChatLink(this.item, this.name, this.color);
      end
   end
end

GraphHandler.Legend.ChatLink = FishingBuddy.ChatLink;

GraphHandler.BAR = "BAR";
GraphHandler.LEGEND = "LEGEND";
GraphHandler.LINE = "LINE";
GraphHandler.LABEL = "LABEL";
GraphHandler.TEXT = "TEXT";

GraphHandler.InitElements = function()
   if ( not this.elements ) then
      this.elements = {};
      this.elements[GraphHandler.BAR] = {};
      this.elements[GraphHandler.LINE] = {};
      this.elements[GraphHandler.LEGEND] = {};
      this.elements[GraphHandler.LABEL] = {};
      this.elements[GraphHandler.TEXT] = {};
   end
end

local function SetColorBar(bar, base, x, y, width, height, r, g, b)
   local name;
   if ( type(bar) == "STRING" ) then
      name = bar;
      bar = getglobal(name);
   elseif ( bar ) then
      name = bar:GetName();
   end
   if ( bar ) then
      if ( not r ) then
         r = 1.0;
         g = 1.0;
         b = 1.0;
      end
      if ( base ) then
         local tex = getglobal(name.."Texture");
         if ( x and y ) then
            bar:ClearAllPoints();
            bar:SetPoint("BOTTOMLEFT", base, "BOTTOMLEFT", x, y);
         end
         if ( width ) then
            bar:SetWidth(width);
         end
         if ( height ) then
            bar:SetHeight(height);
         end
         tex:SetVertexColor(r, g, b);
         bar:Show();
      else
         bar:Hide();
      end
   end
end

-- Registration functions

GraphHandler.Register = function(kind, what)
   local frame = this;
   local lastframe = nil;
   for idx=1,5 do
      frame = frame:GetParent();
      if ( frame == lastframe ) then
         break;
      end
      if ( frame and frame.elements ) then
         if ( not frame.elements[kind] ) then
            frame.elements[kind] = {};
         end
         tinsert(frame.elements[kind], what);
         break;
      end
      lastframe = frame;
   end
end

GraphHandler.PlotData = function(frame, data, offset, skip, r, g, b)
  local limit = table.getn(data);
  local start = 1;
  if ( data[0] ) then
     start = 0;
     limit = limit - 1;
  end

  local bdx=offset+1;
  local bwid = frame.barWidth;
  local bspc = frame.barSpacing;
  local maxval = frame.maxVal;
  local xoff = offset*bspc;
  local yoff = 0;
  local graphHeight = frame:GetHeight();
  for idx=start,limit,1 do
     local bar = frame.elements[GraphHandler.BAR][bdx];
     bdx = bdx + skip + 1;
     if ( bar ) then
        if ( (maxval > 0) and (data[idx] > 0) ) then
           local height = (data[idx]*graphHeight)/maxval;
           SetColorBar(bar, frame, xoff, 0, bwid, height, r, g, b);
        else
           bar:Hide();
        end
     end
     xoff = xoff + bwid + skip*bspc;
  end
  return xoff - skip*bspc;
end

GraphHandler.PlotLegend = function(frame, ldx, name, item, texture, r, g, b)
   local legend = frame.elements[GraphHandler.LEGEND][ldx];
    if ( legend ) then
      local name = legend:GetName();
      local icon = getglobal(name.."Icon");
      local tex = getglobal(name.."IconTexture");
      local color = getglobal(name.."Color");
--      SetColorBar(color, legend, nil, nil, nil, nil, r, g, b);
      SetColorBar(color, legend, 0, 1, 10, 16, r, g, b);
      icon:Show();
      tex:SetTexture(texture);
      tex:Show();
      legend:SetPoint("TOPRIGHT", frame, "TOPRIGHT", 0, -(ldx-1)*21);
      legend.item = item;
      legend.name = name;
      legend:Show();
   end
end

GraphHandler.PlotGrid = function(frame, label, texth, width, textv, height)
   local ldx=1;
   local tdx=1;
   if ( not width ) then
      width = frame:GetWidth();
   end
   if ( not height ) then
      height = frame:GetHeight();
   end
   if ( label ) then
      local button = frame.elements[GraphHandler.TEXT][tdx];
      if ( button ) then
         local text = getglobal(button:GetName().."T");
         text:SetText(label);
         text:SetPoint("BOTTOM", frame, "BOTTOM", 0, -28);
         text:SetVertexColor(1.0, 1.0, 1.0);
         text:Show();
         tdx = tdx + 1;
      end
   end
   if ( texth ) then
      local linesh = 0;
      for _,_ in texth do
         linesh = linesh + 1;
      end
      local offset = height/(linesh-1);
      for label,tick in texth do
         local line = frame.elements[GraphHandler.LINE][ldx];
         if ( line ) then
            ldx = ldx + 1;
            line:SetHeight(1);
            line:SetWidth(width);
            line:SetPoint("BOTTOMLEFT", frame, "BOTTOMLEFT", 0, tick*offset);
            line:SetAlpha(0.5);
            line:Show();
            local button = frame.elements[GraphHandler.TEXT][tdx];
            if ( button ) then
               local text = getglobal(button:GetName().."T");
               if ( type(label) ~= "string" ) then
                  label = string.format("%3d", label);
               end
               text:SetText(label);
               text:SetPoint("LEFT", line, "LEFT", -(text:GetWidth()+4), 0);
               tdx = tdx + 1;
            end
         end
      end
   end
   if ( textv ) then
      local linesv = 0;
      for _,_ in textv do
         linesv = linesv + 1;
      end
      local offset = frame.barSpacing + frame.barWidth;
      for label,tick in textv do
         local line = frame.elements[GraphHandler.LINE][ldx];
         if ( line ) then
            local xpos = tick*offset;
            ldx = ldx + 1;
            line:SetHeight(height);
            line:SetWidth(1);
            line:SetPoint("BOTTOMLEFT", frame, "BOTTOMLEFT", xpos, 0);
            line:SetAlpha(0.5);
            line:Show();
            local button = frame.elements[GraphHandler.TEXT][tdx];
            if ( button ) then
               local text = getglobal(button:GetName().."T");
               if ( type(label) ~= "string" ) then
                  label = string.format("%3d", label);
               end
               text:SetText(label);
               local wid = text:GetWidth();
               if ( xpos < wid ) then
                  text:SetPoint("TOPLEFT", line, "BOTTOMLEFT", 0, -4);
               elseif ( xpos > (width - wid) ) then
                  text:SetPoint("TOPRIGHT", line, "BOTTOMRIGHT", 0, -4);
               else
                  text:SetPoint("TOP", line, "BOTTOM", 0, -4);
               end
               tdx = tdx + 1;
            end
         end
      end
   end
end