Mercurial > wow > reaction
comparison Button.lua @ 2:8e0ff8ae4c08
Version 0.2
author | Flick <flickerstreak@gmail.com> |
---|---|
date | Tue, 20 Mar 2007 21:08:31 +0000 |
parents | c11ca1d8ed91 |
children |
comparison
equal
deleted
inserted
replaced
1:c11ca1d8ed91 | 2:8e0ff8ae4c08 |
---|---|
1 -- private constants | 1 -- private constants |
2 local namePrefix = "ReActionButton_" | 2 local namePrefix = "ReActionButton" |
3 local _G = getfenv(0) | 3 local _G = getfenv(0) |
4 local ACTION_FREE = { } | 4 local ACTION_FREE = { } |
5 local MAX_ACTIONS = 120 | 5 local MAX_ACTIONS = 120 |
6 | 6 |
7 local hotKeyDefaultColor = { r=1.0, g=1.0, b=1.0, a=1.0 } | 7 local hotKeyDefaultColor = { r=1.0, g=1.0, b=1.0, a=1.0 } |
10 | 10 |
11 local hotKeyModifierColors = { | 11 local hotKeyModifierColors = { |
12 S = { r=0.6, g=0.6, b=1.0, a=1.0 }, -- shift | 12 S = { r=0.6, g=0.6, b=1.0, a=1.0 }, -- shift |
13 C = { r=1.0, g=0.82, b=0, a=1.0 }, -- ctrl | 13 C = { r=1.0, g=0.82, b=0, a=1.0 }, -- ctrl |
14 A = { r=0.1, g=1.0, b=0.1, a=1.0 }, -- alt | 14 A = { r=0.1, g=1.0, b=0.1, a=1.0 }, -- alt |
15 } | |
16 | |
17 -- TODO: localize these key names with GetBindingText(KEY_) | |
18 local keybindAbbreviations = { | |
19 ["Mouse Button "] = "M-", | |
20 ["Spacebar"] = "Sp", | |
21 ["Num Pad "] = "Num-", | |
22 ["Page Up"] = "PgUp", | |
23 ["Page Down"] = "PgDn", | |
24 [" Arrow"] = "", | |
15 } | 25 } |
16 | 26 |
17 local equippedActionBorderColor = { r=0, g=1.0, b=0, a=0.35 } | 27 local equippedActionBorderColor = { r=0, g=1.0, b=0, a=0.35 } |
18 | 28 |
19 local actionUsableColor = { r=1.0, g=1.0, b=1.0, a=1.0 } | 29 local actionUsableColor = { r=1.0, g=1.0, b=1.0, a=1.0 } |
58 end | 68 end |
59 local t = actionButtonTbl[id] | 69 local t = actionButtonTbl[id] |
60 | 70 |
61 t.inUse = true | 71 t.inUse = true |
62 if t.button then | 72 if t.button then |
63 t.button:Configure(parent,config,barIdx,id) | 73 t.button:Configure(parent,config,barIdx) |
64 else | 74 else |
65 t.button = self:new(parent,config,barIdx,id) | 75 t.button = self:new(parent,config,barIdx,id) |
66 end | 76 end |
67 | 77 |
68 if actionButtonTbl[t.button:GetActionID()].inUse ~= true then | 78 -- fix screwy config with overlapping IDs |
69 end | 79 config.actionIDs[barIdx] = id |
70 | |
71 return t.button | 80 return t.button |
72 end | 81 end |
73 | 82 |
74 function ReActionButton:release( b ) | 83 function ReActionButton:release( b ) |
75 if b then | 84 if b then |
98 ---------------------- | 107 ---------------------- |
99 function ReActionButton.prototype:init( parentFrame, config, barIdx, id ) | 108 function ReActionButton.prototype:init( parentFrame, config, barIdx, id ) |
100 ReActionButton.super.prototype.init(self) | 109 ReActionButton.super.prototype.init(self) |
101 | 110 |
102 -- create the button widget | 111 -- create the button widget |
103 self.name = namePrefix.."_"..id | 112 self.name = namePrefix..id |
104 self.button = CreateFrame("CheckButton", self.name, parentFrame, "ReActionButtonTemplate") | 113 self.button = CreateFrame("CheckButton", self.name, parentFrame, "ReActionButtonTemplate") |
105 | 114 |
106 -- create the actionID label on the control widget | |
107 local actionIDLabel = self.button:CreateFontString(nil,"ARTWORK", "NumberFontNormalSmall") | |
108 actionIDLabel:SetPoint("BOTTOMLEFT",0,0) | |
109 actionIDLabel:Hide() | |
110 | |
111 -- store references to the various sub-frames so we don't have to look it up all the time | 115 -- store references to the various sub-frames so we don't have to look it up all the time |
112 self.frames = { | 116 self.frames = { |
113 hotkey = _G[self.name.."HotKey"], | 117 hotkey = _G[self.name.."HotKey"], |
114 count = _G[self.name.."Count"], | 118 count = _G[self.name.."Count"], |
115 cooldown = _G[self.name.."Cooldown"], | 119 cooldown = _G[self.name.."Cooldown"], |
117 macro = _G[self.name.."Name"], | 121 macro = _G[self.name.."Name"], |
118 icon = _G[self.name.."Icon"], | 122 icon = _G[self.name.."Icon"], |
119 border = _G[self.name.."Border"], | 123 border = _G[self.name.."Border"], |
120 normalTexture = _G[self.name.."NormalTexture"], | 124 normalTexture = _G[self.name.."NormalTexture"], |
121 flash = _G[self.name.."Flash"], | 125 flash = _G[self.name.."Flash"], |
122 actionID = actionIDLabel | 126 actionID = _G[self.name.."ActionID"], |
123 } | 127 } |
124 | 128 |
125 -- provide a reference back to this object for the frame to use in event handlers | 129 -- provide a reference back to this object for the frame to use in event handlers |
126 self.button.rxnBtn = self | 130 self.button.rxnBtn = self |
127 | 131 |
132 -- set the action ID | |
133 self:SetActionID(id) | |
134 | |
135 -- register button with ReBinder for keybinding | |
136 ReBinder:AddKeybindTarget(self.button) | |
137 | |
128 -- initialize | 138 -- initialize |
129 self:Configure(parentFrame, config, barIdx, id) | 139 self:Configure(parentFrame, config, barIdx) |
140 end | |
141 | |
142 local function tcopy(t) | |
143 local r = { } | |
144 for k, v in pairs(t) do | |
145 r[k] = (type(v) == "table" and tcopy(v) or v) | |
146 end | |
147 return r | |
130 end | 148 end |
131 | 149 |
132 function ReActionButton.prototype:Recycle() | 150 function ReActionButton.prototype:Recycle() |
133 local b = self.button | 151 local b = self.button |
134 local action = self:GetActionID() | |
135 | |
136 self.config.actionIDs[self.barIdx] = nil | |
137 | 152 |
138 self:SetKeyBinding(nil) | 153 self:SetKeyBinding(nil) |
139 self:UpdateDisplay() | 154 self:UpdateDisplay() |
140 b:UnregisterAllEvents() | 155 b:UnregisterAllEvents() |
156 b:SetParent(ReActionButtonRecycleFrame) | |
157 b:ClearAllPoints() | |
158 b:SetPoint("TOPLEFT",0,0) | |
141 b:Hide() | 159 b:Hide() |
142 b:ClearAllPoints() | 160 self.config = tcopy(self.config) -- ew, but necessary |
143 b:SetParent(ReActionButtonRecycleFrame) | 161 end |
144 end | 162 |
145 | 163 function ReActionButton.prototype:BarUnlocked() |
164 self:ShowGridTmp() | |
165 end | |
166 | |
167 function ReActionButton.prototype:BarLocked() | |
168 self:HideGridTmp() | |
169 end | |
146 | 170 |
147 | 171 |
148 -- set the button location | 172 -- set the button location |
149 function ReActionButton.prototype:PlaceButton(point, x, y, sz) | 173 function ReActionButton.prototype:PlaceButton(point, x, y, sz) |
150 local b = self.button | 174 local b = self.button |
164 end | 188 end |
165 | 189 |
166 | 190 |
167 | 191 |
168 -- configuration and setup | 192 -- configuration and setup |
169 function ReActionButton.prototype:Configure( parentFrame, config, barIdx, id ) | 193 function ReActionButton.prototype:Configure( parentFrame, config, barIdx ) |
170 self.config = config | 194 self.config = config |
171 self.barIdx = barIdx | 195 self.barIdx = barIdx |
172 self.showGrid = config.showGrid and 1 or 0 | 196 self.showGridTmp_ = 0 |
173 | 197 |
174 self.button:ClearAllPoints() | 198 self.button:ClearAllPoints() |
175 self.button:SetParent(parentFrame) | 199 self.button:SetParent(parentFrame) |
176 | 200 |
177 self:SetupAttributes() | 201 self:SetupAttributes() |
178 self:RegisterStaticEvents() | 202 self:RegisterStaticEvents() |
179 | 203 |
180 if id then | |
181 -- set action ID | |
182 self:SetActionID(id) | |
183 else | |
184 self:ApplyActionID() | |
185 end | |
186 self:ApplyLayout() | 204 self:ApplyLayout() |
187 self:ApplyStyle() | 205 self:ApplyStyle() |
188 | 206 |
189 self:UpdateDisplay() | 207 self:UpdateDisplay() |
190 end | 208 end |
191 | 209 |
192 function ReActionButton.prototype:SetupAttributes() | 210 function ReActionButton.prototype:SetupAttributes() |
193 local b = self.button | 211 local b = self.button |
194 b:SetAttribute("type", "action") | 212 b:SetAttribute("type", "action") |
195 b:SetAttribute("shift-type*", ATTRIBUTE_NOOP) | 213 b:SetAttribute("shift-type*", ATTRIBUTE_NOOP) |
196 b:SetAttribute("alt-type*", ATTRIBUTE_NOOP) | |
197 b:SetAttribute("checkselfcast", true) | 214 b:SetAttribute("checkselfcast", true) |
198 b:SetAttribute("useparent-unit", true) | 215 b:SetAttribute("useparent-unit", true) |
199 end | 216 end |
200 | 217 |
201 function ReActionButton.prototype:RegisterStaticEvents() | 218 function ReActionButton.prototype:RegisterStaticEvents() |
382 | 399 |
383 function ReActionButton.prototype:GetKeyBinding() | 400 function ReActionButton.prototype:GetKeyBinding() |
384 return GetBindingKey("CLICK "..self.name..":LeftButton") | 401 return GetBindingKey("CLICK "..self.name..":LeftButton") |
385 end | 402 end |
386 | 403 |
387 function ReActionButton.prototype:ShowAssignKeybinding() | |
388 local f = ReActionKeybindFrame | |
389 f:ClearAllPoints() | |
390 f:SetPoint("BOTTOM", self.button, "TOP", 0, 10) | |
391 ReActionKeybindFrameButton.keybindTarget = self | |
392 local k = self:GetKeyBinding() | |
393 if k then | |
394 local txt = GetBindingText(k, "KEY_") | |
395 ReActionKeybindFrameButton:SetText(txt or "") | |
396 end | |
397 f:Show() | |
398 end | |
399 | |
400 | |
401 local mouseButtonConvert = { | |
402 LeftButton = "BUTTON1", | |
403 RightButton = "BUTTON2", | |
404 MiddleButton = "BUTTON3", | |
405 Button4 = "BUTTON4", | |
406 Button5 = "BUTTON5" | |
407 } | |
408 | |
409 function ReActionButton.prototype:HandleKeybindAssign(button, key, mouseButton) | |
410 mouseButton = mouseButton and mouseButtonConvert[mouseButton] | |
411 if mouseButton ~= "BUTTON1" and mouseButton ~= "BUTTON2" then | |
412 key = key or mouseButton | |
413 if key == nil or key == "UNKNOWN" or key == "SHIFT" or key == "CTRL" or key == "ALT" then | |
414 return | |
415 end | |
416 if key == "ESCAPE" then | |
417 ReActionKeybindFrame:Hide() | |
418 return | |
419 end | |
420 if IsShiftKeyDown() then | |
421 key = "SHIFT-"..key | |
422 end | |
423 if IsControlKeyDown() then | |
424 key = "CTRL-"..key | |
425 end | |
426 if IsAltKeyDown() then | |
427 keyPressed = "ALT-"..key | |
428 end | |
429 local oldAction = GetBindingAction(key) | |
430 local oldKey = self:GetKeyBinding() | |
431 if oldAction then | |
432 -- can't pop a modal dialog box, will need to think something up | |
433 end | |
434 if oldKey == key then | |
435 SetBinding(key,nil) | |
436 key = nil | |
437 end | |
438 self:SetKeyBinding(key) | |
439 button:SetText(key and GetBindingText(key, "KEY_") or "") | |
440 self:UpdateDisplay() | |
441 SaveBindings(2) -- 2 = character specific bindings... hmm... | |
442 end | |
443 button.selected = false | |
444 this:SetButtonState("NORMAL") | |
445 end | |
446 | |
447 | |
448 -- action ID functions | 404 -- action ID functions |
449 function ReActionButton.prototype:SetActionID( id ) | 405 function ReActionButton.prototype:SetActionID( id ) |
450 self.config.actionIDs[self.barIdx] = tonumber(id) -- force data integrity | 406 self.actionID = tonumber(id) -- force data integrity |
451 self:ApplyActionID() | 407 self:ApplyActionID() |
452 end | 408 end |
453 | 409 |
454 function ReActionButton.prototype:GetActionID() | 410 function ReActionButton.prototype:GetActionID() |
455 return self.config.actionIDs[self.barIdx] | 411 return self.actionID |
456 end | 412 end |
457 | 413 |
458 function ReActionButton.prototype:ApplyActionID() | 414 function ReActionButton.prototype:ApplyActionID() |
459 local action = tonumber(self:GetActionID()) | 415 local action = tonumber(self:GetActionID()) |
460 self.button:SetAttribute("action",action or nil) | 416 self.button:SetAttribute("action",action) |
461 self.frames.actionID:SetText(action or "") | 417 self.frames.actionID:SetText(action or "") |
462 end | 418 end |
463 | 419 |
464 function ReActionButton.prototype:ShowActionID() | 420 function ReActionButton.prototype:ShowActionID() |
465 self.frames.actionID:Show() | 421 self.frames.actionID:Show() |
486 function ReActionButton.prototype:ShouldPickupAction(mouseButton) | 442 function ReActionButton.prototype:ShouldPickupAction(mouseButton) |
487 return IsShiftKeyDown() and not SecureButton_GetModifiedAttribute(self.button, "type", mouseButton) | 443 return IsShiftKeyDown() and not SecureButton_GetModifiedAttribute(self.button, "type", mouseButton) |
488 end | 444 end |
489 | 445 |
490 function ReActionButton.prototype:ShowGridTmp() | 446 function ReActionButton.prototype:ShowGridTmp() |
491 self.showGrid = self.showGrid + 1 | 447 self.showGridTmp_ = self.showGridTmp_ + 1 |
492 self:UpdateVisibility() | 448 self:UpdateVisibility() |
493 end | 449 end |
494 | 450 |
495 function ReActionButton.prototype:HideGridTmp() | 451 function ReActionButton.prototype:HideGridTmp() |
496 self.showGrid = self.showGrid - 1 | 452 self.showGridTmp_ = self.showGridTmp_ - 1 |
497 self:UpdateVisibility() | 453 self:UpdateVisibility() |
498 end | 454 end |
499 | 455 |
500 function ReActionButton.prototype:ShowGrid() | 456 function ReActionButton.prototype:ShowGrid() |
501 self.config.showGrid = true | 457 self.config.showGrid = true |
502 self:ShowGridTmp() | 458 self:UpdateVisibility() |
503 end | 459 end |
504 | 460 |
505 function ReActionButton.prototype:HideGrid() | 461 function ReActionButton.prototype:HideGrid() |
506 self.config.showGrid = false | 462 self.config.showGrid = false |
507 self:HideGridTmp() | 463 self:UpdateVisibility() |
508 end | 464 end |
509 | 465 |
510 | 466 |
511 | 467 |
512 -- layout & style functions | 468 -- layout & style functions |
514 local f = self.frames | 470 local f = self.frames |
515 | 471 |
516 if self.config.keyBindLoc then | 472 if self.config.keyBindLoc then |
517 local h = f.hotkey | 473 local h = f.hotkey |
518 local loc = self.config.keyBindLoc | 474 local loc = self.config.keyBindLoc |
475 local top = string.match(loc,"TOP") | |
476 local bottom = string.match(loc, "BOTTOM") | |
519 h:ClearAllPoints() | 477 h:ClearAllPoints() |
520 h:SetPoint(loc,0,0) | 478 h:SetWidth(40) |
479 h:SetPoint(top or bottom,0,top and 2 or -2) | |
521 local j | 480 local j |
522 if string.match(loc,"LEFT") then | 481 if string.match(loc,"LEFT") then |
523 j = "LEFT" | 482 j = "LEFT" |
524 elseif string.match(loc,"RIGHT") then | 483 elseif string.match(loc,"RIGHT") then |
525 j = "RIGHT" | 484 j = "RIGHT" |
530 end | 489 end |
531 | 490 |
532 if self.config.stackCountLoc then | 491 if self.config.stackCountLoc then |
533 local c = f.count | 492 local c = f.count |
534 local loc = self.config.stackCountLoc | 493 local loc = self.config.stackCountLoc |
494 local top = string.match(loc,"TOP") | |
495 local bottom = string.match(loc, "BOTTOM") | |
535 c:ClearAllPoints() | 496 c:ClearAllPoints() |
536 c:SetPoint(loc,0,0) | 497 c:SetWidth(40) |
498 c:SetPoint(top or bottom,0,top and 2 or -2) | |
537 local j | 499 local j |
538 if string.match(loc,"LEFT") then | 500 if string.match(loc,"LEFT") then |
539 j = "LEFT" | 501 j = "LEFT" |
540 elseif string.match(loc,"RIGHT") then | 502 elseif string.match(loc,"RIGHT") then |
541 j = "RIGHT" | 503 j = "RIGHT" |
697 local b = self.button | 659 local b = self.button |
698 local f = self.frames | 660 local f = self.frames |
699 local key = self:GetKeyBinding() | 661 local key = self:GetKeyBinding() |
700 local txt = GetBindingText(key, "KEY_",1) | 662 local txt = GetBindingText(key, "KEY_",1) |
701 | 663 |
664 -- abbreviate long key names | |
665 for pat, rep in pairs(keybindAbbreviations) do | |
666 txt = string.gsub(txt,pat,rep) | |
667 end | |
668 | |
702 if txt then | 669 if txt then |
703 f.hotkey:SetText(string.upper(txt)) | 670 f.hotkey:SetText(string.upper(txt)) |
704 self:ColorHotKey() | 671 self:ColorHotKey() |
705 else | 672 else |
706 f.hotkey:SetText("") | 673 f.hotkey:SetText("") |
773 if b:GetAttribute("statehidden") then | 740 if b:GetAttribute("statehidden") then |
774 b:Hide() | 741 b:Hide() |
775 elseif action and HasAction(action) then | 742 elseif action and HasAction(action) then |
776 b:GetNormalTexture():SetAlpha(1.0) | 743 b:GetNormalTexture():SetAlpha(1.0) |
777 b:Show() | 744 b:Show() |
778 elseif self.showGrid > 0 then | 745 elseif self.showGridTmp_ > 0 or self.config.showGrid then |
779 b:GetNormalTexture():SetAlpha(0.5) | 746 b:GetNormalTexture():SetAlpha(0.5) |
780 self.frames.cooldown:Hide() | 747 self.frames.cooldown:Hide() |
781 b:Show() | 748 b:Show() |
782 else | 749 else |
783 b:Hide() | 750 b:Hide() |
793 end | 760 end |
794 end | 761 end |
795 | 762 |
796 function ReActionButton.prototype:UpdateTooltip() | 763 function ReActionButton.prototype:UpdateTooltip() |
797 local action = self:GetActionID() | 764 local action = self:GetActionID() |
798 if action and GameTooltip:SetAction(action) then | 765 if GameTooltip:IsOwned(self.button) and action and GameTooltip:SetAction(action) then |
799 self.tooltipTime = TOOLTIP_UPDATE_TIME | 766 self.tooltipTime = TOOLTIP_UPDATE_TIME |
800 else | 767 else |
801 self.tooltipTime = nil | 768 self.tooltipTime = nil |
802 end | 769 end |
803 end | 770 end |