-- CountDoom 0.46 -- CountDoomTimer stuff -- Author: Scrum CDTimer_maxButtons = 5; CDTimer_numTimers = 0; CDTIMERPRIORITY_LOW = 2; CDTIMERPRIORITY_MEDIUM = 1; CDTIMERPRIORITY_HIGH = 0; CDTIMEREVENT_ONUPDATE = 1; CDTIMEREVENT_ONTIMERWARNING = 2; CDTIMEREVENT_ONTIMEREND = 3; CDTIMEREVENT_ONMOVETIMER = 4; CDTIMEREVENT_ONENTER = 5; CDTIMEREVENT_ONLEAVE = 6; CDTIMEREVENT_ONMOUSEDOWN = 7; CDTIMEREVENT_ONMOUSEUP = 8; CDTIMEREVENT_ONCLICK = 9; CDTIMEREVENT_MAXEVENTS = 10; CDTimers = {}; --Internal members --userHandle - custom object to store anything in a timer --startTime - time timer was created --warningTime - number of seconds before warning is signaled --duration - lifetime of timer. -1 is infinite --icon - cache of texture to be displayed --text - cache of text to be displayed --flashInterval - flash period in seconds. 0 = disabled --flashTime - time within flash period [0 .. flashInterval] --funcHandlers - table of callbacks based on events --priority - determines button priority {HIGH, NORMAL, LOW} --countDown - true if display a countdown versus a countup --prefix - text added to beginning of timer countdown text --suffix - text added to end of timer countdown text --Public methods --CDTimer_Create( priority, duration, warningTime, handle ) --CDTimer_Destroy( timerIndex ) --CDTimer_SetFunctionHandler( timerIndex, handlerName, funcHandler ) --CDTimer_GetRemainingTime( timerIndex ) --CDTimer_SetText( timerIndex, timerText ) --CDTimer_GetText( timerIndex ) --CDTimer_SetIcon( timerIndex, timerIcon ) --CDTimer_GetIcon( timerIndex ) --CDTimer_SetWarningTime( timerIndex, warningTime ) --CDTimer_GetWarningTime( timerIndex ) --CDTimer_SetUserHandle( timerIndex, userHandle ) --CDTimer_GetUserHandle( timerIndex ) --CDTimer_SetCountDown( timerIndex, countDown ); --CDTimer_GetCountDown( timerIndex ); --CDTimer_EnableFlash( timerIndex, interval ) --CDTimer_DisableFlash( timerIndex ) --CDTimer_SetPriority( timerIndex, priority ); --CDTimer_Copy( destIndex, srcIndex ); --CDTimer_SetTimerPrefix( timerPrefix, prefixStr ) --CDTimer_SetTimerSuffix( timerPrefix, suffixStr ) --Private methods --CDTimer_GenericHandler( timerIndex, eventName, arg1 ) --CDTimer_OnUpdate(arg1) --CDTimer_OnEnter(arg1) --CDTimer_OnLeave(arg1) --CDTimer_OnMouseDown(arg1) --CDTimer_OnMouseUp(arg1) --CDTimer_OnClick(arg1) --CDTimer_ShowButton( timerIndex, showButton ) --CDTimer_SetAlpha( timerIndex, alpha ) - NOTE: This is used by the flashing logic and shouldn't be called directly --CDTimer_UpdateFlash( timerIndex, timeDelta ) local function CDTimer_Dump( timerIndex ) CountDoom.dpf( "Timer: " .. timerIndex ); CountDoom.dpf( "userHandle: " .. CDTimers[ timerIndex ].userHandle ); CountDoom.dpf( "startTime: " .. CDTimers[ timerIndex ].startTime ); CountDoom.dpf( "warningTime: " .. CDTimers[ timerIndex ].warningTime ); CountDoom.dpf( "duration: " .. CDTimers[ timerIndex ].duration ); CountDoom.dpf( "icon: " .. CountDoom.ToStr( CDTimers[ timerIndex ].icon ) ); CountDoom.dpf( "text: " .. CountDoom.ToStr( CDTimers[ timerIndex ].text ) ); CountDoom.dpf( "flashInterval: " .. CDTimers[ timerIndex ].flashInterval ); CountDoom.dpf( "flashTime: " .. CDTimers[ timerIndex ].flashTime ); CountDoom.dpf( "priority: " .. CDTimers[ timerIndex ].priority ); end local function CDTimer_DumpAll() local timerIndex; for timerIndex = 0, CDTimer_numTimers - 1, 1 do CDTimer_Dump( timerIndex ); end end local function CDTimer_SetAlpha( timerIndex, alpha ) if CDTimers[ timerIndex ] == nil then CountDoom.dpf( "Invalid timerIndex in CDTimer_SetAlpha" ); return; end local buttonName = "CDTimerButton" .. timerIndex .. "_DurationText"; local buttonItem = getglobal( buttonName ); if( buttonItem ~= nil ) then buttonItem:SetAlpha( alpha ); elseif timerIndex < CDTimer_maxButtons then CountDoom.dpf( "Unable to call " .. buttonName .. ":SetAlpha()" ); end --TODO set the icon alpha also end local function CDTimer_ShowButton( timerIndex, showButton ) CountDoom.dpf( "CDTimer_ShowButton(" .. CountDoom.ToStr( timerIndex ) .. ")" ); if timerIndex >= CDTimer_numTimers then CountDoom.dpf( "CDTimer_ShowButton: Invalid index " .. timerIndex ); return end local buttonName = "CDTimerButton" .. timerIndex; local buttonItem = getglobal( buttonName ); if( buttonItem ~= nil ) then if( showButton ) then CountDoom.dpf( "CDTimer_ShowButton: calling Show() " ); buttonItem:Show(); else CountDoom.dpf( "CDTimer_ShowButton: calling Hide() " ); buttonItem:Hide(); end elseif timerIndex < CDTimer_maxButtons then CountDoom.dpf( "Unable to call " .. buttonName .. ":Show()" ); end end local function CDTimer_UpdateFlash( timerIndex, timeDelta ) if CDTimers[ timerIndex ] == nil then CountDoom.dpf( "Invalid timerIndex in CDTimer_UpdateFlash" ); return -1; end if CDTimers[ timerIndex ].flashInterval <= 0.0 then return end CDTimers[ timerIndex ].flashTime = CDTimers[ timerIndex ].flashTime + timeDelta; while CDTimers[ timerIndex ].flashTime > CDTimers[ timerIndex ].flashInterval do CDTimers[ timerIndex ].flashTime = CDTimers[ timerIndex ].flashTime - CDTimers[ timerIndex ].flashInterval; end local alpha = 2.0 * CDTimers[ timerIndex ].flashTime / CDTimers[ timerIndex ].flashInterval; if( alpha > 1.0 ) then alpha = 2.0 - alpha; end CDTimer_SetAlpha( timerIndex, alpha ); end local function CDTimer_GenericHandler( timerIndex, eventName, arg1 ) if timerIndex == nil then --CountDoom.dpf( "ButtonID doesn't map to a valid timerIndex in CDTimer_" .. eventName ); return nil; end if CDTimers[ timerIndex ] == nil then CountDoom.dpf( "Invalid timerIndex in CDTimer_" .. eventName ); return nil; end -- Call the callback function if CDTimers[ timerIndex ].funcHandlers ~= nil then local funcHandler = CDTimers[ timerIndex ].funcHandlers[ eventName ]; if funcHandler ~= nil then funcHandler( timerIndex, arg1 ); end end return timerIndex; end function CDTimer_UpdateTimer( timerIndex ) if( CDTimers[ timerIndex ] == nil ) then CountDoom.dpf( "Invalid timerIndex in CDTimer_OnUpdate: " .. timerIndex ); return; end local currentTime = GetTime(); local rawDelta = currentTime - CDTimers[ timerIndex ].startTime; local duration = CDTimers[ timerIndex ].duration; local warningTime = CDTimers[ timerIndex ].warningTime; local finished = false; local delta = floor(rawDelta); if( delta > duration ) then delta = duration; finished = true; end -- Update the timer local flashAlpha = 1.0; local textColor = {}; local alpha = 1.0; if (rawDelta > duration) then textColor["r"] = 1.0; textColor["g"] = 0.0; textColor["b"] = 0.0; elseif (rawDelta > warningTime) then alpha = (rawDelta - warningTime) / (duration - warningTime); textColor["r"] = 1.0; textColor["g"] = 1.0 - alpha; textColor["b"] = 0.0; else alpha = rawDelta / warningTime; textColor["r"] = 1.0; textColor["g"] = 1.0; textColor["b"] = 1.0 - alpha; end -- Invert for count down situations local timeDelta = rawDelta; if( CDTimers[ timerIndex ].countDown ) then timeDelta = duration - rawDelta; end local signStr = ""; if timeDelta < 0 then signStr = "-"; timeDelta = -timeDelta; end local minutes = floor(timeDelta/60); local seconds = floor(math.mod(timeDelta, 60)); local hseconds = floor(math.mod(floor(rawDelta*100), 100)); local htimeText = ""; if (CountDoom.config.hseconds == true) then if (hseconds >= 10) then htimeText = "." .. hseconds; else htimeText = ".0" .. hseconds; end end local timeText = ""; if (seconds >= 10) then timeText = signStr .. minutes .. ":" .. seconds .. htimeText; else timeText = signStr .. minutes .. ":0" .. seconds .. htimeText; end -- Add any prefix or suffix if CDTimers[ timerIndex ].prefix ~= nil then timeText = CDTimers[ timerIndex ].prefix .. timeText; end if CDTimers[ timerIndex ].suffix ~= nil then timeText = timeText .. CDTimers[ timerIndex ].suffix; end -- Set the timer text CDTimer_SetText( timerIndex, timeText, textColor ); -- Update flash time local flashRate = 0.1; if CDTimers[ timerIndex ].flashInterval ~= 0.0 then CDTimer_UpdateFlash( timerIndex, flashRate ); else CDTimer_SetAlpha( timerIndex, 1.0 ); end -- Callback for custom OnUpdate calls CDTimer_GenericHandler( timerIndex, CDTIMEREVENT_ONUPDATE, arg1 ); if( finished ) then --CountDoom.dpf( "Calling OnTimerEnd for timer #" .. timerIndex ); CDTimer_GenericHandler( timerIndex, CDTIMEREVENT_ONTIMEREND, delta ); elseif( delta >= warningTime ) then --CountDoom.dpf( "Calling OnTimerWarning for timer #" .. timerIndex ); CDTimer_GenericHandler( timerIndex, CDTIMEREVENT_ONTIMERWARNING, delta ); end end function CDTimer_OnUpdate( arg1 ) local timerIndex = this:GetID(); CDTimer_UpdateTimer( timerIndex ); end function CDTimer_OnEnter( arg1 ) local timerIndex = this:GetID(); -- put the tool tip in the default position GameTooltip_SetDefaultAnchor(GameTooltip, this); -- set the tool tip text GameTooltip:SetText(COUNTDOOM_TITLE, 255/255, 209/255, 0/255); CDTimer_GenericHandler( timerIndex, CDTIMEREVENT_ONENTER, arg1 ); GameTooltip:AddLine(COUNTDOOM_DESCRIPTION, 80/255, 143/255, 148/255); GameTooltip:Show(); end function CDTimer_OnLeave( arg1 ) local timerIndex = this:GetID(); CDTimer_GenericHandler( timerIndex, CDTIMEREVENT_ONLEAVE, arg1 ); GameTooltip:Hide(arg1); end function CDTimer_OnMouseDown( arg1 ) -- if not loaded yet then get out if (CountDoom.initialized == false) then return; end local timerIndex = this:GetID(); CDTimer_GenericHandler( timerIndex, CDTIMEREVENT_ONMOUSEDOWN, arg1 ); end function CDTimer_OnMouseUp( arg1 ) -- if not loaded yet then get out if CountDoom.initialized == false then return; end local timerIndex = this:GetID(); CDTimer_GenericHandler( timerIndex, CDTIMEREVENT_ONMOUSEUP, arg1 ); end function CDTimer_OnClick( arg1 ) -- if not loaded yet then get out if CountDoom.initialized == false then return; end local timerIndex = this:GetID(); CDTimer_GenericHandler( timerIndex, CDTIMEREVENT_ONCLICK, arg1 ); end local function CDTimer_Constructor( timerIndex ) if CDTimers[ timerIndex ] == nil then CDTimers[ timerIndex ] = {}; end CDTimers[ timerIndex ].userHandle = nil; CDTimers[ timerIndex ].priority = nil; CDTimers[ timerIndex ].startTime = GetTime(); CDTimers[ timerIndex ].warningTime = nil; CDTimers[ timerIndex ].duration = nil; CDTimers[ timerIndex ].icon = nil; CDTimers[ timerIndex ].text = nil; CDTimers[ timerIndex ].flashInterval = 0.0; CDTimers[ timerIndex ].flashTime = 0.0; CDTimers[ timerIndex ].countDown = true; CDTimers[ timerIndex ].prefix = nil; CDTimers[ timerIndex ].suffix = nil; CDTimers[ timerIndex ].funcHandlers = nil; CDTimers[ timerIndex ].funcHandlers = {}; end local function CDTimer_GetInsertionIndex( priority, duration ) local foundIndex = CDTimer_numTimers; if( CDTimer_numTimers > 0 ) then local currentTime = GetTime(); -- Loop through all items stopping at first button less than local timerIndex; for timerIndex = 0, CDTimer_numTimers - 1, 1 do if( CDTimers[ timerIndex ] ~= nil ) then -- Check for priority is a lower number (higher priority) if( priority < CDTimers[ timerIndex ].priority ) then foundIndex = timerIndex; break; end -- If equivalent, check remaining time local elapsed = currentTime - CDTimers[ timerIndex ].startTime; local remaining = CDTimers[ timerIndex ].duration - elapsed; if( duration <= remaining ) then foundIndex = timerIndex; break; end else foundIndex = timerIndex; break; end end -- if it's the last index, we're done if( foundIndex <= CDTimer_numTimers ) then -- Slide all the items to the next slots CountDoom.dpf( "CDTimer_numTimers " .. CDTimer_numTimers ); CountDoom.dpf( "foundIndex " .. foundIndex ); for newID = CDTimer_numTimers, foundIndex + 1, -1 do local oldID = newID - 1; CountDoom.dpf( "oldID: " .. oldID .. " newID: " .. newID ); CDTimer_Copy( newID, oldID ); end end end local buttonToEnable = CDTimer_numTimers; CDTimer_numTimers = CDTimer_numTimers + 1; -- Enable the last button CDTimer_ShowButton( buttonToEnable, true ); return foundIndex; end function CDTimer_Create( priority, duration ) local timerIndex = -1; timerIndex = CDTimer_GetInsertionIndex( priority, duration ); CountDoom.dpf( "CDTimer_Create: Insertion Index is " .. timerIndex ); CDTimer_Constructor( timerIndex ); CDTimers[ timerIndex ].priority = priority; CDTimers[ timerIndex ].warningTime = duration; CDTimers[ timerIndex ].duration = duration; CDTimer_ShowButton( timerIndex, true ); CountDoomFrame:Show(); return timerIndex; end function CDTimer_Destroy( removeID ) CountDoom.dpf( "Destroy: " .. removeID ); if CDTimers[ removeID ] == nil then CountDoom.dpf( "Invalid index(" .. timerIndex .. ") in CDTimer_Destroy. " .. CDTimer_numTimers ); return; end CDTimer_DumpAll(); if( removeID ~= ( CDTimer_numTimers - 1 ) ) then -- shift all buttons down by one local oldID; for oldID = removeID + 1, CDTimer_numTimers - 1, 1 do local newID = oldID - 1; CountDoom.dpf( "oldID: " .. oldID .. " newID: " .. newID ); CDTimer_Copy( newID, oldID ); end end -- Erase the button local deleteID = CDTimer_numTimers - 1; CDTimers[ deleteID ] = nil; -- And hide the last one CDTimer_ShowButton( deleteID, false ); CDTimer_numTimers = CDTimer_numTimers - 1; if CDTimer_numTimers <= 0 then if CountDoom.config.isLocked == true then CountDoomFrame:Hide(); end end CDTimer_DumpAll(); end function CDTimer_SetFunctionHandler( timerIndex, handlerName, funcHandler ) if CDTimers[ timerIndex ] == nil then CountDoom.dpf( "Invalid timerIndex in CDTimer_SetFunctionHandler" ); return; end CountDoom.dpf( "SetFunctionHandler before: " .. table.getn( CDTimers[ timerIndex ].funcHandlers ) ); CDTimers[ timerIndex ].funcHandlers[ handlerName ] = funcHandler; CountDoom.dpf( "SetFunctionHandler after: " .. table.getn( CDTimers[ timerIndex ].funcHandlers ) ); end function CDTimer_GetRemainingTime( timerIndex ) if CDTimers[ timerIndex ] == nil then CountDoom.dpf( "Invalid timerIndex in CDTimer_GetRemainingTime" ); return nil; end return CDTimers[ timerIndex ].duration - (GetTime() - CDTimers[ timerIndex ].startTime); end function CDTimer_SetWarningTime( timerIndex, warningTime ) if CDTimers[ timerIndex ] == nil then CountDoom.dpf( "Invalid timerIndex in CDTimer_SetWarningTime" ); return; end CDTimers[ timerIndex ].warningTime = warningTime; end function CDTimer_GetWarningTime( timerIndex ) if CDTimers[ timerIndex ] == nil then CountDoom.dpf( "Invalid timerIndex in CDTimer_GetWarningTime" ); return nil; end return CDTimers[ timerIndex ].warningTime; end function CDTimer_SetUserHandle( timerIndex, userHandle ) if CDTimers[ timerIndex ] == nil then CountDoom.dpf( "Invalid timerIndex in CDTimer_SetUserHandle" ); return; end CDTimers[ timerIndex ].userHandle = userHandle; end function CDTimer_GetUserHandle( timerIndex ) if CDTimers[ timerIndex ] == nil then CountDoom.dpf( "Invalid timerIndex in CDTimer_GetUserHandle" ); return nil; end return CDTimers[ timerIndex ].userHandle; end function CDTimer_SetCountDown( timerIndex, countDown ) if CDTimers[ timerIndex ] == nil then CountDoom.dpf( "Invalid timerIndex in CDTimer_SetCountDown" ); return; end CDTimers[ timerIndex ].countDown = countDown; end function CDTimer_GetCountDown( timerIndex ) if CDTimers[ timerIndex ] == nil then CountDoom.dpf( "Invalid timerIndex in CDTimer_GetCountDown" ); return nil; end return CDTimers[ timerIndex ].countDown; end function CDTimer_SetText( timerIndex, timerText, textColor ) if CDTimers[ timerIndex ] == nil then CountDoom.dpf( "Invalid timerIndex in CDTimer_SetText" ); return; end local red = 1.0; local green = 1.0; local blue = 1.0; if textColor ~= nil then red = textColor["r"]; green = textColor["g"]; blue = textColor["b"]; end CDTimers[ timerIndex ].text = timerText; local buttonName = "CDTimerButton" .. timerIndex .. "_DurationText"; local buttonItem = getglobal( buttonName ); if( buttonItem ~= nil ) then buttonItem:SetTextColor( red, green, blue ); buttonItem:SetText( timerText ); elseif timerIndex < CDTimer_maxButtons then CountDoom.dpf( "Unable to call " .. buttonName .. ":SetText()" ); end end function CDTimer_GetText( timerIndex ) if CDTimers[ timerIndex ] == nil then CountDoom.dpf( "Invalid timerIndex in CDTimer_GetText" ); return nil; end return CDTimers[ timerIndex ].text; end function CDTimer_SetIcon( timerIndex, timerIcon ) if CDTimers[ timerIndex ] == nil then CountDoom.dpf( "Invalid timerIndex in CDTimer_SetIcon" ); return; end CDTimers[ timerIndex ].icon = timerIcon; local buttonName = "CDTimerButton" .. timerIndex .. "_Icon"; local buttonItem = getglobal( buttonName ); if( buttonItem ~= nil ) then buttonItem:SetTexture( timerIcon ); elseif timerIndex < CDTimer_maxButtons then CountDoom.dpf( "Unable to call " .. buttonName .. ":SetTexture()" ); end end function CDTimer_GetIcon( timerIndex ) if CDTimers[ timerIndex ] == nil then CountDoom.dpf( "Invalid timerIndex in CDTimer_GetIcon" ); return nil; end return CDTimers[ timerIndex ].icon; end function CDTimer_EnableFlash( timerIndex, interval ) if CDTimers[ timerIndex ] == nil then CountDoom.dpf( "Invalid timerIndex in CDTimer_EnableFlash" ); return; end if interval <= 0 then interval = 0.0; end CDTimers[ timerIndex ].flashTime = 0.0; CDTimers[ timerIndex ].flashInterval = interval; end function CDTimer_SetTimerPrefix( timerIndex, prefixStr ) if CDTimers[ timerIndex ] == nil then CountDoom.dpf( "Invalid timerIndex in CDTimer_SetTimerPrefix" ); return; end CDTimers[ timerIndex ].prefix = prefixStr; end function CDTimer_SetTimerSuffix( timerIndex, suffixStr ) if CDTimers[ timerIndex ] == nil then CountDoom.dpf( "Invalid timerIndex in CDTimer_SetTimerSuffix" ); return; end CDTimers[ timerIndex ].suffix = suffixStr; end function CDTimer_DisableFlash( timerIndex ) if CDTimers[ timerIndex ] == nil then CountDoom.dpf( "Invalid timerIndex in CDTimer_DisableFlash" ); return; end CDTimers[ timerIndex ].flashTime = 0.0; CDTimers[ timerIndex ].flashInterval = 0.0; end function CDTimer_Copy( destIndex, srcIndex ) CountDoom.dpf( "CDTimer_Copy(" .. CountDoom.ToStr( destIndex ) .. ", " .. CountDoom.ToStr( srcIndex ) .. ")" ); if CDTimers[ srcIndex ] == nil then CDTimers[ destIndex ] = nil; else if CDTimers[ destIndex ] == nil then CDTimers[ destIndex ] = {}; end CDTimers[ destIndex ].userHandle = CDTimers[ srcIndex ].userHandle; CDTimers[ destIndex ].priority = CDTimers[ srcIndex ].priority; CDTimers[ destIndex ].startTime = CDTimers[ srcIndex ].startTime; CDTimers[ destIndex ].warningTime = CDTimers[ srcIndex ].warningTime; CDTimers[ destIndex ].duration = CDTimers[ srcIndex ].duration; CDTimers[ destIndex ].icon = CDTimers[ srcIndex ].icon; CDTimers[ destIndex ].text = CDTimers[ srcIndex ].text; CDTimers[ destIndex ].flashInterval = CDTimers[ srcIndex ].flashInterval; CDTimers[ destIndex ].flashTime = CDTimers[ srcIndex ].flashTime; CDTimers[ destIndex ].countDown = CDTimers[ srcIndex ].countDown; CDTimers[ destIndex ].prefix = CDTimers[ srcIndex ].prefix; CDTimers[ destIndex ].suffix = CDTimers[ srcIndex ].suffix; -- Copy the event table CDTimers[ destIndex ].funcHandlers = {}; if CDTimers[ srcIndex ].funcHandlers ~= nil then local index; for index=1, CDTIMEREVENT_MAXEVENTS, 1 do CDTimers[ destIndex ].funcHandlers[ index ] = CDTimers[ srcIndex ].funcHandlers[ index ]; end CDTimers[ srcIndex ].funcHandlers = nil; end -- Move the visual items CDTimer_SetText( destIndex, CDTimers[ destIndex ].text ); CDTimer_SetIcon( destIndex, CDTimers[ destIndex ].icon ); end -- Notify client of new timer index CDTimer_GenericHandler( destIndex, CDTIMEREVENT_ONMOVETIMER, srcIndex ); end function CDTimers_GetButtonSize() if CountDoom.config.scale == "large" then return 50; elseif CountDoom.config.scale == "small" then return 30; end; return 40; end function CDTimers_LayoutHorizontal() local buttonID = 0; local prevButton = nil; local buttonSize = CDTimers_GetButtonSize(); for buttonID = 0, CDTimer_maxButtons - 1 do local button = getglobal( "CDTimerButton" .. buttonID); if button ~= nil then if prevButton ~= nil then button:ClearAllPoints(); button:SetPoint("TOPLEFT", prevButton, "TOPRIGHT", 0, 0); end local buttonTexture = getglobal( "CDTimerButton" .. buttonID .. "_Icon" ); if buttonTexture ~= nil then buttonTexture:Show(); end button:SetHeight(buttonSize); button:SetWidth(buttonSize); end local buttonText = getglobal( "CDTimerButton" .. buttonID .. "_DurationText" ); if buttonText ~= nil then if button ~= nil then buttonText:ClearAllPoints(); buttonText:SetPoint("LEFT", button, "LEFT", 0, -(5 + (buttonSize/2))); end end prevButton = button; end local numTimers = CDTimer_maxButtons; if numTimers == 0 then numTimers = 1; end CountDoomFrame:SetWidth( 5 + 5 + (buttonSize * numTimers) ); CountDoomFrame:SetHeight( 5 + 5 + buttonSize + 12 ); end function CDTimers_LayoutVertical() local buttonID = 0; local prevButton = nil; local buttonSize = CDTimers_GetButtonSize(); for buttonID = 0, CDTimer_maxButtons - 1 do local button = getglobal( "CDTimerButton" .. buttonID); if button ~= nil then if prevButton ~= nil then button:ClearAllPoints(); button:SetPoint("TOPLEFT", prevButton, "BOTTOMLEFT", 0, 0); end local buttonTexture = getglobal( "CDTimerButton" .. buttonID .. "_Icon" ); if buttonTexture ~= nil then buttonTexture:Show(); end button:SetHeight(buttonSize); button:SetWidth(buttonSize); end local buttonText = getglobal( "CDTimerButton" .. buttonID .. "_DurationText" ); if buttonText ~= nil then if button ~= nil then buttonText:ClearAllPoints(); buttonText:SetPoint("LEFT", button, "LEFT", buttonSize + 10, -7); end end prevButton = button; end local numTimers = CDTimer_maxButtons; if numTimers == 0 then numTimers = 1; end CountDoomFrame:SetWidth( 5 + 5 + buttonSize + 40 ); CountDoomFrame:SetHeight( 5 + 5 + ( buttonSize * numTimers ) ); end function CDTimers_LayoutTextOnly() local buttonID = 0; local prevButton = nil; local prevButtonText = nil; for buttonID = 0, CDTimer_maxButtons - 1 do local button = getglobal( "CDTimerButton" .. buttonID); if button ~= nil then if prevButton ~= nil then button:ClearAllPoints(); button:SetPoint("TOPLEFT", prevButton, "BOTTOMLEFT", 0, 0); end end if button ~= nil then local buttonTexture = getglobal( "CDTimerButton" .. buttonID .. "_Icon" ); if buttonTexture ~= nil then buttonTexture:Hide(); end button:SetHeight(15); button:SetWidth(30); end local buttonText = getglobal( "CDTimerButton" .. buttonID .. "_DurationText" ); if buttonText ~= nil then buttonText:ClearAllPoints(); buttonText:SetPoint("LEFT", button, "LEFT", 0, 0); end prevButtonText = buttonText; prevButton = button; end local numTimers = CDTimer_maxButtons; if numTimers == 0 then numTimers = 1; end CountDoomFrame:SetWidth( 5 + 5 + 250 ); CountDoomFrame:SetHeight( 5 + 5 + ( 15 * numTimers ) ); end