Mercurial > wow > reaction
comparison ReAction.lua @ 63:768be7eb22a0
Converted several ReAction APIs to event-driven model instead of 'call-method-on-all-modules' model. Cleaned up a number of other architectural issues.
| author | Flick <flickerstreak@gmail.com> |
|---|---|
| date | Thu, 22 May 2008 22:02:08 +0000 |
| parents | 2ee41dcd673f |
| children | 06cd74bdc7da |
comparison
equal
deleted
inserted
replaced
| 62:f9cdb920470a | 63:768be7eb22a0 |
|---|---|
| 1 -- ReAction.lua | 1 --[[ |
| 2 -- See modules/ReAction_ModuleTemplate for Module API listing | 2 ReAction.lua |
| 3 -- See Bar.lua for Bar object listing | 3 |
| 4 The ReAction core manages 4 collections: | |
| 5 - modules (via AceAddon) | |
| 6 - bars | |
| 7 - options | |
| 8 - bar-type constructors | |
| 9 | |
| 10 and publishes events when those collections change. It also implements a single property, 'config mode', | |
| 11 and has a couple convenience methods which drill down to particular modules. | |
| 12 | |
| 13 Most of the "real work" of the addon happens in Bar.lua and the various modules. | |
| 14 | |
| 15 Events (with handler arguments): | |
| 16 -------------------------------- | |
| 17 "OnCreateBar" (bar, name) : after a bar object is created | |
| 18 "OnDestroyBar" (bar, name) : before a bar object is destroyed | |
| 19 "OnEraseBar" (bar, name) : before a bar config is removed from the profile db | |
| 20 "OnRenameBar" (bar, oldname, newname) : after a bar is renamed | |
| 21 "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 | |
| 24 "OnBarOptionGeneratorRegistered" (module, function) : after an options generator function is registered | |
| 25 | |
| 26 ReAction is also an AceAddon-3.0 and contains an AceDB-3.0, which in turn publish more events. | |
| 27 ]]-- | |
| 28 local version = GetAddOnMetadata("ReAction","Version") | |
| 4 | 29 |
| 5 ------ CORE ------ | 30 ------ CORE ------ |
| 6 local ReAction = LibStub("AceAddon-3.0"):NewAddon( "ReAction", | 31 local ReAction = LibStub("AceAddon-3.0"):NewAddon( "ReAction", |
| 7 "AceConsole-3.0", | 32 "AceConsole-3.0", |
| 8 "AceEvent-3.0" | 33 "AceEvent-3.0" |
| 9 ) | 34 ) |
| 10 ReAction.version = GetAddOnMetadata("ReAction","Version") | |
| 11 ReAction.revision = tonumber(("$Revision$"):match("%d+")) | 35 ReAction.revision = tonumber(("$Revision$"):match("%d+")) |
| 12 | 36 |
| 13 ------ GLOBALS ------ | 37 ------ GLOBALS ------ |
| 14 _G["ReAction"] = ReAction | 38 _G["ReAction"] = ReAction |
| 15 | 39 |
| 18 local dbprint | 42 local dbprint |
| 19 if ReAction.debug then | 43 if ReAction.debug then |
| 20 dbprint = function(msg) | 44 dbprint = function(msg) |
| 21 DEFAULT_CHAT_FRAME:AddMessage(msg) | 45 DEFAULT_CHAT_FRAME:AddMessage(msg) |
| 22 end | 46 end |
| 23 --seterrorhandler(dbprint) | |
| 24 else | 47 else |
| 25 dbprint = function() end | 48 dbprint = function() end |
| 26 end | 49 end |
| 27 ReAction.dbprint = dbprint | 50 ReAction.dbprint = dbprint |
| 28 | 51 |
| 29 ------ LIBRARIES ------ | 52 ------ LIBRARIES ------ |
| 53 local callbacks = LibStub("CallbackHandler-1.0"):New(ReAction) | |
| 30 local L = LibStub("AceLocale-3.0"):GetLocale("ReAction") | 54 local L = LibStub("AceLocale-3.0"):GetLocale("ReAction") |
| 31 ReAction.L = L | 55 ReAction.L = L |
| 32 | 56 |
| 33 ------ PRIVATE ------ | 57 ------ PRIVATE ------ |
| 34 local SelectBar, DestroyBar, InitializeBars, TearDownBars, DeepCopy, SafeCall, CheckMethod, SlashHandler | 58 local private = { } |
| 59 local bars = {} | |
| 60 local defaultBarConfig = {} | |
| 61 local barOptionGenerators = { } | |
| 62 local options = { | |
| 63 type = "group", | |
| 64 name = "ReAction", | |
| 65 childGroups = "tab", | |
| 66 args = { | |
| 67 _desc = { | |
| 68 type = "description", | |
| 69 name = L["Customizable replacement for Blizzard's Action Bars"], | |
| 70 order = 1, | |
| 71 }, | |
| 72 global = { | |
| 73 type = "group", | |
| 74 name = L["Global Settings"], | |
| 75 desc = L["Global configuration settings"], | |
| 76 args = { | |
| 77 unlock = { | |
| 78 type = "toggle", | |
| 79 name = L["Unlock Bars"], | |
| 80 desc = L["Unlock bars for dragging and resizing with the mouse"], | |
| 81 handler = ReAction, | |
| 82 get = "GetConfigMode", | |
| 83 set = function(info, value) ReAction:SetConfigMode(value) end, | |
| 84 disabled = InCombatLockdown, | |
| 85 order = 1 | |
| 86 }, | |
| 87 }, | |
| 88 plugins = { }, | |
| 89 order = 2, | |
| 90 }, | |
| 91 module = { | |
| 92 type = "group", | |
| 93 childGroups = "select", | |
| 94 name = L["Module Settings"], | |
| 95 desc = L["Configuration settings for each module"], | |
| 96 args = { }, | |
| 97 plugins = { }, | |
| 98 order = 3, | |
| 99 }, | |
| 100 }, | |
| 101 plugins = { } | |
| 102 } | |
| 103 ReAction.options = options | |
| 104 | |
| 105 local SelectBar, DestroyBar, InitializeBars, TearDownBars, DeepCopy, CallModuleMethod, SlashHandler | |
| 35 do | 106 do |
| 36 local pcall = pcall | 107 local pcall = pcall |
| 37 local geterrorhandler = geterrorhandler | 108 local geterrorhandler = geterrorhandler |
| 38 | 109 local self = ReAction |
| 39 SelectBar = function(x) | 110 local inited = false |
| 111 | |
| 112 function SelectBar(x) | |
| 40 local bar, name | 113 local bar, name |
| 41 if type(x) == "string" then | 114 if type(x) == "string" then |
| 42 name = x | 115 name = x |
| 43 bar = ReAction:GetBar(name) | 116 bar = self:GetBar(name) |
| 44 else | 117 else |
| 45 for k,v in pairs(ReAction.bars) do | 118 for k,v in pairs(bars) do |
| 46 if v == x then | 119 if v == x then |
| 47 name = k | 120 name = k |
| 48 bar = x | 121 bar = x |
| 49 end | 122 end |
| 50 end | 123 end |
| 51 end | 124 end |
| 52 return bar, name | 125 return bar, name |
| 53 end | 126 end |
| 54 | 127 |
| 55 DestroyBar = function(x) | 128 function DestroyBar(x) |
| 56 local bar, name = SelectBar(x) | 129 local bar, name = SelectBar(x) |
| 57 if name and bar then | 130 if bar and name then |
| 58 ReAction.bars[name] = nil | 131 bars[name] = nil |
| 59 ReAction:CallMethodOnAllModules("RemoveFromBar", bar) | 132 callbacks:Fire("OnDestroyBar", bar, name) |
| 60 bar:Destroy() | 133 bar:Destroy() |
| 61 end | 134 end |
| 62 end | 135 end |
| 63 | 136 |
| 64 InitializeBars = function () | 137 function InitializeBars() |
| 65 if not(ReAction.inited) then | 138 if not inited then |
| 66 for name, config in pairs(ReAction.db.profile.bars) do | 139 for name, config in pairs(self.db.profile.bars) do |
| 67 if config then | 140 if config then |
| 68 ReAction:CreateBar(name, config) | 141 self:CreateBar(name, config) |
| 69 end | 142 end |
| 70 end | 143 end |
| 71 ReAction:CallMethodOnAllBars("ApplyAnchor") -- re-anchor in the case of oddball ordering | 144 -- re-anchor in case anchor order does not match init order |
| 72 ReAction.inited = true | 145 for name, bar in pairs(bars) do |
| 73 end | 146 bar:ApplyAnchor() |
| 74 end | 147 end |
| 75 | 148 inited = true |
| 76 TearDownBars = function() | 149 end |
| 77 for name, bar in pairs(ReAction.bars) do | 150 end |
| 151 | |
| 152 function TearDownBars() | |
| 153 for name, bar in pairs(bars) do | |
| 78 if bar then | 154 if bar then |
| 79 ReAction.bars[name] = DestroyBar(bar) | 155 bars[name] = DestroyBar(bar) |
| 80 end | 156 end |
| 81 end | 157 end |
| 82 ReAction.inited = false | 158 inited = false |
| 83 end | 159 end |
| 84 | 160 |
| 85 DeepCopy = function(x) | 161 function DeepCopy(x) |
| 86 if type(x) ~= "table" then | 162 if type(x) ~= "table" then |
| 87 return x | 163 return x |
| 88 end | 164 end |
| 89 local r = {} | 165 local r = {} |
| 90 for k,v in pairs(x) do | 166 for k,v in pairs(x) do |
| 91 r[k] = DeepCopy(v) | 167 r[k] = DeepCopy(v) |
| 92 end | 168 end |
| 93 return r | 169 return r |
| 94 end | 170 end |
| 95 | 171 |
| 96 SafeCall = function(f, ...) | 172 function CallModuleMethod(modulename, method, ...) |
| 97 if f then | 173 local m = self:GetModule(modulename,true) |
| 98 local success, err = pcall(f,...) | 174 if not m then |
| 99 if not success then | 175 LoadAddOn(("ReAction_%s"):format(modulename)) |
| 100 geterrorhandler()(err) | 176 m = self:GetModule(modulename,true) |
| 101 end | 177 if m then |
| 102 end | 178 dbprint(("succesfully loaded LOD module: %s"):format(modulename)) |
| 103 end | 179 end |
| 104 | 180 end |
| 105 CheckMethod = function(m) | 181 if m then |
| 106 if type(m) == "function" then | 182 if type(m) == "table" and type(m[method]) == "function" then |
| 107 return m | 183 m[method](m,...) |
| 108 end | 184 else |
| 109 if type(m) ~= "string" then | 185 dbprint(("Bad call '%s' to %s module"):format(tostring(method),modulename)); |
| 110 error("Invalid method") | 186 end |
| 111 end | 187 else |
| 112 end | 188 self:Print(("Module '%s' not found"):format(tostring(modulename))) |
| 113 | 189 end |
| 114 SlashHandler = function(option) | 190 end |
| 191 | |
| 192 function SlashHandler(option) | |
| 115 if option == "config" then | 193 if option == "config" then |
| 116 ReAction:ShowConfig() | 194 self:ShowConfig() |
| 117 elseif option == "edit" then | 195 elseif option == "edit" then |
| 118 ReAction:ShowEditor() | 196 self:ShowEditor() |
| 119 elseif option == "unlock" then | 197 elseif option == "unlock" then |
| 120 ReAction:SetConfigMode(true) | 198 self:SetConfigMode(true) |
| 121 elseif option == "lock" then | 199 elseif option == "lock" then |
| 122 ReAction:SetConfigMode(false) | 200 self:SetConfigMode(false) |
| 123 else | 201 else |
| 124 ReAction:Print(("%3.1f.%d"):format(ReAction.version,ReAction.revision)) | 202 self:Print(("%3.1f.%d"):format(version,self.revision)) |
| 125 ReAction:Print("/reaction config") | 203 self:Print("/rxn config") |
| 126 ReAction:Print("/reaction edit") | 204 self:Print("/rxn edit") |
| 127 ReAction:Print("/reaction lock") | 205 self:Print("/rxn lock") |
| 128 ReAction:Print("/reaction unlock") | 206 self:Print("/rxn unlock") |
| 129 end | 207 end |
| 130 end | 208 end |
| 131 end | 209 end |
| 132 | 210 |
| 133 | 211 |
| 142 } | 220 } |
| 143 -- default profile is character-specific | 221 -- default profile is character-specific |
| 144 ) | 222 ) |
| 145 self.db.RegisterCallback(self,"OnProfileChanged") | 223 self.db.RegisterCallback(self,"OnProfileChanged") |
| 146 self.db.RegisterCallback(self,"OnProfileReset","OnProfileChanged") | 224 self.db.RegisterCallback(self,"OnProfileReset","OnProfileChanged") |
| 147 self.callbacks = LibStub("CallbackHandler-1.0"):New(self) | 225 |
| 226 options.args.profile = LibStub("AceDBOptions-3.0"):GetOptionsTable(self.db) | |
| 227 | |
| 148 self:RegisterChatCommand("reaction", SlashHandler) | 228 self:RegisterChatCommand("reaction", SlashHandler) |
| 149 self:RegisterChatCommand("rxn", SlashHandler) | 229 self:RegisterChatCommand("rxn", SlashHandler) |
| 150 self:RegisterEvent("PLAYER_REGEN_DISABLED") | 230 self:RegisterEvent("PLAYER_REGEN_DISABLED") |
| 151 | |
| 152 self.bars = {} | |
| 153 self.defaultBarConfig = {} | |
| 154 | |
| 155 self.options = { | |
| 156 type = "group", | |
| 157 name = "ReAction", | |
| 158 childGroups = "tab", | |
| 159 args = { | |
| 160 _desc = { | |
| 161 type = "description", | |
| 162 name = L["Customizable replacement for Blizzard's Action Bars"], | |
| 163 order = 1, | |
| 164 }, | |
| 165 global = { | |
| 166 type = "group", | |
| 167 name = L["Global Settings"], | |
| 168 desc = L["Global configuration settings"], | |
| 169 args = { | |
| 170 unlock = { | |
| 171 type = "toggle", | |
| 172 handler = module, | |
| 173 name = L["Unlock Bars"], | |
| 174 desc = L["Unlock bars for dragging and resizing with the mouse"], | |
| 175 get = function() return self.configMode end, | |
| 176 set = function(info, value) self:SetConfigMode(value) end, | |
| 177 disabled = InCombatLockdown, | |
| 178 order = 1 | |
| 179 }, | |
| 180 }, | |
| 181 plugins = { }, | |
| 182 order = 2, | |
| 183 }, | |
| 184 module = { | |
| 185 type = "group", | |
| 186 childGroups = "select", | |
| 187 name = L["Module Settings"], | |
| 188 desc = L["Configuration settings for each module"], | |
| 189 args = { }, | |
| 190 plugins = { }, | |
| 191 order = 3, | |
| 192 }, | |
| 193 profile = LibStub("AceDBOptions-3.0"):GetOptionsTable(self.db) | |
| 194 }, | |
| 195 plugins = { } | |
| 196 } | |
| 197 | |
| 198 end | 231 end |
| 199 | 232 |
| 200 function ReAction:OnEnable() | 233 function ReAction:OnEnable() |
| 201 InitializeBars() | 234 InitializeBars() |
| 202 end | 235 end |
| 208 function ReAction:OnProfileChanged() | 241 function ReAction:OnProfileChanged() |
| 209 TearDownBars() | 242 TearDownBars() |
| 210 InitializeBars() | 243 InitializeBars() |
| 211 end | 244 end |
| 212 | 245 |
| 213 function ReAction:OnModuleEnable(module) | |
| 214 if module.ApplyToBar then | |
| 215 for _, b in pairs(bars) do | |
| 216 if b then | |
| 217 module:ApplyToBar(b) | |
| 218 end | |
| 219 end | |
| 220 end | |
| 221 end | |
| 222 | |
| 223 function ReAction:OnModuleDisable(module) | |
| 224 if module.RemoveFromBar then | |
| 225 for _, b in pairs(bars) do | |
| 226 if b then | |
| 227 module:RemoveFromBar(b) | |
| 228 end | |
| 229 end | |
| 230 end | |
| 231 end | |
| 232 | |
| 233 function ReAction:PLAYER_REGEN_DISABLED() | 246 function ReAction:PLAYER_REGEN_DISABLED() |
| 234 if self.configMode == true then | 247 if private.configMode == true then |
| 235 UIErrorsFrame:AddMessage(L["ReAction config mode disabled during combat."]) | 248 self:UserError(L["ReAction config mode disabled during combat."]) |
| 236 self:SetConfigMode(false) | 249 self:SetConfigMode(false) |
| 237 end | 250 end |
| 238 end | 251 end |
| 239 | 252 |
| 240 | 253 |
| 243 function ReAction:UserError(msg) | 256 function ReAction:UserError(msg) |
| 244 -- any user errors should be flashed to the UIErrorsFrame | 257 -- any user errors should be flashed to the UIErrorsFrame |
| 245 UIErrorsFrame:AddMessage(msg) | 258 UIErrorsFrame:AddMessage(msg) |
| 246 end | 259 end |
| 247 | 260 |
| 248 function ReAction:CallMethodOnAllModules(method, ...) | 261 -- usage: |
| 249 local m = CheckMethod(method) | 262 -- (1) ReAction:CreateBar(name, cfgTable) |
| 250 for _, x in self:IterateModules() do | 263 -- (2) ReAction:CreateBar(name, "barType", [nRows], [nCols], [btnSize], [btnSpacing]) |
| 251 if x then | |
| 252 SafeCall(m or x[method], x, ...) | |
| 253 end | |
| 254 end | |
| 255 end | |
| 256 | |
| 257 function ReAction:CallMethodOnAllBars(method,...) | |
| 258 local m = CheckMethod(method) | |
| 259 for _, x in pairs(self.bars) do | |
| 260 if x then | |
| 261 SafeCall(m or x[method], x, ...) | |
| 262 end | |
| 263 end | |
| 264 end | |
| 265 | |
| 266 function ReAction:CallModuleMethod(modulename, method, ...) | |
| 267 local m = self:GetModule(modulename,true) | |
| 268 if not m then | |
| 269 LoadAddOn(("ReAction_%s"):format(modulename)) | |
| 270 m = self:GetModule(modulename,true) | |
| 271 if m then | |
| 272 dbprint(("succesfully loaded LOD module: %s"):format(modulename)) | |
| 273 end | |
| 274 end | |
| 275 if m then | |
| 276 if type(m) == "table" and type(m[method]) == "function" then | |
| 277 m[method](m,...) | |
| 278 else | |
| 279 dbprint(("Bad call '%s' to %s module"):format(tostring(method),modulename)); | |
| 280 end | |
| 281 else | |
| 282 self:Print(("Module '%s' not found"):format(tostring(modulename))) | |
| 283 end | |
| 284 end | |
| 285 | |
| 286 | |
| 287 function ReAction:CreateBar(name, ...) | 264 function ReAction:CreateBar(name, ...) |
| 288 local config = select(1,...) | 265 local config = select(1,...) |
| 289 if config and type(config) ~= "table" then | 266 if config and type(config) ~= "table" then |
| 290 bartype = select(1,...) | 267 bartype = select(1,...) |
| 291 if type(bartype) ~= "string" then | 268 if type(bartype) ~= "string" then |
| 292 error("ReAction:CreateBar() - first argument must be a config table or a default config type string") | 269 error("ReAction:CreateBar() - first argument must be a config table or a default config type string") |
| 293 end | 270 end |
| 294 config = self.defaultBarConfig[bartype] | 271 config = defaultBarConfig[bartype] |
| 295 if not config then | 272 if not config then |
| 296 error(("ReAction:CreateBar() - unknown bar type '%s'"):format(bartype)) | 273 error(("ReAction:CreateBar() - unknown bar type '%s'"):format(bartype)) |
| 297 end | 274 end |
| 298 config = DeepCopy(config) | 275 config = DeepCopy(config) |
| 299 config.btnRows = select(2,...) or config.btnRows or 1 | 276 config.btnRows = select(2,...) or config.btnRows or 1 |
| 315 if not name then | 292 if not name then |
| 316 i = 1 | 293 i = 1 |
| 317 repeat | 294 repeat |
| 318 name = prefix..i | 295 name = prefix..i |
| 319 i = i + 1 | 296 i = i + 1 |
| 320 until self.bars[name] == nil | 297 until bars[name] == nil |
| 321 end | 298 end |
| 322 profile.bars[name] = profile.bars[name] or config | 299 profile.bars[name] = profile.bars[name] or config |
| 323 local bar = self.Bar:new( name, profile.bars[name] ) -- ReAction.Bar defined in Bar.lua | 300 local bar = self.Bar:new( name, profile.bars[name] ) -- ReAction.Bar defined in Bar.lua |
| 324 self:CallMethodOnAllModules("ApplyToBar", bar) | 301 bars[name] = bar |
| 325 self.bars[name] = bar | 302 callbacks:Fire("OnCreateBar", bar, name) |
| 326 self.callbacks:Fire("OnCreateBar", bar) | 303 if private.configMode then |
| 327 if self.configMode then | |
| 328 bar:ShowControls(true) | 304 bar:ShowControls(true) |
| 329 end | 305 end |
| 330 | 306 |
| 331 return bar | 307 return bar |
| 332 end | 308 end |
| 333 | 309 |
| 334 function ReAction:EraseBar(x) | 310 function ReAction:EraseBar(x) |
| 335 local bar, name = SelectBar(x) | 311 local bar, name = SelectBar(x) |
| 336 if name and bar then | 312 if bar and name then |
| 313 callbacks:Fire("OnEraseBar", bar, name) | |
| 337 DestroyBar(bar) | 314 DestroyBar(bar) |
| 338 self.db.profile.bars[name] = nil | 315 self.db.profile.bars[name] = nil |
| 339 self:CallMethodOnAllModules("EraseBarConfig", name) | |
| 340 self.callbacks:Fire("OnEraseBar",name) | |
| 341 end | 316 end |
| 342 end | 317 end |
| 343 | 318 |
| 344 function ReAction:GetBar(name) | 319 function ReAction:GetBar(name) |
| 345 return self.bars[name] | 320 return bars[name] |
| 321 end | |
| 322 | |
| 323 function ReAction:IterateBars() | |
| 324 return pairs(bars) | |
| 346 end | 325 end |
| 347 | 326 |
| 348 function ReAction:RenameBar(x, newname) | 327 function ReAction:RenameBar(x, newname) |
| 349 local bar, name = SelectBar(x) | 328 local bar, name = SelectBar(x) |
| 350 if bar and name and newname then | 329 if type(newname) ~= "string" then |
| 351 if self.bars[newname] then | 330 error("ReAction:RenameBar() - second argument must be a string") |
| 352 UIErrorsFrame:AddMessage(("%s ('%s')"):format(L["ReAction: name already in use"],newname)) | 331 end |
| 353 else | 332 if bar and name and #newname > 0 then |
| 354 self.bars[newname] = self.bars[name] | 333 if bars[newname] then |
| 355 self.bars[name] = nil | 334 self:UserError(("%s ('%s')"):format(L["ReAction: name already in use"],newname)) |
| 335 else | |
| 336 bars[newname], bars[name] = bars[name], nil | |
| 356 bar:SetName(newname or "") | 337 bar:SetName(newname or "") |
| 357 local cfg = self.db.profile.bars | 338 local cfg = self.db.profile.bars |
| 358 cfg[newname], cfg[name] = cfg[name], nil | 339 cfg[newname], cfg[name] = cfg[name], nil |
| 359 self:CallMethodOnAllModules("RenameBarConfig", name, newname) | 340 callbacks:Fire("OnRenameBar", bar, name, newname) |
| 360 self.callbacks:Fire("OnRenameBar", name, newname) | 341 end |
| 361 end | 342 end |
| 343 end | |
| 344 | |
| 345 function ReAction:RefreshBar(x) | |
| 346 local bar, name = SelectBar(x) | |
| 347 if bar and name then | |
| 348 callbacks:Fire("OnRefreshBar", bar, name) | |
| 362 end | 349 end |
| 363 end | 350 end |
| 364 | 351 |
| 365 function ReAction:RegisterBarType( name, config, isDefaultChoice ) | 352 function ReAction:RegisterBarType( name, config, isDefaultChoice ) |
| 366 self.defaultBarConfig[name] = config | 353 defaultBarConfig[name] = config |
| 367 if isDefaultChoice then | 354 if isDefaultChoice then |
| 368 self.defaultBarConfigChoice = name | 355 defaultBarConfigChoice = name |
| 369 end | 356 end |
| 370 self:RefreshOptions() | 357 self:RefreshOptions() |
| 371 end | 358 end |
| 372 | 359 |
| 373 function ReAction:UnregisterBarType( name ) | 360 function ReAction:UnregisterBarType( name ) |
| 374 self.defaultBarConfig[name] = nil | 361 defaultBarConfig[name] = nil |
| 375 if self.defaultBarConfigChoice == name then | 362 if private.defaultBarConfigChoice == name then |
| 376 self.defaultBarConfigChoice = nil | 363 private.defaultBarConfigChoice = nil |
| 377 end | 364 end |
| 378 self:RefreshOptions() | 365 self:RefreshOptions() |
| 379 end | 366 end |
| 380 | 367 |
| 381 function ReAction:RegisterOptions(module, options, global) | 368 function ReAction:IterateBarTypes() |
| 382 self.options.args[global and "global" or "module"].plugins[module:GetName()] = options | 369 return pairs(defaultBarConfig) |
| 370 end | |
| 371 | |
| 372 function ReAction:GetBarTypeConfig(name) | |
| 373 if name then | |
| 374 return defaultBarConfig[name] | |
| 375 end | |
| 376 end | |
| 377 | |
| 378 function ReAction:GetBarTypeOptions( fill ) | |
| 379 fill = fill or { } | |
| 380 for k in self:IterateBarTypes() do | |
| 381 fill[k] = k | |
| 382 end | |
| 383 return fill | |
| 384 end | |
| 385 | |
| 386 function ReAction:GetDefaultBarType() | |
| 387 return private.defaultBarConfigChoice | |
| 388 end | |
| 389 | |
| 390 function ReAction:RegisterOptions(module, opts, global) | |
| 391 options.args[global and "global" or "module"].plugins[module:GetName()] = opts | |
| 392 self:RefreshOptions() | |
| 383 end | 393 end |
| 384 | 394 |
| 385 function ReAction:RefreshOptions() | 395 function ReAction:RefreshOptions() |
| 386 self.callbacks:Fire("OnOptionsRefreshed") | 396 callbacks:Fire("OnOptionsRefreshed") |
| 397 end | |
| 398 | |
| 399 -- | |
| 400 -- In addition to global and general module options, options tables | |
| 401 -- must be generated dynamically for each bar. | |
| 402 -- | |
| 403 -- 'func' should be a function or a method string. | |
| 404 -- The function or method will be passed the bar as its parameter. | |
| 405 -- (methods will of course get the module as the first 'self' parameter) | |
| 406 -- | |
| 407 -- A generator can be unregistered by passing a nil func. | |
| 408 -- | |
| 409 function ReAction:RegisterBarOptionGenerator( module, func ) | |
| 410 if not module or type(module) ~= "table" then -- doesn't need to be a proper module, strictly | |
| 411 error("ReAction:RegisterBarOptionGenerator() : Invalid module") | |
| 412 end | |
| 413 if type(func) == "string" then | |
| 414 if not module[func] then | |
| 415 error(("ReAction:RegisterBarOptionGenerator() : Invalid method '%s'"):format(func)) | |
| 416 end | |
| 417 elseif func and type(func) ~= "function" then | |
| 418 error("ReAction:RegisterBarOptionGenerator() : Invalid function") | |
| 419 end | |
| 420 barOptionGenerators[module] = func | |
| 421 callbacks:Fire("OnBarOptionGeneratorRegistered", module, func) | |
| 422 end | |
| 423 | |
| 424 -- builds a table suitable for use as an AceConfig3 group 'plugins' sub-table | |
| 425 function ReAction:GenerateBarOptionsTable( bar ) | |
| 426 local opts = { } | |
| 427 for module, func in pairs(barOptionGenerators) do | |
| 428 local success, r | |
| 429 if type(func) == "string" then | |
| 430 success, r = pcall(module[func], module, bar) | |
| 431 else | |
| 432 success, r = pcall(func, bar) | |
| 433 end | |
| 434 if success then | |
| 435 opts[module:GetName()] = { [module:GetName()] = r } | |
| 436 else | |
| 437 geterrorhandler()(r) | |
| 438 end | |
| 439 end | |
| 440 return opts | |
| 387 end | 441 end |
| 388 | 442 |
| 389 function ReAction:SetConfigMode( mode ) | 443 function ReAction:SetConfigMode( mode ) |
| 390 self:CallMethodOnAllBars("ShowControls",mode) | 444 private.configMode = mode |
| 391 self:CallMethodOnAllModules("ApplyConfigMode",mode,self.bars) | 445 callbacks:Fire("OnConfigModeChanged", mode) |
| 392 self.configMode = mode | 446 end |
| 447 | |
| 448 function ReAction:GetConfigMode() | |
| 449 return private.configMode | |
| 393 end | 450 end |
| 394 | 451 |
| 395 function ReAction:ShowConfig() | 452 function ReAction:ShowConfig() |
| 396 self:CallModuleMethod("ConfigUI","OpenConfig") | 453 CallModuleMethod("ConfigUI","OpenConfig") |
| 397 end | 454 end |
| 398 | 455 |
| 399 function ReAction:ShowEditor() | 456 function ReAction:ShowEditor(bar) |
| 400 self:CallModuleMethod("ConfigUI","LaunchBarEditor") | 457 CallModuleMethod("ConfigUI","LaunchBarEditor",bar) |
| 401 end | 458 end |
