comparison ReAction.lua @ 205:42fd93f19291

Code cleanup of ReAction.lua
author Flick <flickerstreak@gmail.com>
date Tue, 16 Nov 2010 21:17:22 -0800
parents 85f7c7857617
children c24ac8ee1e45 443d2ea4be86
comparison
equal deleted inserted replaced
204:85f7c7857617 205:42fd93f19291
1 local addonName, addonTable = ... 1 local addonName, addonTable = ...
2 local pcall = pcall
3 local pairs = pairs
4 local type = type
5 local geterrorhandler = geterrorhandler
6 local LKB = LibStub("LibKeyBound-1.0")
7 local L = LibStub("AceLocale-3.0"):GetLocale("ReAction")
8
9 ------ Utility ------
10 local tcopy
11 do
12 function tcopy(x)
13 if type(x) ~= "table" then
14 return x
15 end
16 local r = {}
17 for k,v in pairs(x) do
18 r[k] = tcopy(v)
19 end
20 return r
21 end
22 end
23
24 ------ Core ------
2 local ReAction = LibStub("AceAddon-3.0"):NewAddon( "ReAction", 25 local ReAction = LibStub("AceAddon-3.0"):NewAddon( "ReAction",
3 "AceEvent-3.0" 26 "AceEvent-3.0"
4 ) 27 )
28 addonTable.ReAction = ReAction
5 ReAction.version = "1.1" 29 ReAction.version = "1.1"
6 addonTable.ReAction = ReAction
7
8 ------ LIBRARIES ------
9 local callbacks = LibStub("CallbackHandler-1.0"):New(ReAction)
10 local LKB = LibStub("LibKeyBound-1.0")
11 local L = LibStub("AceLocale-3.0"):GetLocale("ReAction")
12 ReAction.L = L 30 ReAction.L = L
13 ReAction.LKB = LKB 31 ReAction.LKB = LKB
14 ReAction.callbacks = callbacks 32
15 33
16 ------ PRIVATE ------ 34 ------ Handlers ------
17 local private = { }
18 local bars = {}
19 local defaultBarConfig = {}
20
21
22 local SelectBar, DestroyBar, InitializeBars, TearDownBars, DeepCopy
23 do
24 local pcall = pcall
25 local geterrorhandler = geterrorhandler
26 local self = ReAction
27 local inited = false
28
29 function SelectBar(x)
30 local bar, name
31 if type(x) == "string" then
32 name = x
33 bar = self:GetBar(name)
34 else
35 for k,v in pairs(bars) do
36 if v == x then
37 name = k
38 bar = x
39 end
40 end
41 end
42 return bar, name
43 end
44
45 function DestroyBar(x)
46 local bar, name = SelectBar(x)
47 if bar and name then
48 bars[name] = nil
49 callbacks:Fire("OnDestroyBar", bar, name)
50 bar:Destroy()
51 end
52 end
53
54 function InitializeBars()
55 if not inited then
56 for name, config in pairs(self.db.profile.bars) do
57 if config then
58 self:CreateBar(name, config)
59 end
60 end
61 -- re-anchor and refresh in case anchor order does not match init order
62 for name, bar in pairs(bars) do
63 bar:ApplyAnchor()
64 callbacks:Fire("OnRefreshBar", bar, name)
65 end
66 inited = true
67 end
68 end
69
70 function TearDownBars()
71 for name, bar in pairs(bars) do
72 if bar then
73 bars[name] = DestroyBar(bar)
74 end
75 end
76 inited = false
77 end
78
79 function DeepCopy(x)
80 if type(x) ~= "table" then
81 return x
82 end
83 local r = {}
84 for k,v in pairs(x) do
85 r[k] = DeepCopy(v)
86 end
87 return r
88 end
89
90 end
91
92
93 ------ HANDLERS ------
94 function ReAction:OnInitialize() 35 function ReAction:OnInitialize()
95 self.db = LibStub("AceDB-3.0"):New("ReAction_DB", 36 self.db = LibStub("AceDB-3.0"):New("ReAction_DB",
96 { 37 {
97 profile = { 38 profile = {
98 bars = { }, 39 bars = { },
99 defaultBar = { }, 40 defaultBar = { },
100 } 41 }
101 }, 42 },
102 true -- use global 'Default' (locale-specific) 43 true -- use global 'Default' (locale-specific)
103 ) 44 )
45
46 self.bars = { }
47 self.defaultBarConfig = { }
48
49 self.callbacks = LibStub("CallbackHandler-1.0"):New(self)
104 LKB.RegisterCallback(self,"LIBKEYBOUND_ENABLED") 50 LKB.RegisterCallback(self,"LIBKEYBOUND_ENABLED")
105 LKB.RegisterCallback(self,"LIBKEYBOUND_DISABLED") 51 LKB.RegisterCallback(self,"LIBKEYBOUND_DISABLED")
106
107 self:RegisterEvent("PLAYER_REGEN_DISABLED") 52 self:RegisterEvent("PLAYER_REGEN_DISABLED")
108
109 self:InitializeOptions() 53 self:InitializeOptions()
110 end 54 end
111 55
112 function ReAction:OnEnable() 56 function ReAction:OnEnable()
113 InitializeBars() 57 self:InitializeBars()
114 end 58 end
115 59
116 function ReAction:OnDisable() 60 function ReAction:OnDisable()
117 TearDownBars() 61 self:TearDownBars()
118 end 62 end
119 63
120 function ReAction:PLAYER_REGEN_DISABLED() 64 function ReAction:PLAYER_REGEN_DISABLED()
121 if private.configMode == true then 65 if self.configMode == true then
122 self:UserError(L["ReAction config mode disabled during combat."]) 66 self:UserError(L["ReAction config mode disabled during combat."])
123 self:SetConfigMode(false) 67 self:SetConfigMode(false)
124 self:SetKeybindMode(false) 68 self:SetKeybindMode(false)
125 self:CloseEditor() 69 self:CloseEditor()
126 end 70 end
133 function ReAction:LIBKEYBOUND_DISABLED( evt ) 77 function ReAction:LIBKEYBOUND_DISABLED( evt )
134 return self:SetKeybindMode(false) 78 return self:SetKeybindMode(false)
135 end 79 end
136 80
137 81
138 82 ------ Methods ------
139 ------ API ------
140 83
141 function ReAction:UserError(msg) 84 function ReAction:UserError(msg)
142 -- any user errors should be flashed to the UIErrorsFrame
143 UIErrorsFrame:AddMessage(msg) 85 UIErrorsFrame:AddMessage(msg)
144 end 86 end
145 87
146 function ReAction:RebuildAll() 88 function ReAction:GetBar(arg)
147 TearDownBars() 89 if type(arg) == "string" then
148 InitializeBars() 90 return self.bars[arg], arg
149 end 91 elseif type(arg) == "table" then -- reverse lookup
150 92 for name, bar in pairs(self.bars) do
93 if arg == bar then
94 return bar, name
95 end
96 end
97 else
98 error("ReAction:GetBar() requires either a name or a bar table arg")
99 end
100 end
101
102 function ReAction:IterateBars()
103 return pairs(self.bars)
104 end
151 105
152 -- usage: 106 -- usage:
153 -- (1) ReAction:CreateBar(name, [cfgTable]) 107 -- (1) ReAction:CreateBar(name, [cfgTable])
154 -- (2) ReAction:CreateBar(name, "barType", [nRows], [nCols], [btnSize], [btnSpacing]) 108 -- (2) ReAction:CreateBar(name, "barType", [nRows], [nCols], [btnSize], [btnSpacing])
155 function ReAction:CreateBar(name, config, ...) 109 function ReAction:CreateBar(name, config, ...)
156 local profile = self.db.profile 110 local profile = self.db.profile
157 111
158 if name then 112 if name then
159 if bars[name] then 113 if self.bars[name] then
160 self:UserError(format(L["ReAction: name '%s' already in use"],name)) 114 self:UserError(format(L["ReAction: name '%s' already in use"],name))
161 return nil 115 return nil
162 end 116 end
163 else 117 else
164 local prefix = L["Bar "] 118 local prefix = L["Bar "]
165 local i = 1 119 local i = 1
166 repeat 120 repeat
167 name = prefix..i 121 name = prefix..i
168 i = i + 1 122 i = i + 1
169 until bars[name] == nil 123 until self.bars[name] == nil
170 end 124 end
171 125
172 if type(config) == "string" then 126 if type(config) == "string" then
173 config = defaultBarConfig[config] 127 config = self.defaultBarConfig[config]
174 if not config then 128 if not config then
175 error(("ReAction:CreateBar() - unknown bar type '%s'"):format(tostring(select(1,...)))) 129 error(("ReAction:CreateBar() - unknown bar type '%s'"):format(tostring(select(1,...))))
176 end 130 end
177 config = DeepCopy(config) 131 config = tcopy(config)
178 config.btnRows = select(1,...) or config.btnRows or 1 132 config.btnRows = select(1,...) or config.btnRows or 1
179 config.btnColumns = select(2,...) or config.btnColumns or 12 133 config.btnColumns = select(2,...) or config.btnColumns or 12
180 config.btnWidth = select(3,...) or config.btnWidth or 36 134 config.btnWidth = select(3,...) or config.btnWidth or 36
181 config.btnHeight = select(3,...) or config.btnHeight or 36 135 config.btnHeight = select(3,...) or config.btnHeight or 36
182 config.spacing = select(4,...) or config.spacing or 3 136 config.spacing = select(4,...) or config.spacing or 3
186 config.point = config.point or "BOTTOM" 140 config.point = config.point or "BOTTOM"
187 config.relpoint = config.relpoint or "BOTTOM" 141 config.relpoint = config.relpoint or "BOTTOM"
188 config.y = config.y or 200 142 config.y = config.y or 200
189 config.x = config.x or 0 143 config.x = config.x or 0
190 end 144 end
191 config = config or profile.bars[name] or DeepCopy(profile.defaultBar) 145 config = config or profile.bars[name] or tcopy(profile.defaultBar)
192 146
193 profile.bars[name] = config 147 profile.bars[name] = config
194 local bar = self.Bar:New( name, config ) -- ReAction.Bar defined in Bar.lua 148 local bar = self.Bar:New( name, config ) -- ReAction.Bar defined in Bar.lua
195 bars[name] = bar 149 self.bars[name] = bar
196 callbacks:Fire("OnCreateBar", bar, name) 150 self.callbacks:Fire("OnCreateBar", bar, name)
197 if private.configMode then 151 if self.configMode then
198 bar:ShowControls(true) 152 bar:ShowControls(true)
199 end 153 end
200 154
201 return bar 155 return bar
202 end 156 end
203 157
204 function ReAction:EraseBar(x) 158 function ReAction:DestroyBar(x)
205 local bar, name = SelectBar(x) 159 local bar, name = self:GetBar(x)
206 if bar and name then 160 if bar and name then
207 callbacks:Fire("OnEraseBar", bar, name) 161 self.bars[name] = nil
208 DestroyBar(bar) 162 self.callbacks:Fire("OnDestroyBar", bar, name)
209 self.db.profile.bars[name] = nil 163 bar:Destroy()
210 end 164 end
211 end 165 end
212 166
213 function ReAction:GetBar(name) 167 function ReAction:RefreshBar(x)
214 return bars[name] 168 local bar, name = self:GetBar(x)
215 end 169 if bar and name then
216 170 self.callbacks:Fire("OnRefreshBar", bar, name)
217 -- returns pairs of name, bar 171 end
218 function ReAction:IterateBars() 172 end
219 return pairs(bars) 173
174 function ReAction:InitializeBars()
175 if not self.barsInitialized then
176 for name, config in pairs(self.db.profile.bars) do
177 if config then
178 self:CreateBar(name, config)
179 end
180 end
181 -- re-anchor and refresh in case anchor order does not match init order
182 for name, bar in pairs(self.bars) do
183 bar:ApplyAnchor()
184 self.callbacks:Fire("OnRefreshBar", bar, name)
185 end
186 self.barsInitialized = true
187 end
188 end
189
190 function ReAction:TearDownBars()
191 for name, bar in pairs(self.bars) do
192 if bar then
193 self.bars[name] = DestroyBar(bar)
194 end
195 end
196 self.barsInitialized = false
197 end
198
199 function ReAction:RebuildAll()
200 self:TearDownBars()
201 self:InitializeBars()
220 end 202 end
221 203
222 function ReAction:RenameBar(x, newname) 204 function ReAction:RenameBar(x, newname)
223 local bar, name = SelectBar(x) 205 local bar, name = self:GetBar(x)
224 if type(newname) ~= "string" then 206 if type(newname) ~= "string" then
225 error("ReAction:RenameBar() - second argument must be a string") 207 error("ReAction:RenameBar() - second argument must be a string")
226 end 208 end
227 if bar and name and #newname > 0 then 209 if bar and name and #newname > 0 then
228 if newname == name then 210 if newname == name then
229 return 211 return
230 end 212 end
231 if bars[newname] then 213 if self.bars[newname] then
232 self:UserError(format(L["ReAction: name '%s' already in use"],newname)) 214 self:UserError(format(L["ReAction: name '%s' already in use"],newname))
233 else 215 else
234 bars[newname], bars[name] = bars[name], nil 216 self.bars[newname], self.bars[name] = self.bars[name], nil
235 bar:SetName(newname or "") 217 bar:SetName(newname or "")
236 local cfg = self.db.profile.bars 218 local cfg = self.db.profile.bars
237 cfg[newname], cfg[name] = cfg[name], nil 219 cfg[newname], cfg[name] = cfg[name], nil
238 callbacks:Fire("OnRenameBar", bar, name, newname) 220 self.callbacks:Fire("OnRenameBar", bar, name, newname)
239 end 221 end
240 end 222 end
241 end 223 end
242 224
243 function ReAction:RefreshBar(x) 225 function ReAction:EraseBar(x)
244 local bar, name = SelectBar(x) 226 local bar, name = self:GetBar(x)
245 if bar and name then 227 if bar and name then
246 callbacks:Fire("OnRefreshBar", bar, name) 228 self.callbacks:Fire("OnEraseBar", bar, name)
229 DestroyBar(bar)
230 self.db.profile.bars[name] = nil
247 end 231 end
248 end 232 end
249 233
250 function ReAction:RegisterBarType( name, config, isDefaultChoice ) 234 function ReAction:RegisterBarType( name, config, isDefaultChoice )
251 defaultBarConfig[name] = config 235 self.defaultBarConfig[name] = config
252 if isDefaultChoice then 236 if isDefaultChoice then
253 private.defaultBarConfigChoice = name 237 self.defaultBarConfigChoice = name
254 end 238 end
255 self:RefreshEditor() 239 self:RefreshEditor()
256 end 240 end
257 241
258 function ReAction:UnregisterBarType( name ) 242 function ReAction:UnregisterBarType( name )
259 defaultBarConfig[name] = nil 243 self.defaultBarConfig[name] = nil
260 if private.defaultBarConfigChoice == name then 244 if self.defaultBarConfigChoice == name then
261 private.defaultBarConfigChoice = nil 245 self.defaultBarConfigChoice = nil
262 end 246 end
263 self:RefreshEditor() 247 self:RefreshEditor()
264 end 248 end
265 249
266 function ReAction:IterateBarTypes() 250 function ReAction:IterateBarTypes()
267 return pairs(defaultBarConfig) 251 return pairs(self.defaultBarConfig)
268 end 252 end
269 253
270 function ReAction:GetBarTypeConfig(name) 254 function ReAction:GetBarTypeConfig(name)
271 if name then 255 if name then
272 return defaultBarConfig[name] 256 return self.defaultBarConfig[name]
273 end 257 end
274 end 258 end
275 259
276 function ReAction:GetBarTypeOptions( fill ) 260 function ReAction:GetBarTypeOptions( fill )
277 fill = fill or { } 261 fill = fill or { }
280 end 264 end
281 return fill 265 return fill
282 end 266 end
283 267
284 function ReAction:GetDefaultBarType() 268 function ReAction:GetDefaultBarType()
285 return private.defaultBarConfigChoice 269 return self.defaultBarConfigChoice
286 end 270 end
287 271
288 function ReAction:SetConfigMode( mode ) 272 function ReAction:SetConfigMode( mode )
289 if mode ~= private.configMode then 273 if mode ~= self.configMode then
290 private.configMode = mode 274 self.configMode = mode
291 callbacks:Fire("OnConfigModeChanged", mode) 275 self.callbacks:Fire("OnConfigModeChanged", mode)
292 end 276 end
293 end 277 end
294 278
295 function ReAction:GetConfigMode() 279 function ReAction:GetConfigMode()
296 return private.configMode 280 return self.configMode
297 end 281 end
298 282
299 function ReAction:SetKeybindMode( mode ) 283 function ReAction:SetKeybindMode( mode )
300 if mode ~= private.kbMode then 284 if mode ~= self.kbMode then
301 if mode then 285 if mode then
302 LKB:Activate() 286 LKB:Activate()
303 else 287 else
304 LKB:Deactivate() 288 LKB:Deactivate()
305 end 289 end
306 private.kbMode = LKB:IsShown() or false 290 self.kbMode = LKB:IsShown() or false
307 end 291 end
308 end 292 end
309 293
310 function ReAction:GetKeybindMode( mode ) 294 function ReAction:GetKeybindMode( mode )
311 return private.kbMode 295 return self.kbMode
312 end 296 end