comparison main.lua @ 10:f3a7bfebc283

Version 0.33
author Flick <flickerstreak@gmail.com>
date Tue, 20 Mar 2007 21:37:38 +0000
parents c05fd3e18b4f
children 2735edcf9ab7
comparison
equal deleted inserted replaced
9:650f75d08952 10:f3a7bfebc283
7 7
8 -- Ace Library local object initialization 8 -- Ace Library local object initialization
9 local L = AceLibrary("AceLocale-2.2"):new("ReAction") 9 local L = AceLibrary("AceLocale-2.2"):new("ReAction")
10 local dewdrop = AceLibrary("Dewdrop-2.0") 10 local dewdrop = AceLibrary("Dewdrop-2.0")
11 local tablet = AceLibrary("Tablet-2.0") 11 local tablet = AceLibrary("Tablet-2.0")
12 local ReBound = AceLibrary("ReBound-1.0")
12 13
13 -- private functions 14 -- private functions
14 local function tcopy(t) 15 local function tcopy(t)
15 local r = { } 16 local r = { }
16 for k, v in pairs(t) do 17 for k, v in pairs(t) do
23 local EMPTY_BAR_SLOT = -1 24 local EMPTY_BAR_SLOT = -1
24 25
25 -- key binding label constants 26 -- key binding label constants
26 BINDING_HEADER_REACTION = L["ReAction"] 27 BINDING_HEADER_REACTION = L["ReAction"]
27 BINDING_NAME_REACTION_TOGGLELOCK = L["Toggle ReAction Bar Lock"] 28 BINDING_NAME_REACTION_TOGGLELOCK = L["Toggle ReAction Bar Lock"]
28 BINDING_NAME_REBOUND_TOGGLEBINDINGMODE = L["Toggle ReBound Keybinding Mode"] 29 BINDING_NAME_REACTION_TOGGLEKEYBIND = L["ReAction Keybinding Mode"]
29 30
30 31 -- UI panel strings
31 -- main object 32 REACTION_KEYBIND_TITLE = L["ReAction Keybinding"]
33 REACTION_KEYBIND_SUBTITLE = L["Click Buttons to Set Keybindings"]
34 REACTION_KEYBIND_DONE = L["Save"]
35 REACTION_KEYBIND_REVERT = L["Revert"]
36
37
38
39 ------------------------------
40 -- AceAddon setup
41 ------------------------------
32 local main = AceLibrary("AceAddon-2.0"):new( 42 local main = AceLibrary("AceAddon-2.0"):new(
33 "AceConsole-2.0", 43 "AceConsole-2.0",
34 "AceEvent-2.0", 44 "AceEvent-2.0",
35 "AceDB-2.0", 45 "AceDB-2.0",
36 "FuBarPlugin-2.0" 46 "FuBarPlugin-2.0"
37 ) 47 )
38 48
39 -- initial non-persistent state 49 function main:OnInitialize()
40 main.locked = true 50 self:RegisterChatCommand( {L["/reaction"], L["/rxn"]}, ReActionConsoleOptions, "REACTION" )
41 51 self:RegisterDB("ReActionDB","ReActionDBPC")
42 -- set a global variable for Bindings.xml 52 self:RegisterDefaults("profile", ReAction_DefaultProfile)
43 ReActionAddOn = main 53 self:RegisterEvent("PLAYER_REGEN_DISABLED","CombatLockdown")
44 54 self:RegisterEvent("PLAYER_ENTERING_WORLD","HideDefaultBars")
45 55 self:DisableDefaultKeybindings()
56
57 -- initial non-persistent state
58 self.locked = true
59 self.bars = { }
60 end
61
62 -- OnEnable is called at startup (startup = true, oldConfig = nil),
63 -- and when the profile is changed (startup = false, oldConfig ~= nil )
64 function main:OnEnable( startup, oldConfig )
65 if self.db.profile.firstRunDone ~= true then
66 self.db.profile.bars = tcopy(ReAction_DefaultBlizzardBars)
67 end
68 self:DestroyAllBars()
69 self:SetupBars()
70 self:UpgradeProfile()
71 self:SetupKeybindings( oldConfig and oldConfig.bindings )
72 if self.db.profile.firstRunDone ~= true then
73 self:Unlock()
74 end
75 self.db.profile.firstRunDone = true
76 end
77
78 function main:OnDisable()
79 self:Lock()
80 end
81
82 -- OnProfileEnable() is only called when switching profiles, NOT for the initial profile at load time.
83 function main:OnProfileEnable( oldName, oldData )
84 self:OnEnable(false, oldData)
85 end
86
87 function main:UpgradeProfile()
88 if self.db.profile.firstRunDone ~= true and #self.db.profile.bindings == 0 then
89 for _, bar in pairs(self.bars) do
90 for _, button in pairs(bar.buttons) do
91 local key = ReBound:GetBinding(button:GetActionFrame(),"LeftButton")
92 if key and #key > 0 and not self.db.profile.bindings[key] then
93 self:REBOUND_BIND(key,button:GetActionFrame():GetName(),"LeftButton")
94 end
95 end
96 end
97 end
98 end
99
100
101
102
103 --------------------------------------------
46 -- FuBar plugin setup 104 -- FuBar plugin setup
47 -- Even if FuBar isn't installed, this gives us a nice minimap-button interface. 105 -- Even if FuBar isn't installed, the plugin
106 -- provides a nice minimap-button interface.
107 ---------------------------------------------
48 main.hasIcon = "Interface\\Icons\\INV_Qiraj_JewelEncased" 108 main.hasIcon = "Interface\\Icons\\INV_Qiraj_JewelEncased"
49 main.hasNoColor = true 109 main.hasNoColor = true
50 main.hideMenuTitle = true 110 main.hideMenuTitle = true
51 main.defaultPosition = "LEFT" 111 main.defaultPosition = "LEFT"
52 main.defaultMinimapPosition = 240 -- degrees 112 main.defaultMinimapPosition = 240 -- degrees
55 115
56 -- set the handler for the global bar menu options 116 -- set the handler for the global bar menu options
57 -- have to do this after tcopy() above, otherwise it will try to copy the handler object (bad idea) 117 -- have to do this after tcopy() above, otherwise it will try to copy the handler object (bad idea)
58 ReActionGlobalMenuOptions.handler = main 118 ReActionGlobalMenuOptions.handler = main
59 119
60
61
62
63 -- Event handling
64 function main:OnInitialize()
65 self:RegisterChatCommand( {L["/reaction"], L["/rxn"]}, ReActionConsoleOptions, "REACTION" )
66 self:RegisterDB("ReActionDB","ReActionDBPC")
67 self:RegisterDefaults("profile", ReAction_DefaultProfile)
68 self:RegisterEvent("PLAYER_REGEN_DISABLED","CombatLockdown")
69 self:RegisterEvent("PLAYER_ENTERING_WORLD","HideDefaultBars")
70 self:RegisterEvent("EVENT_REBOUND_KEYBINDING_MODE")
71 end
72
73 function main:OnEnable()
74 -- this gets called at startup and when the profile is changed
75 if self.db.profile.firstRunDone ~= true then
76 -- Do some "first-run" setup
77 self:StealKeyBindings()
78 self.db.profile.firstRunDone = true
79 self.db.profile.bars = tcopy(ReAction_DefaultBlizzardBars)
80 end
81 self:DestroyAllBars()
82 self:SetupBars()
83 end
84
85 function main:OnDisable()
86 self:Lock()
87 end
88
89 function main:OnProfileEnable()
90 -- for profile switching
91 self:OnEnable()
92 end
93
94 function main:CombatLockdown()
95 if not self:IsLocked() then
96 self:Lock()
97 ReBound:Disable()
98 UIErrorsFrame:AddMessage(L["ReAction bars locked when in combat"])
99 end
100 end
101
102 function main:EVENT_REBOUND_KEYBINDING_MODE(enabled)
103 for _, bar in pairs(self.bars) do
104 for __, button in pairs(bar.buttons) do
105 if button and button ~= EMPTY_BAR_SLOT then
106 button:TempShow(enabled)
107 end
108 end
109 end
110 end
111
112
113 -- FuBar plugin methods
114 function main:OnTooltipUpdate() 120 function main:OnTooltipUpdate()
115 local c = tablet:AddCategory("columns", 2) 121 local c = tablet:AddCategory("columns", 2)
116 c:AddLine("text", L["Bar lock"], "text2", self.locked and ("|cffff0000"..L["Locked"].."|r") or ("|cffffcc00"..L["Unlocked"].."|r")) 122 c:AddLine("text", L["Bar lock"], "text2", self.locked and ("|cffff0000"..L["Locked"].."|r") or ("|cffffcc00"..L["Unlocked"].."|r"))
117 c:AddLine("text", L["Button lock"], "text2", LOCK_ACTIONBAR == "1" and ("|cffcc0000"..L["Locked"].."|r") or ("|cff00cc00"..L["Unlocked"].."|r")) 123 c:AddLine("text", L["Button lock"], "text2", LOCK_ACTIONBAR == "1" and ("|cffcc0000"..L["Locked"].."|r") or ("|cff00cc00"..L["Unlocked"].."|r"))
118 c:AddLine("text", L["Kebinding mode"], "text2", ReBound:IsEnabled() and ("|cff33ff33"..L["On"].."|r") or ("|cffffcc00"..L["Off"].."|r")) 124 c:AddLine("text", L["Kebinding mode"], "text2", self:GetKeybindMode() and ("|cff33ff33"..L["On"].."|r") or ("|cffffcc00"..L["Off"].."|r"))
119 tablet:SetHint(L["|cffffcc00Shift-Click for bar lock|n|cff33ff33Alt-Click|r for keybindings|nRight-click for menu"]) 125 tablet:SetHint(L["|cffffcc00Shift-Click for bar lock|n|cff33ff33Alt-Click|r for keybindings|nRight-click for menu"])
120 end 126 end
121 127
122 function main:OnClick(button) 128 function main:OnClick(button)
123 if IsShiftKeyDown() then 129 if IsShiftKeyDown() then
124 self:ToggleLocked() 130 self:ToggleLocked()
125 self:UpdateDisplay() 131 self:UpdateDisplay()
126 elseif IsAltKeyDown() then 132 elseif IsAltKeyDown() then
127 ReBound:ToggleEnabled() 133 self:ToggleKeybindMode()
128 self:UpdateDisplay() 134 self:UpdateDisplay()
129 end 135 end
130 end 136 end
131 137
132 138
133 -- lock/unlock bars 139
140
141 ------------------------------
142 -- Key binding functions
143 ------------------------------
144 function main:DisableDefaultKeybindings()
145 -- change the labels on all actionbar keybindings in the default
146 -- interface.
147 local label = "|cff999999("..L["Use ReAction"]..")|r"
148 for i = 1, 12 do
149 setglobal("BINDING_NAME_ACTIONBUTTON"..i,label)
150 for j = 1, 4 do
151 setglobal("BINDING_NAME_MULTIACTIONBAR"..j.."BUTTON"..i,label)
152 end
153 end
154 for i = 1, 6 do
155 setglobal("BINDING_NAME_ACTIONPAGE"..i,label)
156 end
157 for i = 1, 10 do
158 setglobal("BINDING_NAME_BONUSACTIONBUTTON"..i,label)
159 setglobal("BINDING_NAME_SHAPESHIFTBUTTON"..i,label)
160 end
161 BINDING_HEADER_ACTIONBAR = "|cff999999"..L["Action Bar Functions Disabled"].."|r"
162 BINDING_HEADER_MULTIACTIONBAR = "|cff999999"..L["Multi-Action Bar Functions Disabled"].."|r"
163 BINDING_NAME_NEXTACTIONPAGE = label
164 BINDING_NAME_PREVIOUSACTIONPAGE = label
165 end
166
167 function main:SetupKeybindings( previous )
168 if previous then
169 self:UnregisterEvent("REBOUND_BIND")
170 self:UnregisterEvent("REBOUND_UNBIND")
171 for key, binding in pairs(previous) do
172 ReBound:ClearBinding(key, getglobal(binding.target), binding.button, true)
173 end
174 end
175 if self.db.profile.firstRunDone ~= true then
176 self:StealKeyBindings()
177 else
178 for key, binding in pairs(self.db.profile.bindings) do
179 ReBound:SetBinding(key, getglobal(binding.target), binding.button)
180 end
181 end
182 SaveBindings(GetCurrentBindingSet())
183 self:RegisterEvent("REBOUND_BIND")
184 self:RegisterEvent("REBOUND_UNBIND")
185 end
186
187 function main:StealKeyBindings()
188 -- steal the keybindings of the main action bar and assign them to rebar 1, buttons 1-12
189 for i = 1, 12 do
190 local key = GetBindingKey("ACTIONBUTTON"..i)
191 if key and #key > 0 then
192 ReBound:ClearBinding(key,nil,nil,true) -- suppress notification printouts
193 ReBound:SetBinding(key, self.bars[1].buttons[i]:GetActionFrame(), "LeftButton")
194 end
195 end
196 SaveBindings(GetCurrentBindingSet())
197 end
198
199 function main:REBOUND_BIND(key, target, button)
200 if key and target then
201 self.db.profile.bindings[key] = { target = target, button = button }
202 end
203 end
204
205 function main:REBOUND_UNBIND(key)
206 if key then
207 self.db.profile.bindings[key] = nil
208 end
209 end
210
211 function main:ToggleKeybindMode()
212 self:SetKeybindMode(not self:GetKeybindMode())
213 end
214
215 function main:GetKeybindMode()
216 return self.keybindMode
217 end
218
219 function main:SetKeybindMode(enabled)
220 if not InCombatLockdown() then
221 self.keybindMode = enabled
222 for _, bar in pairs(self.bars) do
223 for __, button in pairs(bar.buttons) do
224 if button and button ~= EMPTY_BAR_SLOT then
225 button:TempShow(enabled)
226 end
227 end
228 end
229 if enabled then
230 ReBound:ShowAll()
231 ReActionKeybindDialog:Show()
232 else
233 ReBound:HideAll()
234 if ReActionKeybindDialog:IsShown() then
235 ReActionKeybindDialog:Hide()
236 end
237 end
238 else
239 UIErrorsFrame:AddMessage(ERROR_NOT_IN_COMBAT)
240 end
241 end
242
243
244
245
246 ----------------------------
247 -- Bar lock/unlock functions
248 ----------------------------
249 function main:CombatLockdown()
250 if not self:IsLocked() then
251 self:Lock()
252 UIErrorsFrame:AddMessage(L["ReAction bars locked when in combat"])
253 end
254 ReActionKeybindDialog:Hide()
255 end
256
134 function main:SetLocked( lock ) 257 function main:SetLocked( lock )
135 if lock ~= self.locked then 258 if lock ~= self.locked then
136 if not lock and InCombatLockdown() then 259 if not lock and InCombatLockdown() then
137 UIErrorsFrame:AddMessage(SPELL_FAILED_AFFECTING_COMBAT) 260 UIErrorsFrame:AddMessage(ERROR_NOT_IN_COMBAT)
138 else 261 else
139 self.locked = lock and true or false -- force data integrity 262 self.locked = lock and true or false -- force data integrity
140 for _, bar in pairs(self.bars) do 263 for _, bar in pairs(self.bars) do
141 if bar ~= EMPTY_BAR_SLOT then 264 if bar ~= EMPTY_BAR_SLOT then
142 if self.locked then 265 if self.locked then
170 main:SetLocked( not(self.locked) ) 293 main:SetLocked( not(self.locked) )
171 end 294 end
172 295
173 296
174 297
175 -- Hide the default Blizzard main bar artwork 298 --------------------------------------------------------
299 -- Functions to hide the default Blizzard main bar parts
300 --------------------------------------------------------
176 function main:HideArt() 301 function main:HideArt()
177 if self.db.profile.hideArt then 302 if self.db.profile.hideArt then
178 -- the pet bar is a child of MainMenuBar, and can't be hidden. Need to reparent it 303 -- the pet bar is a child of MainMenuBar, and can't be hidden. Need to reparent it
179 PetActionBarFrame:SetParent(UIParent) 304 PetActionBarFrame:SetParent(UIParent)
180 MainMenuBar:Hide() -- this also hides the bags, xp bar, lag meter, and micro menu buttons. 305 MainMenuBar:Hide() -- this also hides the bags, xp bar, lag meter, and micro menu buttons.
204 end 329 end
205 330
206 function main:ToggleHideArt() 331 function main:ToggleHideArt()
207 self:SetHideArt( not self:IsArtHidden() ) 332 self:SetHideArt( not self:IsArtHidden() )
208 end 333 end
209
210
211 334
212 -- Hide default Blizzard bars 335 -- Hide default Blizzard bars
213 local blizzDefaultBars = { 336 local blizzDefaultBars = {
214 ActionButton1, 337 ActionButton1,
215 ActionButton2, 338 ActionButton2,
243 MultiBarRight, 366 MultiBarRight,
244 MultiBarBottomLeft, 367 MultiBarBottomLeft,
245 MultiBarBottomRight, 368 MultiBarBottomRight,
246 } 369 }
247 370
248 function main:StealKeyBindings()
249 -- steal the keybindings of the main action bar and assign them to rebar 1, buttons 1-12
250 for i = 1, 12 do
251 -- TODO: when we convert to override bindings
252 end
253 end
254
255 local function disableUIOptions() 371 local function disableUIOptions()
256 -- disable the buttons to hide/show the blizzard multiaction bars 372 -- disable the buttons to hide/show the blizzard multiaction bars
257 -- see UIOptionsFrame.lua and .xml 373 -- see UIOptionsFrame.lua and .xml
258 -- This is called every time the options panel is shown, after it is set up 374 -- This is called every time the options panel is shown, after it is set up
259 for _, idx in pairs( { 33, 34, 35, 36, 37, 40 } ) do 375 for _, idx in pairs( { 33, 34, 35, 36, 37, 40 } ) do
275 MainMenuBar:SetFrameStrata("LOW") -- otherwise it appears on top of bars, if it isn't hidden 391 MainMenuBar:SetFrameStrata("LOW") -- otherwise it appears on top of bars, if it isn't hidden
276 hooksecurefunc("UIOptionsFrame_Load",disableUIOptions) 392 hooksecurefunc("UIOptionsFrame_Load",disableUIOptions)
277 end 393 end
278 394
279 395
396
397
398 ---------------------------------------
399 -- Bar setup and manipulation functions
400 ---------------------------------------
280 -- Reset bars to blizzard defaults 401 -- Reset bars to blizzard defaults
281 function main:ResetBars() 402 function main:ResetBars()
282 if InCombatLockdown() then 403 if InCombatLockdown() then
283 UIErrorsFrame:AddMessage(SPELL_FAILED_AFFECTING_COMBAT) 404 UIErrorsFrame:AddMessage(SPELL_FAILED_AFFECTING_COMBAT)
284 else 405 else
286 self.db.profile.bars = tcopy(ReAction_DefaultBlizzardBars) 407 self.db.profile.bars = tcopy(ReAction_DefaultBlizzardBars)
287 self:SetupBars() 408 self:SetupBars()
288 end 409 end
289 end 410 end
290 411
291
292 -- re-sync action IDs
293 function main:ResyncActionIDs()
294 -- TODO
295 end
296
297
298
299 -- Bar manipulation
300 main.bars = { }
301
302 function main:DestroyAllBars() 412 function main:DestroyAllBars()
303 -- destroy any existing bars 413 -- destroy any existing bars
304 for id = 1, table.maxn(self.bars) do 414 for id = 1, table.maxn(self.bars) do
305 self:DestroyBar(id) 415 self:DestroyBar(id)
306 end 416 end
307 end 417 end
308
309 418
310 function main:SetupBars() 419 function main:SetupBars()
311 -- hide the default Blizzard art, if configued 420 -- hide the default Blizzard art, if configued
312 self:HideArt() 421 self:HideArt()
313 422
386 -- find the lowest numbered nil slot. 495 -- find the lowest numbered nil slot.
387 self.bars[id] = EMPTY_BAR_SLOT 496 self.bars[id] = EMPTY_BAR_SLOT
388 end 497 end
389 end 498 end
390 499
500 --
501 -- this function is a wrapper for CreateBar() which looks up the bar type
502 -- and constructs a new configuration object of the right type.
391 function main:NewBar( type ) 503 function main:NewBar( type )
392 if InCombatLockdown() then 504 if InCombatLockdown() then
393 UIErrorsFrame:AddMessage(SPELL_FAILED_AFFECTING_COMBAT) 505 UIErrorsFrame:AddMessage(SPELL_FAILED_AFFECTING_COMBAT)
394 else 506 else
395 local t = ReAction:GetButtonType(type) 507 local t = ReAction:GetButtonType(type)
407 self:Unlock() 519 self:Unlock()
408 end 520 end
409 end 521 end
410 end 522 end
411 523
412 524 --
525 -- This function is a wrapper for DestroyBar() which does in-combat
526 -- checking and updates the config.
413 function main:DeleteBar(id) 527 function main:DeleteBar(id)
414 if InCombatLockdown() then 528 if InCombatLockdown() then
415 UIErrorsFrame:AddMessage(SPELL_FAILED_AFFECTING_COMBAT) 529 UIErrorsFrame:AddMessage(SPELL_FAILED_AFFECTING_COMBAT)
416 else 530 else
417 if self.bars[id] then 531 if self.bars[id] then
419 self.db.profile.bars[id] = nil 533 self.db.profile.bars[id] = nil
420 end 534 end
421 end 535 end
422 end 536 end
423 537
538
539
540
541 -----------------
542 -- General utility
543 -----------------
424 function main:ToggleIds() 544 function main:ToggleIds()
425 if self.showIds then 545 if self.showIds then
426 ReAction:HideAllIds() 546 ReAction:HideAllIds()
427 else 547 else
428 ReAction:ShowAllIds() 548 ReAction:ShowAllIds()
432 552
433 function main:AreIdsVisible() 553 function main:AreIdsVisible()
434 return self.showIds 554 return self.showIds
435 end 555 end
436 556
437 557 -- set a global variable for Bindings.xml
438 558 ReActionAddOn = main
559
560