Mercurial > wow > reaction
comparison ReAction.lua @ 185:2e7a322e0195
move ConfigUI module to Editor non-module, make it more self-contained
author | Flick <flickerstreak@gmail.com> |
---|---|
date | Fri, 22 Oct 2010 23:48:02 +0000 |
parents | 1ee86bbb05a0 |
children | 55af1ebbec65 |
comparison
equal
deleted
inserted
replaced
184:1ee86bbb05a0 | 185:2e7a322e0195 |
---|---|
2 ReAction.lua | 2 ReAction.lua |
3 | 3 |
4 The ReAction core manages several collections: | 4 The ReAction core manages several collections: |
5 - modules (via AceAddon) | 5 - modules (via AceAddon) |
6 - bars | 6 - bars |
7 - bar options | |
8 - bar-type constructors | 7 - bar-type constructors |
9 | 8 |
10 and publishes events when those collections change. It also implements a couple properties | 9 and publishes events when those collections change. It also implements a couple properties |
11 and has a couple convenience methods which drill down to particular modules. | 10 and has a couple convenience methods which drill down to particular modules. |
12 | 11 |
17 "OnCreateBar" (bar, name) : after a bar object is created | 16 "OnCreateBar" (bar, name) : after a bar object is created |
18 "OnDestroyBar" (bar, name) : before a bar object is destroyed | 17 "OnDestroyBar" (bar, name) : before a bar object is destroyed |
19 "OnEraseBar" (bar, name) : before a bar config is removed from the profile db | 18 "OnEraseBar" (bar, name) : before a bar config is removed from the profile db |
20 "OnRenameBar" (bar, oldname, newname) : after a bar is renamed | 19 "OnRenameBar" (bar, oldname, newname) : after a bar is renamed |
21 "OnRefreshBar" (bar, name) : after a bar's state has been updated | 20 "OnRefreshBar" (bar, name) : after a bar's state has been updated |
22 "OnOptionsRefreshed" () : after the global options tree is refreshed | |
23 "OnConfigModeChanged" (mode) : after the config mode is changed | 21 "OnConfigModeChanged" (mode) : after the config mode is changed |
24 "OnBarOptionGeneratorRegistered" (module, function) : after an options generator function is registered | |
25 | 22 |
26 ReAction is also an AceAddon-3.0 and contains an AceDB-3.0, which in turn publish more events. | 23 ReAction is also an AceAddon-3.0 and contains an AceDB-3.0, which in turn publish more events. |
27 ]]-- | 24 ]]-- |
28 local addonName, addonTable = ... | 25 local _, addonTable = ... |
29 local ReAction = LibStub("AceAddon-3.0"):NewAddon( addonName, | 26 local ReAction = LibStub("AceAddon-3.0"):NewAddon( "ReAction", |
30 "AceEvent-3.0" | 27 "AceEvent-3.0" |
31 ) | 28 ) |
32 ReAction.version = GetAddOnMetadata(addonName,"Version") | 29 ReAction.version = "1.0" |
33 addonTable.ReAction = ReAction | 30 addonTable.ReAction = ReAction |
34 | 31 |
35 ------ LIBRARIES ------ | 32 ------ LIBRARIES ------ |
36 local callbacks = LibStub("CallbackHandler-1.0"):New(ReAction) | 33 local callbacks = LibStub("CallbackHandler-1.0"):New(ReAction) |
37 local LKB = LibStub("LibKeyBound-1.0") | 34 local LKB = LibStub("LibKeyBound-1.0") |
42 | 39 |
43 ------ PRIVATE ------ | 40 ------ PRIVATE ------ |
44 local private = { } | 41 local private = { } |
45 local bars = {} | 42 local bars = {} |
46 local defaultBarConfig = {} | 43 local defaultBarConfig = {} |
47 local barOptionGenerators = { } | 44 |
48 | 45 |
49 | 46 local SelectBar, DestroyBar, InitializeBars, TearDownBars, DeepCopy |
50 local SelectBar, DestroyBar, InitializeBars, TearDownBars, DeepCopy, CallModuleMethod | |
51 do | 47 do |
52 local pcall = pcall | 48 local pcall = pcall |
53 local geterrorhandler = geterrorhandler | 49 local geterrorhandler = geterrorhandler |
54 local self = ReAction | 50 local self = ReAction |
55 local inited = false | 51 local inited = false |
113 r[k] = DeepCopy(v) | 109 r[k] = DeepCopy(v) |
114 end | 110 end |
115 return r | 111 return r |
116 end | 112 end |
117 | 113 |
118 function CallModuleMethod(modulename, method, ...) | |
119 local m = self:GetModule(modulename,true) | |
120 if m then | |
121 if type(m) == "table" and type(m[method]) == "function" then | |
122 m[method](m,...) | |
123 end | |
124 end | |
125 end | |
126 | |
127 end | 114 end |
128 | 115 |
129 | 116 |
130 ------ HANDLERS ------ | 117 ------ HANDLERS ------ |
131 function ReAction:OnInitialize() | 118 function ReAction:OnInitialize() |
133 { | 120 { |
134 profile = { | 121 profile = { |
135 bars = { }, | 122 bars = { }, |
136 defaultBar = { }, | 123 defaultBar = { }, |
137 closeOptionsOnEditorLaunch = true, | 124 closeOptionsOnEditorLaunch = true, |
125 editorCloseOnLaunch = true, | |
138 } | 126 } |
139 }, | 127 }, |
140 true -- use global 'Default' (locale-specific) | 128 true -- use global 'Default' (locale-specific) |
141 ) | 129 ) |
142 LKB.RegisterCallback(self,"LIBKEYBOUND_ENABLED") | 130 LKB.RegisterCallback(self,"LIBKEYBOUND_ENABLED") |
158 function ReAction:PLAYER_REGEN_DISABLED() | 146 function ReAction:PLAYER_REGEN_DISABLED() |
159 if private.configMode == true then | 147 if private.configMode == true then |
160 self:UserError(L["ReAction config mode disabled during combat."]) | 148 self:UserError(L["ReAction config mode disabled during combat."]) |
161 self:SetConfigMode(false) | 149 self:SetConfigMode(false) |
162 self:SetKeybindMode(false) | 150 self:SetKeybindMode(false) |
151 self:CloseEditor() | |
163 end | 152 end |
164 end | 153 end |
165 | 154 |
166 function ReAction:LIBKEYBOUND_ENABLED( evt ) | 155 function ReAction:LIBKEYBOUND_ENABLED( evt ) |
167 self:SetKeybindMode(true) | 156 self:SetKeybindMode(true) |
287 function ReAction:RegisterBarType( name, config, isDefaultChoice ) | 276 function ReAction:RegisterBarType( name, config, isDefaultChoice ) |
288 defaultBarConfig[name] = config | 277 defaultBarConfig[name] = config |
289 if isDefaultChoice then | 278 if isDefaultChoice then |
290 private.defaultBarConfigChoice = name | 279 private.defaultBarConfigChoice = name |
291 end | 280 end |
292 self:RefreshOptions() | 281 self:RefreshEditor() |
293 end | 282 end |
294 | 283 |
295 function ReAction:UnregisterBarType( name ) | 284 function ReAction:UnregisterBarType( name ) |
296 defaultBarConfig[name] = nil | 285 defaultBarConfig[name] = nil |
297 if private.defaultBarConfigChoice == name then | 286 if private.defaultBarConfigChoice == name then |
298 private.defaultBarConfigChoice = nil | 287 private.defaultBarConfigChoice = nil |
299 end | 288 end |
300 self:RefreshOptions() | 289 self:RefreshEditor() |
301 end | 290 end |
302 | 291 |
303 function ReAction:IterateBarTypes() | 292 function ReAction:IterateBarTypes() |
304 return pairs(defaultBarConfig) | 293 return pairs(defaultBarConfig) |
305 end | 294 end |
320 | 309 |
321 function ReAction:GetDefaultBarType() | 310 function ReAction:GetDefaultBarType() |
322 return private.defaultBarConfigChoice | 311 return private.defaultBarConfigChoice |
323 end | 312 end |
324 | 313 |
325 function ReAction:RefreshOptions() | |
326 callbacks:Fire("OnOptionsRefreshed") | |
327 end | |
328 | |
329 -- | |
330 -- In addition to global options, options tables | |
331 -- must be generated dynamically for each bar. | |
332 -- | |
333 -- 'func' should be a function or a method string. | |
334 -- The function or method will be passed the bar as its parameter. | |
335 -- (methods will of course get the module as the first 'self' parameter) | |
336 -- | |
337 -- A generator can be unregistered by passing a nil func. | |
338 -- | |
339 function ReAction:RegisterBarOptionGenerator( module, func ) | |
340 if not module or type(module) ~= "table" then -- doesn't need to be a proper module, strictly | |
341 error("ReAction:RegisterBarOptionGenerator() : Invalid module") | |
342 end | |
343 if type(func) == "string" then | |
344 if not module[func] then | |
345 error(("ReAction:RegisterBarOptionGenerator() : Invalid method '%s'"):format(func)) | |
346 end | |
347 elseif func and type(func) ~= "function" then | |
348 error("ReAction:RegisterBarOptionGenerator() : Invalid function") | |
349 end | |
350 barOptionGenerators[module] = func | |
351 callbacks:Fire("OnBarOptionGeneratorRegistered", module, func) | |
352 end | |
353 | |
354 -- builds a table suitable for use as an AceConfig3 group 'plugins' sub-table | |
355 function ReAction:GenerateBarOptionsTable( bar ) | |
356 local opts = { } | |
357 for module, func in pairs(barOptionGenerators) do | |
358 local success, r | |
359 if type(func) == "string" then | |
360 success, r = pcall(module[func], module, bar) | |
361 else | |
362 success, r = pcall(func, bar) | |
363 end | |
364 if success then | |
365 if r then | |
366 opts[module:GetName()] = { [module:GetName()] = r } | |
367 end | |
368 else | |
369 geterrorhandler()(r) | |
370 end | |
371 end | |
372 return opts | |
373 end | |
374 | |
375 function ReAction:SetConfigMode( mode ) | 314 function ReAction:SetConfigMode( mode ) |
376 if mode ~= private.configMode then | 315 if mode ~= private.configMode then |
377 private.configMode = mode | 316 private.configMode = mode |
378 callbacks:Fire("OnConfigModeChanged", mode) | 317 callbacks:Fire("OnConfigModeChanged", mode) |
379 end | 318 end |
380 end | 319 end |
381 | 320 |
382 function ReAction:GetConfigMode() | 321 function ReAction:GetConfigMode() |
383 return private.configMode | 322 return private.configMode |
384 end | |
385 | |
386 function ReAction:ShowEditor(bar, ...) | |
387 CallModuleMethod("ConfigUI","LaunchBarEditor",bar, ...) | |
388 end | 323 end |
389 | 324 |
390 function ReAction:SetKeybindMode( mode ) | 325 function ReAction:SetKeybindMode( mode ) |
391 if mode ~= private.kbMode then | 326 if mode ~= private.kbMode then |
392 if mode then | 327 if mode then |