comparison Editor.lua @ 216:376c424900f0

cleanup: editor bar options table generation
author Flick <flickerstreak@gmail.com>
date Fri, 19 Nov 2010 14:33:45 -0800
parents 85213d045acb
children e63aefb8a555
comparison
equal deleted inserted replaced
215:258ca67bde4a 216:376c424900f0
171 AceConfigReg:RegisterOptionsTable(self.configID, self.options) 171 AceConfigReg:RegisterOptionsTable(self.configID, self.options)
172 AceConfigDialog:SetDefaultSize(self.configID, 700, 540) 172 AceConfigDialog:SetDefaultSize(self.configID, 700, 540)
173 173
174 ReAction.RegisterCallback(self,"OnCreateBar") 174 ReAction.RegisterCallback(self,"OnCreateBar")
175 ReAction.RegisterCallback(self,"OnDestroyBar") 175 ReAction.RegisterCallback(self,"OnDestroyBar")
176 ReAction.RegisterCallback(self,"OnEraseBar")
177 ReAction.RegisterCallback(self,"OnRenameBar") 176 ReAction.RegisterCallback(self,"OnRenameBar")
178 177
179 for name, bar in ReAction:IterateBars() do 178 self:RefreshBarOptions()
180 self:CreateBarTree(bar)
181 end
182 179
183 return self 180 return self
184 end 181 end
185 182
186 183
201 198
202 function Editor:Refresh() 199 function Editor:Refresh()
203 AceConfigReg:NotifyChange(self.configID) 200 AceConfigReg:NotifyChange(self.configID)
204 end 201 end
205 202
206 function Editor:CreateBarTree(bar) 203 function Editor:UpdateBarOptions(bar)
207 local name = bar:GetName() 204 local name = bar:GetName()
208 -- AceConfig doesn't allow spaces, etc, in arg key names, and they must be 205 local key = self.barOptMap[name]
209 -- unique strings. So generate a unique key (it can be whatever) for the bar
210 local args = self.options.args 206 local args = self.options.args
211 local key 207
212 local i = 1 208 if not key then
213 repeat 209 -- AceConfig doesn't allow spaces, etc, in arg key names, and they must be
214 key = ("bar%s"):format(i) 210 -- unique strings. So generate a unique key (it can be whatever) for the bar
215 i = i+1 211 local i = 1
216 until args[key] == nil 212 repeat
217 self.barOptMap[name] = key 213 key = ("bar%s"):format(i)
218 args[key] = { 214 i = i+1
219 type = "group", 215 until args[key] == nil
220 name = name, 216 self.barOptMap[name] = key
221 childGroups = "tab", 217
222 order = i+100, 218 args[key] = {
223 args = { 219 type = "group",
224 general = { 220 name = name,
225 type = "group", 221 childGroups = "tab",
226 name = L["General"], 222 order = i+100,
227 order = 1, 223 args = {
228 args = { 224 general = {
229 name = { 225 type = "group",
230 type = "input", 226 name = L["General"],
231 name = L["Rename Bar"], 227 order = 1,
232 get = function() return bar:GetName() end, 228 args = {
233 set = function(info, value) return ReAction:RenameBar(bar, value) end, 229 name = {
234 order = 1, 230 type = "input",
235 }, 231 name = L["Rename Bar"],
236 delete = { 232 get = function() return bar:GetName() end,
237 type = "execute", 233 set = function(info, value) return ReAction:RenameBar(bar, value) end,
238 name = L["Delete Bar"], 234 order = 1,
239 desc = function() return bar:GetName() end, 235 },
240 confirm = true, 236 delete = {
241 func = function() ReAction:EraseBar(bar) end, 237 type = "execute",
242 order = 2 238 name = L["Delete Bar"],
243 }, 239 desc = function() return bar:GetName() end,
244 anchor = { 240 confirm = true,
245 type = "group", 241 func = function() ReAction:EraseBar(bar) end,
246 name = L["Anchor"], 242 order = 2
247 inline = true, 243 },
248 args = { 244 anchor = {
249 frame = { 245 type = "group",
250 type = "input", 246 name = L["Anchor"],
251 name = L["Frame"], 247 inline = true,
252 desc = L["The frame that the bar is anchored to"], 248 args = {
253 get = function() local _, f = bar:GetAnchor(); return f end, 249 frame = {
254 set = function(info, val) bar:SetAnchor(nil,val) end, 250 type = "input",
255 validate = function(info, name) 251 name = L["Frame"],
256 if name then 252 desc = L["The frame that the bar is anchored to"],
257 local f = ReAction:GetBar(name) 253 get = function() local _, f = bar:GetAnchor(); return f end,
258 if f then 254 set = function(info, val) bar:SetAnchor(nil,val) end,
259 return true 255 validate = function(info, name)
260 else 256 if name then
261 f = _G[name] 257 local f = ReAction:GetBar(name)
262 if f and type(f) == "table" and f.IsObjectType and f:IsObjectType("Frame") then 258 if f then
263 local _, explicit = f:IsProtected() 259 return true
264 return explicit 260 else
261 f = _G[name]
262 if f and type(f) == "table" and f.IsObjectType and f:IsObjectType("Frame") then
263 local _, explicit = f:IsProtected()
264 return explicit
265 end
265 end 266 end
266 end 267 end
267 end 268 return false
268 return false 269 end,
269 end, 270 width = "double",
270 width = "double", 271 order = 1
271 order = 1 272 },
273 point = {
274 type = "select",
275 name = L["Point"],
276 desc = L["Anchor point on the bar frame"],
277 style = "dropdown",
278 get = function() return bar:GetAnchor() end,
279 set = function(info, val) bar:SetAnchor(val) end,
280 values = pointTable,
281 order = 2,
282 },
283 relativePoint = {
284 type = "select",
285 name = L["Relative Point"],
286 desc = L["Anchor point on the target frame"],
287 style = "dropdown",
288 get = function() local p,f,r = bar:GetAnchor(); return r end,
289 set = function(info, val) bar:SetAnchor(nil,nil,val) end,
290 values = pointTable,
291 order = 3,
292 },
293 x = {
294 type = "input",
295 pattern = "\-?%d+",
296 name = L["X offset"],
297 get = function() local p,f,r,x = bar:GetAnchor(); return ("%d"):format(x) end,
298 set = function(info,val) bar:SetAnchor(nil,nil,nil,val) end,
299 order = 4
300 },
301 y = {
302 type = "input",
303 pattern = "\-?%d+",
304 name = L["Y offset"],
305 get = function() local p,f,r,x,y = bar:GetAnchor(); return ("%d"):format(y) end,
306 set = function(info,val) bar:SetAnchor(nil,nil,nil,nil,val) end,
307 order = 5
308 },
272 }, 309 },
273 point = { 310 order = 3
274 type = "select",
275 name = L["Point"],
276 desc = L["Anchor point on the bar frame"],
277 style = "dropdown",
278 get = function() return bar:GetAnchor() end,
279 set = function(info, val) bar:SetAnchor(val) end,
280 values = pointTable,
281 order = 2,
282 },
283 relativePoint = {
284 type = "select",
285 name = L["Relative Point"],
286 desc = L["Anchor point on the target frame"],
287 style = "dropdown",
288 get = function() local p,f,r = bar:GetAnchor(); return r end,
289 set = function(info, val) bar:SetAnchor(nil,nil,val) end,
290 values = pointTable,
291 order = 3,
292 },
293 x = {
294 type = "input",
295 pattern = "\-?%d+",
296 name = L["X offset"],
297 get = function() local p,f,r,x = bar:GetAnchor(); return ("%d"):format(x) end,
298 set = function(info,val) bar:SetAnchor(nil,nil,nil,val) end,
299 order = 4
300 },
301 y = {
302 type = "input",
303 pattern = "\-?%d+",
304 name = L["Y offset"],
305 get = function() local p,f,r,x,y = bar:GetAnchor(); return ("%d"):format(y) end,
306 set = function(info,val) bar:SetAnchor(nil,nil,nil,nil,val) end,
307 order = 5
308 },
309 }, 311 },
310 order = 3 312 alpha = {
311 }, 313 type = "range",
312 alpha = { 314 name = L["Transparency"],
313 type = "range", 315 get = function() return bar:GetAlpha() end,
314 name = L["Transparency"], 316 set = function(info, val) bar:SetAlpha(val) end,
315 get = function() return bar:GetAlpha() end, 317 min = 0,
316 set = function(info, val) bar:SetAlpha(val) end, 318 max = 1,
317 min = 0, 319 isPercent = true,
318 max = 1, 320 step = 0.01,
319 isPercent = true, 321 bigStep = 0.05,
320 step = 0.01, 322 order = 4,
321 bigStep = 0.05, 323 },
322 order = 4,
323 }, 324 },
324 }, 325 },
325 }, 326 },
327 plugins = { }
326 } 328 }
327 } 329 end
328 self:RefreshBarOptions() 330
331 if ReAction.barOptionGenerators then
332 for module, func in pairs(ReAction.barOptionGenerators) do
333 local success, r
334 if type(func) == "string" then
335 success, r = pcall(module[func], module, bar)
336 else
337 success, r = pcall(func, bar)
338 end
339 if success then
340 if r then
341 args[key].plugins[module:GetName()] = { [module:GetName()] = r }
342 end
343 else
344 geterrorhandler()(r)
345 end
346 end
347 end
329 end 348 end
330 349
331 function Editor:RefreshBarOptions() 350 function Editor:RefreshBarOptions()
332 for name, key in pairs(self.barOptMap) do 351 for key, name in pairs(self.barOptMap) do
333 local bar = ReAction:GetBar(name) 352 if not ReAction:GetBar(name) then
334 if bar and key and self.options.args[key] then 353 self.barOptMap[key] = nil
335 self.options.args[key].plugins = self:GenerateBarOptionsTable(bar)
336 end 354 end
337 end 355 end
338 AceConfigReg:NotifyChange(self.configID) 356 for name, bar in ReAction:IterateBars() do
357 self:UpdateBarOptions(bar)
358 end
359 self:Refresh()
339 end 360 end
340 361
341 function Editor:OnCreateBar(evt, bar) 362 function Editor:OnCreateBar(evt, bar)
342 if not self.tmp.creating then 363 self:UpdateBarOptions(bar)
343 -- a bit of hack to work around OnCreateBar event handler ordering 364 self:Refresh()
344 self:CreateBarTree(bar)
345 end
346 end 365 end
347 366
348 function Editor:OnDestroyBar(evt, bar, name) 367 function Editor:OnDestroyBar(evt, bar, name)
349 local key = self.barOptMap[name] 368 local key = self.barOptMap[name]
350 if key then 369 if key then
351 self.options.args[key] = nil 370 self.barOptMap[name] = nil
352 end
353 self:Refresh()
354 end
355
356 function Editor:OnEraseBar(evt, name)
357 local key = self.barOptMap[name]
358 self.barOptMap[name] = nil
359 if key then
360 self.options.args[key] = nil 371 self.options.args[key] = nil
361 self:Refresh() 372 self:Refresh()
362 end 373 end
363 end 374 end
364 375
365 function Editor:OnRenameBar(evt, bar, oldname, newname) 376 function Editor:OnRenameBar(evt, bar, oldname, newname)
366 local key = self.barOptMap[oldname] 377 local key = self.barOptMap[oldname]
367 self.barOptMap[oldname], self.barOptMap[newname] = nil, key
368 if key then 378 if key then
379 self.barOptMap[oldname], self.barOptMap[newname] = nil, key
369 self.options.args[key].name = newname 380 self.options.args[key].name = newname
370 self:Refresh() 381 self:Refresh()
371 end 382 end
372 end 383 end
373 384
377 return ReAction:GetBarTypeOptions(_scratch) 388 return ReAction:GetBarTypeOptions(_scratch)
378 end 389 end
379 390
380 function Editor:CreateBar() 391 function Editor:CreateBar()
381 if self.tmp.barName and self.tmp.barName ~= "" then 392 if self.tmp.barName and self.tmp.barName ~= "" then
382 self.tmp.creating = true
383 local bar = ReAction:CreateBar(self.tmp.barName, self.tmp.barType or ReAction:GetDefaultBarType(), self.tmp.barRows, self.tmp.barCols, self.tmp.barSize, self.tmp.barSpacing) 393 local bar = ReAction:CreateBar(self.tmp.barName, self.tmp.barType or ReAction:GetDefaultBarType(), self.tmp.barRows, self.tmp.barCols, self.tmp.barSize, self.tmp.barSpacing)
384 if bar then 394 if bar then
385 self:CreateBarTree(bar)
386 AceConfigDialog:SelectGroup(self.configID, self.barOptMap[self.tmp.barName]) 395 AceConfigDialog:SelectGroup(self.configID, self.barOptMap[self.tmp.barName])
387 self.tmp.barName = nil 396 self.tmp.barName = nil
388 end 397 end
389 self.tmp.creating = false 398 end
390 end
391 end
392
393 function Editor:GenerateBarOptionsTable( bar )
394 local opts = { }
395 if not ReAction.barOptionGenerators then
396 return
397 end
398
399 for module, func in pairs(ReAction.barOptionGenerators) do
400 local success, r
401 if type(func) == "string" then
402 success, r = pcall(module[func], module, bar)
403 else
404 success, r = pcall(func, bar)
405 end
406 if success then
407 if r then
408 opts[module:GetName()] = { [module:GetName()] = r }
409 end
410 else
411 geterrorhandler()(r)
412 end
413 end
414 return opts
415 end 399 end
416 400
417 401
418 402
419 ---- Export to ReAction ---- 403 ---- Export to ReAction ----