Mercurial > wow > reaction
comparison main.lua @ 4:dfd829db3ad0
(none)
author | Flick <flickerstreak@gmail.com> |
---|---|
date | Tue, 20 Mar 2007 21:19:34 +0000 |
parents | ReAction.lua@8e0ff8ae4c08 |
children | f920db5fc6b1 |
comparison
equal
deleted
inserted
replaced
3:f5607e135c37 | 4:dfd829db3ad0 |
---|---|
1 -- ReAction.lua | |
2 -- | |
3 -- Top-level file for the ReAction Action Bar add-on | |
4 -- | |
5 -- ReAction is implemented in terms of the Ace 2 library: http://www.wowace.com | |
6 -- | |
7 | |
8 -- key binding label constants | |
9 BINDING_HEADER_REACTION = "ReAction" | |
10 BINDING_NAME_REACTION_TOGGLELOCK = "Lock/Unlock ReAction Bars" | |
11 BINDING_NAME_REBINDER_TOGGLEBINDINGMODE = "Toggle ReAction keybinding mode" | |
12 | |
13 -- ReAction addon setup via Ace 2 | |
14 ReAction = AceLibrary("AceAddon-2.0"):new( | |
15 "AceConsole-2.0", | |
16 "AceEvent-2.0", | |
17 "AceDB-2.0", | |
18 "FuBarPlugin-2.0" | |
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 | |
29 -- FuBar plugin setup | |
30 ReAction.hasIcon = false | |
31 ReAction.hasNoColor = true | |
32 ReAction.hideMenuTitle = true | |
33 ReAction.defaultPosition = "RIGHT" | |
34 ReAction.defaultMinimapPosition = 240 -- degrees | |
35 ReAction.OnMenuRequest = tcopy(ReActionGlobalMenuOptions) | |
36 | |
37 -- initial non-persistent state | |
38 ReAction.locked = true | |
39 | |
40 -- localization | |
41 -- local L = AceLibrary("AceLocale-2.0"):new("ReAction") | |
42 | |
43 | |
44 | |
45 -- Event handling | |
46 function ReAction:OnInitialize() | |
47 self:RegisterChatCommand( {"/reaction", "/rxn"}, ReActionConsoleOptions, "REACTION" ) | |
48 | |
49 self:RegisterDB("ReActionDB","ReActionDBPC") | |
50 self:RegisterDefaults("profile", ReActionProfileDefaults) | |
51 self:RegisterEvent("PLAYER_REGEN_DISABLED","CombatLockdown") | |
52 self:RegisterEvent("PLAYER_ENTERING_WORLD","HideDefaultBars") | |
53 end | |
54 | |
55 function ReAction:OnEnable() | |
56 if self.db.profile.firstRunDone ~= true then | |
57 -- Do some "first-run" setup | |
58 self.db.profile.firstRunDone = true | |
59 elseif self.db.profile.disabled == true then | |
60 -- print some kind of a warning | |
61 end | |
62 self:SetupBars() | |
63 end | |
64 | |
65 function ReAction:OnDisable() | |
66 self:Lock() | |
67 end | |
68 | |
69 function ReAction:OnProfileEnable() | |
70 -- handle profile switching | |
71 self:Lock() | |
72 self:SetupBars() | |
73 end | |
74 | |
75 function ReAction:CombatLockdown() | |
76 if not self:IsLocked() then | |
77 self:Lock() | |
78 UIErrorsFrame:AddMessage("ReAction bars locked when in combat") | |
79 end | |
80 end | |
81 | |
82 | |
83 -- lock/unlock ReAction | |
84 function ReAction:SetLocked( lock ) | |
85 if lock ~= self.locked then | |
86 if not lock then | |
87 self:Print("Buttons disabled while unlocked") | |
88 end | |
89 if not lock and InCombatLockdown() then | |
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 | |
97 end | |
98 end | |
99 | |
100 function ReAction:IsLocked() | |
101 return self.locked | |
102 end | |
103 | |
104 function ReAction:Lock() | |
105 self:SetLocked(true) | |
106 end | |
107 | |
108 function ReAction:Unlock() | |
109 self:SetLocked(false) | |
110 end | |
111 | |
112 function ReAction:ToggleLocked() | |
113 ReAction:SetLocked( not(self.locked) ) | |
114 end | |
115 | |
116 | |
117 | |
118 -- Hide the default Blizzard main bar artwork | |
119 function ReAction:HideArt() | |
120 if self.db.profile.hideArt then | |
121 MainMenuBar:Hide() -- this also hides the bags, xp bar, lag meter, and micro menu buttons. | |
122 else | |
123 MainMenuBar:Show() | |
124 end | |
125 end | |
126 | |
127 function ReAction:IsArtHidden() | |
128 return self.db.profile.hideArt | |
129 end | |
130 | |
131 function ReAction:SetHideArt( hide ) | |
132 if InCombatLockdown() then | |
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 | |
138 end | |
139 | |
140 function ReAction:ToggleHideArt() | |
141 self:SetHideArt( not self:IsArtHidden() ) | |
142 end | |
143 | |
144 | |
145 | |
146 -- Keybinding color coding | |
147 function ReAction:SetKeyColorCoding( cc ) | |
148 self.db.profile.keyColorCode = cc | |
149 end | |
150 | |
151 function ReAction:IsKeyColorCodeEnabled() | |
152 return self.db.profile.keyColorCode | |
153 end | |
154 | |
155 function ReAction:ToggleKeyColorCoding() | |
156 self:SetKeyColorCoding(not self.db.profile.keyColorCode) | |
157 end | |
158 | |
159 | |
160 | |
161 -- Hide default Blizzard bars | |
162 local blizzDefaultBars = { | |
163 ActionButton1, | |
164 ActionButton2, | |
165 ActionButton3, | |
166 ActionButton4, | |
167 ActionButton5, | |
168 ActionButton6, | |
169 ActionButton7, | |
170 ActionButton8, | |
171 ActionButton9, | |
172 ActionButton10, | |
173 ActionButton11, | |
174 ActionButton12, | |
175 BonusActionBarFrame, | |
176 MultiBarLeft, | |
177 MultiBarRight, | |
178 MultiBarBottomLeft, | |
179 MultiBarBottomRight | |
180 } | |
181 | |
182 function ReAction:HideDefaultBars() | |
183 for _, f in pairs(blizzDefaultBars) do | |
184 f:UnregisterAllEvents() | |
185 f:Hide() | |
186 f:SetParent(ReActionButtonRecycler) -- I mean it! | |
187 f:ClearAllPoints() -- no, I really mean it! | |
188 end | |
189 end | |
190 | |
191 | |
192 -- Reset bars to defaults | |
193 function ReAction:ResetBars() | |
194 if InCombatLockdown() then | |
195 UIErrorsFrame:AddMessage(SPELL_FAILED_AFFECTING_COMBAT) | |
196 else | |
197 self.db.profile.bars = ReActionProfileDefaults.bars | |
198 self:SetupBars() | |
199 end | |
200 end | |
201 | |
202 | |
203 -- re-sync action IDs | |
204 function ReAction:ResyncActionIDs() | |
205 -- TODO | |
206 end | |
207 | |
208 | |
209 | |
210 -- Bar manipulation | |
211 ReAction.bars = { } | |
212 | |
213 function ReAction:SetupBars() | |
214 -- hide the default Blizzard art, if configued | |
215 self:HideArt() | |
216 -- hide the default Blizzard bars | |
217 self:HideDefaultBars() | |
218 | |
219 -- set up the bars from the profile | |
220 -- note the use of table.maxn rather than # or ipairs: | |
221 -- our array of bars can in fact contain holes | |
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 | |
230 end | |
231 | |
232 -- remove excess bars | |
233 for id = table.maxn(self.db.profile.bars) + 1, table.maxn(self.bars) do | |
234 if self.bars[id] then | |
235 self.bars[id]:Destroy() | |
236 self.bars[id] = nil | |
237 end | |
238 end | |
239 | |
240 -- anchor the bars, have to do this in a second pass because | |
241 -- they might be anchored to each other in a non-ordered way | |
242 for _, bar in pairs(self.bars) do | |
243 bar:ApplyAnchor() | |
244 end | |
245 end | |
246 | |
247 | |
248 function ReAction:NewBar() | |
249 if InCombatLockdown() then | |
250 UIErrorsFrame:AddMessage(SPELL_FAILED_AFFECTING_COMBAT) | |
251 else | |
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 | |
260 end | |
261 | |
262 | |
263 function ReAction:DeleteBar(id) | |
264 if InCombatLockdown() then | |
265 UIErrorsFrame:AddMessage(SPELL_FAILED_AFFECTING_COMBAT) | |
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 | |
276 end | |
277 end | |
278 | |
279 function ReAction:ToggleActionID() | |
280 if self.showActionIDs then | |
281 ReActionButton:HideAllActionIDs() | |
282 else | |
283 ReActionButton:ShowAllActionIDs() | |
284 end | |
285 self.showActionIDs = not self.showActionIDs | |
286 end | |
287 | |
288 function ReAction:IsActionIDVisible() | |
289 return self.showActionIDs | |
290 end | |
291 | |
292 | |
293 | |
294 -- FuBar plugin methods | |
295 local tablet = AceLibrary("Tablet-2.0") | |
296 | |
297 function ReAction:OnTooltipUpdate() | |
298 local c = tablet:AddCategory("columns", 2) | |
299 c:AddLine("text", "Bar lock", "text2", self.locked and "|cffcc0000Locked|r" or "|cff00cc00Unlocked|r") | |
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") | |
305 end | |
306 | |
307 function ReAction:OnClick(button) | |
308 if IsShiftKeyDown() then | |
309 self:ToggleLocked() | |
310 self:UpdateDisplay() | |
311 elseif IsAltKeyDown() then | |
312 ReBinder:ToggleEnabled() | |
313 end | |
314 end |