-- speed optimizations (mostly so update functions are faster) local _G = getfenv(0); local date = _G.date; local abs = _G.abs; local min = _G.min; local max = _G.max; local floor = _G.floor; local mod = _G.mod; local tonumber = _G.tonumber; local gsub = _G.gsub; local GetCVar = _G.GetCVar; local SetCVar = _G.SetCVar; local GetGameTime = _G.GetGameTime; -- private data local SEC_TO_MINUTE_FACTOR = 1/60; local SEC_TO_HOUR_FACTOR = SEC_TO_MINUTE_FACTOR*SEC_TO_MINUTE_FACTOR; local WARNING_SOUND_TRIGGER_OFFSET = -2 * SEC_TO_MINUTE_FACTOR; -- play warning sound 2 sec before alarm sound local Settings = { militaryTime = false; localTime = false; alarmHour = 12; alarmMinute = 00; alarmAM = true; alarmMessage = ""; alarmEnabled = false; }; local CVAR_USE_MILITARY_TIME = "timeMgrUseMilitaryTime"; local CVAR_USE_LOCAL_TIME = "timeMgrUseLocalTime"; local CVAR_ALARM_TIME = "timeMgrAlarmTime"; local CVAR_ALARM_MESSAGE = "timeMgrAlarmMessage"; local CVAR_ALARM_ENABLED = "timeMgrAlarmEnabled"; -- public data MAX_TIMER_SEC = 99*3600 + 59*60 + 59; -- 99:59:59 local function _TimeManager_GetCurrentMinutes(localTime) local currTime; if ( localTime ) then local dateInfo = date("*t"); local hour, minute = dateInfo.hour, dateInfo.min; currTime = minute + hour*60; else local hour, minute = GetGameTime(); currTime = minute + hour*60; end return currTime; end -- CVar helpers local function _TimeManager_Setting_SetBool(cvar, field, value) if ( value ) then SetCVar(cvar, "1"); else SetCVar(cvar, "0"); end Settings[field] = value; end local function _TimeManager_Setting_Set(cvar, field, value) SetCVar(cvar, value); Settings[field] = value; end local function _TimeManager_Setting_SetTime() local alarmTime = GameTime_ComputeMinutes(Settings.alarmHour, Settings.alarmMinute, Settings.militaryTime, Settings.alarmAM); SetCVar(CVAR_ALARM_TIME, alarmTime); end -- TimeManagerFrame function TimeManager_Toggle() if ( TimeManagerFrame:IsShown() ) then TimeManagerFrame:Hide(); else TimeManagerFrame:Show(); end end function TimeManagerFrame_OnLoad(self) Settings.militaryTime = GetCVar(CVAR_USE_MILITARY_TIME) == "1"; Settings.localTime = GetCVar(CVAR_USE_LOCAL_TIME) == "1"; local alarmTime = tonumber(GetCVar(CVAR_ALARM_TIME)); Settings.alarmHour = floor(alarmTime / 60); Settings.alarmMinute = max(min(alarmTime - Settings.alarmHour*60, 59), 0); Settings.alarmHour = max(min(Settings.alarmHour, 23), 0); if ( not Settings.militaryTime ) then if ( Settings.alarmHour == 0 ) then Settings.alarmHour = 12; Settings.alarmAM = true; elseif ( Settings.alarmHour < 12 ) then Settings.alarmAM = true; elseif ( Settings.alarmHour == 12 ) then Settings.alarmAM = false; else Settings.alarmHour = Settings.alarmHour - 12; Settings.alarmAM = false; end end Settings.alarmMessage = GetCVar(CVAR_ALARM_MESSAGE); Settings.alarmEnabled = GetCVar(CVAR_ALARM_ENABLED) == "1"; self:SetFrameLevel(self:GetFrameLevel() + 2); UIDropDownMenu_Initialize(TimeManagerAlarmHourDropDown, TimeManagerAlarmHourDropDown_Initialize); UIDropDownMenu_SetWidth(TimeManagerAlarmHourDropDown, 30, 40); UIDropDownMenu_Initialize(TimeManagerAlarmMinuteDropDown, TimeManagerAlarmMinuteDropDown_Initialize); UIDropDownMenu_SetWidth(TimeManagerAlarmMinuteDropDown, 30, 40); UIDropDownMenu_Initialize(TimeManagerAlarmAMPMDropDown, TimeManagerAlarmAMPMDropDown_Initialize); -- some languages have ridonculously long am/pm strings (i'm looking at you French) so we may have to -- readjust the ampm dropdown width plus do some reanchoring if the text is too wide local maxAMPMWidth; TimeManagerAMPMDummyText:SetText(TIMEMANAGER_AM); maxAMPMWidth = TimeManagerAMPMDummyText:GetWidth(); TimeManagerAMPMDummyText:SetText(TIMEMANAGER_PM); if ( maxAMPMWidth < TimeManagerAMPMDummyText:GetWidth() ) then maxAMPMWidth = TimeManagerAMPMDummyText:GetWidth(); end maxAMPMWidth = ceil(maxAMPMWidth); if ( maxAMPMWidth > 40 ) then UIDropDownMenu_SetWidth(TimeManagerAlarmAMPMDropDown, maxAMPMWidth + 20, 40); TimeManagerAlarmAMPMDropDown:SetScript("OnShow", TimeManagerAlarmAMPMDropDown_OnShow); TimeManagerAlarmAMPMDropDown:SetScript("OnHide", TimeManagerAlarmAMPMDropDown_OnHide); else UIDropDownMenu_SetWidth(TimeManagerAlarmAMPMDropDown, 40, 40); end TimeManager_Update(); end function TimeManagerFrame_OnUpdate(self, elapsed) TimeManager_UpdateTimeTicker(); end function TimeManagerFrame_OnShow(self) TimeManager_Update(); TimeManagerStopwatchCheck:SetChecked(StopwatchFrame:IsShown()); PlaySound("igCharacterInfoOpen"); end function TimeManagerFrame_OnHide(self) PlaySound("igCharacterInfoClose"); end function TimeManagerCloseButton_OnClick() TimeManagerFrame:Hide(); end function TimeManagerStopwatchCheck_OnClick(self) Stopwatch_Toggle(); if ( self:GetChecked() ) then PlaySound("igMainMenuOptionCheckBoxOn"); else PlaySound("igMainMenuQuit"); end end function TimeManagerAlarmHourDropDown_Initialize() local info = UIDropDownMenu_CreateInfo(); local alarmHour = Settings.alarmHour; local militaryTime = Settings.militaryTime; local hourMin, hourMax; if ( militaryTime ) then hourMin = 0; hourMax = 23; else hourMin = 1; hourMax = 12; end for hour = hourMin, hourMax, 1 do info.value = hour; if ( militaryTime ) then info.text = format(TIMEMANAGER_24HOUR, hour); else info.text = hour; info.justifyH = "RIGHT"; end info.func = TimeManagerAlarmHourDropDown_OnClick; if ( hour == alarmHour ) then info.checked = 1; UIDropDownMenu_SetText(TimeManagerAlarmHourDropDown, info.text); else info.checked = nil; end UIDropDownMenu_AddButton(info); end end function TimeManagerAlarmMinuteDropDown_Initialize() local info = UIDropDownMenu_CreateInfo(); local alarmMinute = Settings.alarmMinute; for minute = 0, 55, 5 do info.value = minute; info.text = format(TIMEMANAGER_MINUTE, minute); info.func = TimeManagerAlarmMinuteDropDown_OnClick; if ( minute == alarmMinute ) then info.checked = 1; UIDropDownMenu_SetText(TimeManagerAlarmMinuteDropDown, info.text); else info.checked = nil; end UIDropDownMenu_AddButton(info); end end function TimeManagerAlarmAMPMDropDown_Initialize() local info = UIDropDownMenu_CreateInfo(); local pm = (Settings.militaryTime and Settings.alarmHour >= 12) or not Settings.alarmAM; info.value = 1; info.text = TIMEMANAGER_AM; info.func = TimeManagerAlarmAMPMDropDown_OnClick; if ( not pm ) then info.checked = 1; UIDropDownMenu_SetText(TimeManagerAlarmAMPMDropDown, info.text); else info.checked = nil; end UIDropDownMenu_AddButton(info); info.value = 0; info.text = TIMEMANAGER_PM; info.func = TimeManagerAlarmAMPMDropDown_OnClick; if ( pm ) then info.checked = 1; UIDropDownMenu_SetText(TimeManagerAlarmAMPMDropDown, info.text); else info.checked = nil; end UIDropDownMenu_AddButton(info); end function TimeManagerAlarmHourDropDown_OnClick(self) UIDropDownMenu_SetSelectedValue(TimeManagerAlarmHourDropDown, self.value); local oldValue = Settings.alarmHour; Settings.alarmHour = self.value; if ( Settings.alarmHour ~= oldValue ) then TimeManager_StartCheckingAlarm(); end _TimeManager_Setting_SetTime(); end function TimeManagerAlarmMinuteDropDown_OnClick(self) UIDropDownMenu_SetSelectedValue(TimeManagerAlarmMinuteDropDown, self.value); local oldValue = Settings.alarmMinute; Settings.alarmMinute = self.value; if ( Settings.alarmMinute ~= oldValue ) then TimeManager_StartCheckingAlarm(); end _TimeManager_Setting_SetTime(); end function TimeManagerAlarmAMPMDropDown_OnClick(self) UIDropDownMenu_SetSelectedValue(TimeManagerAlarmAMPMDropDown, self.value); if ( self.value == 1 ) then if ( not Settings.alarmAM ) then Settings.alarmAM = true; TimeManager_StartCheckingAlarm(); end else if ( Settings.alarmAM ) then Settings.alarmAM = false; TimeManager_StartCheckingAlarm(); end end _TimeManager_Setting_SetTime(); end function TimeManagerAlarmAMPMDropDown_OnShow() -- readjust the size of and reanchor TimeManagerAlarmAMPMDropDown and all frames below it TimeManagerAlarmAMPMDropDown:SetPoint("TOPLEFT", TimeManagerAlarmHourDropDown, "BOTTOMLEFT", 0, 5); TimeManagerAlarmMessageFrame:SetPoint("TOPLEFT", TimeManagerAlarmHourDropDown, "BOTTOMLEFT", 20, -23); TimeManagerAlarmEnabledButton:SetPoint("CENTER", TimeManagerFrame, "CENTER", -20, -69); TimeManagerMilitaryTimeCheck:SetPoint("TOPLEFT", TimeManagerFrame, "TOPLEFT", 174, -207); end function TimeManagerAlarmAMPMDropDown_OnHide() -- readjust the size of and reanchor TimeManagerAlarmAMPMDropDown and all frames below it TimeManagerAlarmAMPMDropDown:SetPoint("LEFT", TimeManagerAlarmHourDropDown, "RIGHT", -22, 0); TimeManagerAlarmMessageFrame:SetPoint("TOPLEFT", TimeManagerAlarmHourDropDown, "BOTTOMLEFT", 20, 0); TimeManagerAlarmEnabledButton:SetPoint("CENTER", TimeManagerFrame, "CENTER", -20, -50); TimeManagerMilitaryTimeCheck:SetPoint("TOPLEFT", TimeManagerFrame, "TOPLEFT", 174, -207); end function TimeManager_Update() TimeManager_UpdateTimeTicker(); TimeManager_UpdateAlarmTime(); TimeManagerAlarmEnabledButton_Update(); TimeManagerAlarmMessageEditBox:SetText(Settings.alarmMessage); TimeManagerMilitaryTimeCheck:SetChecked(Settings.militaryTime); TimeManagerLocalTimeCheck:SetChecked(Settings.localTime); end function TimeManager_UpdateAlarmTime() UIDropDownMenu_SetSelectedValue(TimeManagerAlarmHourDropDown, Settings.alarmHour); UIDropDownMenu_SetSelectedValue(TimeManagerAlarmMinuteDropDown, Settings.alarmMinute); UIDropDownMenu_SetText(TimeManagerAlarmMinuteDropDown, format(TIMEMANAGER_MINUTE, Settings.alarmMinute)); if ( Settings.militaryTime ) then TimeManagerAlarmAMPMDropDown:Hide(); UIDropDownMenu_SetText(TimeManagerAlarmHourDropDown, format(TIMEMANAGER_24HOUR, Settings.alarmHour)); else TimeManagerAlarmAMPMDropDown:Show(); UIDropDownMenu_SetText(TimeManagerAlarmHourDropDown, Settings.alarmHour); if ( Settings.alarmAM ) then UIDropDownMenu_SetSelectedValue(TimeManagerAlarmAMPMDropDown, 1); UIDropDownMenu_SetText(TimeManagerAlarmAMPMDropDown, TIMEMANAGER_AM); else UIDropDownMenu_SetSelectedValue(TimeManagerAlarmAMPMDropDown, 0); UIDropDownMenu_SetText(TimeManagerAlarmAMPMDropDown, TIMEMANAGER_PM); end end end function TimeManager_UpdateTimeTicker() TimeManagerFrameTicker:SetText(GameTime_GetTime(false)); end function TimeManagerAlarmMessageEditBox_OnEnterPressed(self) self:ClearFocus(); end function TimeManagerAlarmMessageEditBox_OnEscapePressed(self) self:ClearFocus(); end function TimeManagerAlarmMessageEditBox_OnEditFocusLost(self) _TimeManager_Setting_Set(CVAR_ALARM_MESSAGE, "alarmMessage", TimeManagerAlarmMessageEditBox:GetText()); end function TimeManagerAlarmEnabledButton_Update() if ( Settings.alarmEnabled ) then TimeManagerAlarmEnabledButton:SetText(TIMEMANAGER_ALARM_ENABLED); TimeManagerAlarmEnabledButton:SetNormalFontObject(GameFontNormal); TimeManagerAlarmEnabledButton:SetNormalTexture("Interface\\Buttons\\UI-Panel-Button-Up"); TimeManagerAlarmEnabledButton:SetPushedTexture("Interface\\Buttons\\UI-Panel-Button-Down"); else TimeManagerAlarmEnabledButton:SetText(TIMEMANAGER_ALARM_DISABLED); TimeManagerAlarmEnabledButton:SetNormalFontObject(GameFontHighlight); TimeManagerAlarmEnabledButton:SetNormalTexture("Interface\\Buttons\\UI-Panel-Button-Disabled"); TimeManagerAlarmEnabledButton:SetPushedTexture("Interface\\Buttons\\UI-Panel-Button-Disabled-Down"); end end function TimeManagerAlarmEnabledButton_OnClick(self) _TimeManager_Setting_SetBool(CVAR_ALARM_ENABLED, "alarmEnabled", not Settings.alarmEnabled); if ( Settings.alarmEnabled ) then PlaySound("igMainMenuOptionCheckBoxOn"); TimeManager_StartCheckingAlarm(); else PlaySound("igMainMenuOptionCheckBoxOff"); if ( TimeManagerClockButton.alarmFiring ) then TimeManager_TurnOffAlarm(); end end TimeManagerAlarmEnabledButton_Update(); end function TimeManagerMilitaryTimeCheck_OnClick(self) TimeManager_ToggleTimeFormat(); if ( self:GetChecked() ) then PlaySound("igMainMenuOptionCheckBoxOn"); else PlaySound("igMainMenuOptionCheckBoxOff"); end end function TimeManager_ToggleTimeFormat() local alarmHour = Settings.alarmHour; if ( Settings.militaryTime ) then _TimeManager_Setting_SetBool(CVAR_USE_MILITARY_TIME, "militaryTime", false); Settings.alarmHour, Settings.alarmAM = GameTime_ComputeStandardTime(Settings.alarmHour); else _TimeManager_Setting_SetBool(CVAR_USE_MILITARY_TIME, "militaryTime", true); Settings.alarmHour = GameTime_ComputeMilitaryTime(Settings.alarmHour, Settings.alarmAM); end _TimeManager_Setting_SetTime(); TimeManager_UpdateAlarmTime(); -- TimeManagerFrame_OnUpdate will pick up the time ticker change -- TimeManagerClockButton_OnUpdate will pick up the clock change if ( CalendarFrame_UpdateTimeFormat ) then -- update the Calendar's time format if it's available CalendarFrame_UpdateTimeFormat(); end end function TimeManagerLocalTimeCheck_OnClick(self) TimeManager_ToggleLocalTime(); -- since we're changing which time type we're checking, we need to check the alarm now TimeManager_StartCheckingAlarm(); if ( self:GetChecked() ) then PlaySound("igMainMenuOptionCheckBoxOn"); else PlaySound("igMainMenuOptionCheckBoxOff"); end end function TimeManager_ToggleLocalTime() _TimeManager_Setting_SetBool(CVAR_USE_LOCAL_TIME, "localTime", not Settings.localTime); -- TimeManagerFrame_OnUpdate will pick up the time ticker change -- TimeManagerClockButton_OnUpdate will pick up the clock change end -- TimeManagerClockButton function TimeManagerClockButton_Show() TimeManagerClockButton:Show(); end function TimeManagerClockButton_Hide() TimeManagerClockButton:Hide(); end function TimeManagerClockButton_OnLoad(self) self:SetFrameLevel(self:GetFrameLevel() + 2); TimeManagerClockButton_Update(); if ( Settings.alarmEnabled ) then TimeManager_StartCheckingAlarm(); end self:RegisterForClicks("AnyUp"); end function TimeManagerClockButton_Update() TimeManagerClockTicker:SetText(GameTime_GetTime(false)); end function TimeManagerClockButton_OnEnter(self) GameTooltip:SetOwner(self, "ANCHOR_LEFT"); TimeManagerClockButton:SetScript("OnUpdate", TimeManagerClockButton_OnUpdateWithTooltip); end function TimeManagerClockButton_OnLeave(self) GameTooltip:Hide(); TimeManagerClockButton:SetScript("OnUpdate", TimeManagerClockButton_OnUpdate); end function TimeManagerClockButton_OnClick(self) if ( self.alarmFiring ) then PlaySound("igMainMenuQuit"); TimeManager_TurnOffAlarm(); else TimeManager_Toggle(); end end function TimeManagerClockButton_OnUpdate(self, elapsed) TimeManagerClockButton_Update(); if ( self.checkAlarm and Settings.alarmEnabled ) then TimeManager_CheckAlarm(elapsed); end end function TimeManagerClockButton_OnUpdateWithTooltip(self, elapsed) TimeManagerClockButton_OnUpdate(self, elapsed); TimeManagerClockButton_UpdateTooltip(); end function TimeManager_ShouldCheckAlarm() return TimeManagerClockButton.checkAlarm and Settings.alarmEnabled; end function TimeManager_StartCheckingAlarm() TimeManagerClockButton.checkAlarm = true; -- set the time to play the warning sound local alarmTime = GameTime_ComputeMinutes(Settings.alarmHour, Settings.alarmMinute, Settings.militaryTime, Settings.alarmAM); local warningTime = alarmTime + WARNING_SOUND_TRIGGER_OFFSET; -- max minutes per day = 24*60 = 1440 if ( warningTime < 0 ) then warningTime = warningTime + 1440; elseif ( warningTime > 1440 ) then warningTime = warningTime - 1440; end TimeManagerClockButton.warningTime = warningTime; TimeManagerClockButton.checkAlarmWarning = true; -- since game time isn't available in seconds, we have to keep track of the previous minute -- in order to play our alarm warning sound at the right time TimeManagerClockButton.currentMinute = _TimeManager_GetCurrentMinutes(Settings.localTime); TimeManagerClockButton.currentMinuteCounter = 0; end function TimeManager_CheckAlarm(elapsed) local currTime = _TimeManager_GetCurrentMinutes(Settings.localTime); local alarmTime = GameTime_ComputeMinutes(Settings.alarmHour, Settings.alarmMinute, Settings.militaryTime, Settings.alarmAM); -- check for the warning sound local clockButton = TimeManagerClockButton; if ( clockButton.checkAlarmWarning ) then if ( clockButton.currentMinute ~= currTime ) then clockButton.currentMinute = currTime; clockButton.currentMinuteCounter = 0; end local secOffset = floor(clockButton.currentMinuteCounter) * SEC_TO_MINUTE_FACTOR; if ( (currTime + secOffset) == clockButton.warningTime ) then TimeManager_FireAlarmWarning(); end clockButton.currentMinuteCounter = clockButton.currentMinuteCounter + elapsed; end -- check for the alarm sound if ( currTime == alarmTime ) then TimeManager_FireAlarm(); end end function TimeManager_FireAlarmWarning() TimeManagerClockButton.checkAlarmWarning = false; PlaySound("AlarmClockWarning1"); end function TimeManager_FireAlarm() TimeManagerClockButton.alarmFiring = true; TimeManagerClockButton.checkAlarm = false; -- do a bunch of crazy stuff to get the player's attention if ( gsub(Settings.alarmMessage, "%s", "") ~= "" ) then local info = ChatTypeInfo["SYSTEM"]; DEFAULT_CHAT_FRAME:AddMessage(Settings.alarmMessage, info.r, info.g, info.b, info.id); RaidNotice_AddMessage(RaidWarningFrame, Settings.alarmMessage, ChatTypeInfo["RAID_WARNING"]); end PlaySound("AlarmClockWarning2"); UIFrameFlash(TimeManagerAlarmFiredTexture, 0.5, 0.5, -1); -- show the clock if necessary, but record its current state so it can return to that state after -- the player turns the alarm off TimeManagerClockButton.prevShown = TimeManagerClockButton:IsShown(); TimeManagerClockButton:Show(); end function TimeManager_TurnOffAlarm() UIFrameFlashStop(TimeManagerAlarmFiredTexture); if ( not TimeManagerClockButton.prevShown ) then TimeManagerClockButton:Hide(); end TimeManagerClockButton.alarmFiring = false; end function TimeManager_IsAlarmFiring() return TimeManagerClockButton.alarmFiring; end function TimeManagerClockButton_UpdateTooltip() GameTooltip:ClearLines(); if ( TimeManagerClockButton.alarmFiring ) then if ( gsub(Settings.alarmMessage, "%s", "") ~= "" ) then GameTooltip:AddLine(Settings.alarmMessage, HIGHLIGHT_FONT_COLOR.r, HIGHLIGHT_FONT_COLOR.g, HIGHLIGHT_FONT_COLOR.b, 1); GameTooltip:AddLine(" "); end GameTooltip:AddLine(TIMEMANAGER_ALARM_TOOLTIP_TURN_OFF); else GameTime_UpdateTooltip(); GameTooltip:AddLine(" "); GameTooltip:AddLine(GAMETIME_TOOLTIP_TOGGLE_CLOCK); end -- readjust tooltip size GameTooltip:Show(); end -- StopwatchFrame function Stopwatch_Toggle() if ( StopwatchFrame:IsShown() ) then StopwatchFrame:Hide(); else StopwatchFrame:Show(); end end function Stopwatch_StartCountdown(hour, minute, second) local sec = 0; if ( hour ) then sec = hour * 3600; end if ( minute ) then sec = sec + minute * 60; end if ( second ) then sec = sec + second; end if ( sec == 0 ) then Stopwatch_Toggle(); return; end if ( sec > MAX_TIMER_SEC ) then StopwatchTicker.timer = MAX_TIMER_SEC; elseif ( sec < 0 ) then StopwatchTicker.timer = 0; else StopwatchTicker.timer = sec; end StopwatchTicker_Update(); StopwatchTicker.reverse = sec > 0; StopwatchFrame:Show(); end function Stopwatch_Play() if ( StopwatchPlayPauseButton.playing ) then return; end StopwatchPlayPauseButton.playing = true; StopwatchTicker:SetScript("OnUpdate", StopwatchTicker_OnUpdate); StopwatchPlayPauseButton:SetNormalTexture("Interface\\TimeManager\\PauseButton"); end function Stopwatch_Pause() if ( not StopwatchPlayPauseButton.playing ) then return; end StopwatchPlayPauseButton.playing = false; StopwatchTicker:SetScript("OnUpdate", nil); StopwatchPlayPauseButton:SetNormalTexture("Interface\\Buttons\\UI-SpellbookIcon-NextPage-Up"); end function Stopwatch_IsPlaying() return StopwatchPlayPauseButton.playing; end function Stopwatch_Clear() StopwatchTicker.timer = 0; StopwatchTicker.reverse = false; StopwatchTicker:SetScript("OnUpdate", nil); StopwatchTicker_Update(); StopwatchPlayPauseButton.playing = false; StopwatchPlayPauseButton:SetNormalTexture("Interface\\Buttons\\UI-SpellbookIcon-NextPage-Up"); end function Stopwatch_FinishCountdown() Stopwatch_Clear(); PlaySound("AlarmClockWarning3"); end function StopwatchCloseButton_OnClick() PlaySound("igMainMenuQuit"); StopwatchFrame:Hide(); end function StopwatchFrame_OnLoad(self) self:RegisterEvent("ADDON_LOADED"); self:RegisterEvent("PLAYER_LOGOUT"); self:RegisterForDrag("LeftButton"); StopwatchTabFrame:SetAlpha(0); Stopwatch_Clear(); end function StopwatchFrame_OnEvent(self, event, ...) if ( event == "ADDON_LOADED" ) then local name = ...; if ( name == "Blizzard_TimeManager" ) then if ( not BlizzardStopwatchOptions ) then BlizzardStopwatchOptions = {}; end if ( BlizzardStopwatchOptions.position ) then StopwatchFrame:ClearAllPoints(); StopwatchFrame:SetPoint("CENTER", "UIParent", "BOTTOMLEFT", BlizzardStopwatchOptions.position.x, BlizzardStopwatchOptions.position.y); StopwatchFrame:SetUserPlaced(true); else StopwatchFrame:SetPoint("TOPRIGHT", "UIParent", "TOPRIGHT", -250, -300); end end elseif ( event == "PLAYER_LOGOUT" ) then if ( StopwatchFrame:IsUserPlaced() ) then if ( not BlizzardStopwatchOptions.position ) then BlizzardStopwatchOptions.position = {}; end BlizzardStopwatchOptions.position.x, BlizzardStopwatchOptions.position.y = StopwatchFrame:GetCenter(); StopwatchFrame:SetUserPlaced(false); else BlizzardStopwatchOptions.position = nil; end end end function StopwatchFrame_OnUpdate(self) if ( self.prevMouseIsOver ) then if ( not self:IsMouseOver() ) then UIFrameFadeOut(StopwatchTabFrame, CHAT_FRAME_FADE_TIME); self.prevMouseIsOver = false; end else if ( self:IsMouseOver() ) then UIFrameFadeIn(StopwatchTabFrame, CHAT_FRAME_FADE_TIME); self.prevMouseIsOver = true; end end end function StopwatchFrame_OnShow(self) TimeManagerStopwatchCheck:SetChecked(1); end function StopwatchFrame_OnHide(self) UIFrameFadeRemoveFrame(StopwatchTabFrame); StopwatchTabFrame:SetAlpha(0); self.prevMouseIsOver = false; TimeManagerStopwatchCheck:SetChecked(nil); end function StopwatchFrame_OnMouseDown(self) self:SetScript("OnUpdate", nil); end function StopwatchFrame_OnMouseUp(self) self:SetScript("OnUpdate", StopwatchFrame_OnUpdate); end function StopwatchFrame_OnDragStart(self) self:StartMoving(); end function StopwatchFrame_OnDragStop(self) StopwatchFrame_OnMouseUp(self); -- OnMouseUp won't fire if OnDragStart fired after OnMouseDown self:StopMovingOrSizing(); end function StopwatchTicker_OnUpdate(self, elapsed) if ( self.reverse ) then self.timer = self.timer - elapsed; if ( self.timer <= 0 ) then Stopwatch_FinishCountdown(); return; end else self.timer = self.timer + elapsed; end StopwatchTicker_Update(); end function StopwatchTicker_Update() local timer = StopwatchTicker.timer; local hour = min(floor(timer*SEC_TO_HOUR_FACTOR), 99); local minute = mod(timer*SEC_TO_MINUTE_FACTOR, 60); local second = mod(timer, 60); StopwatchTickerHour:SetFormattedText(STOPWATCH_TIME_UNIT, hour); StopwatchTickerMinute:SetFormattedText(STOPWATCH_TIME_UNIT, minute); StopwatchTickerSecond:SetFormattedText(STOPWATCH_TIME_UNIT, second); end function StopwatchResetButton_OnClick() Stopwatch_Clear(); PlaySound("igMainMenuOptionCheckBoxOff"); end function StopwatchPlayPauseButton_OnClick(self) if ( self.playing ) then Stopwatch_Pause(); PlaySound("igMainMenuOptionCheckBoxOff"); else Stopwatch_Play(); PlaySound("igMainMenuOptionCheckBoxOn"); end end