comparison Modules/BuffFrame.lua @ 86:48182978d1c6

- revert count info to non-hook method; something spam fires Hide making stacking debuffs unintelligible - implement config variables for position and anchoring of buff sub-regions
author Nenue
date Tue, 18 Oct 2016 19:53:24 -0400
parents 16b300d96724
children 6e2cb847c3c6
comparison
equal deleted inserted replaced
85:1196b8175674 86:48182978d1c6
11 - BuffButtons can only be hidden/shown by blizzcode, so functions doing that have to be accounted for 11 - BuffButtons can only be hidden/shown by blizzcode, so functions doing that have to be accounted for
12 --]] 12 --]]
13 13
14 local BUFFS_PER_ROW = 12 14 local BUFFS_PER_ROW = 12
15 local BUFF_BUTTON_SIZE = 48 15 local BUFF_BUTTON_SIZE = 48
16 local BUFF_BUTTON_SPACING_H = 4 16 local BUFF_BUTTON_SPACING_H = 5
17 local BUFF_BUTTON_SPACING_V = 14 17 local BUFF_BUTTON_SPACING_V = 14
18 local BUFF_PROGRESS_SIZE = 4 18 local BUFF_PROGRESS_SIZE = 4
19 local BUFF_PROGRESS_INSET = 1 19 local BUFF_PROGRESS_INSET = 2
20 local PROGRESS_ANCHOR = 'BOTTOM'
21 local PROGRESS_PARENT
22 local PROGRESS_OFFSET = 1
23
20 local BUFF_BUTTON_ZOOM = .15 24 local BUFF_BUTTON_ZOOM = .15
21 local BORDER_SIZE_L = 1 25 local BORDER_SIZE_L = 2
22 local BORDER_SIZE_R = 1 26 local BORDER_SIZE_R = 2
23 local BORDER_SIZE_U = 1 27 local BORDER_SIZE_U = 2
24 local BORDER_SIZE_D = 1 28 local BORDER_SIZE_D = 2
25 local BUFF_FRAMES_X = -230 29 local BUFF_FRAMES_X = -230
26 local BUFF_FRAMES_Y = -4 30 local BUFF_FRAMES_Y = -4
31
32 local COUNT_ANCHOR = 'TOPRIGHT'
33 local COUNT_INSET = 4
34 local COUNT_PARENT
35
36 local DURATION_ANCHOR = 'BOTTOMLEFT'
37 local DURATION_INSET = 4
38 local DURATION_PARENT
27 39
28 VeneerBuffFrameMixin = { 40 VeneerBuffFrameMixin = {
29 moduleName = 'Buff Frames', 41 moduleName = 'Buff Frames',
30 defaultCluster = 'TOPRIGHT', 42 defaultCluster = 'TOPRIGHT',
31 Buttons = {}, 43 Buttons = {},
73 min = 0, 85 min = 0,
74 max = 16, 86 max = 16,
75 } 87 }
76 } 88 }
77 89
90 local OFFSET_PARALLELS = {
91 TOP = {'LEFT', 'RIGHT', 'SetHeight'},
92 BOTTOM = {'LEFT', 'RIGHT', 'SetHeight'},
93 LEFT = {'TOP', 'BOTTOM', 'SetWidth'},
94 RIGHT = {'TOP', 'BOTTOM', 'SetWidth'},
95 }
96 local ANCHOR_OFFSET_POINT = {
97 TOP = 'BOTTOM',
98 TOPLEFT = 'BOTTOMRIGHT',
99 TOPRIGHT = 'BOTTOMLEFT',
100 LEFT = 'RIGHT',
101 RIGHT = 'LEFT',
102 CENTER = 'CENTER',
103 BOTTOM = 'TOP',
104 BOTTOMRIGHT = 'TOPLEFT',
105 BOTTOMLEFT = 'TOPRIGHT',
106 }
107 local ANCHOR_INSET_DELTA = {
108 TOP = {0, -1},
109 TOPLEFT = {1, -1},
110 TOPRIGHT = {-1,-1},
111 LEFT = {1, 0},
112 BOTTOMLEFT = {1, 1},
113 BOTTOM = {0, 1},
114 BOTTOMRIGHT = {-1, 1},
115 RIGHT = {-1, 0},
116 CENTER = {0, 0},
117 }
78 118
79 function plugin:Acquire(target) 119 function plugin:Acquire(target)
80 120
81 local frame = self.Buttons[target] 121 local frame = self.Buttons[target]
82 if not (self.Buttons[target]) then 122 if not (self.Buttons[target]) then
84 local id = target:GetID() 124 local id = target:GetID()
85 print('|cFF88FF00Creating', name,'Veneer') 125 print('|cFF88FF00Creating', name,'Veneer')
86 126
87 frame = vn:Acquire(target, 'VeneerBuffTemplate') 127 frame = vn:Acquire(target, 'VeneerBuffTemplate')
88 128
89 frame.progress:SetHeight(BUFF_PROGRESS_SIZE + (BUFF_PROGRESS_INSET * 2)) 129 frame.progress[OFFSET_PARALLELS[PROGRESS_ANCHOR][3]](frame.progress, BUFF_PROGRESS_SIZE + (BUFF_PROGRESS_INSET * 2))
130 print(BUFF_PROGRESS_SIZE + (BUFF_PROGRESS_INSET * 2))
131
132 frame.progress:ClearAllPoints()
133 frame.progress:SetPoint(ANCHOR_OFFSET_POINT[PROGRESS_ANCHOR], PROGRESS_PARENT or frame.border, PROGRESS_ANCHOR,
134 (ANCHOR_INSET_DELTA[PROGRESS_ANCHOR][1] * PROGRESS_OFFSET * -1),
135 (ANCHOR_INSET_DELTA[PROGRESS_ANCHOR][2] * PROGRESS_OFFSET * -1))
136 frame.progress:SetPoint(OFFSET_PARALLELS[PROGRESS_ANCHOR][1], frame.border, OFFSET_PARALLELS[PROGRESS_ANCHOR][1], 0, 0)
137 frame.progress:SetPoint(OFFSET_PARALLELS[PROGRESS_ANCHOR][2], frame.border, OFFSET_PARALLELS[PROGRESS_ANCHOR][2], 0, 0)
138
139 print(frame.progress:GetPoint(1))
140 print(frame.progress:GetPoint(2))
141 print(frame.progress:GetPoint(3))
142 frame.progress:Show()
143
144 frame.progress.bg:ClearAllPoints()
145 frame.progress.bg:SetAllPoints(frame.progress)
90 146
91 frame.progress.fg:ClearAllPoints() 147 frame.progress.fg:ClearAllPoints()
92 frame.progress.fg:SetPoint('BOTTOMLEFT', BUFF_PROGRESS_INSET,BUFF_PROGRESS_INSET) 148 frame.progress.fg:SetPoint('BOTTOMLEFT', BUFF_PROGRESS_INSET,BUFF_PROGRESS_INSET)
93 frame.progress.fg:SetPoint('TOP', 0, -BUFF_PROGRESS_INSET) 149 frame.progress.fg:SetPoint('TOP', 0, -BUFF_PROGRESS_INSET)
94 150 --frame.count:ClearAllPoints()
151 --frame.count:SetPoint('TOPRIGHT', frame,'TOPRIGHT', -3, -3)
152
153
154 frame.duration:ClearAllPoints()
155 frame.duration:SetPoint(DURATION_ANCHOR, DURATION_PARENT or frame, DURATION_ANCHOR,
156 (ANCHOR_INSET_DELTA[DURATION_ANCHOR][1] * DURATION_INSET),
157 (ANCHOR_INSET_DELTA[DURATION_ANCHOR][2] * DURATION_INSET))
158
159 frame.count:ClearAllPoints()
160 frame.count:SetPoint(COUNT_ANCHOR, COUNT_PARENT or frame, COUNT_ANCHOR,
161 (ANCHOR_INSET_DELTA[COUNT_ANCHOR][1] * COUNT_INSET),
162 (ANCHOR_INSET_DELTA[COUNT_ANCHOR][2] * COUNT_INSET))
95 163
96 frame.underlay:SetParent(UIParent) 164 frame.underlay:SetParent(UIParent)
97 frame.underlay:SetFrameStrata('BACKGROUND') 165 frame.underlay:SetFrameStrata('BACKGROUND')
98 frame.border:SetColorTexture(0,0,0,1) 166 frame.border:SetColorTexture(0,0,0,1)
99 frame.border:SetPoint('TOPLEFT', frame, 'TOPLEFT', -BORDER_SIZE_L, BORDER_SIZE_U) 167 frame.border:SetPoint('TOPLEFT', frame, 'TOPLEFT', -BORDER_SIZE_L, BORDER_SIZE_U)
122 _G['TempEnchant'..i..'Border']:SetVertexColor(0.5,0,1,1) 190 _G['TempEnchant'..i..'Border']:SetVertexColor(0.5,0,1,1)
123 end 191 end
124 end 192 end
125 -- Associates skinning elements with said button 193 -- Associates skinning elements with said button
126 local surrogates = { 194 local surrogates = {
127 Show = false, 195 ['Show'] = false,
128 Hide = false, 196 ['Hide'] = false,
129 SetText = false, 197 ['SetText'] = false,
130 SetVertexColor = function(surrogate, frame, r, g, b, a) 198 ['SetVertexColor'] = function(self, region, r, g, b, a)
131 frame:Hide() 199 if not self.progress then
132 print('|cFF0088FFborder:SetVertexColor|r', r,g,b,a) 200 return
133 surrogate.progress.fg:SetColorTexture(r,g,b,a) 201 end
134 surrogate.border:Show() 202
203 region:Hide()
204 tprint('|cFF0088FFborder:SetVertexColor|r', r,g,b,a)
205 self.progress.fg:SetColorTexture(r,g,b,a)
206 self.border:SetColorTexture(r,g,b,a)
207 self.border:Show()
135 end, 208 end,
136 } 209 }
137 local DoRegionHooks = function (veneer, region) 210 local DoRegionHooks = function (veneer, region)
138 211
139 if region then 212 if region then
140 print('hooking', region:GetName()) 213 --print('hooking', region:GetName())
141 region:ClearAllPoints() 214 region:ClearAllPoints()
142 for method, callback in ipairs(surrogates) do 215 for method, callback in pairs(surrogates) do
143 print(method, callback) 216 if type(region[method]) == 'function' then
144 if region[method] then 217
218 --print(method, type(callback))
145 local func 219 local func
146 if callback then 220 if callback then
147 print('hooking', region:GetName(), method) 221 func = function(self, ...)
148 func = function(self,...) 222 --tprint('|cFF00FFFF'.. region:GetName().. ':', method)
149 print(self:GetName(), ':', method) 223 region:ClearAllPoints()
150 self:ClearAllPoints() 224 callback(veneer, region, ...)
151 veneer[method](...)
152 end 225 end
153 else 226 else
154 func = function(self, ...) 227 func = function(self,...)
228 tprint('|cFF0088FF'.. self:GetName().. ':', method)
155 self:ClearAllPoints() 229 self:ClearAllPoints()
156 callback(veneer, region, ...) 230 veneer:Show()
231 veneer[method](veneer, ...)
232
233 if self:GetName():match('Debuff.+Count') then
234
235 print('|cFF00FFFF'.. self:GetName().. ':'.. method, '->', veneer:GetName()..':'..method..'(', ...,')')
236 print(veneer:IsVisible(),veneer:GetStringWidth(),veneer:GetText())
237 print(veneer:GetTop(), veneer:GetLeft())
238 print(veneer:GetPoint(1))
239 end
240
157 end 241 end
158 end 242 end
159 hooksecurefunc(region, method, callback) 243 if func then
244 --print('hooking', region:GetName(), method)
245 hooksecurefunc(region, method, func)
246
247 end
160 end 248 end
161 end 249 end
162 end 250 end
163 end 251 end
164 252
165 253
166 function plugin:SetupButton (name) 254 function plugin:SetupButton (name)
167 local frame = _G[name ] 255 local frame = _G[name ]
168 if self.DetectedFrames[frame] then 256 if self.DetectedFrames[frame] then
169 print('|cFFFF4400Attempting to skin a frame that already went through.|r') 257 --print('|cFFFF4400Attempting to skin a frame that already went through.|r')
170 return 258 return
171 end 259 end
172 print('|cFFFFFF00Adopting', name) 260 --print('|cFFFFFF00Adopting', name)
173 261
174 local icon = _G[name .. 'Icon'] 262 local icon = _G[name .. 'Icon']
175 local border = _G[name .. 'Border'] 263 local border = _G[name .. 'Border']
176 local count = _G[name .. 'Count'] 264 local count = _G[name .. 'Count']
177 local duration = _G[name .. 'Duration'] 265 local duration = _G[name .. 'Duration']
181 self.DetectedFrames[frame] = frame 269 self.DetectedFrames[frame] = frame
182 frame:SetSize(BUFF_BUTTON_SIZE,BUFF_BUTTON_SIZE) 270 frame:SetSize(BUFF_BUTTON_SIZE,BUFF_BUTTON_SIZE)
183 icon:SetTexCoord(offset, 1 - offset, offset, 1 - offset) 271 icon:SetTexCoord(offset, 1 - offset, offset, 1 - offset)
184 272
185 273
274
186 DoRegionHooks(veneer, border) 275 DoRegionHooks(veneer, border)
187 DoRegionHooks(veneer.duration, duration)
188 DoRegionHooks(veneer.count, count)
189 if border then 276 if border then
190 local color = DebuffTypeColor["none"] 277 local color = DebuffTypeColor["none"]
191 if aurasCache[frame] and aurasCache[frame][5] then 278 if aurasCache[frame] and aurasCache[frame][5] then
192 color = DebuffTypeColor[aurasCache[frame][5]] 279 color = DebuffTypeColor[aurasCache[frame][5]]
193 end 280 end
197 else 284 else
198 veneer.border:SetColorTexture(0,0,0,1) 285 veneer.border:SetColorTexture(0,0,0,1)
199 veneer.border:Show() 286 veneer.border:Show()
200 end 287 end
201 288
289 if count and count:GetText() then
290 count:ClearAllPoints()
291 veneer.count:SetText(count:GetText())
292 end
293 if duration then
294 duration:ClearAllPoints()
295 end
296
297
298
202 299
203 hooksecurefunc(frame, "Hide", function(self) 300 hooksecurefunc(frame, "Hide", function(self)
204 local isVisible = self:IsVisible() 301 local isVisible = self:IsVisible()
205 if isVisible ~= visibility[self] then 302 if isVisible ~= visibility[self] then
206 visibility[self] = isVisible 303 visibility[self] = isVisible
227 local veneer = self:Acquire(frame) 324 local veneer = self:Acquire(frame)
228 -- is it a new button? 325 -- is it a new button?
229 if not self.DetectedFrames[frame] then 326 if not self.DetectedFrames[frame] then
230 self:SetupButton(frame:GetName()) 327 self:SetupButton(frame:GetName())
231 end 328 end
329
330 --[[
331 if frame.count then
332 frame.count:SetText('test')
333 frame.count:Show()
334 end
335 --]]
336 local name, rank, icon, count, _, duration, expires = UnitAura(frame.unit, frame:GetID(), frame.filter)
232 337
233 338
234 if expires and duration then 339 if expires and duration then
235 if duration ~= 0 then 340 if duration ~= 0 then
236 local startTime = (expires - duration) 341 local startTime = (expires - duration)
266 print('|cFF00FF88'..frame:GetName()..'|r', 'duration zero') 371 print('|cFF00FF88'..frame:GetName()..'|r', 'duration zero')
267 veneer.progress:SetScript('OnUpdate', nil) 372 veneer.progress:SetScript('OnUpdate', nil)
268 veneer.progress:Hide() 373 veneer.progress:Hide()
269 veneer.cooldown:Hide() 374 veneer.cooldown:Hide()
270 end 375 end
376
377 if count and count >= 1 then
378 veneer.count:SetText(count)
379 veneer.count:Show()
380 else
381 veneer.count:Hide()
382 end
383
384
271 else 385 else
272 veneer.progress:Hide() 386 veneer.progress:Hide()
273 veneer.cooldown:SetCooldown(0,0) 387 veneer.cooldown:SetCooldown(0,0)
274 veneer.cooldown:Hide() 388 veneer.cooldown:Hide()
275 print('|cFF88FF00'..frame:GetName()..'|r', 'nil duration') 389 print('|cFF88FF00'..frame:GetName()..'|r', 'nil duration')
295 409
296 function plugin:OnAuraButton_Update (name, index, filter) 410 function plugin:OnAuraButton_Update (name, index, filter)
297 local bName = name..index 411 local bName = name..index
298 local frame = _G[bName] 412 local frame = _G[bName]
299 if frame and frame:IsVisible() then 413 if frame and frame:IsVisible() then
300 local cacheDiff = self:ButtonHasChanged(frame, UnitAura(frame.unit, frame:GetID(), frame.filter))
301 -- if the name or expirationTime changed 414 -- if the name or expirationTime changed
302 if (cacheDiff >= 1) then 415
303 print('|cFFFF4400', frame:GetName(), 'diff:', cacheDiff)
304 if not skinnedFrames[frame] then 416 if not skinnedFrames[frame] then
305 tinsert(pendingFrames, frame) 417 tinsert(pendingFrames, frame)
306 end 418 end
307 expirationCache[name] = frame.expirationTime 419 expirationCache[name] = frame.expirationTime
308 print(unpack(aurasCache[frame])) 420 self:UpdateButton(frame)
309 421
310 self:UpdateButton(frame, aurasCache[frame][6], aurasCache[frame][7])
311 end
312 422
313 end 423 end
314 end 424 end
315 425
316 function plugin:OnUpdateAllBuffAnchors () 426 function plugin:OnUpdateAllBuffAnchors ()
407 if veneer.duration.getHuge then 517 if veneer.duration.getHuge then
408 veneer.duration.getHuge = nil 518 veneer.duration.getHuge = nil
409 veneer.duration:SetFontObject(VeneerNumberFont) 519 veneer.duration:SetFontObject(VeneerNumberFont)
410 veneer.duration:SetTextColor(1,1,1,1) 520 veneer.duration:SetTextColor(1,1,1,1)
411 end 521 end
412 522 end
413 end
414
415 523
416 veneer.duration:SetText(timeString) 524 veneer.duration:SetText(timeString)
417 end 525 end
418 526
419 527