Mercurial > wow > reaction
comparison ReAction.lua @ 182:55c2fc0c8d55
Collect options in one file
clean up ReAction.lua a bit
remove AceConsole-3.0
| author | Flick <flickerstreak@gmail.com> |
|---|---|
| date | Thu, 21 Oct 2010 22:07:11 +0000 |
| parents | df68b5a40490 |
| children | 1ee86bbb05a0 |
comparison
equal
deleted
inserted
replaced
| 181:c8777ae7d460 | 182:55c2fc0c8d55 |
|---|---|
| 1 --[[ | 1 --[[ |
| 2 ReAction.lua | 2 ReAction.lua |
| 3 | 3 |
| 4 The ReAction core manages 4 collections: | 4 The ReAction core manages several collections: |
| 5 - modules (via AceAddon) | 5 - modules (via AceAddon) |
| 6 - bars | 6 - bars |
| 7 - options | 7 - bar options |
| 8 - bar-type constructors | 8 - bar-type constructors |
| 9 | 9 |
| 10 and publishes events when those collections change. It also implements a couple properties | 10 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. | 11 and has a couple convenience methods which drill down to particular modules. |
| 12 | 12 |
| 23 "OnConfigModeChanged" (mode) : after the config mode is changed | 23 "OnConfigModeChanged" (mode) : after the config mode is changed |
| 24 "OnBarOptionGeneratorRegistered" (module, function) : after an options generator function is registered | 24 "OnBarOptionGeneratorRegistered" (module, function) : after an options generator function is registered |
| 25 | 25 |
| 26 ReAction is also an AceAddon-3.0 and contains an AceDB-3.0, which in turn publish more events. | 26 ReAction is also an AceAddon-3.0 and contains an AceDB-3.0, which in turn publish more events. |
| 27 ]]-- | 27 ]]-- |
| 28 local version = GetAddOnMetadata("ReAction","Version") | 28 |
| 29 | 29 local addonName, addonTable = ... |
| 30 ------ CORE ------ | 30 local version = GetAddOnMetadata(addonName,"Version") |
| 31 local ReAction = LibStub("AceAddon-3.0"):NewAddon( "ReAction", | 31 local ReAction = LibStub("AceAddon-3.0"):NewAddon( addonName, |
| 32 "AceConsole-3.0", | |
| 33 "AceEvent-3.0" | 32 "AceEvent-3.0" |
| 34 ) | 33 ) |
| 35 | |
| 36 -- export to other files in this addon (even if it's a compilation) | |
| 37 local addonName, addonTable = ... | |
| 38 local version = GetAddOnMetadata("ReAction","Version") | |
| 39 addonTable.ReAction = ReAction | 34 addonTable.ReAction = ReAction |
| 40 | |
| 41 ------ DEBUGGING ------ | |
| 42 ReAction.debug = true | |
| 43 local dbprint | |
| 44 if ReAction.debug then | |
| 45 dbprint = function(msg) | |
| 46 DEFAULT_CHAT_FRAME:AddMessage(msg) | |
| 47 end | |
| 48 else | |
| 49 dbprint = function() end | |
| 50 end | |
| 51 ReAction.dbprint = dbprint | |
| 52 | 35 |
| 53 ------ LIBRARIES ------ | 36 ------ LIBRARIES ------ |
| 54 local callbacks = LibStub("CallbackHandler-1.0"):New(ReAction) | 37 local callbacks = LibStub("CallbackHandler-1.0"):New(ReAction) |
| 55 local KB = LibStub("LibKeyBound-1.0") | 38 local KB = LibStub("LibKeyBound-1.0") |
| 56 local L = LibStub("AceLocale-3.0"):GetLocale("ReAction") | 39 local L = LibStub("AceLocale-3.0"):GetLocale("ReAction") |
| 57 ReAction.L = L | 40 ReAction.L = L |
| 41 ReAction.KB = KB | |
| 42 ReAction.callbacks = callbacks | |
| 58 | 43 |
| 59 ------ PRIVATE ------ | 44 ------ PRIVATE ------ |
| 60 local weak = {__mode="k"} | |
| 61 local private = { } | 45 local private = { } |
| 62 local bars = {} | 46 local bars = {} |
| 63 local defaultBarConfig = {} | 47 local defaultBarConfig = {} |
| 64 local barOptionGenerators = { } | 48 local barOptionGenerators = { } |
| 65 local options = { | 49 |
| 66 type = "group", | 50 |
| 67 name = "ReAction", | 51 local SelectBar, DestroyBar, InitializeBars, TearDownBars, DeepCopy, CallModuleMethod |
| 68 childGroups = "tab", | |
| 69 args = { | |
| 70 _desc = { | |
| 71 type = "description", | |
| 72 name = L["Customizable replacement for Blizzard's Action Bars"], | |
| 73 order = 1, | |
| 74 }, | |
| 75 global = { | |
| 76 type = "group", | |
| 77 name = L["Global Settings"], | |
| 78 desc = L["Global configuration settings"], | |
| 79 args = { | |
| 80 unlock = { | |
| 81 type = "toggle", | |
| 82 name = L["Unlock Bars"], | |
| 83 desc = L["Unlock bars for dragging and resizing with the mouse"], | |
| 84 handler = ReAction, | |
| 85 get = "GetConfigMode", | |
| 86 set = function(info, value) ReAction:SetConfigMode(value) end, | |
| 87 width = "double", | |
| 88 disabled = InCombatLockdown, | |
| 89 order = 1 | |
| 90 }, | |
| 91 skipProfileWarning = { | |
| 92 type = "toggle", | |
| 93 name = L["Skip profile keybind warning"], | |
| 94 desc = L["Don't show a warning about updating keybinds when switching profiles"], | |
| 95 get = function() return ReAction.db.global.skipKeybindWarning end, | |
| 96 set = function(info, value) ReAction.db.global.skipKeybindWarning = value end, | |
| 97 width = "double", | |
| 98 order = 2, | |
| 99 }, | |
| 100 }, | |
| 101 plugins = { }, | |
| 102 order = 2, | |
| 103 }, | |
| 104 module = { | |
| 105 type = "group", | |
| 106 childGroups = "select", | |
| 107 name = L["Module Settings"], | |
| 108 desc = L["Configuration settings for each module"], | |
| 109 args = { }, | |
| 110 plugins = { }, | |
| 111 order = 3, | |
| 112 }, | |
| 113 }, | |
| 114 plugins = { } | |
| 115 } | |
| 116 ReAction.options = options | |
| 117 | |
| 118 -- insert an entry into the WoW static popup dialogs list | |
| 119 StaticPopupDialogs["REACTION_KB_WARN"] = { | |
| 120 text = L["ReAction profile changed: check your keybinds, they may need to be updated."], | |
| 121 button1 = L["OK"], | |
| 122 hideOnEscape = true, | |
| 123 enterClicksFirstButton = true, | |
| 124 timeout = 0, | |
| 125 showAlert = true, | |
| 126 whileDead = true, | |
| 127 } | |
| 128 | |
| 129 local SelectBar, DestroyBar, InitializeBars, TearDownBars, DeepCopy, CallModuleMethod, SlashHandler | |
| 130 do | 52 do |
| 131 local pcall = pcall | 53 local pcall = pcall |
| 132 local geterrorhandler = geterrorhandler | 54 local geterrorhandler = geterrorhandler |
| 133 local self = ReAction | 55 local self = ReAction |
| 134 local inited = false | 56 local inited = false |
| 197 function CallModuleMethod(modulename, method, ...) | 119 function CallModuleMethod(modulename, method, ...) |
| 198 local m = self:GetModule(modulename,true) | 120 local m = self:GetModule(modulename,true) |
| 199 if m then | 121 if m then |
| 200 if type(m) == "table" and type(m[method]) == "function" then | 122 if type(m) == "table" and type(m[method]) == "function" then |
| 201 m[method](m,...) | 123 m[method](m,...) |
| 202 else | 124 end |
| 203 dbprint(("Bad call '%s' to %s module"):format(tostring(method),modulename)); | |
| 204 end | |
| 205 else | |
| 206 self:Print(("Module '%s' not found"):format(tostring(modulename))) | |
| 207 end | |
| 208 end | |
| 209 | |
| 210 function SlashHandler(option) | |
| 211 if option == "config" then | |
| 212 self:ShowConfig() | |
| 213 elseif option == "edit" then | |
| 214 self:ShowEditor() | |
| 215 elseif option == "unlock" then | |
| 216 self:SetConfigMode(true) | |
| 217 elseif option == "lock" then | |
| 218 self:SetConfigMode(false) | |
| 219 elseif option == "kb" then | |
| 220 self:SetKeybindMode(true) | |
| 221 else | |
| 222 self:Print(("%3.1f"):format(version)) | |
| 223 self:Print("/rxn config") | |
| 224 self:Print("/rxn edit") | |
| 225 self:Print("/rxn lock") | |
| 226 self:Print("/rxn unlock") | |
| 227 self:Print("/rxn kb") | |
| 228 end | 125 end |
| 229 end | 126 end |
| 230 | 127 |
| 231 end | 128 end |
| 232 | 129 |
| 238 profile = { | 135 profile = { |
| 239 bars = { }, | 136 bars = { }, |
| 240 defaultBar = { } | 137 defaultBar = { } |
| 241 } | 138 } |
| 242 }, | 139 }, |
| 243 L["Default"] | 140 true -- use global 'Default' (locale-specific) |
| 244 ) | 141 ) |
| 245 self.db.RegisterCallback(self,"OnProfileChanged") | |
| 246 self.db.RegisterCallback(self,"OnProfileReset", "OnProfileChanged") | |
| 247 self.db.RegisterCallback(self,"OnProfileCopied","OnProfileChanged") | |
| 248 | |
| 249 KB.RegisterCallback(self,"LIBKEYBOUND_ENABLED") | 142 KB.RegisterCallback(self,"LIBKEYBOUND_ENABLED") |
| 250 KB.RegisterCallback(self,"LIBKEYBOUND_DISABLED") | 143 KB.RegisterCallback(self,"LIBKEYBOUND_DISABLED") |
| 251 | 144 |
| 252 options.args.profile = LibStub("AceDBOptions-3.0"):GetOptionsTable(self.db) | |
| 253 | |
| 254 self:RegisterChatCommand("reaction", SlashHandler) | |
| 255 self:RegisterChatCommand("rxn", SlashHandler) | |
| 256 self:RegisterEvent("PLAYER_REGEN_DISABLED") | 145 self:RegisterEvent("PLAYER_REGEN_DISABLED") |
| 146 | |
| 147 self:InitializeOptions() | |
| 257 end | 148 end |
| 258 | 149 |
| 259 function ReAction:OnEnable() | 150 function ReAction:OnEnable() |
| 260 InitializeBars() | 151 InitializeBars() |
| 261 end | 152 end |
| 262 | 153 |
| 263 function ReAction:OnDisable() | 154 function ReAction:OnDisable() |
| 264 TearDownBars() | 155 TearDownBars() |
| 265 end | |
| 266 | |
| 267 function ReAction:OnProfileChanged() | |
| 268 TearDownBars() | |
| 269 InitializeBars() | |
| 270 self:PopKeybindWarning() | |
| 271 end | 156 end |
| 272 | 157 |
| 273 function ReAction:PLAYER_REGEN_DISABLED() | 158 function ReAction:PLAYER_REGEN_DISABLED() |
| 274 if private.configMode == true then | 159 if private.configMode == true then |
| 275 self:UserError(L["ReAction config mode disabled during combat."]) | 160 self:UserError(L["ReAction config mode disabled during combat."]) |
| 429 | 314 |
| 430 function ReAction:GetDefaultBarType() | 315 function ReAction:GetDefaultBarType() |
| 431 return private.defaultBarConfigChoice | 316 return private.defaultBarConfigChoice |
| 432 end | 317 end |
| 433 | 318 |
| 434 function ReAction:RegisterOptions(module, opts, global) | |
| 435 options.args[global and "global" or "module"].plugins[module:GetName()] = opts | |
| 436 self:RefreshOptions() | |
| 437 end | |
| 438 | |
| 439 function ReAction:RefreshOptions() | 319 function ReAction:RefreshOptions() |
| 440 callbacks:Fire("OnOptionsRefreshed") | 320 callbacks:Fire("OnOptionsRefreshed") |
| 441 end | 321 end |
| 442 | 322 |
| 443 -- | 323 -- |
| 444 -- In addition to global and general module options, options tables | 324 -- In addition to global options, options tables |
| 445 -- must be generated dynamically for each bar. | 325 -- must be generated dynamically for each bar. |
| 446 -- | 326 -- |
| 447 -- 'func' should be a function or a method string. | 327 -- 'func' should be a function or a method string. |
| 448 -- The function or method will be passed the bar as its parameter. | 328 -- The function or method will be passed the bar as its parameter. |
| 449 -- (methods will of course get the module as the first 'self' parameter) | 329 -- (methods will of course get the module as the first 'self' parameter) |
| 495 | 375 |
| 496 function ReAction:GetConfigMode() | 376 function ReAction:GetConfigMode() |
| 497 return private.configMode | 377 return private.configMode |
| 498 end | 378 end |
| 499 | 379 |
| 500 function ReAction:ShowConfig() | |
| 501 CallModuleMethod("ConfigUI","OpenConfig") | |
| 502 end | |
| 503 | |
| 504 function ReAction:ShowEditor(bar, ...) | 380 function ReAction:ShowEditor(bar, ...) |
| 505 CallModuleMethod("ConfigUI","LaunchBarEditor",bar, ...) | 381 CallModuleMethod("ConfigUI","LaunchBarEditor",bar, ...) |
| 506 end | 382 end |
| 507 | 383 |
| 508 function ReAction:SetKeybindMode( mode ) | 384 function ReAction:SetKeybindMode( mode ) |
| 517 end | 393 end |
| 518 | 394 |
| 519 function ReAction:GetKeybindMode( mode ) | 395 function ReAction:GetKeybindMode( mode ) |
| 520 return private.kbMode | 396 return private.kbMode |
| 521 end | 397 end |
| 522 | |
| 523 function ReAction:PopKeybindWarning() | |
| 524 if not self.db.global.skipKeybindWarning then | |
| 525 StaticPopup_Show("REACTION_KB_WARN") | |
| 526 end | |
| 527 end | |
| 528 | |
| 529 -- Export ReAction launcher to LibDataBroker-aware displays | |
| 530 LibStub:GetLibrary("LibDataBroker-1.1"):NewDataObject( "ReAction", | |
| 531 { | |
| 532 type = "launcher", | |
| 533 icon = "Interface\\Icons\\INV_Qiraj_JewelEncased", | |
| 534 | |
| 535 OnClick = function( frame, button ) | |
| 536 if not InCombatLockdown() then | |
| 537 if IsAltKeyDown() then | |
| 538 ReAction:SetKeybindMode( not ReAction:GetKeybindMode() ) | |
| 539 elseif IsShiftKeyDown() then | |
| 540 ReAction:SetConfigMode( not ReAction:GetConfigMode() ) | |
| 541 elseif button == "RightButton" then | |
| 542 ReAction:ShowEditor() | |
| 543 else | |
| 544 ReAction:ShowConfig() | |
| 545 end | |
| 546 else | |
| 547 ReAction:UserError(L["ReAction: can't configure in combat"]) | |
| 548 end | |
| 549 end, | |
| 550 | |
| 551 -- this isn't included in the 'launcher' type LDB spec but it seems all launcher displays use it | |
| 552 OnTooltipShow = function( tooltip ) | |
| 553 tooltip:AddLine(format("|cffffffff%s|r %s",L["Click"],L["for global configuration"])) | |
| 554 tooltip:AddLine(format("|cffffd200%s|r %s",L["Right-click"],L["for bar editor dialog"])) | |
| 555 tooltip:AddLine(format("|cff00ff00%s|r %s",L["Shift-click"],L["to unlock bars"])) | |
| 556 tooltip:AddLine(format("|cff00cccc%s|r %s",L["Alt-click"],L["for keybind mode"])) | |
| 557 end, | |
| 558 | |
| 559 } | |
| 560 ) |
