Mercurial > wow > reaction
comparison classes/Bar.lua @ 234:0e20f65375d5
Reworked button creation to not use goofy event driven semantics.
author | Flick |
---|---|
date | Tue, 22 Mar 2011 17:05:51 -0700 |
parents | 8ba8ab8bf6dd |
children | 704f4a05a1d7 |
comparison
equal
deleted
inserted
replaced
233:9b9f5fc84d34 | 234:0e20f65375d5 |
---|---|
182 end | 182 end |
183 | 183 |
184 | 184 |
185 ---- Bar class ---- | 185 ---- Bar class ---- |
186 local Bar = { } | 186 local Bar = { } |
187 local weak = { __mode = "k" } | |
188 local frameList = { } | 187 local frameList = { } |
189 | 188 |
190 ReAction.Bar = Bar -- export to ReAction | 189 ReAction.Bar = Bar -- export to ReAction |
191 | 190 |
192 function Bar:New( name, config ) | 191 function Bar:New( name, config, buttonClass ) |
193 if type(config) ~= "table" then | 192 if type(config) ~= "table" then |
194 error("ReAction.Bar: config table required") | 193 error("ReAction.Bar: config table required") |
195 end | 194 end |
196 | 195 |
197 -- create new self | 196 -- create new self |
198 self = setmetatable( | 197 self = setmetatable( |
199 { | 198 { |
200 config = config, | 199 config = config, |
201 name = name, | 200 name = name, |
202 buttons = setmetatable( { }, weak ), | 201 buttons = { }, |
203 width = config.width or 480, | 202 buttonClass = buttonClass, |
204 height = config.height or 40, | 203 width = config.width or 480, |
204 height = config.height or 40, | |
205 }, | 205 }, |
206 {__index = self} ) | 206 {__index = self} ) |
207 | 207 |
208 -- The frame type is 'Button' in order to have an OnClick handler. However, the frame itself is | 208 -- The frame type is 'Button' in order to have an OnClick handler. However, the frame itself is |
209 -- not mouse-clickable by the user. | 209 -- not mouse-clickable by the user. |
259 self.LBFGroup = g | 259 self.LBFGroup = g |
260 end | 260 end |
261 | 261 |
262 ReAction.RegisterCallback(self, "OnConfigModeChanged") | 262 ReAction.RegisterCallback(self, "OnConfigModeChanged") |
263 | 263 |
264 buttonClass:SetupBar(self) | |
265 | |
264 return self | 266 return self |
265 end | 267 end |
266 | 268 |
267 function Bar:Destroy() | 269 function Bar:Destroy() |
268 local f = self:GetFrame() | 270 local f = self:GetFrame() |
271 for idx, b in self:IterateButtons() do | |
272 b:Destroy() | |
273 end | |
269 f:UnregisterAllEvents() | 274 f:UnregisterAllEvents() |
270 self:ShowControls(false) | 275 self:ShowControls(false) |
271 ReAction.UnregisterAllCallbacks(self) | 276 ReAction.UnregisterAllCallbacks(self) |
272 LKB.UnregisterAllCallbacks(self) | 277 LKB.UnregisterAllCallbacks(self) |
273 if self.LBFGroup then | 278 if self.LBFGroup then |
300 function Bar:SetName(name) | 305 function Bar:SetName(name) |
301 if self.LBFGroup then | 306 if self.LBFGroup then |
302 -- LBF doesn't offer a method of renaming a group, so delete and remake the group. | 307 -- LBF doesn't offer a method of renaming a group, so delete and remake the group. |
303 local c = self.config.ButtonFacade | 308 local c = self.config.ButtonFacade |
304 local g = ReAction.LBF:Group(L["ReAction"], name) | 309 local g = ReAction.LBF:Group(L["ReAction"], name) |
305 for b in self:IterateButtons() do | 310 for idx, b in self:IterateButtons() do |
306 self.LBFGroup:RemoveButton(b:GetFrame(), true) | 311 self.LBFGroup:RemoveButton(b:GetFrame(), true) |
307 g:AddButton(b:GetFrame()) | 312 g:AddButton(b:GetFrame()) |
308 end | 313 end |
309 self.LBFGroup:Delete(true) | 314 self.LBFGroup:Delete(true) |
310 self.LBFGroup = g | 315 self.LBFGroup = g |
318 | 323 |
319 function Bar:GetFrame() | 324 function Bar:GetFrame() |
320 -- this method is included for documentation purposes. It is overridden | 325 -- this method is included for documentation purposes. It is overridden |
321 -- for each object in the :New() method. | 326 -- for each object in the :New() method. |
322 error("Invalid Bar object: used without initialization") | 327 error("Invalid Bar object: used without initialization") |
328 end | |
329 | |
330 function Bar:GetButton(idx) | |
331 return self.buttons[idx] | |
323 end | 332 end |
324 | 333 |
325 function Bar:GetConfig() | 334 function Bar:GetConfig() |
326 return self.config | 335 return self.config |
327 end | 336 end |
392 local cfg = self.config | 401 local cfg = self.config |
393 cfg.btnRows = r | 402 cfg.btnRows = r |
394 cfg.btnColumns = c | 403 cfg.btnColumns = c |
395 cfg.spacing = s | 404 cfg.spacing = s |
396 end | 405 end |
406 self.buttonClass:SetupBar(self) | |
397 ReAction:RefreshBar(self) | 407 ReAction:RefreshBar(self) |
398 end | 408 end |
399 | 409 |
400 function Bar:GetAlpha() | 410 function Bar:GetAlpha() |
401 return self.config.alpha or 1.0 | 411 return self.config.alpha or 1.0 |
407 self:UpdateDefaultStateAlpha() | 417 self:UpdateDefaultStateAlpha() |
408 ReAction:RefreshBar(self) | 418 ReAction:RefreshBar(self) |
409 end | 419 end |
410 | 420 |
411 function Bar:IterateButtons() | 421 function Bar:IterateButtons() |
412 -- iterator returns button, idx and does NOT iterate in index order | 422 -- iterator returns idx, button, but does NOT iterate in index order |
413 return pairs(self.buttons) | 423 return pairs(self.buttons) |
414 end | 424 end |
415 | 425 |
416 -- | 426 -- |
417 -- Methods | 427 -- Methods |
418 -- | 428 -- |
419 | 429 |
420 function Bar:SetConfigMode(mode) | 430 function Bar:SetConfigMode(mode) |
421 self:SetSecureData("showAll",mode) | 431 self:SetSecureData("showAll",mode) |
422 self:ShowControls(mode) | 432 self:ShowControls(mode) |
423 for b in self:IterateButtons() do | 433 for idx, b in self:IterateButtons() do |
424 b:ShowGridTemp(mode) | 434 b:ShowGridTemp(mode) |
425 b:UpdateActionIDLabel(mode) | 435 b:UpdateActionIDLabel(mode) |
426 end | 436 end |
427 end | 437 end |
428 | 438 |
429 function Bar:SetKeybindMode(mode) | 439 function Bar:SetKeybindMode(mode) |
430 self:SetSecureData("showAll",mode) | 440 self:SetSecureData("showAll",mode) |
431 for b in self:IterateButtons() do | 441 for idx, b in self:IterateButtons() do |
432 b:SetKeybindMode(mode) | 442 b:SetKeybindMode(mode) |
433 end | 443 end |
434 end | 444 end |
435 | 445 |
436 function Bar:ApplyAnchor() | 446 function Bar:ApplyAnchor() |
471 end | 481 end |
472 | 482 |
473 function Bar:AddButton(idx, button) | 483 function Bar:AddButton(idx, button) |
474 local f = self:GetFrame() | 484 local f = self:GetFrame() |
475 | 485 |
476 -- store in a weak reverse-index array | 486 self.buttons[idx] = button |
477 self.buttons[button] = idx | |
478 | 487 |
479 -- Store a properly wrapped reference to the child frame as an attribute | 488 -- Store a properly wrapped reference to the child frame as an attribute |
480 -- (accessible via "frameref-btn#") | 489 -- (accessible via "frameref-btn#") |
481 f:SetFrameRef(format("btn%d",idx), button:GetFrame()) | 490 f:SetFrameRef(format("btn%d",idx), button:GetFrame()) |
482 | 491 |
483 -- button constructors are responsible for calling SkinButton | 492 -- button constructors are responsible for calling SkinButton |
484 end | 493 end |
485 | 494 |
486 function Bar:RemoveButton(button) | 495 function Bar:RemoveButton(button) |
487 local idx = self.buttons[button] | 496 local idx = button:GetIndex() |
488 if idx then | 497 if idx then |
489 self:GetFrame():SetAttribute(format("frameref-btn%d",idx),nil) | 498 self:GetFrame():SetAttribute(format("frameref-btn%d",idx),nil) |
490 self.buttons[button] = nil | 499 self.buttons[idx] = nil |
491 end | 500 end |
492 if self.LBFGroup then | 501 if self.LBFGroup then |
493 self.LBFGroup:RemoveButton(button:GetFrame(),true) | 502 self.LBFGroup:RemoveButton(button:GetFrame(),true) |
494 end | 503 end |
495 end | 504 end |
496 | 505 |
497 function Bar:PlaceButton(button, baseW, baseH) | 506 function Bar:PlaceButton(button, baseW, baseH) |
498 local idx = self.buttons[button] | 507 local idx = button:GetIndex() |
499 if idx then | 508 if idx then |
500 local r, c, s = self:GetButtonGrid() | 509 local r, c, s = self:GetButtonGrid() |
501 local bh, bw = self:GetButtonSize() | 510 local bh, bw = self:GetButtonSize() |
502 local row, col = floor((idx-1)/c), fmod((idx-1),c) -- zero-based | 511 local row, col = floor((idx-1)/c), fmod((idx-1),c) -- zero-based |
503 local x, y = col*bw + (col+0.5)*s, -(row*bh + (row+0.5)*s) | 512 local x, y = col*bw + (col+0.5)*s, -(row*bh + (row+0.5)*s) |
515 self.LBFGroup:AddButton(button:GetFrame(), data) | 524 self.LBFGroup:AddButton(button:GetFrame(), data) |
516 end | 525 end |
517 end | 526 end |
518 | 527 |
519 function Bar:UpdateShowGrid() | 528 function Bar:UpdateShowGrid() |
520 for button in self:IterateButtons() do | 529 for idx, button in self:IterateButtons() do |
521 button:UpdateShowGrid() | 530 button:UpdateShowGrid() |
522 end | 531 end |
523 end | 532 end |
524 | 533 |
525 function Bar:ShowControls(show) | 534 function Bar:ShowControls(show) |
673 local f = self:GetFrame() | 682 local f = self:GetFrame() |
674 if unit then | 683 if unit then |
675 f:SetAttribute("unit",unit) | 684 f:SetAttribute("unit",unit) |
676 end | 685 end |
677 if enable then | 686 if enable then |
678 RegisterUnitWatch(self:GetFrame(),true) | 687 if not self.unitwatch then |
688 RegisterUnitWatch(self:GetFrame(),true) | |
689 end | |
679 elseif self.unitwatch then | 690 elseif self.unitwatch then |
680 UnregisterUnitWatch(self:GetFrame()) | 691 UnregisterUnitWatch(self:GetFrame()) |
681 end | 692 end |
682 self.unitwatch = enable | 693 self.unitwatch = enable |
683 self:RefreshSecureState() | 694 self:RefreshSecureState() |