vanilla-wow-addons – Rev 1
?pathlinks?
-- Does not get called if the timer is paused or stopped.
-- The function is called with two parameters:
-- First parameter (integer): The time remaining (if counting down)/time elapsed(if counting up), both in seconds.
-- Second parameter (integer): Whether the timer is counting up or down (1 for up, -1 for down).
CT_Timer_CallFunctions = { };
-- Global variable. Add your function to the list to get it called every time the timer counts 1 second (works both counting up and counting down).
-- You can add the function using "tinsert(CT_Timer_CallFunctions, functionName);"
CT_Timer = { };
function CT_Timer_OnMouseOver()
CT_TimerFrameDragClickFrame.step = 0.05;
end
function CT_Timer_OnMouseOut()
CT_TimerFrameDragClickFrame.step = -0.05;
end
function CT_Timer_Toggle(btn)
if ( not btn ) then btn = this:GetParent(); end
if ( CT_Timer.status and CT_Timer.status == 1 ) then
CT_Timer.status = 0;
getglobal(btn:GetName() .. "Time"):SetTextColor(1, 0.5, 0);
CT_Timer.color = { 1, 0.5, 0 };
else
if ( not CT_Timer.status ) then
if ( CT_Timer.time > 0 ) then
CT_Timer.countfrom = CT_Timer_GetTimeString(CT_Timer.time);
CT_Timer.step = -1;
else
CT_Timer.step = 1;
end
end
getglobal(btn:GetName() .. "Time"):SetTextColor(0, 1, 0);
CT_Timer.color = { 0, 1, 0 };
CT_Timer.status = 1;
end
end
function CT_Timer_UpdateTime(elapsed)
if ( CT_Timer.hideBG ) then
CT_Timer.alphaUpdate = ( CT_Timer.alphaUpdate or 0 ) + elapsed;
if ( CT_Timer.alphaUpdate > 0.05 ) then
if ( ( not CT_Timer.alphaWait or CT_Timer.alphaWait < 1 ) and ( CT_TimerFrameDragClickFrame.step or 0 ) > 0 ) then
CT_Timer.alphaWait = ( CT_Timer.alphaWait or 0 ) + elapsed;
CT_TimerFrameHeaderTexture:SetAlpha(0);
CT_TimerFrameScrollDownHour:SetAlpha(0);
CT_TimerFrameScrollDownMin:SetAlpha(0);
CT_TimerFrameScrollUpHour:SetAlpha(0);
CT_TimerFrameScrollUpMin:SetAlpha(0);
else
CT_Timer.alpha = ( CT_Timer.alpha or 0 ) + ( CT_TimerFrameDragClickFrame.step or 0 );
if ( CT_Timer.alpha < 0 ) then
CT_Timer.alpha = 0;
CT_Timer.alphaWait = nil;
elseif ( CT_Timer.alpha > 1 ) then
CT_Timer.alpha = 1;
end
CT_TimerFrameHeaderTexture:SetAlpha(CT_Timer.alpha);
CT_TimerFrameScrollDownHour:SetAlpha(CT_Timer.alpha);
CT_TimerFrameScrollDownMin:SetAlpha(CT_Timer.alpha);
CT_TimerFrameScrollUpHour:SetAlpha(CT_Timer.alpha);
CT_TimerFrameScrollUpMin:SetAlpha(CT_Timer.alpha);
end
end
else
CT_Timer.alpha = nil;
CT_Timer.alphaWait = nil;
CT_Timer.alphaUpdate = nil;
CT_TimerFrameHeaderTexture:SetAlpha(1);
CT_TimerFrameScrollDownHour:SetAlpha(1);
CT_TimerFrameScrollDownMin:SetAlpha(1);
CT_TimerFrameScrollUpHour:SetAlpha(1);
CT_TimerFrameScrollUpMin:SetAlpha(1);
end
if ( not CT_Timer.status or CT_Timer.status == 0 ) then
if ( CT_Timer.color ) then
CT_TimerFrameTime:SetTextColor(CT_Timer.color[1], CT_Timer.color[2], CT_Timer.color[3]);
end
return;
end
CT_TimerFrame.update = ( CT_TimerFrame.update or 0 ) + elapsed;
if ( CT_TimerFrame.update >= 1 ) then
if ( CT_Timer.color ) then
CT_TimerFrameTime:SetTextColor(CT_Timer.color[1], CT_Timer.color[2], CT_Timer.color[3]);
end
CT_Timer.time = CT_Timer.time + CT_Timer.step;
-- Process call list
for k, v in CT_Timer_CallFunctions do
if ( type(v) == "function" ) then
v(CT_Timer.time, CT_Timer.step);
end
end
if ( CT_Timer.time == 0 ) then
DEFAULT_CHAT_FRAME:AddMessage(format(CT_TIMER_FINISHCOUNT, CT_Timer.countfrom), 1, 0.5, 0);
PlaySound("TellMessage");
CT_Timer_Reset();
else
CT_Timer_SetTime(CT_Timer.time, CT_TimerFrame);
end
CT_TimerFrame.update = CT_TimerFrame.update - 1;
end
end
function CT_Timer_Start(seconds)
CT_Timer.status = 1;
if ( seconds ) then
CT_Timer.step = -1;
CT_Timer.countfrom = CT_Timer_GetTimeString(seconds);
else
CT_Timer.step = 1;
end
if ( seconds ) then
CT_Timer.time = seconds;
else
CT_Timer.time = 0;
end
CT_TimerFrameTime:SetTextColor(0, 1, 0);
CT_Timer.color = { 0, 1, 0 };
end
function CT_Timer_Pause(newStatus)
if ( not newStatus and ( not CT_Timer.status or CT_Timer.status == 0 ) ) then
newStatus = 1;
elseif ( newStatus and newStatus ~= 0 and newStatus ~= 1 ) then
newStatus = nil;
end
if ( newStatus ) then
if ( not CT_Timer.status ) then
if ( CT_Timer.time > 0 ) then
CT_Timer.countfrom = CT_Timer_GetTimeString(CT_Timer.time);
CT_Timer.step = -1;
else
CT_Timer.step = 1;
end
end
CT_Timer.status = 1;
CT_TimerFrameTime:SetTextColor(0, 1, 0);
CT_Timer.color = { 0, 1, 0 };
else
CT_Timer.status = 0;
CT_TimerFrameTime:SetTextColor(1, 0.5, 0);
CT_Timer.color = { 1, 0.5, 0 };
end
end
function CT_Timer_SetTime(num, field)
if ( not num ) then return; end
local hours, mins, secs, temp;
if ( num >= 3600 ) then
hours = floor(num / 3600);
temp = num - (hours*3600);
mins = floor(temp / 60);
secs = temp - (mins*60);
elseif ( num >= 60 ) then
hours = 0;
mins = floor(num / 60);
secs = num - (mins*60);
else
hours = 0;
mins = 0;
secs = num;
end
if ( not CT_Timer.showsecs ) then
getglobal(field:GetName() .. "Time"):SetText(CT_Timer_AddZeros(hours) .. ":" .. CT_Timer_AddZeros(mins));
else
getglobal(field:GetName() .. "Time"):SetText(CT_Timer_AddZeros(hours) .. ":" .. CT_Timer_AddZeros(mins) .. ":" .. CT_Timer_AddZeros(secs));
end
if ( CT_Timer.time < 60 ) then
CT_TimerFrameScrollDownMin:Disable();
CT_TimerFrameScrollDownHour:Disable();
elseif ( CT_Timer.time < 3600 ) then
CT_TimerFrameScrollDownHour:Disable();
CT_TimerFrameScrollDownMin:Enable();
else
CT_TimerFrameScrollDownMin:Enable();
CT_TimerFrameScrollDownHour:Enable();
end
end
function CT_Timer_GetTimeString(num)
local hours, mins, secs;
if ( num >= 3600 ) then
hours = floor(num / 3600);
mins = floor(mod(num, 3600) / 60);
else
hours = 0;
mins = floor(num / 60);
end
if ( hours == 0 ) then
if ( mins == 1 ) then
return "1 " .. CT_TIMER_MIN;
else
return mins .. " " .. CT_TIMER_MINS;
end
else
local str;
if ( hours == 1 ) then
str = "1 " .. CT_TIMER_HOUR;
else
str = hours .. " " .. CT_TIMER_HOURS;
end
if ( mins == 0 ) then
return str;
elseif ( mins == 1 ) then
return str .. " and 1 " .. CT_TIMER_MIN;
else
return str .. " and " .. mins .. CT_TIMER_MINS;
end
end
end
function CT_Timer_AddZeros(num)
if ( strlen(num) == 1 ) then
return "0" .. num;
elseif ( strlen(num) == 2 ) then
return num;
else
return "--";
end
end
function CT_Timer_ModTime(num)
CT_Timer.time = CT_Timer.time + num;
if ( CT_Timer.time < 0 ) then
CT_Timer.time = 0;
end
CT_Timer_SetTime(CT_Timer.time, this:GetParent());
end
function CT_Timer_SetTimerTime(num)
if ( num < 0 ) then
num = 0;
end
CT_Timer.time = num;
CT_Timer_SetTime(CT_Timer.time, CT_TimerFrame);
end
function CT_Timer_Reset()
CT_TimerFrameTime:SetTextColor(1, 0, 0);
CT_Timer.color = { 1, 0, 0 };
CT_Timer.status = nil;
CT_Timer.time = 0;
CT_Timer.countfrom = nil;
CT_Timer_SetTime(CT_Timer.time, CT_TimerFrame);
end
if ( CT_RegisterMod ) then
local function modfunc(modId)
if ( CT_TimerOptionsFrame:IsVisible() ) then
HideUIPanel(CT_TimerOptionsFrame);
else
ShowUIPanel(CT_TimerOptionsFrame);
end
end
CT_RegisterMod( CT_TIMER_MODNAME,
CT_TIMER_SUBNAME,
5,
"Interface\\Icons\\INV_Misc_Key_02",
CT_TIMER_TOOLTIP,
"off",
nil,
modfunc
);
end
SlashCmdList["TIMER"] = function(msg)
if ( msg == "" ) then
DEFAULT_CHAT_FRAME:AddMessage("<CTMod> " .. CT_TIMER_HELP[1], 1, 1, 0);
DEFAULT_CHAT_FRAME:AddMessage("<CTMod> " .. CT_TIMER_HELP[2], 1, 1, 0);
DEFAULT_CHAT_FRAME:AddMessage("<CTMod> " .. CT_TIMER_HELP[3], 1, 1, 0);
DEFAULT_CHAT_FRAME:AddMessage("<CTMod> " .. CT_TIMER_HELP[4], 1, 1, 0);
DEFAULT_CHAT_FRAME:AddMessage("<CTMod> " .. CT_TIMER_HELP[5], 1, 1, 0);
DEFAULT_CHAT_FRAME:AddMessage("<CTMod> " .. CT_TIMER_HELP[6], 1, 1, 0);
DEFAULT_CHAT_FRAME:AddMessage("<CTMod> " .. CT_TIMER_HELP[7], 1, 1, 0);
DEFAULT_CHAT_FRAME:AddMessage("<CTMod> " .. CT_TIMER_HELP[8], 1, 1, 0);
DEFAULT_CHAT_FRAME:AddMessage("<CTMod> " .. CT_TIMER_HELP[9], 1, 1, 0);
DEFAULT_CHAT_FRAME:AddMessage("<CTMod> " .. CT_TIMER_HELP[10], 1, 1, 0);
elseif ( msg == "show" ) then
DEFAULT_CHAT_FRAME:AddMessage("<CTMod> " .. CT_TIMER_SHOW_ON, 1, 1, 0);
CT_TimerFrame:Show();
CT_Timer.show = 1;
elseif ( msg == "hide" ) then
DEFAULT_CHAT_FRAME:AddMessage("<CTMod> " .. CT_TIMER_SHOW_OFF, 1, 1, 0);
CT_TimerFrame:Hide();
CT_Timer.show = nil;
CT_Timer_ShowTimer = 0;
elseif ( msg == "secs on" ) then
CT_Timer.showsecs = 1;
DEFAULT_CHAT_FRAME:AddMessage("<CTMod> " .. CT_TIMER_SHOWSECS_ON, 1, 1, 0);
CT_Timer_SetTime(CT_Timer.time, CT_TimerFrame);
elseif ( msg == "secs off" ) then
CT_Timer.showsecs = nil;
DEFAULT_CHAT_FRAME:AddMessage("<CTMod> " .. CT_TIMER_SHOWSECS_OFF, 1, 1, 0);
CT_Timer_SetTime(CT_Timer.time, CT_TimerFrame);
elseif ( msg == "start" ) then
CT_Timer_Start();
elseif ( msg == "stop" ) then
CT_Timer_Pause();
elseif ( msg == "reset" ) then
CT_Timer_Reset();
elseif ( msg == "bg on" ) then
CT_Timer.hideBG = nil;
CT_Timer.alphaUpdate = 5; -- Force redraw
elseif ( msg == "bg off" ) then
CT_Timer.hideBG = 1;
CT_Timer.alphaUpdate = 5; -- Force redraw
elseif ( msg == "options" ) then
ShowUIPanel(CT_TimerOptionsFrame);
elseif ( string.find(msg, "^%d+$") ) then
local _, _, mins = string.find(msg, "^(%d+)$");
CT_Timer_Start(tonumber(mins)*60);
elseif ( string.find(msg, "^%d+:%d+$") ) then
local _, _, mins, sec = string.find(msg, "^(%d+):(%d+)$");
CT_Timer_Start(tonumber(mins)*60+tonumber(sec));
else
SlashCmdList["TIMER"]("");
end
end
SLASH_TIMER1 = "/timer";
SLASH_TIMER2 = "/tr";
function CT_Timer_OnEvent(event)
if ( event == "VARIABLES_LOADED" and not CT_RegisterMod ) then
if ( CT_Timer.color ) then
CT_TimerFrameTime:SetTextColor(CT_Timer.color[1], CT_Timer.color[2], CT_Timer.color[3]);
end
CT_Timer_SetTime(CT_Timer.time, CT_TimerFrame);
end
end
tinsert(UISpecialFrames, "CT_TimerOptionsFrame");
function CT_TimerOptions_Initialize()
CT_TimerOptions_OnClick(1, CT_Timer.show);
CT_TimerOptions_OnClick(2, CT_Timer.showsecs);
CT_TimerOptions_OnClick(3, CT_Timer.hideBG);
end
function CT_TimerOptions_OnClick(id, checked)
if ( id == 1 ) then
CT_Timer.show = checked;
getglobal("CT_TimerOptionsFrameShowTimerCB"):SetChecked(checked);
if ( checked ) then
CT_TimerFrame:Show();
else
CT_TimerFrame:Hide();
end
elseif ( id == 2 ) then
CT_Timer.showsecs = checked;
getglobal("CT_TimerOptionsFrameShowSecondsCB"):SetChecked(checked);
CT_Timer_SetTime(CT_Timer.time, CT_TimerFrame);
elseif ( id == 3 ) then
CT_Timer.hideBG = checked;
getglobal("CT_TimerOptionsFrameHideBackgroundCB"):SetChecked(checked);
CT_Timer.alphaUpdate = 5; -- Force redraw
end
end
Generated by GNU Enscript 1.6.5.90.