annotate ReAction.lua @ 37:413f61e038b1

cleanup from stupid bindings.lua name change
author Flick <flickerstreak@gmail.com>
date Thu, 03 Apr 2008 21:07:05 +0000
parents 52ac6db0c8ca
children 00f08528faaf
rev   line source
flickerstreak@28 1 -- ReAction.lua
flickerstreak@28 2 -- See modules/ReAction_ModuleTemplate for Module API listing
flickerstreak@28 3 -- See Bar.lua for Bar object listing
flickerstreak@27 4
flickerstreak@27 5 ------ CORE ------
flickerstreak@30 6 local ReAction = LibStub("AceAddon-3.0"):NewAddon( "ReAction",
flickerstreak@33 7 "AceConsole-3.0",
flickerstreak@33 8 "AceEvent-3.0"
flickerstreak@30 9 )
flickerstreak@33 10 ReAction.version = GetAddOnMetadata("ReAction","Version")
flickerstreak@33 11 ReAction.revision = tonumber(("$Revision$"):match("%d+"))
flickerstreak@27 12
flickerstreak@28 13 ------ GLOBALS ------
flickerstreak@28 14 _G["ReAction"] = ReAction
flickerstreak@27 15
flickerstreak@28 16 ------ DEBUGGING ------
flickerstreak@25 17 ReAction.debug = true
flickerstreak@36 18 local dbprint
flickerstreak@25 19 if ReAction.debug then
flickerstreak@36 20 dbprint = function(msg)
flickerstreak@25 21 DEFAULT_CHAT_FRAME:AddMessage(msg)
flickerstreak@25 22 end
flickerstreak@36 23 --seterrorhandler(dbprint)
flickerstreak@25 24 else
flickerstreak@36 25 dbprint = function() end
flickerstreak@25 26 end
flickerstreak@36 27 ReAction.dbprint = dbprint
flickerstreak@25 28
flickerstreak@33 29 ------ LIBRARIES ------
flickerstreak@33 30 local L = LibStub("AceLocale-3.0"):GetLocale("ReAction")
flickerstreak@33 31 ReAction.L = L
flickerstreak@33 32
flickerstreak@28 33 ------ PRIVATE ------
flickerstreak@30 34 local SelectBar, DestroyBar, InitializeBars, TearDownBars, DeepCopy, SafeCall, CheckMethod, SlashHandler
flickerstreak@28 35 do
flickerstreak@28 36 local pcall = pcall
flickerstreak@28 37 local geterrorhandler = geterrorhandler
flickerstreak@28 38
flickerstreak@28 39 SelectBar = function(x)
flickerstreak@28 40 local bar, name
flickerstreak@28 41 if type(x) == "string" then
flickerstreak@28 42 name = x
flickerstreak@28 43 bar = ReAction:GetBar(name)
flickerstreak@28 44 elseif ReAction.Bar:IsInstance(x) then
flickerstreak@28 45 bar = x
flickerstreak@28 46 for k,v in pairs(ReAction.bars) do
flickerstreak@28 47 if v == bar then
flickerstreak@28 48 name = k
flickerstreak@28 49 end
flickerstreak@28 50 end
flickerstreak@28 51 else
flickerstreak@28 52 error("bad argument to SelectBar")
flickerstreak@28 53 end
flickerstreak@28 54 return bar, name
flickerstreak@28 55 end
flickerstreak@28 56
flickerstreak@28 57 DestroyBar = function(x)
flickerstreak@28 58 local bar, name = SelectBar(x)
flickerstreak@28 59 if name and bar then
flickerstreak@28 60 ReAction.bars[name] = nil
flickerstreak@28 61 ReAction:CallMethodOnAllModules("RemoveFromBar", bar)
flickerstreak@28 62 bar:Destroy()
flickerstreak@28 63 end
flickerstreak@28 64 end
flickerstreak@28 65
flickerstreak@28 66 InitializeBars = function ()
flickerstreak@28 67 if not(ReAction.inited) then
flickerstreak@28 68 for name, config in pairs(ReAction.db.profile.bars) do
flickerstreak@28 69 if config then
flickerstreak@28 70 ReAction:CreateBar(name, config)
flickerstreak@28 71 end
flickerstreak@28 72 end
flickerstreak@28 73 ReAction:CallMethodOnAllBars("ApplyAnchor") -- re-anchor in the case of oddball ordering
flickerstreak@28 74 ReAction.inited = true
flickerstreak@28 75 end
flickerstreak@28 76 end
flickerstreak@28 77
flickerstreak@28 78 TearDownBars = function()
flickerstreak@28 79 for name, bar in pairs(ReAction.bars) do
flickerstreak@28 80 if bar then
flickerstreak@28 81 ReAction.bars[name] = DestroyBar(bar)
flickerstreak@28 82 end
flickerstreak@28 83 end
flickerstreak@28 84 ReAction.inited = false
flickerstreak@28 85 end
flickerstreak@28 86
flickerstreak@28 87 DeepCopy = function(x)
flickerstreak@28 88 if type(x) ~= "table" then
flickerstreak@28 89 return x
flickerstreak@28 90 end
flickerstreak@28 91 local r = {}
flickerstreak@28 92 for k,v in pairs(x) do
flickerstreak@28 93 r[k] = DeepCopy(v)
flickerstreak@28 94 end
flickerstreak@28 95 return r
flickerstreak@28 96 end
flickerstreak@28 97
flickerstreak@28 98 SafeCall = function(f, ...)
flickerstreak@28 99 if f then
flickerstreak@28 100 local success, err = pcall(f,...)
flickerstreak@28 101 if not success then
flickerstreak@28 102 geterrorhandler()(err)
flickerstreak@28 103 end
flickerstreak@28 104 end
flickerstreak@28 105 end
flickerstreak@28 106
flickerstreak@28 107 CheckMethod = function(m)
flickerstreak@28 108 if type(m) == "function" then
flickerstreak@28 109 return m
flickerstreak@28 110 end
flickerstreak@28 111 if type(m) ~= "string" then
flickerstreak@28 112 error("Invalid method")
flickerstreak@28 113 end
flickerstreak@28 114 end
flickerstreak@30 115
flickerstreak@30 116 local function CallOptsModule(method,...)
flickerstreak@33 117 local m = ReAction:GetModule("ConfigUI",true)
flickerstreak@33 118 if not m then
flickerstreak@33 119 LoadAddOn("ReAction_ConfigUI")
flickerstreak@33 120 m = ReAction:GetModule("ConfigUI")
flickerstreak@33 121 end
flickerstreak@36 122 if m then
flickerstreak@36 123 if type(m) == "table" and type(m[method]) == "function" then
flickerstreak@36 124 m[method](m,...)
flickerstreak@36 125 else
flickerstreak@36 126 dbprint(("Bad call '%s' to options module"):format(tostring(method)));
flickerstreak@36 127 end
flickerstreak@33 128 else
flickerstreak@33 129 ReAction:Print("Options module not found")
flickerstreak@33 130 end
flickerstreak@30 131 end
flickerstreak@30 132
flickerstreak@30 133 SlashHandler = function(option)
flickerstreak@30 134 if option == "config" then
flickerstreak@30 135 CallOptsModule("OpenConfig",true)
flickerstreak@30 136 elseif option == "unlock" then
flickerstreak@33 137 ReAction:SetConfigMode(true)
flickerstreak@30 138 elseif option == "lock" then
flickerstreak@33 139 ReAction:SetConfigMode(false)
flickerstreak@30 140 else
flickerstreak@36 141 ReAction:Print(("%3.1f.%d"):format(ReAction.version,ReAction.revision))
flickerstreak@30 142 ReAction:Print("/reaction config")
flickerstreak@30 143 ReAction:Print("/reaction unlock")
flickerstreak@30 144 ReAction:Print("/reaction lock")
flickerstreak@30 145 end
flickerstreak@30 146 end
flickerstreak@28 147 end
flickerstreak@28 148
flickerstreak@28 149
flickerstreak@28 150 ------ HANDLERS ------
flickerstreak@28 151 function ReAction:OnInitialize()
flickerstreak@28 152 self.db = LibStub("AceDB-3.0"):New("ReAction_DB",
flickerstreak@28 153 {
flickerstreak@28 154 profile = {
flickerstreak@28 155 bars = { },
flickerstreak@28 156 defaultBar = { }
flickerstreak@28 157 }
flickerstreak@28 158 }
flickerstreak@28 159 -- default profile is character-specific
flickerstreak@28 160 )
flickerstreak@28 161 self.db.RegisterCallback(self,"OnProfileChanged")
flickerstreak@30 162 self.callbacks = LibStub("CallbackHandler-1.0"):New(self)
flickerstreak@30 163 self:RegisterChatCommand("reaction", SlashHandler)
flickerstreak@30 164 self:RegisterChatCommand("rxn", SlashHandler)
flickerstreak@33 165 self:RegisterEvent("PLAYER_REGEN_DISABLED")
flickerstreak@28 166
flickerstreak@28 167 self.bars = {}
flickerstreak@28 168 end
flickerstreak@28 169
flickerstreak@28 170 function ReAction:OnEnable()
flickerstreak@28 171 InitializeBars()
flickerstreak@28 172 end
flickerstreak@28 173
flickerstreak@28 174 function ReAction:OnDisable()
flickerstreak@28 175 TearDownBars()
flickerstreak@28 176 end
flickerstreak@28 177
flickerstreak@28 178 function ReAction:OnProfileChanged()
flickerstreak@33 179 TearDownBars()
flickerstreak@33 180 InitializeBars()
flickerstreak@28 181 end
flickerstreak@28 182
flickerstreak@28 183 function ReAction:OnModuleEnable(module)
flickerstreak@28 184 if module.ApplyToBar then
flickerstreak@28 185 for _, b in pairs(bars) do
flickerstreak@28 186 if b then
flickerstreak@28 187 module:ApplyToBar(b)
flickerstreak@28 188 end
flickerstreak@28 189 end
flickerstreak@28 190 end
flickerstreak@28 191 end
flickerstreak@28 192
flickerstreak@28 193 function ReAction:OnModuleDisable(module)
flickerstreak@28 194 if module.RemoveFromBar then
flickerstreak@28 195 for _, b in pairs(bars) do
flickerstreak@28 196 if b then
flickerstreak@28 197 module:RemoveFromBar(b)
flickerstreak@28 198 end
flickerstreak@28 199 end
flickerstreak@28 200 end
flickerstreak@28 201 end
flickerstreak@28 202
flickerstreak@33 203 function ReAction:PLAYER_REGEN_DISABLED()
flickerstreak@33 204 if self.configMode == true then
flickerstreak@33 205 UIErrorsFrame:AddMessage(L["ReAction config mode disabled during combat."])
flickerstreak@33 206 self:SetConfigMode(false)
flickerstreak@33 207 end
flickerstreak@33 208 end
flickerstreak@33 209
flickerstreak@33 210
flickerstreak@28 211
flickerstreak@28 212 ------ API ------
flickerstreak@28 213 function ReAction:CallMethodOnAllModules(method, ...)
flickerstreak@28 214 local m = CheckMethod(method)
flickerstreak@28 215 for _, x in self:IterateModules() do
flickerstreak@28 216 if x then
flickerstreak@28 217 SafeCall(m or x[method], x, ...)
flickerstreak@28 218 end
flickerstreak@28 219 end
flickerstreak@28 220 end
flickerstreak@28 221
flickerstreak@28 222 function ReAction:CallMethodOnAllBars(method,...)
flickerstreak@28 223 local m = CheckMethod(method)
flickerstreak@28 224 for _, x in pairs(self.bars) do
flickerstreak@28 225 if x then
flickerstreak@28 226 SafeCall(m or x[method], x, ...)
flickerstreak@28 227 end
flickerstreak@28 228 end
flickerstreak@28 229 end
flickerstreak@28 230
flickerstreak@28 231 function ReAction:CreateBar(name, defaultConfig, prefix)
flickerstreak@28 232 local profile = self.db.profile
flickerstreak@28 233 defaultConfig = defaultConfig or profile.defaultBar
flickerstreak@28 234 prefix = prefix or L["Bar "]
flickerstreak@28 235 if not name then
flickerstreak@28 236 i = 1
flickerstreak@28 237 repeat
flickerstreak@28 238 name = prefix..i
flickerstreak@28 239 i = i + 1
flickerstreak@28 240 until self.bars[name] == nil
flickerstreak@28 241 end
flickerstreak@28 242 profile.bars[name] = profile.bars[name] or DeepCopy(defaultConfig)
flickerstreak@28 243 local bar = self.Bar:new( name, profile.bars[name] ) -- ReAction.Bar defined in Bar.lua
flickerstreak@28 244 self:CallMethodOnAllModules("ApplyToBar", bar)
flickerstreak@28 245 self.bars[name] = bar
flickerstreak@30 246 self.callbacks:Fire("OnCreateBar", bar)
flickerstreak@33 247 if self.configMode then
flickerstreak@33 248 bar:ShowControls(true)
flickerstreak@33 249 end
flickerstreak@33 250
flickerstreak@28 251 return bar
flickerstreak@28 252 end
flickerstreak@28 253
flickerstreak@28 254 function ReAction:EraseBar(x)
flickerstreak@28 255 local bar, name = SelectBar(x)
flickerstreak@28 256 if name and bar then
flickerstreak@28 257 DestroyBar(bar)
flickerstreak@28 258 self.db.profile.bars[name] = nil
flickerstreak@28 259 self:CallMethodOnAllModules("EraseBarConfig", name)
flickerstreak@30 260 self.callbacks:Fire("OnEraseBar",name)
flickerstreak@28 261 end
flickerstreak@28 262 end
flickerstreak@28 263
flickerstreak@28 264 function ReAction:GetBar(name)
flickerstreak@28 265 return self.bars[name]
flickerstreak@28 266 end
flickerstreak@28 267
flickerstreak@28 268 function ReAction:RenameBar(x, newname)
flickerstreak@28 269 local bar, name = SelectBar(x)
flickerstreak@28 270 if bar and name and newname then
flickerstreak@28 271 if self.bars[newname] then
flickerstreak@28 272 error(L["ReAction: name already in use"])
flickerstreak@28 273 end
flickerstreak@28 274 self.bars[newname] = self.bars[name]
flickerstreak@28 275 self.bars[name] = nil
flickerstreak@28 276 bar.name = newname or ""
flickerstreak@28 277 local cfg = self.db.profile.bars
flickerstreak@28 278 cfg[newname], cfg[name] = cfg[name], nil
flickerstreak@28 279 self:CallMethodOnAllModules("RenameBarConfig", name, newname)
flickerstreak@30 280 self.callbacks:Fire("OnRenameBar", name, newname)
flickerstreak@28 281 end
flickerstreak@28 282 end
flickerstreak@28 283
flickerstreak@30 284 ReAction.options = {}
flickerstreak@30 285 -- See modules/ReAction_ConfigUI for valid options contexts.
flickerstreak@30 286 function ReAction:RegisterOptions(context, module, opts)
flickerstreak@30 287 if module == nil or context == nil then
flickerstreak@30 288 error("ReAction:RegisterOptions requires a module object and context ID")
flickerstreak@30 289 end
flickerstreak@30 290 if not self.options[context] then
flickerstreak@30 291 self.options[context] = {}
flickerstreak@30 292 end
flickerstreak@30 293 self.options[context][module] = opts
flickerstreak@30 294 self.callbacks:Fire("OnOptionsRegistered", context, module, opts)
flickerstreak@30 295 end
flickerstreak@28 296
flickerstreak@30 297 function ReAction:GetOptions(context)
flickerstreak@30 298 if context then
flickerstreak@30 299 if not self.options[context] then
flickerstreak@30 300 self.options[context] = { }
flickerstreak@30 301 end
flickerstreak@30 302 return self.options[context]
flickerstreak@30 303 end
flickerstreak@30 304 end
flickerstreak@30 305
flickerstreak@30 306 function ReAction:GetOptionContextList()
flickerstreak@30 307 local c = {}
flickerstreak@30 308 for k in self.options do
flickerstreak@30 309 tinsert(c,k)
flickerstreak@30 310 end
flickerstreak@30 311 return c
flickerstreak@30 312 end
flickerstreak@30 313
flickerstreak@30 314 function ReAction:RefreshOptions()
flickerstreak@30 315 self.callbacks:Fire("OnOptionsRefreshed")
flickerstreak@30 316 end
flickerstreak@33 317
flickerstreak@33 318 function ReAction:SetConfigMode( mode )
flickerstreak@33 319 self:CallMethodOnAllBars("ShowControls",mode)
flickerstreak@33 320 self:CallMethodOnAllModules("ApplyConfigMode",mode,self.bars)
flickerstreak@33 321 self.configMode = mode
flickerstreak@33 322 end