From a291c10d4cd0e1c9661b3db2bb85f5bf14a40f83 Mon Sep 17 00:00:00 2001 From: Tuller Date: Sat, 31 Jul 2010 15:10:04 -0400 Subject: [PATCH] Fixed scaling issues Updated readme --- README | 2 +- tullaCC/cc.lua | 98 +++++++++++++++++++++++++++++++++++--------------------- 2 files changed, 62 insertions(+), 38 deletions(-) diff --git a/README b/README index 81338ad..6786af1 100644 --- a/README +++ b/README @@ -1 +1 @@ -tullaRange is a minimal addon for displaying cooldown text on acton buttons/inventory items/etc \ No newline at end of file +tullaCooldownCount is a minimal addon for displaying cooldown text on acton buttons/inventory items/etc \ No newline at end of file diff --git a/tullaCC/cc.lua b/tullaCC/cc.lua index c71a3e3..a03b23f 100644 --- a/tullaCC/cc.lua +++ b/tullaCC/cc.lua @@ -1,7 +1,7 @@ --[[ tullaCooldownCount A basic cooldown count addon - + The purpose of this addon is mainly for me to test performance optimizations and also for people who don't care about the extra features of OmniCC --]] @@ -26,7 +26,7 @@ local GetTime = GetTime --returns both what text to display, and how long until the next update local function getTimeText(s) --format text as seconds when at 90 seconds or below - if s < MINUTEISH then + if s < MINUTEISH then local seconds = round(s) return seconds, s - (seconds - 0.51) --format text as minutes when below an hour @@ -38,12 +38,42 @@ local function getTimeText(s) local hours = round(s/HOUR) return hours .. 'h', hours > 1 and (s - (hours*HOUR - HALFHOURISH)) or (s - HOURISH) --format text as days - else + else local days = round(s/DAY) return days .. 'd', days > 1 and (s - (days*DAY - HALFDAYISH)) or (s - DAYISH) end end +--stops the timer +local function Timer_Stop(self) + self.enabled = nil + self:Hide() +end + +--forces the given timer to update on the next frame +local function Timer_ForceUpdate(self) + self.nextUpdate = 0 + self:Show() +end + +--scale text when a button's size changes +local function Timer_OnSizeChanged(self, width, height) + local fontScale = round(width) / ICON_SIZE + if fontScale == self.fontScale then + return + end + + self.fontScale = fontScale + if fontScale < MIN_SCALE then + self:Hide() + else + self.text:SetFont(FONT_FACE, fontScale * FONT_SIZE, 'OUTLINE') + if self.enabled then + Timer_ForceUpdate(self) + end + end +end + local function Timer_OnUpdate(self, elapsed) if self.nextUpdate > 0 then self.nextUpdate = self.nextUpdate - elapsed @@ -54,52 +84,46 @@ local function Timer_OnUpdate(self, elapsed) self.text:SetText(time) self.nextUpdate = nextUpdate else - self.text:Hide() - self.nextUpdate = 0 - self:SetScript('OnUpdate', nil) + Timer_Stop(self) end end end -local function Timer_OnSizeChanged(self) - if (self:GetParent():GetWidth() / ICON_SIZE) < MIN_SCALE then - self.text:Hide() - self:SetScript('OnUpdate', nil) - else - self.text:Show() - self:SetScript('OnUpdate', Timer_OnUpdate) - end -end +local function Timer_Create(cd) + local scaler = CreateFrame('Frame', nil, cd) --needed since OnSizeChanged has funny triggering if the parent is not visible for some reason + scaler:SetAllPoints(cd) + + local timer = CreateFrame('Frame', nil, scaler); timer:Hide() + timer:SetAllPoints(scaler) + timer:SetScript('OnUpdate', Timer_OnUpdate) -local function Timer_Create(self) - local text = self:CreateFontString(nil, 'OVERLAY'); text:Hide() - text:SetPoint('CENTER', 0, 36) - text:SetFont(FONT_FACE, FONT_SIZE, 'OUTLINE') + local text = timer:CreateFontString(nil, 'OVERLAY') + text:SetPoint('CENTER', 0, 0) text:SetTextColor(1, 0.92, 0) - self.text = text - - self:SetScript('OnSizeChanged', Timer_OnSizeChanged) - return text + timer.text = text + + Timer_OnSizeChanged(timer, scaler:GetSize()) + scaler:SetScript('OnSizeChanged', function(self, ...) Timer_OnSizeChanged(timer, ...) end) + + cd.timer = timer + return timer end --ActionButton1Cooldown here, is something we think will always exist -hooksecurefunc(getmetatable(ActionButton1Cooldown).__index, 'SetCooldown', function(self, start, duration) +hooksecurefunc(getmetatable(ActionButton1Cooldown).__index, 'SetCooldown', function(cd, start, duration) --start timer if start > 0 and duration > MIN_DURATION then - self.start = start - self.duration = duration - self.nextUpdate = 0 - - local text = self.text or Timer_Create(self) - if text then - text:Show() - self:SetScript('OnUpdate', Timer_OnUpdate) - end + local timer = cd.timer or Timer_Create(cd) + timer.start = start + timer.duration = duration + timer.enabled = true + timer.nextUpdate = 0 + if timer.fontScale >= MIN_SCALE then timer:Show() end --stop timer - else - local text = self.text - if text then - text:Hide() + else + local timer = cd.timer + if timer then + Timer_Stop(timer) end end end) \ No newline at end of file -- 1.7.9.5