mirror of
https://codeberg.org/Duvelcorp/MetaHunt.git
synced 2026-09-21 23:26:57 +00:00
1912 lines
50 KiB
Lua
1912 lines
50 KiB
Lua
--[[
|
|
Name: CandyBar-2.0
|
|
Revision: 16003
|
|
Author: Ammo (wouter@muze.nl)
|
|
Backport to vanilla: laytya (@gmail.com)
|
|
Website: https://github.com/laytya/LibCandyBar/
|
|
Documentation: http://web.archive.org/web/20070314234510/http://wowace.com/wiki/CandyBar-2.0
|
|
Description: A timer bars library.
|
|
Dependencies: AceLibrary, AceOO-2.0, PaintChips-2.0
|
|
]]
|
|
local getn,setn,tinsert = table.getn, table.setn,table.insert
|
|
local vmajor, vminor = "CandyBar-2.0", "$Revision: 16011 $"
|
|
|
|
if not AceLibrary then error(vmajor .. " requires AceLibrary.") end
|
|
if not AceLibrary:IsNewVersion(vmajor, vminor) then return end
|
|
|
|
if not AceLibrary:HasInstance("AceOO-2.0") then error(vmajor .. " requires AceOO-2.0") end
|
|
--if not AceLibrary:HasInstance("PaintChips-2.0") then error(vmajor .. " requires PaintChips-2.0") end
|
|
|
|
local paint,compost = nil,nil
|
|
|
|
if AceLibrary:HasInstance("Compost-2.0") then compost = AceLibrary:GetInstance("Compost-2.0") end
|
|
|
|
local AceOO = AceLibrary:GetInstance("AceOO-2.0")
|
|
local Mixin = AceOO.Mixin
|
|
local CandyBar = Mixin {
|
|
"RegisterCandyBar",
|
|
"UnregisterCandyBar",
|
|
"IsCandyBarRegistered",
|
|
"StartCandyBar",
|
|
"StopCandyBar",
|
|
"PauseCandyBar",
|
|
"CandyBarStatus",
|
|
"SetCandyBarTexture",
|
|
"SetCandyBarTime",
|
|
"SetCandyBarColor",
|
|
"SetCandyBarText",
|
|
"SetCandyBarIcon",
|
|
"SetCandyBarIconPosition",
|
|
"SetCandyBarWidth",
|
|
"SetCandyBarHeight",
|
|
"SetCandyBarBackgroundColor",
|
|
"SetCandyBarBorderColor",
|
|
"SetCandyBarBorderTexture",
|
|
"SetCandyBarTextColor",
|
|
"SetCandyBarTimerTextColor",
|
|
"SetCandyBarFontSize",
|
|
"SetCandyBarPoint",
|
|
"GetCandyBarPoint",
|
|
"GetCandyBarCenter",
|
|
"GetCandyBarOffsets",
|
|
"GetCandyBarEffectiveScale",
|
|
"SetCandyBarGradient",
|
|
"SetCandyBarScale",
|
|
"SetCandyBarTimeFormat",
|
|
"SetCandyBarTimeLeft",
|
|
"SetCandyBarCompletion",
|
|
"SetCandyBarFade",
|
|
"RegisterCandyBarGroup",
|
|
"UnregisterCandyBarGroup",
|
|
"IsCandyBarGroupRegistered",
|
|
"SetCandyBarGroupPoint",
|
|
"SetCandyBarGroupGrowth",
|
|
"SetCandyBarGroupVerticalSpacing",
|
|
"UpdateCandyBarGroup",
|
|
"GetCandyBarNextBarPointInGroup",
|
|
"RegisterCandyBarWithGroup",
|
|
"UnregisterCandyBarWithGroup",
|
|
"IsCandyBarRegisteredWithGroup",
|
|
"SetCandyBarReversed",
|
|
"IsCandyBarReversed",
|
|
"SetCandyBarOnClick",
|
|
"SetCandyBarOnSizeGroup",
|
|
}
|
|
|
|
local defaults = {
|
|
texture = "Interface\\TargetingFrame\\UI-StatusBar",
|
|
width = 200,
|
|
height = 16,
|
|
scale = 1,
|
|
point = "CENTER",
|
|
rframe = UIParent,
|
|
rpoint = "CENTER",
|
|
iconpos = "LEFT",
|
|
xoffset = 0,
|
|
yoffset = 0,
|
|
fontsize = 11,
|
|
color = {1, 0, 1, 1},
|
|
bgcolor = {0, 0.5, 0.5, 0.5},
|
|
bordercolor = {1,1,1,1},
|
|
bordertexture = "Interface\\None",
|
|
textcolor = {1, 1, 1, 1},
|
|
timertextcolor = {1, 1, 1, 1},
|
|
stayonscreen = false,
|
|
}
|
|
|
|
local getArgs
|
|
do
|
|
local numargs
|
|
local function _get(t, str, i, ...)
|
|
if i<=numargs then
|
|
return t[format("%s%d", str, i)], _get(t, str, i+1, unpack(arg))
|
|
end
|
|
return (unpack(arg))
|
|
end
|
|
|
|
function getArgs(t, str, ...)
|
|
numargs = t[str.."#" or 0]
|
|
return _get(t,str,1, unpack(arg))
|
|
end
|
|
end
|
|
|
|
local function setArgs(t, str, ...)
|
|
local n = getn(arg)
|
|
for i=1,n do
|
|
t[format("%s%d",str,i)]=arg[i]
|
|
end
|
|
for i=n+1, (t[str.."#"] or 0) do
|
|
t[format("%s%d",str,i)]=nil
|
|
end
|
|
t[str.."#"] = n
|
|
end
|
|
|
|
local new, del
|
|
if compost then
|
|
new = function() return compost:Acquire() end
|
|
del = function(t) compost:Reclaim(t) end
|
|
else
|
|
local list = setmetatable({}, {__mode = "k"})
|
|
function new()
|
|
local t = next(list)
|
|
if not t then
|
|
return {}
|
|
end
|
|
list[t] = nil
|
|
return t
|
|
end
|
|
|
|
function del(t)
|
|
setmetatable(t, nil)
|
|
for k in pairs(t) do
|
|
t[k] = nil
|
|
end
|
|
setn(t,0)
|
|
list[t] = true
|
|
end
|
|
end
|
|
|
|
-- Registers a new candy bar
|
|
-- name - A unique identifier for your bar.
|
|
-- time - Time for the bar
|
|
-- text - text displayed on the bar [defaults to the name if not set]
|
|
-- icon - icon off the bar [optional]
|
|
-- c1 - c10 - color of the bar [optional]
|
|
-- returns true on a succesful register
|
|
function CandyBar:Register(name, time, text, icon, c1, c2, c3, c4, ...)
|
|
CandyBar:argCheck(name, 2, "string")
|
|
CandyBar:argCheck(time, 3, "number")
|
|
CandyBar:argCheck(text, 4, "string", "nil")
|
|
CandyBar:argCheck(icon, 5, "string", "nil")
|
|
CandyBar:argCheck(c1, 6, "string", "number", "nil")
|
|
CandyBar:argCheck(c2, 7, "string", "number", "nil")
|
|
CandyBar:argCheck(c3, 8, "string", "number", "nil")
|
|
CandyBar:argCheck(c4, 9, "string", "number", "nil")
|
|
if not text then text = name end
|
|
if CandyBar.handlers[name] then
|
|
self:Unregister(name)
|
|
end
|
|
local handler = new()
|
|
handler.name, handler.time, handler.text, handler.icon = name, time, text or name, icon
|
|
handler.texture = defaults.texture
|
|
local c1Type = type(c1)
|
|
if c1Type ~= "number" and not paint then
|
|
CandyBar:error("You need the PaintChips-2.0 library if you don't pass in RGB pairs as colors.")
|
|
end
|
|
if c1Type == "nil" or (c1Type ~= "number" and paint and not paint:GetRGBPercent(c1)) then
|
|
c1 = "green"
|
|
end
|
|
handler.color = new()
|
|
if c1Type == "number" then
|
|
handler.color[1] = c1
|
|
handler.color[2] = c2
|
|
handler.color[3] = c3
|
|
else
|
|
local _
|
|
_, handler.color[1], handler.color[2], handler.color[3] = paint:GetRGBPercent(c1)
|
|
end
|
|
handler.color[4] = 1
|
|
handler.running = nil
|
|
handler.endtime = 0
|
|
handler.reversed = nil
|
|
CandyBar.handlers[name] = handler
|
|
handler.frame = CandyBar:AcquireBarFrame(name)
|
|
if (c1Type == "number" and c4) or (c1Type == "string" and c2) then
|
|
CandyBar:SetGradient(name, c1, c2, c3, c4, unpack(arg))
|
|
end
|
|
handler.stayonscreen = defaults.stayonscreen
|
|
return true
|
|
end
|
|
|
|
|
|
-- Removes a candy bar
|
|
-- a1 - a10 handlers that you wish to remove
|
|
-- returns true upon sucessful removal
|
|
function CandyBar:Unregister(a1, ...)
|
|
CandyBar:argCheck(a1, 2, "string")
|
|
if not CandyBar.handlers[a1] then
|
|
return
|
|
end
|
|
CandyBar:UnregisterWithGroup(a1)
|
|
CandyBar:ReleaseBarFrame(a1)
|
|
local handler = CandyBar.handlers[a1]
|
|
CandyBar.handlers[a1] = nil
|
|
if handler.color then
|
|
handler.color = del(handler.color)
|
|
end
|
|
if handler.bgcolor then
|
|
handler.bgcolor = del(handler.bgcolor)
|
|
end
|
|
if handler.textcolor then
|
|
handler.textcolor = del(handler.textcolor)
|
|
end
|
|
if handler.timertextcolor then
|
|
handler.timertextcolor = del(handler.timertextcolor)
|
|
end
|
|
if handler.gradienttable then
|
|
for i,v in ipairs(handler.gradienttable) do
|
|
v = del(v)
|
|
end
|
|
handler.gradienttable = del(handler.gradienttable)
|
|
end
|
|
handler = del(handler)
|
|
if getn(arg)>0 then
|
|
CandyBar:Unregister(unpack(arg))
|
|
elseif not CandyBar:HasHandlers() then
|
|
CandyBar.frame:Hide()
|
|
end
|
|
return true
|
|
end
|
|
|
|
-- Checks if a candy bar is registered
|
|
-- Args: name - name of the candybar
|
|
-- returns true if a the candybar is registered
|
|
function CandyBar:IsRegistered(name)
|
|
CandyBar:argCheck(name, 2, "string")
|
|
if CandyBar.handlers[name] then
|
|
return true
|
|
end
|
|
return false
|
|
end
|
|
|
|
-- Start a bar
|
|
-- Args: name - the candybar you want to start
|
|
-- fireforget [optional] - pass true if you want the bar to unregister upon completion
|
|
-- returns true if succesful
|
|
function CandyBar:Start(name, fireforget)
|
|
CandyBar:argCheck(name, 2, "string")
|
|
CandyBar:argCheck(fireforget, 3, "boolean", "nil")
|
|
local handler = CandyBar.handlers[name]
|
|
if not handler then
|
|
return
|
|
end
|
|
local t = GetTime()
|
|
if handler.paused then
|
|
local pauseoffset = t - handler.pausetime
|
|
handler.endtime = handler.endtime + pauseoffset
|
|
handler.starttime = handler.starttime + pauseoffset
|
|
elseif handler.elapsed and not handler.running then
|
|
handler.endtime = t + handler.time - handler.elapsed
|
|
handler.starttime = t - handler.elapsed
|
|
else
|
|
-- bar hasn't elapsed a second.
|
|
handler.elapsed = 0
|
|
handler.endtime = t + handler.time
|
|
handler.starttime = t
|
|
end
|
|
handler.fireforget = fireforget
|
|
handler.running = true
|
|
handler.paused = nil
|
|
handler.fading = nil
|
|
CandyBar:AcquireBarFrame(name) -- this will reset the barframe incase we were fading out when it was restarted
|
|
handler.frame:Show()
|
|
if handler.group then
|
|
CandyBar:UpdateGroup(handler.group) -- update the group
|
|
end
|
|
CandyBar.frame:Show()
|
|
return true
|
|
end
|
|
|
|
-- Stop a bar
|
|
-- Args: name - the candybar you want to stop
|
|
-- returns true if succesful
|
|
function CandyBar:Stop(name)
|
|
CandyBar:argCheck(name, 2, "string")
|
|
|
|
local handler = CandyBar.handlers[name]
|
|
|
|
if not handler then
|
|
return
|
|
end
|
|
|
|
handler.running = nil
|
|
handler.paused = nil
|
|
handler.elapsed = 0
|
|
|
|
if handler.fadeout then
|
|
handler.frame.spark:Hide()
|
|
if not handler.stayonscreen then
|
|
handler.fading = true
|
|
handler.fadeelapsed = 0
|
|
local t = GetTime()
|
|
if handler.endtime > t then
|
|
handler.endtime = t
|
|
end
|
|
end
|
|
else
|
|
handler.frame:Hide()
|
|
handler.starttime = nil
|
|
handler.endtime = 0
|
|
if handler.group then
|
|
CandyBar:UpdateGroup(handler.group)
|
|
end
|
|
if handler.fireforget then
|
|
return CandyBar:Unregister(name)
|
|
end
|
|
end
|
|
if not CandyBar:HasHandlers() then
|
|
CandyBar.frame:Hide()
|
|
end
|
|
return true
|
|
end
|
|
|
|
-- Pause a bar
|
|
-- Name - the candybar you want to pause
|
|
-- returns true if succesful
|
|
function CandyBar:Pause(name)
|
|
CandyBar:argCheck(name, 2, "string")
|
|
local handler = CandyBar.handlers[name]
|
|
if not handler then
|
|
return
|
|
end
|
|
handler.pausetime = GetTime()
|
|
handler.paused = true
|
|
handler.running = nil
|
|
end
|
|
|
|
-- Query a timer's status
|
|
-- Args: name - the schedule you wish to look up
|
|
-- Returns: registered - true if a schedule exists with this name
|
|
-- time - time for this bar
|
|
-- elapsed - time elapsed for this bar
|
|
-- running - true if this schedule is currently running
|
|
function CandyBar:Status(name)
|
|
CandyBar:argCheck(name, 2, "string")
|
|
local handler = CandyBar.handlers[name]
|
|
if not handler then
|
|
return
|
|
end
|
|
return true, handler.time, handler.elapsed, handler.running, handler.paused
|
|
end
|
|
|
|
|
|
-- Set the time for a bar.
|
|
-- Args: name - the candybar name
|
|
-- time - the new time for this bar
|
|
-- returns true if succesful
|
|
function CandyBar:SetTime(name, time)
|
|
CandyBar:argCheck(name, 2, "string")
|
|
CandyBar:argCheck(time, 3, "number")
|
|
|
|
local handler = CandyBar.handlers[name]
|
|
if not handler then
|
|
return
|
|
end
|
|
handler.time = time
|
|
if handler.starttime and handler.endtime then
|
|
handler.endtime = handler.starttime + time
|
|
end
|
|
return true
|
|
end
|
|
|
|
-- Set the time left for a bar.
|
|
-- Args: name - the candybar name
|
|
-- time - time left on the bar
|
|
-- returns true if succesful
|
|
|
|
function CandyBar:SetTimeLeft(name, time)
|
|
CandyBar:argCheck(name, 2, "string")
|
|
CandyBar:argCheck(time, 3, "number")
|
|
|
|
local handler = CandyBar.handlers[name]
|
|
if not handler then
|
|
return
|
|
end
|
|
if handler.time < time or time < 0 then
|
|
return
|
|
end
|
|
|
|
local e = handler.time - time
|
|
if handler.starttime and handler.endtime then
|
|
local d = handler.elapsed - e
|
|
handler.starttime = handler.starttime + d
|
|
handler.endtime = handler.endtime + d
|
|
end
|
|
|
|
handler.elapsed = e
|
|
|
|
if handler.group then
|
|
CandyBar:UpdateGroup(handler.group)
|
|
end
|
|
|
|
return true
|
|
end
|
|
|
|
-- Sets smooth coloring of the bar depending on time elapsed
|
|
-- Args: name - the candybar name
|
|
-- c1 - c10 color order of the gradient
|
|
-- returns true when succesful
|
|
local cachedgradient = new()
|
|
function CandyBar:SetGradient(name, c1, c2, ...)
|
|
CandyBar:argCheck(name, 2, "string")
|
|
CandyBar:argCheck(c1, 3, "string", "number", "nil")
|
|
CandyBar:argCheck(c2, 4, "string", "number", "nil")
|
|
|
|
local handler = CandyBar.handlers[name]
|
|
|
|
if not handler then
|
|
return
|
|
end
|
|
|
|
local gtable = new()
|
|
local gradientid = nil
|
|
local gmax = 0
|
|
-- We got string values passed in, which means they're not rgb values
|
|
-- directly, but a color most likely registered with paintchips
|
|
if type(c1) == "string" then
|
|
if not paint then
|
|
CandyBar:error("You need the PaintChips-2.0 library if you don't pass in RGB pairs as colors.")
|
|
end
|
|
if not paint:GetRGBPercent(c1) then c1 = "green" end
|
|
if not paint:GetRGBPercent(c2) then c2 = "red" end
|
|
|
|
gtable[1] = new()
|
|
gtable[2] = new()
|
|
|
|
gradientid = c1 .. "_" .. c2
|
|
local _
|
|
_, gtable[1][1], gtable[1][2], gtable[1][3] = paint:GetRGBPercent(c1)
|
|
_, gtable[2][1], gtable[2][2], gtable[2][3] = paint:GetRGBPercent(c2)
|
|
gmax = 2
|
|
for i = 1, getn(arg) do
|
|
local c = arg[i]
|
|
if not c or not paint:GetRGBPercent(c) then
|
|
break
|
|
end
|
|
gmax = gmax + 1
|
|
gtable[gmax] = new()
|
|
local _
|
|
_, gtable[gmax][1], gtable[gmax][2], gtable[gmax][3] = paint:GetRGBPercent(c)
|
|
gradientid = gradientid .. "_" .. c
|
|
end
|
|
|
|
elseif type(c1) == "number" then
|
|
-- It's a number, which means we should expect r,g,b values
|
|
local n = getn(arg) -- select("#", ...)
|
|
if n < 4 then CandyBar:error("Not enough extra arguments to :SetGradient, need at least 2 RGB pairs.") end
|
|
gtable[1] = new()
|
|
gtable[1][1] = c1
|
|
gtable[1][2] = c2
|
|
gtable[1][3] = arg[1] -- select(1, ...)
|
|
gradientid = string.format("%d%d%d", c1, c2, gtable[1][3])
|
|
gmax = 1
|
|
|
|
local i = 2,2
|
|
while i < n do --for i = 2, n, 3 do
|
|
local r, g, b = arg[i], arg[i+1], arg[i+3] --select(i, ...)
|
|
if r and g and b then
|
|
gmax = gmax + 1
|
|
gtable[gmax] = new()
|
|
gtable[gmax][1], gtable[gmax][2], gtable[gmax][3] = r, g, b
|
|
gradientid = string.format("%s_%d%d%d", gradientid, r, g, b)
|
|
else
|
|
break
|
|
end
|
|
i = i + 3
|
|
end
|
|
end
|
|
|
|
for i = 1, gmax do
|
|
if not gtable[i][4] then
|
|
gtable[i][4] = 1
|
|
end
|
|
gtable[i][5] = (i-1) / (gmax-1)
|
|
end
|
|
|
|
if handler.gradienttable then
|
|
for i,v in ipairs(handler.gradienttable) do
|
|
v = del(v)
|
|
end
|
|
handler.gradienttable = del(handler.gradienttable)
|
|
end
|
|
handler.gradienttable = gtable
|
|
handler.gradient = true
|
|
handler.gradientid = gradientid
|
|
if not cachedgradient[gradientid] then
|
|
cachedgradient[gradientid] = new()
|
|
end
|
|
handler.frame.statusbar:SetStatusBarColor(unpack(gtable[1], 1, 4))
|
|
return true
|
|
end
|
|
|
|
local function setColor(color, alpha, b, a)
|
|
CandyBar:argCheck(color, 3, "string", "number")
|
|
local ctable = new()
|
|
local _, rr, gg, bb, aa
|
|
if type(color) == "string" then
|
|
if not paint then
|
|
CandyBar:error("You need the PaintChips-2.0 library if you don't pass in RGB pairs as colors.")
|
|
end
|
|
if not paint:GetRGBPercent(color) then
|
|
return
|
|
end
|
|
CandyBar:argCheck(alpha, 4, "number", "nil")
|
|
_, rr, gg, bb = paint:GetRGBPercent(color)
|
|
aa = alpha and alpha or 1
|
|
else
|
|
CandyBar:argCheck(alpha, 4, "number")
|
|
CandyBar:argCheck(b, 5, "number")
|
|
CandyBar:argCheck(a, 6, "number", "nil")
|
|
rr, gg, bb = color, alpha, b
|
|
aa = a and a or 1
|
|
end
|
|
tinsert(ctable,rr)
|
|
tinsert(ctable,gg)
|
|
tinsert(ctable,bb)
|
|
tinsert(ctable,aa)
|
|
return ctable
|
|
end
|
|
|
|
-- Set the color of the bar
|
|
-- Args: name - the candybar name
|
|
-- color - new color of the bar
|
|
-- alpha - new alpha of the bar
|
|
-- Setting the color will override smooth settings.
|
|
function CandyBar:SetColor(name, color, alpha, b, a)
|
|
CandyBar:argCheck(name, 2, "string")
|
|
local handler = CandyBar.handlers[name]
|
|
if not handler then
|
|
return
|
|
end
|
|
local t = setColor(color, alpha, b, a)
|
|
if not t then return end
|
|
|
|
if handler.color then
|
|
handler.color = del(handler.color)
|
|
end
|
|
handler.color = t
|
|
handler.gradient = nil
|
|
|
|
handler.frame.statusbar:SetStatusBarColor(unpack(t, 1, 4))
|
|
return true
|
|
end
|
|
|
|
-- Set the color of background of the bar
|
|
-- Args: name - the candybar name
|
|
-- color - new color of the bar
|
|
-- alpha - new alpha of the bar
|
|
-- Setting the color will override smooth settings.
|
|
function CandyBar:SetBackgroundColor(name, color, alpha, b, a)
|
|
CandyBar:argCheck(name, 2, "string")
|
|
local handler = CandyBar.handlers[name]
|
|
if not handler then
|
|
return
|
|
end
|
|
|
|
local t = setColor(color, alpha, b, a)
|
|
if not t then return end
|
|
|
|
if handler.bgcolor then
|
|
handler.bgcolor = del(handler.bgcolor)
|
|
end
|
|
handler.bgcolor = t
|
|
handler.frame.statusbarbg:SetStatusBarColor(unpack(t, 1, 4))
|
|
handler.frame:SetBackdropColor(unpack(t, 1, 4))
|
|
|
|
return true
|
|
end
|
|
|
|
-- Set the color of border of the bar
|
|
-- Args: name - the candybar name
|
|
-- color - new color of the bar border
|
|
-- alpha - new alpha of the bar border
|
|
-- Setting the color will override smooth settings.
|
|
function CandyBar:SetBorderColor(name, color, alpha, b, a)
|
|
CandyBar:argCheck(name, 2, "string")
|
|
local handler = CandyBar.handlers[name]
|
|
if not handler then
|
|
return
|
|
end
|
|
|
|
local t = setColor(color, alpha, b, a)
|
|
if not t then return end
|
|
|
|
if handler.bordercolor then
|
|
handler.bordercolor = del(handler.bordercolor)
|
|
end
|
|
handler.bordercolor = t
|
|
handler.frame:SetBackdropBorderColor(unpack(t, 1, 4))
|
|
return true
|
|
end
|
|
|
|
|
|
|
|
-- Set the color for the bar text
|
|
-- Args: name - name of the candybar
|
|
-- color - new color of the text
|
|
-- alpha - new alpha of the text
|
|
-- returns true when succesful
|
|
function CandyBar:SetTextColor(name, color, alpha, b, a)
|
|
CandyBar:argCheck(name, 2, "string")
|
|
local handler = CandyBar.handlers[name]
|
|
if not handler then
|
|
return
|
|
end
|
|
|
|
local t = setColor(color, alpha, b, a)
|
|
if not t then return end
|
|
|
|
if handler.textcolor then
|
|
handler.textcolor = del(handler.textcolor)
|
|
end
|
|
handler.textcolor = t
|
|
handler.frame.text:SetTextColor(unpack(t, 1, 4))
|
|
|
|
return true
|
|
end
|
|
|
|
-- Set the color for the timer text
|
|
-- Args: name - name of the candybar
|
|
-- color - new color of the text
|
|
-- alpha - new alpha of the text
|
|
-- returns true when succesful
|
|
function CandyBar:SetTimerTextColor(name, color, alpha, b, a)
|
|
CandyBar:argCheck(name, 2, "string")
|
|
local handler = CandyBar.handlers[name]
|
|
if not handler then
|
|
return
|
|
end
|
|
|
|
local t = setColor(color, alpha, b, a)
|
|
if not t then return end
|
|
|
|
if handler.timertextcolor then
|
|
handler.timertextcolor = del(handler.timertextcolor)
|
|
end
|
|
handler.timertextcolor = t
|
|
handler.frame.timertext:SetTextColor(unpack(t, 1, 4))
|
|
|
|
return true
|
|
end
|
|
|
|
-- Set the text for the bar
|
|
-- Args: name - name of the candybar
|
|
-- text - text to set it to
|
|
-- returns true when succesful
|
|
function CandyBar:SetText(name, text)
|
|
CandyBar:argCheck(name, 2, "string")
|
|
CandyBar:argCheck(text, 3, "string")
|
|
|
|
local handler = CandyBar.handlers[name]
|
|
if not handler then
|
|
return
|
|
end
|
|
|
|
handler.text = text
|
|
handler.frame.text:SetText(text)
|
|
|
|
return true
|
|
end
|
|
|
|
-- Set the fontsize
|
|
-- Args: name - name of the candybar
|
|
-- fontsize - new fontsize
|
|
-- returns true when succesful
|
|
function CandyBar:SetFontSize(name, fontsize)
|
|
CandyBar:argCheck(name, 2, "string")
|
|
CandyBar:argCheck(fontsize, 3, "number")
|
|
|
|
local handler = CandyBar.handlers[name]
|
|
if not handler then
|
|
return
|
|
end
|
|
|
|
local font, _, style = GameFontHighlight:GetFont()
|
|
local timertextwidth = fontsize * 3.6
|
|
local width = handler.width or defaults.width
|
|
local f = handler.frame
|
|
|
|
handler.fontsize = fontsize
|
|
f.timertext:SetFont(font, fontsize, style)
|
|
f.text:SetFont(font, fontsize, style)
|
|
f.timertext:SetWidth(timertextwidth)
|
|
f.text:SetWidth((width - timertextwidth) * .9)
|
|
|
|
return true
|
|
end
|
|
|
|
|
|
-- Set the point where a bar should be anchored
|
|
-- Args: name -- name of the bar
|
|
-- point -- anchor point
|
|
-- rframe -- relative frame
|
|
-- rpoint -- relative point
|
|
-- xoffset -- x offset
|
|
-- yoffset -- y offset
|
|
-- returns true when succesful
|
|
function CandyBar:SetPoint(name, point, rframe, rpoint, xoffset, yoffset)
|
|
CandyBar:argCheck(name, 2, "string")
|
|
CandyBar:argCheck(point, 3, "string")
|
|
CandyBar:argCheck(rframe, 4, "table", "string", "nil")
|
|
CandyBar:argCheck(rpoint, 5, "string", "nil")
|
|
CandyBar:argCheck(xoffset, 6, "number", "nil")
|
|
CandyBar:argCheck(yoffset, 7, "number", "nil")
|
|
|
|
local handler = CandyBar.handlers[name]
|
|
if not handler then
|
|
return
|
|
end
|
|
|
|
handler.point = point
|
|
handler.rframe = rframe
|
|
handler.rpoint = rpoint
|
|
handler.xoffset = xoffset
|
|
handler.yoffset = yoffset
|
|
|
|
handler.frame:ClearAllPoints()
|
|
handler.frame:SetPoint(point, rframe, rpoint, xoffset, yoffset)
|
|
|
|
return true
|
|
end
|
|
|
|
function CandyBar:GetPoint(name)
|
|
CandyBar:argCheck(name, 2, "string")
|
|
|
|
local handler = CandyBar.handlers[name]
|
|
if not handler then
|
|
return
|
|
end
|
|
|
|
return handler.point, handler.rframe, handler.rpoint, handler.xoffset, handler.yoffset
|
|
end
|
|
|
|
function CandyBar:GetCenter(name)
|
|
CandyBar:argCheck(name, 2, "string")
|
|
|
|
local handler = CandyBar.handlers[name]
|
|
if not handler then
|
|
return
|
|
end
|
|
|
|
return handler.frame:GetCenter()
|
|
end
|
|
|
|
function CandyBar:GetOffsets(name)
|
|
CandyBar:argCheck(name, 2, "string")
|
|
|
|
local handler = CandyBar.handlers[name]
|
|
if not handler then
|
|
return
|
|
end
|
|
|
|
local bottom = handler.frame:GetBottom()
|
|
local top = handler.frame:GetTop()
|
|
local left = handler.frame:GetLeft()
|
|
local right = handler.frame:GetRight()
|
|
|
|
return left, top, bottom, right
|
|
end
|
|
|
|
function CandyBar:GetEffectiveScale(name)
|
|
CandyBar:argCheck(name, 2, "string")
|
|
|
|
local handler = CandyBar.handlers[name]
|
|
if not handler then
|
|
return
|
|
end
|
|
|
|
return handler.frame:GetEffectiveScale()
|
|
end
|
|
|
|
-- Set the width for a bar
|
|
-- Args: name - name of the candybar
|
|
-- width - new width of the candybar
|
|
-- returns true when succesful
|
|
function CandyBar:SetWidth(name, width)
|
|
CandyBar:argCheck(name, 2, "string")
|
|
CandyBar:argCheck(width, 3, "number")
|
|
|
|
local handler = CandyBar.handlers[name]
|
|
if not CandyBar.handlers[name] then
|
|
return
|
|
end
|
|
|
|
local height = handler.height or defaults.height
|
|
local fontsize = handler.fontsize or defaults.fontsize
|
|
local timertextwidth = fontsize * 3.6
|
|
local f = handler.frame
|
|
f:SetWidth(width + height)
|
|
f.statusbar:SetWidth(width)
|
|
f.statusbarbg:SetWidth(width)
|
|
|
|
f.timertext:SetWidth(timertextwidth)
|
|
f.text:SetWidth((width - timertextwidth) * .9)
|
|
|
|
handler.width = width
|
|
|
|
return true
|
|
end
|
|
|
|
-- Set the height for a bar
|
|
-- Args: name - name of the candybar
|
|
-- height - new height for the bar
|
|
-- returs true when succesful
|
|
function CandyBar:SetHeight(name, height)
|
|
CandyBar:argCheck(name, 2, "string")
|
|
CandyBar:argCheck(height, 3, "number")
|
|
|
|
local handler = CandyBar.handlers[name]
|
|
if not handler then
|
|
return
|
|
end
|
|
|
|
local width = handler.width or defaults.width
|
|
local f = handler.frame
|
|
|
|
f:SetWidth(width + height)
|
|
f:SetHeight(height)
|
|
f.icon:SetWidth(height)
|
|
f.icon:SetHeight(height)
|
|
f.statusbar:SetHeight(height)
|
|
f.statusbarbg:SetHeight(height)
|
|
f.spark:SetHeight(height + 25)
|
|
|
|
f.statusbarbg:SetPoint("TOPLEFT", f, "TOPLEFT", height, 0)
|
|
f.statusbar:SetPoint("TOPLEFT", f, "TOPLEFT", height, 0)
|
|
|
|
handler.height = height
|
|
|
|
return true
|
|
end
|
|
|
|
-- Set the scale for a bar
|
|
-- Args: name - name of the candybar
|
|
-- scale - new scale of the bar
|
|
-- returns true when succesful
|
|
function CandyBar:SetScale(name, scale)
|
|
CandyBar:argCheck(name, 2, "string")
|
|
CandyBar:argCheck(scale, 3, "number")
|
|
|
|
local handler = CandyBar.handlers[name]
|
|
if not handler then
|
|
return
|
|
end
|
|
|
|
handler.scale = scale
|
|
|
|
handler.frame:SetScale(scale)
|
|
|
|
return true
|
|
end
|
|
|
|
-- Set the time formatting function for a bar
|
|
-- Args: name - name of the candybar
|
|
-- func - function that returns the formatted string
|
|
-- a1-a10 - optional arguments to that function
|
|
-- returns true when succesful
|
|
|
|
function CandyBar:SetTimeFormat(name, func, ...)
|
|
CandyBar:argCheck(name, 2, "string")
|
|
CandyBar:argCheck(func, 3, "function")
|
|
|
|
local handler = CandyBar.handlers[name]
|
|
|
|
if not handler then
|
|
return
|
|
end
|
|
handler.timeformat = func
|
|
setArgs(handler, "timeformat", unpack(arg))
|
|
|
|
return true
|
|
end
|
|
|
|
-- Set the completion function for a bar
|
|
-- Args: name - name of the candybar
|
|
-- func - function to call upon ending of the bar
|
|
-- a1 - a10 - arguments to pass to the function
|
|
-- returns true when succesful
|
|
function CandyBar:SetCompletion(name, func, ...)
|
|
CandyBar:argCheck(name, 2, "string")
|
|
CandyBar:argCheck(func, 3, "function")
|
|
|
|
local handler = CandyBar.handlers[name]
|
|
|
|
if not handler then
|
|
return
|
|
end
|
|
handler.completion = func
|
|
setArgs(handler, "completion", unpack(arg))
|
|
|
|
return true
|
|
end
|
|
|
|
local function onClick()
|
|
CandyBar:OnClick()
|
|
end
|
|
|
|
-- Set the on click function for a bar
|
|
-- Args: name - name of the candybar
|
|
-- func - function to call when the bar is clicked
|
|
-- a1 - a10 - arguments to pass to the function
|
|
-- returns true when succesful
|
|
function CandyBar:SetOnClick(name, func, ...)
|
|
CandyBar:argCheck(name, 2, "string")
|
|
CandyBar:argCheck(func, 3, "function", "nil")
|
|
|
|
local handler = CandyBar.handlers[name]
|
|
|
|
if not handler then
|
|
return
|
|
end
|
|
handler.onclick = func
|
|
setArgs(handler, "onclick", unpack(arg))
|
|
|
|
local frame = handler.frame
|
|
if func then
|
|
-- enable mouse
|
|
frame:EnableMouse(true)
|
|
frame:RegisterForClicks("LeftButtonUp", "RightButtonUp", "MiddleButtonUp", "Button4Up", "Button5Up", "RightButtonDown")
|
|
frame:SetScript("OnClick", onClick)
|
|
frame.icon:EnableMouse(true)
|
|
frame.icon:RegisterForClicks("LeftButtonUp", "RightButtonUp", "MiddleButtonUp", "Button4Up", "Button5Up", "RightButtonDown")
|
|
frame.icon:SetScript("OnClick", onClick)
|
|
else
|
|
frame:EnableMouse(false)
|
|
frame:RegisterForClicks()
|
|
frame:SetScript("OnClick", nil)
|
|
frame.icon:EnableMouse(false)
|
|
frame.icon:RegisterForClicks()
|
|
frame.icon:SetScript("OnClick", nil)
|
|
end
|
|
|
|
return true
|
|
|
|
end
|
|
|
|
-- Set the "on size" function for a group
|
|
-- Args: name - name of the candybar
|
|
-- func - function to call when a group changes size
|
|
-- ... - arguments to pass to the function
|
|
-- (the new size of the bar, in pixels, will be appended last)
|
|
-- returns true when succesful
|
|
function CandyBar:SetOnSizeGroup(name, func, ...)
|
|
CandyBar:argCheck(name, 2, "string")
|
|
CandyBar:argCheck(func, 3, "function", "nil")
|
|
|
|
local group = assert(CandyBar.groups[name])
|
|
|
|
group.onsize = func
|
|
setArgs(group, "onsize", unpack(arg))
|
|
end
|
|
|
|
|
|
-- Set the texture for a bar
|
|
-- Args: name - name of the candybar
|
|
-- texture - new texture, if passed nil, the texture is reset to default
|
|
-- returns true when succesful
|
|
function CandyBar:SetTexture(name, texture)
|
|
CandyBar:argCheck(name, 2, "string")
|
|
CandyBar:argCheck(texture, 3, "string", "nil")
|
|
|
|
local handler = CandyBar.handlers[name]
|
|
if not handler then
|
|
return
|
|
end
|
|
if not texture then
|
|
texture = defaults.texture
|
|
end
|
|
|
|
handler.texture = texture
|
|
|
|
handler.frame.statusbar:SetStatusBarTexture(texture)
|
|
handler.frame.statusbarbg:SetStatusBarTexture(texture)
|
|
|
|
return true
|
|
end
|
|
|
|
-- Set the texture for a bar
|
|
-- Args: name - name of the candybar
|
|
-- texture - new texture, if passed nil, the texture is reset to default
|
|
-- returns true when succesful
|
|
function CandyBar:SetBorderTexture(name, texture)
|
|
CandyBar:argCheck(name, 2, "string")
|
|
CandyBar:argCheck(texture, 3, "string", "nil")
|
|
|
|
local handler = CandyBar.handlers[name]
|
|
if not handler then
|
|
return
|
|
end
|
|
if not texture then
|
|
texture = defaults.bordertexture
|
|
end
|
|
|
|
local bgcolor = handler.bgcolor or defaults.bgcolor
|
|
local bordercolor = handler.bordercolor or defaults.bordercolor
|
|
|
|
handler.bordertexture = texture
|
|
local backdrop = handler.frame:GetBackdrop()
|
|
backdrop.edgefile = texture
|
|
handler.frame:SetBackdrop(backdrop)
|
|
handler.frame:SetBackdropBorderColor(unpack(bordercolor, 1, 4))
|
|
handler.frame:SetBackdropColor(unpack(bgcolor, 1, 4))
|
|
|
|
return true
|
|
end
|
|
|
|
-- Set the icon on a bar
|
|
-- Args: name - name of the candybar
|
|
-- icon - icon path, nil removes the icon
|
|
-- left, right, top, bottom - optional texture coordinates
|
|
-- returns true when succesful
|
|
function CandyBar:SetIcon(name, icon, left, right, top, bottom)
|
|
CandyBar:argCheck(name, 2, "string")
|
|
CandyBar:argCheck(icon, 3, "string", "nil")
|
|
CandyBar:argCheck(left, 4, "number", "nil")
|
|
CandyBar:argCheck(right, 5, "number", "nil")
|
|
CandyBar:argCheck(top, 6, "number", "nil")
|
|
CandyBar:argCheck(bottom, 7, "number", "nil")
|
|
|
|
local handler = CandyBar.handlers[name]
|
|
if not handler then
|
|
return
|
|
end
|
|
handler.icon = icon
|
|
|
|
if not icon then
|
|
handler.frame.icon:Hide()
|
|
else
|
|
left = left or 0.07
|
|
right = right or 0.93
|
|
top = top or 0.07
|
|
bottom = bottom or 0.93
|
|
handler.frame.icon:SetNormalTexture(icon)
|
|
handler.frame.icon:GetNormalTexture():SetTexCoord(left, right, top, bottom)
|
|
handler.frame.icon:Show()
|
|
end
|
|
|
|
return true
|
|
end
|
|
|
|
-- Set the icon position on bar
|
|
-- Args: name - name of the candybar
|
|
-- position - icon position, "LEFT" or "RIGHT"
|
|
-- returns true when succesful
|
|
function CandyBar:SetIconPosition(name, position)
|
|
CandyBar:argCheck(name, 2, "string")
|
|
CandyBar:argCheck(position, 3, "string", "LEFT", "RIGHT")
|
|
|
|
local handler = CandyBar.handlers[name]
|
|
if not handler then
|
|
return
|
|
end
|
|
|
|
handler.iconpos = position
|
|
if handler.running then
|
|
handler.frame.icon:SetPoint("LEFT", handler.frame, position, 0, 0)
|
|
end
|
|
return true
|
|
end
|
|
|
|
-- Sets the fading style of a candybar
|
|
-- args: name - name of the candybar
|
|
-- time - duration of the fade (default .5 seconds), negative to keep the bar on screen
|
|
-- returns true when succesful
|
|
function CandyBar:SetFade(name, time)
|
|
CandyBar:argCheck(name, 2, "string")
|
|
CandyBar:argCheck(time, 3, "number")
|
|
|
|
local handler = CandyBar.handlers[name]
|
|
if not handler then
|
|
return
|
|
end
|
|
|
|
handler.fadetime = time
|
|
handler.fadeout = true
|
|
handler.stayonscreen = (handler.fadetime < 0)
|
|
|
|
return true
|
|
end
|
|
|
|
function CandyBar:SetReversed(name, reversed)
|
|
CandyBar:argCheck(name, 2, "string")
|
|
CandyBar:argCheck(reversed, 3, "boolean", "nil")
|
|
|
|
local handler = CandyBar.handlers[name]
|
|
if not handler then
|
|
return
|
|
end
|
|
|
|
handler.reversed = reversed
|
|
return true
|
|
end
|
|
|
|
function CandyBar:IsReversed(name)
|
|
CandyBar:argCheck(name, 2, "string")
|
|
|
|
local handler = CandyBar.handlers[name]
|
|
if not handler then
|
|
return
|
|
end
|
|
|
|
return handler.reversed
|
|
end
|
|
|
|
|
|
-- Registers a candybar with a certain candybar group
|
|
-- args: name - name of the candybar
|
|
-- group - group to register the bar with
|
|
-- returns true when succesful
|
|
function CandyBar:RegisterWithGroup(name, group)
|
|
CandyBar:argCheck(name, 2, "string")
|
|
CandyBar:argCheck(group, 3, "string")
|
|
|
|
local handler = CandyBar.handlers[name]
|
|
local gtable = CandyBar.groups[group]
|
|
if not handler or not gtable then
|
|
return
|
|
end
|
|
|
|
CandyBar:UnregisterWithGroup(name)
|
|
|
|
tinsert(gtable.bars, name)
|
|
-- CandyBar.groups[group].bars[name] = name
|
|
handler.group = group
|
|
CandyBar:UpdateGroup(group)
|
|
|
|
return true
|
|
end
|
|
|
|
-- Unregisters a candybar from its group
|
|
-- args: name - name of the candybar
|
|
-- returns true when succesful
|
|
|
|
function CandyBar:UnregisterWithGroup(name)
|
|
CandyBar:argCheck(name, 2, "string")
|
|
|
|
local handler = CandyBar.handlers[name]
|
|
if not handler then
|
|
return
|
|
end
|
|
--if not CandyBar.handlers[name].group then return end
|
|
|
|
local group = handler.group
|
|
local gtable = CandyBar.groups[group]
|
|
if not gtable then
|
|
return
|
|
end
|
|
|
|
for k,v in pairs(gtable.bars) do
|
|
if v == name then
|
|
table.remove(gtable.bars, k)
|
|
end
|
|
end
|
|
-- CandyBar.groups[group].bars[name] = nil
|
|
handler.group = nil
|
|
|
|
CandyBar:UpdateGroup(group)
|
|
|
|
return true
|
|
end
|
|
|
|
-- Register a Candybar group
|
|
-- Args: name - name of the candybar group
|
|
-- returns true when succesful
|
|
function CandyBar:RegisterGroup(name)
|
|
CandyBar:argCheck(name, 2, "string")
|
|
|
|
if CandyBar.groups[name] then
|
|
return
|
|
end
|
|
|
|
local t = new()
|
|
|
|
t.point = "CENTER"
|
|
t.rframe = UIParent
|
|
t.rpoint = "CENTER"
|
|
t.xoffset = 0
|
|
t.yoffset = 0
|
|
t.bars = new()
|
|
t.height = -1
|
|
|
|
CandyBar.groups[name] = t
|
|
return true
|
|
end
|
|
|
|
-- Unregister a candybar group
|
|
-- Args: a1-a2 candybar group ids
|
|
-- returns true when succesful
|
|
function CandyBar:UnregisterGroup(a1, ...)
|
|
CandyBar:argCheck(a1, 2, "string")
|
|
if not CandyBar.groups[a1] then
|
|
return
|
|
end
|
|
CandyBar.groups[a1].bars = del(CandyBar.groups[a1].bars)
|
|
CandyBar.groups[a1] = del(CandyBar.groups[a1])
|
|
|
|
if getn(arg) > 0 then
|
|
CandyBar:UnregisterGroup(unpack(arg))
|
|
end
|
|
|
|
return true
|
|
end
|
|
|
|
-- Checks if a group is registered
|
|
-- Args: name - Candybar group
|
|
-- returns true if the candybar group is registered
|
|
function CandyBar:IsGroupRegistered(name)
|
|
CandyBar:argCheck(name, 2, "string")
|
|
return CandyBar.groups[name] and true or false
|
|
end
|
|
|
|
-- Checks if a bar is registered with a group
|
|
-- Args: name - Candybar name
|
|
-- group - group id [optional]
|
|
-- returns true is the candybar is registered with a/the group
|
|
function CandyBar:IsRegisteredWithGroup(name, group)
|
|
CandyBar:argCheck(name, 2, "string")
|
|
CandyBar:argCheck(group, 3, "string", "nil")
|
|
local handler = CandyBar.handlers[name]
|
|
if not handler then
|
|
return
|
|
end
|
|
|
|
if group then
|
|
if not CandyBar.groups[group] then
|
|
return false
|
|
end
|
|
if handler.group == group then
|
|
return true
|
|
end
|
|
elseif handler.group then
|
|
return true
|
|
end
|
|
return false
|
|
end
|
|
|
|
|
|
-- Set the point for a CandyBargroup
|
|
-- point -- anchor point
|
|
-- rframe -- relative frame
|
|
-- rpoint -- relative point
|
|
-- xoffset [optional] -- x offset
|
|
-- yoffset [optional] -- y offset
|
|
-- The first bar of the group will be anchored at the anchor.
|
|
-- returns true when succesful
|
|
function CandyBar:SetGroupPoint(name, point, rframe, rpoint, xoffset, yoffset)
|
|
CandyBar:argCheck(name, 2, "string")
|
|
CandyBar:argCheck(point, 3, "string")
|
|
CandyBar:argCheck(rframe, 4, "string", "table", "nil")
|
|
CandyBar:argCheck(rpoint, 5, "string", "nil")
|
|
CandyBar:argCheck(xoffset, 6, "number", "nil")
|
|
CandyBar:argCheck(yoffset, 6, "number", "nil")
|
|
|
|
local group = CandyBar.groups[name]
|
|
if not group then
|
|
return
|
|
end
|
|
|
|
group.point = point
|
|
group.rframe = rframe
|
|
group.rpoint = rpoint
|
|
group.xoffset = xoffset
|
|
group.yoffset = yoffset
|
|
CandyBar:UpdateGroup(name)
|
|
return true
|
|
end
|
|
|
|
-- SetGroupGrowth - sets the group to grow up or down
|
|
-- Args: name - name of the candybar group
|
|
-- growup - true if growing up, false for growing down
|
|
-- returns true when succesful
|
|
function CandyBar:SetGroupGrowth(name, growup)
|
|
CandyBar:argCheck(name, 2, "string")
|
|
CandyBar:argCheck(growup, 3, "boolean")
|
|
|
|
local group = CandyBar.groups[name]
|
|
if not group then
|
|
return
|
|
end
|
|
|
|
group.growup = growup
|
|
|
|
CandyBar:UpdateGroup(name)
|
|
|
|
return true
|
|
end
|
|
|
|
-- SetGroupVerticalSpacing - sets a vertical spacing between the bars of the group
|
|
-- Args: name - name of the candybar group
|
|
-- spacing - y offset for the bars
|
|
-- returns true when succesful
|
|
function CandyBar:SetGroupVerticalSpacing(name, spacing)
|
|
CandyBar:argCheck(name, 2, "string");
|
|
CandyBar:argCheck(spacing, 3, "number");
|
|
|
|
local group = CandyBar.groups[name]
|
|
if not group then
|
|
return
|
|
end
|
|
|
|
group.vertspacing = spacing;
|
|
|
|
CandyBar:UpdateGroup(name)
|
|
|
|
return true
|
|
end
|
|
|
|
local mysort = function(a, b)
|
|
return CandyBar.handlers[a].endtime < CandyBar.handlers[b].endtime
|
|
end
|
|
function CandyBar:SortGroup(name)
|
|
local group = CandyBar.groups[name]
|
|
if not group then
|
|
return
|
|
end
|
|
table.sort(group.bars, mysort)
|
|
end
|
|
|
|
-- internal method
|
|
-- UpdateGroup - updates the location of bars in a group
|
|
-- Args: name - name of the candybar group
|
|
-- returns true when succesful
|
|
|
|
function CandyBar:UpdateGroup(name)
|
|
local group = CandyBar.groups[name]
|
|
if not CandyBar.groups[name] then
|
|
return
|
|
end
|
|
|
|
local point = group.point
|
|
local rframe = group.rframe
|
|
local rpoint = group.rpoint
|
|
local xoffset = group.xoffset
|
|
local yoffset = group.yoffset
|
|
local m = -1
|
|
if group.growup then
|
|
m = 1
|
|
end
|
|
local vertspacing = group.vertspacing or 0
|
|
|
|
local bar = 0
|
|
local barh = 0
|
|
|
|
CandyBar:SortGroup(name)
|
|
|
|
for c,n in pairs(group.bars) do
|
|
local handler = CandyBar.handlers[n]
|
|
if handler then
|
|
if handler.frame:IsShown() then
|
|
CandyBar:SetPoint(n, point, rframe, rpoint, xoffset, yoffset + (m * bar))
|
|
barh = handler.height or defaults.height
|
|
bar = bar + barh + vertspacing
|
|
end
|
|
end
|
|
end
|
|
|
|
if group.height ~= bar then
|
|
group.height = bar
|
|
if group.onsize then
|
|
group.onsize(getArgs(group, "onsize", bar))
|
|
end
|
|
end
|
|
|
|
return true
|
|
end
|
|
|
|
function CandyBar:GetNextBarPointInGroup(name)
|
|
CandyBar:argCheck(name, 2, "string")
|
|
|
|
local group = CandyBar.groups[name]
|
|
if not CandyBar.groups[name] then
|
|
return
|
|
end
|
|
|
|
local xoffset = group.xoffset
|
|
local yoffset = group.yoffset
|
|
local m = -1
|
|
if group.growup then
|
|
m = 1
|
|
end
|
|
|
|
local bar = 0
|
|
local barh = 0
|
|
|
|
local vertspacing = group.vertspacing or 0
|
|
|
|
for c,n in pairs(group.bars) do
|
|
local handler = CandyBar.handlers[n]
|
|
if handler then
|
|
if handler.frame:IsShown() then
|
|
barh = handler.height or defaults.height
|
|
bar = bar + barh + vertspacing
|
|
end
|
|
end
|
|
end
|
|
|
|
return xoffset, yoffset + (m * bar)
|
|
end
|
|
|
|
-- Internal Method
|
|
-- Update a bar on screen
|
|
function CandyBar:Update(name)
|
|
local handler = CandyBar.handlers[name]
|
|
if not handler then
|
|
return
|
|
end
|
|
|
|
local t = handler.time - handler.elapsed
|
|
handler.slow = t>11
|
|
|
|
local timetext
|
|
if handler.timeformat then
|
|
timetext = handler.timeformat(t, getArgs(handler, "timeformat"))
|
|
else
|
|
local h = floor(t/3600)
|
|
local m = t - (h*3600)
|
|
m = floor(m/60)
|
|
local s = t - ((h*3600) + (m*60))
|
|
if h > 0 then
|
|
timetext = string.format("%d:%02d", h, m)
|
|
elseif m > 0 then
|
|
timetext = string.format("%d:%02d", m, floor(s))
|
|
elseif s < 10 then
|
|
timetext = string.format("%1.1f", s)
|
|
else
|
|
timetext = string.format("%.0f", floor(s))
|
|
end
|
|
end
|
|
handler.frame.timertext:SetText(timetext)
|
|
|
|
local perc = t / handler.time
|
|
|
|
local reversed = handler.reversed
|
|
handler.frame.statusbar:SetValue(reversed and 1-perc or perc)
|
|
|
|
local width = handler.width or defaults.width
|
|
|
|
local sp = width * perc
|
|
sp = reversed and -sp or sp
|
|
handler.frame.spark:SetPoint("CENTER", handler.frame.statusbar, reversed and "RIGHT" or "LEFT", sp, 0)
|
|
|
|
if handler.gradient then
|
|
local p = floor( (handler.elapsed / handler.time) * 100 ) / 100
|
|
local currentGradient = cachedgradient[handler.gradientid][p]
|
|
if currentGradient==nil then
|
|
-- find the appropriate start/end
|
|
local gstart, gend, gp
|
|
for i = 1, getn(handler.gradienttable) - 1 do
|
|
if handler.gradienttable[i][5] < p and p <= handler.gradienttable[i+1][5] then
|
|
-- the bounds are to assure no divide by zero error here.
|
|
|
|
gstart = handler.gradienttable[i]
|
|
gend = handler.gradienttable[i+1]
|
|
gp = (p - gstart[5]) / (gend[5] - gstart[5])
|
|
end
|
|
end
|
|
if gstart and gend then
|
|
-- calculate new gradient
|
|
currentGradient = new()
|
|
for i = 1, 4 do
|
|
-- these may be the same.. but I'm lazy to make sure.
|
|
tinsert(currentGradient, gstart[i]*(1-gp) + gend[i]*(gp))
|
|
end
|
|
cachedgradient[handler.gradientid][p] = currentGradient
|
|
end
|
|
end
|
|
if currentGradient~=nil then
|
|
handler.frame.statusbar:SetStatusBarColor(unpack(currentGradient))
|
|
end
|
|
end
|
|
end
|
|
|
|
-- Intenal Method
|
|
-- Fades the bar out when it's complete.
|
|
function CandyBar:UpdateFade(name)
|
|
local handler = CandyBar.handlers[name]
|
|
if not handler then
|
|
return
|
|
end
|
|
if not handler.fading then
|
|
return
|
|
end
|
|
if handler.stayonscreen then
|
|
return
|
|
end
|
|
|
|
-- if the fade is done go and keel the bar.
|
|
if handler.fadeelapsed > handler.fadetime then
|
|
handler.fading = nil
|
|
handler.starttime = nil
|
|
handler.endtime = 0
|
|
handler.frame:Hide()
|
|
if handler.group then
|
|
CandyBar:UpdateGroup(handler.group)
|
|
end
|
|
if handler.fireforget then
|
|
return CandyBar:Unregister(name)
|
|
end
|
|
else -- we're fading, set the alpha for the texts, statusbar and background. fade from default to 0 in the time given.
|
|
local t = handler.fadetime - CandyBar.handlers[name].fadeelapsed
|
|
local p = t / handler.fadetime
|
|
local color = handler.color or defaults.color
|
|
local bgcolor = handler.bgcolor or defaults.bgcolor
|
|
local bordercolor = handler.bordercolor or defaults.bordercolor
|
|
local textcolor = handler.textcolor or defaults.textcolor
|
|
local timertextcolor = handler.timertextcolor or defaults.timertextcolor
|
|
local colora = color[4] * p
|
|
local bgcolora = bgcolor[4] * p
|
|
local bordercolora = bordercolor[4] * p
|
|
local textcolora = textcolor[4] * p
|
|
local timertextcolora = timertextcolor[4] * p
|
|
|
|
handler.frame.statusbarbg:SetStatusBarColor(bgcolor[1], bgcolor[2], bgcolor[3], bgcolora)
|
|
handler.frame.statusbar:SetStatusBarColor(color[1], color[2], color[3], colora)
|
|
handler.frame.text:SetTextColor(textcolor[1], textcolor[2], textcolor[3], textcolora)
|
|
handler.frame.timertext:SetTextColor(timertextcolor[1], timertextcolor[2], timertextcolor[3], timertextcolora)
|
|
handler.frame:SetBackdropBorderColor(bordercolor[1], bordercolor[2], bordercolor[3], bordercolora)
|
|
handler.frame:SetBackdropColor(bgcolor[1], bgcolor[2], bgcolor[3], bgcolora)
|
|
|
|
handler.frame.icon:SetAlpha(p)
|
|
end
|
|
return true
|
|
end
|
|
do
|
|
local backdrop = { insets = {} }
|
|
local backdrop_insets = backdrop.insets
|
|
|
|
-- Internal Method
|
|
-- Create and return a new bar frame, recycles where needed
|
|
-- Name - which candybar is this for
|
|
-- Returns the frame
|
|
function CandyBar:AcquireBarFrame(name)
|
|
local handler = CandyBar.handlers[name]
|
|
if not handler then
|
|
return
|
|
end
|
|
|
|
local f = handler.frame
|
|
|
|
local color = handler.color or defaults.color
|
|
local bgcolor = handler.bgcolor or defaults.bgcolor
|
|
local bordercolor = handler.bordercolor or defaults.bordercolor
|
|
local bordertexture = handler.bordertexture or defaults.bordertexture
|
|
local icon = handler.icon or nil
|
|
local iconpos = handler.iconpos or defaults.iconpos
|
|
local texture = handler.texture or defaults.texture
|
|
local width = handler.width or defaults.width
|
|
local height = handler.height or defaults.height
|
|
local point = handler.point or defaults.point
|
|
local rframe = handler.rframe or defaults.rframe
|
|
local rpoint = handler.rpoint or defaults.rpoint
|
|
local xoffset = handler.xoffset or defaults.xoffset
|
|
local yoffset = handler.yoffset or defaults.yoffset
|
|
local text = handler.text or defaults.text
|
|
local fontsize = handler.fontsize or defaults.fontsize
|
|
local textcolor = handler.textcolor or defaults.textcolor
|
|
local timertextcolor = handler.timertextcolor or defaults.timertextcolor
|
|
local scale = handler.scale or defaults.scale
|
|
if not scale then
|
|
scale = 1
|
|
end
|
|
local timertextwidth = fontsize * 3.6
|
|
local font, _, style = GameFontHighlight:GetFont()
|
|
|
|
if not f and getn(CandyBar.framepool) > 0 then
|
|
f = table.remove(CandyBar.framepool)
|
|
end
|
|
|
|
if not f then
|
|
f = CreateFrame("Button", nil, UIParent)
|
|
end
|
|
f:Hide()
|
|
f.owner = name
|
|
-- yes we add the height to the width for the icon.
|
|
f:SetWidth(width + 10)
|
|
f:SetHeight(height + 10)
|
|
f:ClearAllPoints()
|
|
f:SetPoint(point, rframe, rpoint, xoffset, yoffset)
|
|
-- disable mouse
|
|
f:EnableMouse(false)
|
|
f:RegisterForClicks()
|
|
f:SetScript("OnClick", nil)
|
|
f:SetScale(scale)
|
|
-- LaYt
|
|
backdrop.bgFile = "Interface\\Tooltips\\UI-Tooltip-Background"
|
|
backdrop.tile = true
|
|
backdrop.tileSize = 16
|
|
backdrop.edgeFile = bordertexture
|
|
backdrop.edgeSize = 16
|
|
backdrop_insets.left = 4
|
|
backdrop_insets.right = 4
|
|
backdrop_insets.top = 4
|
|
backdrop_insets.bottom = 4
|
|
f:SetBackdrop(backdrop)
|
|
f:SetBackdropBorderColor(unpack(bordercolor, 1, 4))
|
|
f:SetBackdropColor(unpack(bgcolor, 1, 4))
|
|
|
|
if not f.icon then
|
|
f.icon = CreateFrame("Button", nil, f)
|
|
end
|
|
f.icon:ClearAllPoints()
|
|
f.icon.owner = name
|
|
f.icon:EnableMouse(false)
|
|
f.icon:RegisterForClicks()
|
|
f.icon:SetScript("OnClick", nil)
|
|
-- an icno is square and the height of the bar, so yes 2x height there
|
|
f.icon:SetHeight(height)
|
|
f.icon:SetWidth(height)
|
|
local delta = 0 -- height/2 + 2
|
|
if iconpos == "LEFT" then
|
|
f.icon:SetPoint("RIGHT", f, "LEFT", -2, 0)
|
|
|
|
else --L["Right"]
|
|
f.icon:SetPoint("LEFT", f, "RIGHT", 2, 0)
|
|
delta = -delta
|
|
end
|
|
-- f.icon:SetPoint("LEFT", f, iconpos, 0, 0)
|
|
f.icon:SetNormalTexture(icon)
|
|
if f.icon:GetNormalTexture() then
|
|
f.icon:GetNormalTexture():SetTexCoord( 0.07, 0.93, 0.07, 0.93)
|
|
end
|
|
f.icon:SetAlpha(1)
|
|
f.icon:Show()
|
|
|
|
if not f.statusbarbg then
|
|
f.statusbarbg = CreateFrame("StatusBar", nil, f)
|
|
f.statusbarbg:SetFrameLevel(f.statusbarbg:GetFrameLevel() - 1)
|
|
end
|
|
f.statusbarbg:ClearAllPoints()
|
|
f.statusbarbg:SetHeight(height)
|
|
f.statusbarbg:SetWidth(width)
|
|
-- offset the height of the frame on the x-axis for the icon.
|
|
-- f.statusbarbg:SetPoint("TOPLEFT", f, "TOPLEFT", height, 0)
|
|
f.statusbarbg:SetPoint('CENTER',f,'CENTER', delta, 0)
|
|
f.statusbarbg:SetStatusBarTexture(texture)
|
|
f.statusbarbg:SetStatusBarColor(bgcolor[1],bgcolor[2],bgcolor[3],bgcolor[4])
|
|
f.statusbarbg:SetMinMaxValues(0,100)
|
|
f.statusbarbg:SetValue(100)
|
|
|
|
if not f.statusbar then
|
|
f.statusbar = CreateFrame("StatusBar", nil, f)
|
|
end
|
|
f.statusbar:ClearAllPoints()
|
|
f.statusbar:SetHeight(height)
|
|
f.statusbar:SetWidth(width)
|
|
-- offset the height of the frame on the x-axis for the icon.
|
|
-- f.statusbar:SetPoint("TOPLEFT", f, "TOPLEFT", height, 0)
|
|
f.statusbar:SetPoint('CENTER',f,'CENTER', delta, 0)
|
|
f.statusbar:SetStatusBarTexture(texture)
|
|
f.statusbar:SetStatusBarColor(color[1], color[2], color[3], color[4])
|
|
f.statusbar:SetMinMaxValues(0,1)
|
|
f.statusbar:SetValue(1)
|
|
|
|
|
|
if not f.spark then
|
|
f.spark = f.statusbar:CreateTexture(nil, "OVERLAY")
|
|
end
|
|
f.spark:SetTexture("Interface\\CastingBar\\UI-CastingBar-Spark")
|
|
f.spark:SetWidth(16)
|
|
f.spark:SetHeight(height + 25)
|
|
f.spark:SetBlendMode("ADD")
|
|
f.spark:Show()
|
|
|
|
if not f.timertext then
|
|
f.timertext = f.statusbar:CreateFontString(nil, "OVERLAY")
|
|
end
|
|
f.timertext:SetFontObject(GameFontHighlight)
|
|
f.timertext:SetFont(font, fontsize, style)
|
|
f.timertext:SetHeight(height)
|
|
f.timertext:SetWidth(timertextwidth)
|
|
f.timertext:SetPoint("LEFT", f.statusbar, "LEFT", 0, 0)
|
|
f.timertext:SetJustifyH("RIGHT")
|
|
f.timertext:SetText("")
|
|
f.timertext:SetTextColor(timertextcolor[1], timertextcolor[2], timertextcolor[3], timertextcolor[4])
|
|
|
|
if not f.text then
|
|
f.text = f.statusbar:CreateFontString(nil, "OVERLAY")
|
|
end
|
|
f.text:SetFontObject(GameFontHighlight)
|
|
f.text:SetFont(font, fontsize, style)
|
|
f.text:SetHeight(height)
|
|
f.text:SetWidth((width - timertextwidth) *.9)
|
|
f.text:SetPoint("RIGHT", f.statusbar, "RIGHT", 0, 0)
|
|
f.text:SetJustifyH("LEFT")
|
|
f.text:SetText(text)
|
|
f.text:SetTextColor(textcolor[1], textcolor[2], textcolor[3], textcolor[4])
|
|
|
|
if handler.onclick then
|
|
f:EnableMouse(true)
|
|
f:RegisterForClicks("LeftButtonUp", "RightButtonUp", "MiddleButtonUp", "Button4Up", "Button5Up", "RightButtonDown")
|
|
f:SetScript("OnClick", onClick)
|
|
f.icon:EnableMouse(true)
|
|
f.icon:RegisterForClicks("LeftButtonUp", "RightButtonUp", "MiddleButtonUp", "Button4Up", "Button5Up", "RightButtonDown")
|
|
f.icon:SetScript("OnClick", onClick)
|
|
end
|
|
|
|
return f
|
|
end
|
|
end
|
|
|
|
-- Internal Method
|
|
-- Releases a bar frame into the pool
|
|
-- Name - which candybar's frame are we're releasing
|
|
-- Returns true when succesful
|
|
function CandyBar:ReleaseBarFrame(name)
|
|
local handler = CandyBar.handlers[name]
|
|
if not handler then
|
|
return
|
|
end
|
|
if not handler.frame then
|
|
return
|
|
end
|
|
handler.frame:Hide()
|
|
tinsert(CandyBar.framepool, handler.frame)
|
|
return true
|
|
end
|
|
|
|
-- Internal Method
|
|
-- Executes the OnClick function of a bar
|
|
function CandyBar:OnClick()
|
|
if not this.owner then
|
|
return
|
|
end
|
|
local handler = CandyBar.handlers[this.owner]
|
|
if not handler then
|
|
return
|
|
end
|
|
if not handler.onclick then
|
|
return
|
|
end
|
|
-- pass the name of the handlers first, and the button clicked as the second argument
|
|
local button = arg1
|
|
handler.onclick(this.owner, button, getArgs(handler, "onclick"))
|
|
return true
|
|
end
|
|
|
|
-- Internal Method
|
|
-- on update handler
|
|
local lastSlow = 0
|
|
function CandyBar:OnUpdate()
|
|
local doslow
|
|
lastSlow = lastSlow + arg1
|
|
if lastSlow > 0.04 then
|
|
doslow = true
|
|
lastSlow = 0
|
|
end
|
|
|
|
local t
|
|
for i,v in pairs(this.owner.handlers) do
|
|
if not t then t = GetTime() end
|
|
if (not doslow) and v.slow then
|
|
-- nada
|
|
elseif v.running then
|
|
v.elapsed = t - v.starttime
|
|
if v.endtime <= t then
|
|
local c = this.owner.handlers[i]
|
|
if c.completion then
|
|
if not c.completion(getArgs(c, "completion")) then
|
|
this.owner:Stop(i)
|
|
end
|
|
else
|
|
this.owner:Stop(i)
|
|
end
|
|
else
|
|
this.owner:Update(i)
|
|
end
|
|
elseif v.fading and not v.stayonscreen then
|
|
v.fadeelapsed = (t - v.endtime)
|
|
this.owner:UpdateFade(i)
|
|
end
|
|
end
|
|
end
|
|
|
|
-- Internal Method
|
|
-- returns true if we have any handlers
|
|
function CandyBar:HasHandlers()
|
|
return next(CandyBar.handlers) and true
|
|
end
|
|
|
|
------------------------------
|
|
-- Mixins Methods --
|
|
------------------------------
|
|
|
|
CandyBar.IsCandyBarRegistered = CandyBar.IsRegistered
|
|
CandyBar.StartCandyBar = CandyBar.Start
|
|
CandyBar.StopCandyBar = CandyBar.Stop
|
|
CandyBar.PauseCandyBar = CandyBar.Pause
|
|
CandyBar.CandyBarStatus = CandyBar.Status
|
|
CandyBar.SetCandyBarTexture = CandyBar.SetTexture
|
|
CandyBar.SetCandyBarTime = CandyBar.SetTime
|
|
CandyBar.SetCandyBarColor = CandyBar.SetColor
|
|
CandyBar.SetCandyBarText = CandyBar.SetText
|
|
CandyBar.SetCandyBarIcon = CandyBar.SetIcon
|
|
CandyBar.SetCandyBarIconPosition = CandyBar.SetIconPosition
|
|
CandyBar.SetCandyBarBackgroundColor = CandyBar.SetBackgroundColor
|
|
CandyBar.SetCandyBarBorderColor = CandyBar.SetBorderColor
|
|
CandyBar.SetCandyBarBorderTexture = CandyBar.SetBorderTexture
|
|
CandyBar.SetCandyBarTextColor = CandyBar.SetTextColor
|
|
CandyBar.SetCandyBarTimerTextColor = CandyBar.SetTimerTextColor
|
|
CandyBar.SetCandyBarFontSize = CandyBar.SetFontSize
|
|
CandyBar.SetCandyBarPoint = CandyBar.SetPoint
|
|
CandyBar.GetCandyBarPoint = CandyBar.GetPoint
|
|
CandyBar.GetCandyBarCenter = CandyBar.GetCenter
|
|
CandyBar.GetCandyBarOffsets = CandyBar.GetOffsets
|
|
CandyBar.GetCandyBarEffectiveScale = CandyBar.GetEffectiveScale
|
|
CandyBar.SetCandyBarScale = CandyBar.SetScale
|
|
CandyBar.SetCandyBarTimeFormat = CandyBar.SetTimeFormat
|
|
CandyBar.SetCandyBarTimeLeft = CandyBar.SetTimeLeft
|
|
CandyBar.SetCandyBarCompletion = CandyBar.SetCompletion
|
|
CandyBar.RegisterCandyBarGroup = CandyBar.RegisterGroup
|
|
CandyBar.UnregisterCandyBarGroup = CandyBar.UnregisterGroup
|
|
CandyBar.IsCandyBarGroupRegistered = CandyBar.IsGroupRegistered
|
|
CandyBar.SetCandyBarGroupPoint = CandyBar.SetGroupPoint
|
|
CandyBar.SetCandyBarGroupGrowth = CandyBar.SetGroupGrowth
|
|
CandyBar.SetCandyBarGroupVerticalSpacing = CandyBar.SetGroupVerticalSpacing
|
|
CandyBar.UpdateCandyBarGroup = CandyBar.UpdateGroup
|
|
CandyBar.GetCandyBarNextBarPointInGroup = CandyBar.GetNextBarPointInGroup
|
|
CandyBar.SetCandyBarOnClick = CandyBar.SetOnClick
|
|
CandyBar.SetCandyBarFade = CandyBar.SetFade
|
|
CandyBar.RegisterCandyBarWithGroup = CandyBar.RegisterWithGroup
|
|
CandyBar.UnregisterCandyBarWithGroup = CandyBar.UnregisterWithGroup
|
|
CandyBar.IsCandyBarRegisteredWithGroup = CandyBar.IsRegisteredWithGroup
|
|
CandyBar.SetCandyBarReversed = CandyBar.SetReversed
|
|
CandyBar.IsCandyBarReversed = CandyBar.IsReversed
|
|
CandyBar.SetCandyBarOnClick = CandyBar.SetOnClick
|
|
CandyBar.SetCandyBarHeight = CandyBar.SetHeight
|
|
CandyBar.SetCandyBarWidth = CandyBar.SetWidth
|
|
CandyBar.SetCandyBarOnSizeGroup = CandyBar.SetOnSizeGroup
|
|
|
|
function CandyBar:RegisterCandyBar(name, time, text, icon, ...)
|
|
if not CandyBar.addons[self] then
|
|
CandyBar.addons[self] = new()
|
|
end
|
|
CandyBar.addons[self][name] = CandyBar:Register(name, time, text, icon, unpack(arg))
|
|
end
|
|
|
|
function CandyBar:UnregisterCandyBar(a1, ...)
|
|
CandyBar:argCheck(a1, 2, "string")
|
|
if CandyBar.addons[self] then
|
|
CandyBar.addons[self][a1] = nil
|
|
end
|
|
CandyBar:Unregister(a1)
|
|
if getn(arg)>0 then
|
|
self:UnregisterCandyBar(unpack(arg))
|
|
end
|
|
end
|
|
|
|
function CandyBar:OnEmbedDisable(target)
|
|
if self.addons[target] then
|
|
for i in pairs(self.addons[target]) do
|
|
self:Unregister(i)
|
|
end
|
|
end
|
|
end
|
|
|
|
--------------------------------
|
|
-- Load this bitch! --
|
|
--------------------------------
|
|
|
|
local function activate(self, oldLib, oldDeactivate)
|
|
CandyBar = self
|
|
|
|
self.frame = oldLib and (oldLib.frame or oldLib.var and oldLib.var.frame)
|
|
if not self.frame then
|
|
self.frame = CreateFrame("Frame")
|
|
self.frame:Hide()
|
|
self.frame.name = "CandyBar-2.0 Frame"
|
|
end
|
|
|
|
self.handlers = oldLib and (oldLib.handlers or oldLib.var and oldLib.var.handlers) or {}
|
|
self.groups = oldLib and (oldLib.groups or oldLib.var and oldLib.var.groups) or {}
|
|
self.framepool = oldLib and (oldLib.framepool or oldLib.var and oldLib.var.framepool) or {}
|
|
self.addons = oldLib and (oldLib.addons or oldLib.var and oldLib.var.addons) or {}
|
|
|
|
self.frame:SetScript("OnUpdate", self.OnUpdate)
|
|
self.frame.owner = self
|
|
|
|
self:activate(oldLib, oldDeactivate)
|
|
|
|
if oldDeactivate then
|
|
oldDeactivate(oldLib)
|
|
end
|
|
end
|
|
|
|
local function external(self, major, instance)
|
|
if major == "PaintChips-2.0" then
|
|
paint = instance
|
|
end
|
|
end
|
|
|
|
AceLibrary:Register(CandyBar, vmajor, vminor, activate, nil, external)
|
|
|