Mercurial > wow > reaction
comparison modules/ReAction_ConfigUI/ReAction_ConfigUI.lua @ 47:e12b736c23c3
Added Layout Editor
author | Flick <flickerstreak@gmail.com> |
---|---|
date | Fri, 11 Apr 2008 22:21:28 +0000 |
parents | aa0b7fd68462 |
children | 7b7d178dec52 |
comparison
equal
deleted
inserted
replaced
46:aa0b7fd68462 | 47:e12b736c23c3 |
---|---|
5 --]] | 5 --]] |
6 | 6 |
7 -- local imports | 7 -- local imports |
8 local ReAction = ReAction | 8 local ReAction = ReAction |
9 local L = ReAction.L | 9 local L = ReAction.L |
10 local AceConfigReg = LibStub("AceConfigRegistry-3.0") | |
11 local AceConfigDialog = LibStub("AceConfigDialog-3.0") | |
10 | 12 |
11 -- module declaration | 13 -- module declaration |
12 local moduleID = "ConfigUI" | 14 local moduleID = "ConfigUI" |
13 local module = ReAction:NewModule( moduleID ) | 15 local module = ReAction:NewModule( moduleID, |
16 "AceEvent-3.0" | |
17 ) | |
14 | 18 |
15 -- module methods | 19 -- module methods |
16 function module:OnInitialize() | 20 function module:OnInitialize() |
21 self.db = ReAction.db:RegisterNamespace( moduleID, | |
22 { | |
23 profile = { | |
24 closeOnLaunch = true, | |
25 editorCloseOnLaunch = true, | |
26 } | |
27 } | |
28 ) | |
29 | |
17 ReAction.RegisterCallback(self,"OnOptionsRegistered") | 30 ReAction.RegisterCallback(self,"OnOptionsRegistered") |
18 ReAction.RegisterCallback(self,"OnOptionsRefreshed") | 31 ReAction.RegisterCallback(self,"OnOptionsRefreshed") |
32 ReAction.RegisterCallback(self,"OnCreateBar") | |
33 ReAction.RegisterCallback(self,"OnEraseBar") | |
34 ReAction.RegisterCallback(self,"OnRenameBar") | |
19 self:InitializeOptions() | 35 self:InitializeOptions() |
36 self:RegisterEvent("PLAYER_REGEN_DISABLED") | |
20 end | 37 end |
21 | 38 |
22 function module:OnOptionsRegistered(evt, context, module, opts) | 39 function module:OnOptionsRegistered(evt, context, module, opts) |
23 local c = self.configOptions.args[context] | 40 local c = self.configOptions.args[context] |
24 if c then | 41 if c then |
25 for k, v in pairs(opts) do | 42 for k, v in pairs(opts) do |
26 c.args[k] = v | 43 c.args[k] = v |
27 end | 44 end |
45 elseif c == "bar" then | |
46 | |
28 end | 47 end |
29 end | 48 end |
30 | 49 |
31 function module:OnOptionsRefreshed(evt) | 50 function module:OnOptionsRefreshed(evt) |
32 -- TODO: refresh options frame (just OpenConfig again?) | 51 -- TODO: refresh options frame (just OpenConfig again?) |
33 end | 52 end |
34 | 53 |
35 function module:OpenConfig(bar) | 54 function module:OnCreateBar(evt, bar) |
36 InterfaceOptionsFrame_OpenToFrame("ReAction") | 55 local name = bar:GetName() |
37 if bar then | 56 -- AceConfig doesn't allow spaces, etc, in arg key names, and they must be |
38 -- TODO: select the correct bar pane | 57 -- unique strings. So generate a unique key (it can be whatever) for the bar |
39 end | 58 local key |
40 end | 59 local i = 1 |
41 | 60 repeat |
42 function module:InitializeOptions() | 61 key = ("bar%s"):format(i) |
43 self.configOptions = { | 62 i = i+1 |
63 until self.layoutOpts.args[key] == nil | |
64 self.barOptMap[name] = key | |
65 self.layoutOpts.args[key] = { | |
44 type = "group", | 66 type = "group", |
67 name = name, | |
45 childGroups = "tab", | 68 childGroups = "tab", |
46 args = { | 69 args = { |
70 general = { | |
71 type = "group", | |
72 name = L["General"], | |
73 args = { | |
74 name = { | |
75 type = "input", | |
76 name = L["Rename Bar"], | |
77 get = function() return bar:GetName() end, | |
78 set = function(info, value) return ReAction:RenameBar(bar, value) end, | |
79 order = 1, | |
80 }, | |
81 delete = { | |
82 type = "execute", | |
83 name = L["Delete Bar"], | |
84 desc = function() return bar:GetName() end, | |
85 confirm = true, | |
86 func = function() ReAction:EraseBar(bar) end, | |
87 order = -1 | |
88 }, | |
89 | |
90 } | |
91 }, | |
92 }, | |
93 | |
94 } | |
95 end | |
96 | |
97 function module:OnEraseBar(evt, name) | |
98 local key = self.barOptMap[name] | |
99 self.barOptMap[name] = nil | |
100 if key then | |
101 self.layoutOpts.args[key] = nil | |
102 self:RefreshLayoutEditor() | |
103 end | |
104 end | |
105 | |
106 function module:OnRenameBar(evt, oldname, newname) | |
107 local key = self.barOptMap[oldname] | |
108 self.barOptMap[oldname], self.barOptMap[newname] = nil, key | |
109 if key then | |
110 self.layoutOpts.args[key].name = newname | |
111 self:RefreshLayoutEditor() | |
112 end | |
113 end | |
114 | |
115 function module:PLAYER_REGEN_DISABLED() | |
116 if self.editor then | |
117 self.editor:Hide() | |
118 end | |
119 end | |
120 | |
121 function module:UserError(msg) | |
122 -- any user errors should be flashed to the UIErrorsFrame | |
123 UIErrorsFrame:AddMessage(msg) | |
124 end | |
125 | |
126 function module:OpenConfig() | |
127 InterfaceOptionsFrame_OpenToFrame("ReAction") | |
128 end | |
129 | |
130 function module:LaunchLayoutEditor(bar) | |
131 if InCombatLockdown() then | |
132 self:UserError(L["ReAction config mode disabled during combat."]) | |
133 else | |
134 if not self.editor then | |
135 -- use a local container to work around AceConfigDialog closing | |
136 -- both the layout editor and the global options when interface options is closed | |
137 local ed = LibStub("AceGUI-3.0"):Create("Frame") | |
138 ed.frame:SetClampedToScreen(true) | |
139 local old_OnUpdate = ed.frame:GetScript("OnUpdate") | |
140 ed.frame:SetScript("OnUpdate", function(dt) | |
141 if old_OnUpdate then | |
142 old_OnUpdate(dt) | |
143 end | |
144 if ed.closePending then | |
145 InterfaceOptionsFrame:Hide() | |
146 ed.closePending = false | |
147 end | |
148 if ed.selfClosePending then | |
149 ed:Hide() | |
150 AceConfigReg:NotifyChange("ReAction") | |
151 ed.selfClosePending = false | |
152 end | |
153 end ) | |
154 ed:SetCallback("OnClose", | |
155 function() | |
156 ReAction:SetConfigMode(false) | |
157 end ) | |
158 self.editor = ed | |
159 AceConfigDialog:SetDefaultSize("ReAction-Layout", 600, 450) | |
160 end | |
161 | |
162 AceConfigDialog:Open("ReAction-Layout", self.editor) | |
163 ReAction:SetConfigMode(true) | |
164 end | |
165 end | |
166 | |
167 function module:RefreshLayoutEditor() | |
168 AceConfigReg:NotifyChange("ReAction-Layout") | |
169 if self.editor and self.editor.frame:IsShown() then | |
170 AceConfigDialog:Open("ReAction-Layout", self.editor) | |
171 end | |
172 end | |
173 | |
174 function module:GetBarTypes() | |
175 local opts = self.optBarTypes or { } | |
176 self.optBarTypes = opts | |
177 | |
178 -- TODO: get these from module registration somehow | |
179 opts[1] = "foo" | |
180 | |
181 return opts | |
182 end | |
183 | |
184 function module:CreateBar() | |
185 local name = self.tmpBarName | |
186 local type = self.tmpBarType | |
187 | |
188 self.tmpBarName = nil | |
189 self.tmpBarType = nil | |
190 | |
191 -- TODO: get from module registration | |
192 -- TODO: use rows/cols info | |
193 ReAction:CreateBar(name) | |
194 end | |
195 | |
196 function module:InitializeOptions() | |
197 -- general config options | |
198 local opts = { | |
199 type = "group", | |
200 name = "ReAction", | |
201 childGroups = "tab", | |
202 args = { | |
203 _desc = { | |
204 type = "description", | |
205 name = L["Customizable replacement for Blizzard's Action Bars"], | |
206 order = 1, | |
207 }, | |
208 _launchLayout = { | |
209 type = "execute", | |
210 handler = self, | |
211 name = L["Layout Editor..."], | |
212 desc = L["Show the ReAction Layout Editor to edit your bars"], | |
213 func = function() | |
214 self:LaunchLayoutEditor() | |
215 -- you can't close a dialog in response to an options click, because the end of the | |
216 -- handler for all the button events calls lib:Open() | |
217 -- So, schedule a close on the next OnUpdate | |
218 if self.db.profile.closeOnLaunch then | |
219 self.editor.closePending = true | |
220 end | |
221 end, | |
222 order = 2, | |
223 }, | |
224 _closeThis = { | |
225 type = "toggle", | |
226 name = L["Close on Launch"], | |
227 desc = L["Close the Interface Options window when launching the ReAction Layout Editor"], | |
228 get = function() return self.db.profile.closeOnLaunch end, | |
229 set = function(info, val) self.db.profile.closeOnLaunch = val end, | |
230 order = 3, | |
231 }, | |
47 global = { | 232 global = { |
48 type = "group", | 233 type = "group", |
49 name = L["Global Settings"], | 234 name = L["Global Settings"], |
50 desc = L["Global configuration settings"], | 235 desc = L["Global configuration settings"], |
51 args = { }, | 236 args = { }, |
52 order = 1, | 237 order = 3, |
53 }, | 238 }, |
54 bar = { | 239 _profile = LibStub("AceDBOptions-3.0"):GetOptionsTable(ReAction.db), |
55 type = "group", | |
56 name = L["Bar Config"], | |
57 desc = L["Configuration settings for bars"], | |
58 args = { }, | |
59 order = 2, | |
60 }, | |
61 module = { | 240 module = { |
62 type = "group", | 241 type = "group", |
63 childGroups = "select", | 242 childGroups = "select", |
64 name = L["Module Settings"], | 243 name = L["Module Settings"], |
65 desc = L["Configuration settings for each module"], | 244 desc = L["Configuration settings for each module"], |
67 order = -1, | 246 order = -1, |
68 }, | 247 }, |
69 }, | 248 }, |
70 plugins = { } | 249 plugins = { } |
71 } | 250 } |
72 | 251 self.configOptions = opts |
73 for c, tbl in pairs(self.configOptions.args) do | 252 opts.args._profile.order = -2 |
253 AceConfigReg:RegisterOptionsTable("ReAction",opts) | |
254 self.frame = AceConfigDialog:AddToBlizOptions("ReAction", "ReAction") | |
255 self.frame.obj:SetCallback("default", | |
256 function() | |
257 ReAction.db:ResetProfile() | |
258 module:OpenConfig() | |
259 end ) | |
260 | |
261 -- import options from registered modules | |
262 for c, tbl in pairs(opts.args) do | |
74 for _, m in pairs(ReAction:GetOptions(c)) do | 263 for _, m in pairs(ReAction:GetOptions(c)) do |
75 for k, v in pairs(m) do | 264 for k, v in pairs(m) do |
76 tbl.args[k] = v | 265 tbl.args[k] = v |
77 end | 266 end |
78 end | 267 end |
79 end | 268 end |
80 | |
81 self.configOptions.args.desc = { | |
82 type = "description", | |
83 name = L["Customizable replacement for Blizzard's Action Bars"], | |
84 } | |
85 self.configOptions.args.profile = LibStub("AceDBOptions-3.0"):GetOptionsTable(ReAction.db) | |
86 self.configOptions.args.profile.order = -2 | |
87 | 269 |
88 ReAction:RegisterOptions("module",self, { | 270 ReAction:RegisterOptions("module",self, { |
89 configUI = { | 271 configUI = { |
90 type = "group", | 272 type = "group", |
91 name = "Config UI", | 273 name = "Config UI", |
101 } | 283 } |
102 } | 284 } |
103 }, | 285 }, |
104 }) | 286 }) |
105 | 287 |
106 LibStub("AceConfigRegistry-3.0"):RegisterOptionsTable("ReAction",self.configOptions) | 288 -- layout editor options |
107 self.frame = LibStub("AceConfigDialog-3.0"):AddToBlizOptions("ReAction", "ReAction") | 289 local layoutOpts = { |
108 self.frame.obj:SetCallback("default", function() ReAction.db:ResetProfile() end) | 290 type = "group", |
109 end | 291 name = ("ReAction - %s"):format(L["Layout"]), |
110 | 292 handler = self, |
293 childGroups = "tree", | |
294 args = { | |
295 desc = { | |
296 type = "description", | |
297 name = L["Use the mouse to arrange and resize the bars on screen. Tooltips on bars indicate additional functionality."], | |
298 order = 1 | |
299 }, | |
300 launchConfig = { | |
301 type = "execute", | |
302 name = L["Global Config"], | |
303 desc = L["Opens ReAction global configuration settings panel"], | |
304 func = function() | |
305 self:OpenConfig() | |
306 -- you can't close a dialog in response to an options click, because the end of the | |
307 -- handler for all the button events calls lib:Open() | |
308 -- So, schedule a close on the next appropriate event | |
309 if self.db.profile.editorCloseOnLaunch then | |
310 self.editor.selfClosePending = true | |
311 end | |
312 end, | |
313 order = 2 | |
314 }, | |
315 closThis = { | |
316 type = "toggle", | |
317 name = L["Close on Launch"], | |
318 desc = L["Close the Layout Editor when opening the ReAction global Interface Options"], | |
319 get = function() return self.db.profile.editorCloseOnLaunch end, | |
320 set = function(info, val) self.db.profile.editorCloseOnLaunch = val end, | |
321 order = 3, | |
322 }, | |
323 new = { | |
324 type = "group", | |
325 name = L["New Bar..."], | |
326 order = 4, | |
327 args = { | |
328 desc = { | |
329 type = "description", | |
330 name = L["Choose a name, type, and initial grid for your new action bar:"], | |
331 order = 1, | |
332 }, | |
333 name = { | |
334 type = "input", | |
335 name = L["Bar Name"], | |
336 desc = L["Enter a name for your new action bar"], | |
337 get = function() return self.tmpBarName or "" end, | |
338 set = function(info, val) self.tmpBarName = val end, | |
339 order = 2, | |
340 }, | |
341 type = { | |
342 type = "select", | |
343 name = L["Button Type"], | |
344 get = function() return self.tmpBarType or "" end, | |
345 set = function(info, val) self.tmpBarType = val end, | |
346 values = "GetBarTypes", | |
347 order = 3, | |
348 }, | |
349 grid = { | |
350 type = "group", | |
351 name = L["Button Grid"], | |
352 inline = true, | |
353 args = { | |
354 hdr = { | |
355 type = "header", | |
356 name = L["Button Grid"], | |
357 order = 1, | |
358 }, | |
359 rows = { | |
360 type = "range", | |
361 name = L["Rows"], | |
362 get = function() return self.tmpBarRows or 1 end, | |
363 set = function(info, val) self.tmpBarRows = val end, | |
364 width = "half", | |
365 min = 1, | |
366 max = 32, | |
367 step = 1, | |
368 order = 2, | |
369 }, | |
370 cols = { | |
371 type = "range", | |
372 name = L["Columns"], | |
373 get = function() return self.tmpBarCols or 12 end, | |
374 set = function(info, val) self.tmpBarCols = val end, | |
375 width = "half", | |
376 min = 1, | |
377 max = 32, | |
378 step = 1, | |
379 order = 3, | |
380 }, | |
381 sz = { | |
382 type = "range", | |
383 name = L["Size"], | |
384 get = function() return self.tmpBarSize or 36 end, | |
385 set = function(info, val) self.tmpBarSize = val end, | |
386 width = "half", | |
387 min = 10, | |
388 max = 72, | |
389 step = 1, | |
390 order = 4, | |
391 }, | |
392 spacing = { | |
393 type = "range", | |
394 name = L["Spacing"], | |
395 get = function() return self.tmpBarSpacing or 3 end, | |
396 set = function(info, val) self.tmpBarSpacing = val end, | |
397 width = "half", | |
398 min = 0, | |
399 max = 24, | |
400 step = 1, | |
401 order = 5, | |
402 } | |
403 }, | |
404 order = 4 | |
405 }, | |
406 spacer = { | |
407 type = "header", | |
408 name = "", | |
409 width = "full", | |
410 order = -2 | |
411 }, | |
412 go = { | |
413 type = "execute", | |
414 name = L["Create Bar"], | |
415 func = "CreateBar", | |
416 order = -1, | |
417 } | |
418 } | |
419 } | |
420 } | |
421 } | |
422 self.layoutOpts = layoutOpts | |
423 self.barOptMap = { } | |
424 AceConfigReg:RegisterOptionsTable("ReAction-Layout",layoutOpts) | |
425 end | |
426 |