vanilla-wow-addons – Rev 1
?pathlinks?
-- 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