Mercurial > wow > reaction
comparison ReAction.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 |
---|---|
4 -- | 4 -- |
5 -- ReAction is implemented in terms of the Ace 2 library: http://www.wowace.com | 5 -- ReAction is implemented in terms of the Ace 2 library: http://www.wowace.com |
6 -- | 6 -- |
7 | 7 |
8 -- key binding label constants | 8 -- key binding label constants |
9 BINDING_HEADER_REACTION = "ReAction" | 9 BINDING_HEADER_REACTION = "ReAction" |
10 BINDING_NAME_REACTION_TOGGLELOCK = "Lock/Unlock ReAction" | 10 BINDING_NAME_REACTION_TOGGLELOCK = "Lock/Unlock ReAction Bars" |
11 BINDING_NAME_REBINDER_TOGGLEBINDINGMODE = "Toggle ReAction keybinding mode" | |
11 | 12 |
12 -- ReAction addon setup via Ace 2 | 13 -- ReAction addon setup via Ace 2 |
13 ReAction = AceLibrary("AceAddon-2.0"):new( | 14 ReAction = AceLibrary("AceAddon-2.0"):new( |
14 "AceConsole-2.0", | 15 "AceConsole-2.0", |
15 "AceEvent-2.0", | 16 "AceEvent-2.0", |
16 "AceDB-2.0", | 17 "AceDB-2.0", |
17 "FuBarPlugin-2.0" | 18 "FuBarPlugin-2.0" |
18 ) | 19 ) |
19 | 20 |
21 local function tcopy(t) | |
22 local r = { } | |
23 for k, v in pairs(t) do | |
24 r[k] = (type(v) == "table" and tcopy(v) or v) | |
25 end | |
26 return r | |
27 end | |
28 | |
20 -- FuBar plugin setup | 29 -- FuBar plugin setup |
21 ReAction.hasIcon = false | 30 ReAction.hasIcon = false |
22 ReAction.hasNoColor = true | 31 ReAction.hasNoColor = true |
32 ReAction.hideMenuTitle = true | |
23 ReAction.defaultPosition = "RIGHT" | 33 ReAction.defaultPosition = "RIGHT" |
24 ReAction.defaultMinimapPosition = 240 -- degrees | 34 ReAction.defaultMinimapPosition = 240 -- degrees |
25 ReAction.OnMenuRequest = ReActionGlobalMenuOptions | 35 ReAction.OnMenuRequest = tcopy(ReActionGlobalMenuOptions) |
26 | 36 |
27 -- initial non-persistent state | 37 -- initial non-persistent state |
28 ReAction.locked = true | 38 ReAction.locked = true |
29 | 39 |
30 -- localization | 40 -- localization |
37 self:RegisterChatCommand( {"/reaction", "/rxn"}, ReActionConsoleOptions, "REACTION" ) | 47 self:RegisterChatCommand( {"/reaction", "/rxn"}, ReActionConsoleOptions, "REACTION" ) |
38 | 48 |
39 self:RegisterDB("ReActionDB","ReActionDBPC") | 49 self:RegisterDB("ReActionDB","ReActionDBPC") |
40 self:RegisterDefaults("profile", ReActionProfileDefaults) | 50 self:RegisterDefaults("profile", ReActionProfileDefaults) |
41 self:RegisterEvent("PLAYER_REGEN_DISABLED","CombatLockdown") | 51 self:RegisterEvent("PLAYER_REGEN_DISABLED","CombatLockdown") |
42 | 52 self:RegisterEvent("PLAYER_ENTERING_WORLD","HideDefaultBars") |
43 AceLibrary("Dewdrop-2.0"):InjectAceOptionsTable(self, ReActionProfileMenuOptions) | |
44 end | 53 end |
45 | 54 |
46 function ReAction:OnEnable() | 55 function ReAction:OnEnable() |
47 if self.db.profile.firstRunDone ~= true then | 56 if self.db.profile.firstRunDone ~= true then |
48 -- Do some "first-run" setup | 57 -- Do some "first-run" setup |
49 self.db.profile.firstRunDone = true | 58 self.db.profile.firstRunDone = true |
50 elseif self.db.profile.disabled == true then | 59 elseif self.db.profile.disabled == true then |
51 -- print some kind of a warning | 60 -- print some kind of a warning |
52 else | 61 end |
53 self:SetupBars() | 62 self:SetupBars() |
54 end | |
55 end | 63 end |
56 | 64 |
57 function ReAction:OnDisable() | 65 function ReAction:OnDisable() |
58 self:Lock() | 66 self:Lock() |
59 end | 67 end |
60 | 68 |
61 function ReAction:OnProfileEnable() | 69 function ReAction:OnProfileEnable() |
62 -- handle profile switching | 70 -- handle profile switching |
71 self:Lock() | |
63 self:SetupBars() | 72 self:SetupBars() |
64 self:Lock() | |
65 end | 73 end |
66 | 74 |
67 function ReAction:CombatLockdown() | 75 function ReAction:CombatLockdown() |
68 if not self:IsLocked() then | 76 if not self:IsLocked() then |
69 self:Lock() | 77 self:Lock() |
72 end | 80 end |
73 | 81 |
74 | 82 |
75 -- lock/unlock ReAction | 83 -- lock/unlock ReAction |
76 function ReAction:SetLocked( lock ) | 84 function ReAction:SetLocked( lock ) |
77 self.locked = lock and true or false -- force data integrity | 85 if lock ~= self.locked then |
78 if not self.locked then | 86 if not lock then |
79 self:Print("Buttons disabled while unlocked") | 87 self:Print("Buttons disabled while unlocked") |
80 end | 88 end |
81 for _, bar in ipairs(self.bars) do | 89 if not lock and InCombatLockdown() then |
82 if self.locked then bar:HideControls() else bar:ShowControls() end | 90 UIErrorsFrame:AddMessage(SPELL_FAILED_AFFECTING_COMBAT) |
91 else | |
92 self.locked = lock and true or false -- force data integrity | |
93 for _, bar in pairs(self.bars) do | |
94 if self.locked then bar:HideControls() else bar:ShowControls() end | |
95 end | |
96 end | |
83 end | 97 end |
84 end | 98 end |
85 | 99 |
86 function ReAction:IsLocked() | 100 function ReAction:IsLocked() |
87 return self.locked | 101 return self.locked |
113 function ReAction:IsArtHidden() | 127 function ReAction:IsArtHidden() |
114 return self.db.profile.hideArt | 128 return self.db.profile.hideArt |
115 end | 129 end |
116 | 130 |
117 function ReAction:SetHideArt( hide ) | 131 function ReAction:SetHideArt( hide ) |
118 self.db.profile.hideArt = hide and true or false -- force data integrity | 132 if InCombatLockdown() then |
119 self:HideArt() | 133 UIErrorsFrame:AddMessage(SPELL_FAILED_AFFECTING_COMBAT) |
134 else | |
135 self.db.profile.hideArt = hide and true or false -- force data integrity | |
136 self:HideArt() | |
137 end | |
120 end | 138 end |
121 | 139 |
122 function ReAction:ToggleHideArt() | 140 function ReAction:ToggleHideArt() |
123 self:SetHideArt( not self:IsArtHidden() ) | 141 self:SetHideArt( not self:IsArtHidden() ) |
124 end | 142 end |
161 MultiBarBottomRight | 179 MultiBarBottomRight |
162 } | 180 } |
163 | 181 |
164 function ReAction:HideDefaultBars() | 182 function ReAction:HideDefaultBars() |
165 for _, f in pairs(blizzDefaultBars) do | 183 for _, f in pairs(blizzDefaultBars) do |
184 f:UnregisterAllEvents() | |
166 f:Hide() | 185 f:Hide() |
167 f:ClearAllPoints() | 186 f:SetParent(ReActionButtonRecycler) -- I mean it! |
168 f:SetParent(ReActionButtonRecycler) | 187 f:ClearAllPoints() -- no, I really mean it! |
169 f:UnregisterAllEvents() | |
170 end | 188 end |
171 end | 189 end |
172 | 190 |
173 | 191 |
174 -- Reset bars to defaults | 192 -- Reset bars to defaults |
175 function ReAction:ResetBars() | 193 function ReAction:ResetBars() |
176 self.db.profile.bars = ReActionProfileDefaults.bars | 194 if InCombatLockdown() then |
177 self:SetupBars() | 195 UIErrorsFrame:AddMessage(SPELL_FAILED_AFFECTING_COMBAT) |
196 else | |
197 self.db.profile.bars = ReActionProfileDefaults.bars | |
198 self:SetupBars() | |
199 end | |
178 end | 200 end |
179 | 201 |
180 | 202 |
181 -- re-sync action IDs | 203 -- re-sync action IDs |
182 function ReAction:ResyncActionIDs() | 204 function ReAction:ResyncActionIDs() |
193 self:HideArt() | 215 self:HideArt() |
194 -- hide the default Blizzard bars | 216 -- hide the default Blizzard bars |
195 self:HideDefaultBars() | 217 self:HideDefaultBars() |
196 | 218 |
197 -- set up the bars from the profile | 219 -- set up the bars from the profile |
198 for id, info in ipairs(self.db.profile.bars) do | 220 -- note the use of table.maxn rather than # or ipairs: |
199 if self.bars[id] then self.bars[id]:Destroy() end -- remove old version of bar if switching profiles | 221 -- our array of bars can in fact contain holes |
200 self.bars[id] = ReBar:new(info, id) | 222 for id = 1, table.maxn(self.db.profile.bars) do |
223 local config = self.db.profile.bars[id] | |
224 if self.bars[id] then | |
225 self.bars[id]:Destroy() -- remove old version of bar if switching profiles | |
226 end | |
227 if config then | |
228 self.bars[id] = ReBar:new(config, id) | |
229 end | |
201 end | 230 end |
202 | 231 |
203 -- remove excess bars | 232 -- remove excess bars |
204 while #self.bars > #self.db.profile.bars do | 233 for id = table.maxn(self.db.profile.bars) + 1, table.maxn(self.bars) do |
205 table.remove(self.bars):Destroy() | 234 if self.bars[id] then |
235 self.bars[id]:Destroy() | |
236 self.bars[id] = nil | |
237 end | |
206 end | 238 end |
207 | 239 |
208 -- anchor the bars, have to do this in a second pass because | 240 -- anchor the bars, have to do this in a second pass because |
209 -- they might be anchored to each other in a non-ordered way | 241 -- they might be anchored to each other in a non-ordered way |
210 for _, bar in ipairs(self.bars) do | 242 for _, bar in pairs(self.bars) do |
211 bar:ApplyAnchor() | 243 bar:ApplyAnchor() |
212 end | 244 end |
213 end | 245 end |
214 | 246 |
215 | 247 |
216 function ReAction:NewBar() | 248 function ReAction:NewBar() |
217 local c = ReActionBarConfigDefaults | 249 if InCombatLockdown() then |
218 table.insert(self.bars, ReBar:new(c, #self.bars + 1)) | 250 UIErrorsFrame:AddMessage(SPELL_FAILED_AFFECTING_COMBAT) |
219 table.insert(self.db.profile.bars, c) | 251 else |
220 self:Unlock() | 252 local c = tcopy(ReActionBarConfigDefaults) |
253 local bar = ReBar:new(c, #self.bars+1) | |
254 table.insert(self.bars, bar) | |
255 table.insert(self.db.profile.bars, c) | |
256 if not self.locked then | |
257 bar:ShowControls() | |
258 end | |
259 end | |
221 end | 260 end |
222 | 261 |
223 | 262 |
224 function ReAction:DeleteBar(id) | 263 function ReAction:DeleteBar(id) |
225 if self.bars[id] then | 264 if InCombatLockdown() then |
226 table.remove(self.bars, id):Destroy() | 265 UIErrorsFrame:AddMessage(SPELL_FAILED_AFFECTING_COMBAT) |
227 table.remove( self.db.profile.bars, id ) | 266 else |
267 if self.bars[id] then | |
268 -- we can't do tremove because each bar ID is encoded into the | |
269 -- frame names as they're created. Need a nil entry in the table. | |
270 -- The nice thing is that table.insert in NewBar() will automatically | |
271 -- find the first nil slot. | |
272 self.bars[id]:Destroy() | |
273 self.bars[id] = nil | |
274 self.db.profile.bars[id] = nil | |
275 end | |
228 end | 276 end |
229 end | 277 end |
230 | 278 |
231 function ReAction:ToggleActionID() | 279 function ReAction:ToggleActionID() |
232 if self.showActionIDs then | 280 if self.showActionIDs then |
246 -- FuBar plugin methods | 294 -- FuBar plugin methods |
247 local tablet = AceLibrary("Tablet-2.0") | 295 local tablet = AceLibrary("Tablet-2.0") |
248 | 296 |
249 function ReAction:OnTooltipUpdate() | 297 function ReAction:OnTooltipUpdate() |
250 local c = tablet:AddCategory("columns", 2) | 298 local c = tablet:AddCategory("columns", 2) |
251 c:AddLine("text", "ReAction bar lock", "text2", self.locked and "|cffcc0000Locked|r" or "|cff00cc00Unlocked|r") | 299 c:AddLine("text", "Bar lock", "text2", self.locked and "|cffcc0000Locked|r" or "|cff00cc00Unlocked|r") |
252 tablet:SetHint("|cffcc6600Shift-Click|r to toggle action bar lock. Right-click for options.") | 300 c:AddLine("text", "Button lock", "text2", LOCK_ACTIONBAR == "1" and "|cffcc0000Locked|r" or "|cff00cc00Unlocked|r") |
301 c:AddLine("text", "Kebinding mode", "text2", ReBinder:IsEnabled() and "|cff33ff33On|r" or "|cffffcc00Off|r") | |
302 tablet:SetHint("|cffffcc00Shift-Click|r for bar lock|n".. | |
303 "|cff33ff33Alt-Click|r for keybindings|n".. | |
304 "Right-click for menu") | |
253 end | 305 end |
254 | 306 |
255 function ReAction:OnClick(button) | 307 function ReAction:OnClick(button) |
256 if IsShiftKeyDown() then | 308 if IsShiftKeyDown() then |
257 self:ToggleLocked() | 309 self:ToggleLocked() |
258 end | 310 self:UpdateDisplay() |
259 self:UpdateDisplay() | 311 elseif IsAltKeyDown() then |
260 end | 312 ReBinder:ToggleEnabled() |
313 end | |
314 end |