comparison Modules/BuffFrame.lua @ 69:ebc18a7412a1

- use secure hook functions to manage duration and count text
author Nenue
date Sun, 21 Aug 2016 10:28:09 -0400
parents be5cea6e1e8f
children 1b0d7bcd252e
comparison
equal deleted inserted replaced
68:be5cea6e1e8f 69:ebc18a7412a1
80 end 80 end
81 81
82 82
83 local GetVeneer = function(frame) 83 local GetVeneer = function(frame)
84 local name = frame:GetName() 84 local name = frame:GetName()
85 if not (_G[name..'Veneer'] and _G[name..'Underlay']) then 85 if not (_G[name..'Veneer']) then
86 print('|cFF88FF00Creating', name,'Veneer') 86 print('|cFF88FF00Creating', name,'Veneer')
87 local veneer = CreateFrame('Frame', name..'Veneer', UIParent) 87 local veneer = CreateFrame('Frame', name..'Veneer', UIParent)
88 local id = frame:GetID() 88 local id = frame:GetID()
89 veneer:SetAllPoints(frame) 89 veneer:SetAllPoints(frame)
90 veneer:SetParent(frame) 90 veneer:SetParent(frame)
125 125
126 veneer.cooldown = CreateFrame('Cooldown', name ..'VeneerCooldown', veneer, 'CooldownFrameTemplate') 126 veneer.cooldown = CreateFrame('Cooldown', name ..'VeneerCooldown', veneer, 'CooldownFrameTemplate')
127 veneer.cooldown:SetAllPoints(frame) 127 veneer.cooldown:SetAllPoints(frame)
128 veneer.cooldown:SetReverse(true) 128 veneer.cooldown:SetReverse(true)
129 129
130 130 local overlay = CreateFrame('Frame', name .. 'VeneerOverlay', UIParent)
131 131
132 132 overlay:Show()
133 local underlay = CreateFrame('Frame', name..'Underlay', UIParent) 133 overlay:SetFrameStrata('MEDIUM')
134 local n = frame:GetNumPoints()
135 for i = 1, n do
136 overlay:SetPoint(frame:GetPoint(n))
137 end
138
139
140 local underlay = CreateFrame('Frame', name..'VeneerUnderlay', UIParent)
134 underlay:Show() 141 underlay:Show()
135 underlay:SetFrameStrata('BACKGROUND') 142 underlay:SetFrameStrata('BACKGROUND')
136 local n = frame:GetNumPoints() 143 local n = frame:GetNumPoints()
137 for i = 1, n do 144 for i = 1, n do
138 underlay:SetPoint(frame:GetPoint(n)) 145 underlay:SetPoint(frame:GetPoint(n))
139 end 146 end
140 147
148 veneer.duration = overlay:CreateFontString(name..'VeneerDuration', 'OVERLAY')
149 veneer.duration:SetFontObject(VeneerNumberFont)
150 veneer.duration:SetPoint('TOP', frame, 'BOTTOM', 0, -8)
151
152 veneer.count = overlay:CreateFontString(name..'VeneerCount', 'OVERLAY')
153 veneer.count:SetFontObject(VeneerNumberFont)
154 veneer.count:SetPoint('BOTTOMRIGHT', frame, 'BOTTOMRIGHT', -3, 3)
141 155
142 156
143 157
144 veneer.border = underlay:CreateTexture(name..'VeneerBorder', 'BACKGROUND') 158 veneer.border = underlay:CreateTexture(name..'VeneerBorder', 'BACKGROUND')
145 veneer.border:SetPoint('TOPLEFT', veneer, 'TOPLEFT', -BORDER_SIZE_L, BORDER_SIZE_U) 159 veneer.border:SetPoint('TOPLEFT', veneer, 'TOPLEFT', -BORDER_SIZE_L, BORDER_SIZE_U)
146 veneer.border:SetPoint('BOTTOMRIGHT', veneer, 'BOTTOMRIGHT', BORDER_SIZE_R, -BORDER_SIZE_D) 160 veneer.border:SetPoint('BOTTOMRIGHT', veneer, 'BOTTOMRIGHT', BORDER_SIZE_R, -BORDER_SIZE_D)
147 --veneer.border:SetColorTexture(0,1,0,1)
148 veneer.border:Show() 161 veneer.border:Show()
149 162
150 end 163
151 164 veneer.overlay = overlay
152 165 veneer.underlay = underlay
153 return _G[name..'Veneer'], _G[name..'Underlay'] 166 end
167
168
169 return _G[name..'Veneer']
154 end 170 end
155 171
156 172
157 -- Associates skinning elements with said button 173 -- Associates skinning elements with said button
158 local SkinFrame = function(name) 174 local SkinFrame = function(name)
166 local icon = _G[name .. 'Icon'] 182 local icon = _G[name .. 'Icon']
167 local border = _G[name .. 'Border'] 183 local border = _G[name .. 'Border']
168 local count = _G[name .. 'Count'] 184 local count = _G[name .. 'Count']
169 local duration = _G[name .. 'Duration'] 185 local duration = _G[name .. 'Duration']
170 local slot = frame:GetID() or 0 186 local slot = frame:GetID() or 0
171 local veneer, underlay = GetVeneer(frame) 187 local veneer = GetVeneer(frame)
188 local underlay = veneer.underlay
189 local overlay = veneer.overlay
172 190
173 skinnedFrames[frame] = frame 191 skinnedFrames[frame] = frame
174 frame:SetSize(BUFF_BUTTON_SIZE,BUFF_BUTTON_SIZE) 192 frame:SetSize(BUFF_BUTTON_SIZE,BUFF_BUTTON_SIZE)
175 193
176 local offset = BUFF_BUTTON_ZOOM/2 194 local offset = BUFF_BUTTON_ZOOM/2
190 208
191 veneer.border:SetColorTexture(color.r,color.g,color.b) 209 veneer.border:SetColorTexture(color.r,color.g,color.b)
192 end 210 end
193 if duration then 211 if duration then
194 duration:ClearAllPoints() 212 duration:ClearAllPoints()
195 duration:SetPoint('TOP', frame, 'BOTTOM', 0, -8) 213 --duration:SetPoint('TOP', frame, 'BOTTOM', 0, -8)
196 duration:SetFontObject(VeneerNumberFont) 214 --duration:SetFontObject(VeneerNumberFont)
197 duration:SetDrawLayer('OVERLAY') 215 --duration:SetDrawLayer('OVERLAY')
198 216
217 hooksecurefunc(duration, 'Hide', function(self, text)
218 veneer.duration:Hide()
219 end)
220 hooksecurefunc(duration, 'Show', function(self, text)
221 veneer.duration:Show()
222 end)
223 end
224 if count then
225 count:ClearAllPoints()
226 hooksecurefunc(count, 'SetText', function(self, text)
227 self:Hide()
228 veneer.count:SetText(text)
229 end)
230 hooksecurefunc(count, 'Hide', function(self, text)
231 veneer.count:Hide()
232 end)
233 hooksecurefunc(count, 'Show', function(self, text)
234 veneer.count:Show()
235 end)
199 end 236 end
200 237
201 238
202 hooksecurefunc(frame, "Hide", function(self) 239 hooksecurefunc(frame, "Hide", function(self)
203 local isVisible = self:IsVisible() 240 local isVisible = self:IsVisible()
350 end 387 end
351 388
352 end 389 end
353 390
354 local AuraButton_UpdateDuration = function(frame, timeLeft) 391 local AuraButton_UpdateDuration = function(frame, timeLeft)
392 local veneer = GetVeneer(frame)
355 local hours = floor(timeLeft/3600) 393 local hours = floor(timeLeft/3600)
356 local minutes = floor(mod(timeLeft, 3600)/60) 394 local minutes = floor(mod(timeLeft, 3600)/60)
357 local seconds = floor(mod(timeLeft, 60)) 395 local seconds = floor(mod(timeLeft, 60))
358 local timeString = '%ds' 396 local timeString = '%ds'
359 if timeLeft > 3600 then 397 if timeLeft > 3600 then
363 else 401 else
364 timeString = format('%d', seconds) 402 timeString = format('%d', seconds)
365 end 403 end
366 404
367 405
368 frame.duration:SetText(timeString) 406 veneer.duration:SetText(timeString)
369 frame.duration:SetVertexColor(1,1,1) 407 veneer.duration:SetVertexColor(1,1,1)
370 end 408 end
371 409
372 410
373 -- Obtains the first instance of Tenchant use 411 -- Obtains the first instance of Tenchant use
374 412