Mercurial > wow > ouroloot
comparison options.lua @ 96:780b7e0eeeeb
Break the options panel out of gui.lua into new options.lua. Move default item lists from verbage.lua there also. Redo options panel as a tree instead of a massive scrolling thing, and prepare data structures to let plugins/etc add their own options code.
author | Farmbuyer of US-Kilrogg <farmbuyer@gmail.com> |
---|---|
date | Thu, 26 Jul 2012 20:46:00 +0000 |
parents | |
children | ba5ff82dcf19 |
comparison
equal
deleted
inserted
replaced
95:3546c7b55986 | 96:780b7e0eeeeb |
---|---|
1 local addon = select(2,...) | |
2 if addon.NOLOAD then return end | |
3 | |
4 -- Don't bother recording any of this loot: | |
5 addon.default_itemfilter = { | |
6 -- could probably remove most of this now | |
7 -- [29434] = true, -- Badge of Justice | |
8 -- [40752] = true, -- Emblem of Heroism | |
9 -- [40753] = true, -- Emblem of Valor | |
10 -- [45624] = true, -- Emblem of Conquest | |
11 -- [43228] = true, -- Stone Keeper's Shard | |
12 -- [47241] = true, -- Emblem of Triumph | |
13 -- [49426] = true, -- Emblem of Frost | |
14 } | |
15 | |
16 -- Mark these as straight to guild vault: | |
17 addon.default_itemvault = { | |
18 [52078] = true, -- Chaos Orb | |
19 [69237] = true, -- Living Ember | |
20 [71998] = true, -- Essence of Destruction | |
21 } | |
22 | |
23 local options_tree = { | |
24 { | |
25 value = "pong", | |
26 text = "Pongs", | |
27 }, | |
28 { | |
29 value = "basic", | |
30 text = "Options", | |
31 children = { | |
32 { | |
33 value = "filter", | |
34 text = "Item Filters", | |
35 }, | |
36 }, | |
37 }, | |
38 { | |
39 value = "adv", | |
40 text = "Advanced/Debugging", | |
41 }, | |
42 } | |
43 | |
44 | |
45 --[[ | |
46 mkbutton ("WidgetType", 'display key', "Text On Widget", "mouseover status text") | |
47 mkbutton ( [Button] 'display key', "Text On Widget", "mouseover status text") | |
48 mkbutton ( [Button] [text] "Text On Widget", "mouseover status text") | |
49 ]] | |
50 local mkbutton = addon.gui_state_pointer.mkbutton | |
51 local gui = addon.gui_state_pointer | |
52 local AceGUI = LibStub("AceGUI-3.0") | |
53 local flib = LibStub("LibFarmbuyer") | |
54 -- Local ref to OuroLootSV_opts, which may be reassigned after load. | |
55 -- So instead this is updated when the tab is displayed. | |
56 local opts | |
57 | |
58 local function mktoggle (opt, label, width, desc, opt_func) | |
59 local w = mkbutton("CheckBoxSmallLabel", nil, "", desc) | |
60 w:SetRelativeWidth(width) | |
61 w:SetType("checkbox") | |
62 w:SetLabel(label) | |
63 if opt then | |
64 w:SetValue(opts[opt]) | |
65 w:SetCallback("OnValueChanged", opt_func or (function(_w,event,value) | |
66 opts[opt] = value | |
67 end)) | |
68 end | |
69 return w | |
70 end | |
71 | |
72 local function mktitle (txt) | |
73 local t = AceGUI:Create("Label") | |
74 t:SetFullWidth(true) | |
75 t:SetColor (0.19, 0.68, 1) -- cff30adff | |
76 t:SetFontObject(GameFontHighlightLarge) | |
77 t:SetText(txt) | |
78 local s = AceGUI:Create("Spacer") | |
79 s:SetFullWidth(true) | |
80 s:SetHeight(20) | |
81 return t, s | |
82 end | |
83 | |
84 local function adv_careful_OnTextChanged (ebox,event,value) | |
85 -- The EditBox widget's code will call an internal ShowButton routine | |
86 -- after this callback returns. ShowButton will test for this flag: | |
87 ebox:DisableButton (value == "") | |
88 end | |
89 | |
90 | |
91 --------------- | |
92 -- All controls take a scrollframe container set to Flow layout. | |
93 local controls = {} | |
94 controls.pong = function (container) | |
95 container:AddChildren(mktitle[[Echoes from latest ping:]]) | |
96 addon.sender_list.sort() | |
97 if #addon.sender_list.namesI > 0 then | |
98 local w = AceGUI:Create("Label") | |
99 w:SetFullWidth(true) | |
100 w:SetText(table.concat(addon.sender_list.namesI,'\n')) -- sigh | |
101 container:AddChild(w) | |
102 end | |
103 end | |
104 | |
105 | |
106 --------------- | |
107 controls.basic = function (container) | |
108 container:AddChildren(mktitle[[Account Options (saved across sessions)]]) | |
109 | |
110 container:PauseLayout() | |
111 local w | |
112 local stdw = 0.99 -- standard width | |
113 | |
114 -- the nubtoggle! | |
115 w = mktoggle('gui_noob', [[Show UI Tips]], stdw, | |
116 [[Toggles display of the "helpful tips" box hanging off the right side. Useful if you've just installed/upgraded.]]) | |
117 container:AddChild(w) | |
118 | |
119 -- reminder popup | |
120 w = mktoggle('popup_on_join', "Show reminder popup on new raid", stdw, | |
121 [[When joining a raid and not already tracking, display a dialog asking for instructions.]]) | |
122 container:AddChild(w) | |
123 | |
124 -- toggle scroll-to-bottom on first tab | |
125 w = mktoggle('scroll_to_bottom', "Scroll to bottom when opening display", stdw, | |
126 [[Scroll to the bottom of the loot window (most recent entries) when displaying the GUI.]]) | |
127 container:AddChild(w) | |
128 | |
129 -- chatty boss mode | |
130 w = mktoggle('chatty_on_kill', "Be chatty on boss kill", stdw, | |
131 [[Print something to chat output when the boss mod tells Ouro Loot about a successful boss kill.]]) | |
132 container:AddChild(w) | |
133 | |
134 -- less noise in main panel | |
135 w = mktoggle('no_tracking_wipes', "Do not track wipes", stdw, | |
136 [[Do not add 'wipe' entries on the main loot grid, or generate any text for them.]]) | |
137 container:AddChild(w) | |
138 | |
139 -- cutesy abbrevs | |
140 w = mktoggle('snarky_boss', "Use snarky boss names", stdw, | |
141 [[Irreverent replacement names for boss events. See abbreviations.lua for details.]]) | |
142 container:AddChild(w) | |
143 | |
144 -- LOD plugins in all cases | |
145 w = mktoggle('display_disabled_LODs', "Include disabled plugins", stdw, | |
146 [[Show loadable plugins even if they've been disabled (and offer to enable them). Relog to take effect.]]) | |
147 container:AddChild(w) | |
148 | |
149 -- showing the "(from Rebroadcasterdude)" in the notes column | |
150 w = mktoggle('display_bcast_from', "Show rebroadcasting player", stdw, | |
151 [[Include "from PlayerName" in the Notes column for loot that was broadcast to you. (Not included in forum output).]], | |
152 function(_w,_e,value) | |
153 opts.display_bcast_from = value | |
154 addon.loot_clean = nil | |
155 end) | |
156 container:AddChild(w) | |
157 | |
158 -- prefilling g_uniques with history | |
159 w = mktoggle('precache_history_uniques', "Prescan for faster handling", stdw, | |
160 [[See description under +Help -- Handy Tips -- Prescanning> for instructions.]]) | |
161 container:AddChild(w) | |
162 | |
163 w = AceGUI:Create("Spacer") w:SetFullWidth(true) w:SetHeight(10) container:AddChild(w) | |
164 -- possible keybindings | |
165 do | |
166 local pair = AceGUI:Create("InlineGroup") | |
167 pair:SetLayout("List") | |
168 pair:SetRelativeWidth(0.49) | |
169 pair:SetTitle("Keybinding for '/ouroloot'") | |
170 local editbox, checkbox | |
171 editbox = mkbutton("EditBox", nil, opts.keybinding_text, | |
172 [[Keybinding text format is fragile! (All caps, ALT then CTRL then SHIFT.) Relog to take effect.]]) | |
173 editbox:SetFullWidth(true) | |
174 editbox:SetLabel("Keybinding text") | |
175 editbox:SetCallback("OnEnterPressed", function(_w,event,value) | |
176 opts.keybinding_text = value | |
177 end) | |
178 editbox:SetDisabled(not opts.keybinding) | |
179 checkbox = mktoggle('keybinding', "Register keybinding", 1, | |
180 [[Register a keybinding to toggle the loot display. Relog to take effect.]], | |
181 function (_w,_,value) | |
182 opts.keybinding = value | |
183 editbox:SetDisabled(not opts.keybinding) | |
184 end) | |
185 checkbox:SetFullWidth(true) | |
186 pair:AddChild(checkbox) | |
187 pair:AddChild(editbox) | |
188 container:AddChild(pair) | |
189 end | |
190 | |
191 -- replacement for slashloot | |
192 do | |
193 local pair = AceGUI:Create("InlineGroup") | |
194 pair:SetLayout("List") | |
195 pair:SetRelativeWidth(0.49) | |
196 pair:SetTitle('Synonyms for "/ouroloot"') | |
197 local editbox, checkbox | |
198 editbox = mkbutton("EditBox", nil, opts.slash_synonyms, | |
199 [[Separate multiple synonyms with a comma. Relog to take effect.]]) | |
200 editbox:SetFullWidth(true) | |
201 editbox:SetLabel("Slash commands") | |
202 editbox:SetCallback("OnEnterPressed", function(_e,event,value) | |
203 -- Do the sanity checking here rather than at each login. | |
204 -- This is not foolproof. That's okay. | |
205 local t = { strsplit(',', tostring(value)) } | |
206 for k,v in ipairs(t) do | |
207 v = v:trim() | |
208 if v:sub(1,1) ~= "/" then | |
209 v = "/" .. v | |
210 end | |
211 t[k] = v | |
212 end | |
213 value = table.concat(t,',') | |
214 _e:SetText(value) | |
215 opts.slash_synonyms = value | |
216 end) | |
217 editbox:SetDisabled(not opts.register_slash_synonyms) | |
218 checkbox = mktoggle('register_slash_synonyms', "Register slash commands", 1, | |
219 [[Register these slash commands as synonyms for "/ouroloot". Relog to take effect.]], | |
220 function (_w,_,value) | |
221 opts.register_slash_synonyms = value | |
222 editbox:SetDisabled(not opts.register_slash_synonyms) | |
223 end) | |
224 checkbox:SetFullWidth(true) | |
225 pair:AddChild(checkbox) | |
226 pair:AddChild(editbox) | |
227 container:AddChild(pair) | |
228 end | |
229 | |
230 -- chatty disposition/assignment changes | |
231 w = AceGUI:Create("Spacer") w:SetFullWidth(true) w:SetHeight(10) container:AddChild(w) | |
232 do | |
233 local chatgroup = AceGUI:Create("InlineGroup") | |
234 chatgroup:SetLayout("List") | |
235 chatgroup:SetRelativeWidth(0.75) | |
236 chatgroup:SetTitle("Remote Changes Chat") | |
237 local toggle, editbox | |
238 toggle = mktoggle('chatty_on_remote_changes', "Be chatty on remote changes", 1, | |
239 [[Print something to chat when other users change recorded loot.]], | |
240 function (_w,_,value) | |
241 opts.chatty_on_remote_changes = value | |
242 editbox:SetDisabled(not opts.chatty_on_remote_changes) | |
243 end) | |
244 toggle:SetFullWidth(true) | |
245 chatgroup:AddChild(toggle) | |
246 w = AceGUI:Create("Label") | |
247 w:SetFullWidth(true) | |
248 w:SetText("This controls the output of the |cff00ffff'Be chatty on remote changes'|r option. If this field is a number, it designates which chat frame to use. Otherwise it is the Lua variable name of a frame with AddMessage capability.") | |
249 chatgroup:AddChild(w) | |
250 editbox = mkbutton("EditBox", nil, opts.chatty_on_remote_changes_frame, | |
251 [[1 = default chat frame, 2 = combat log, etc]]) | |
252 editbox:SetFullWidth(true) | |
253 editbox:SetLabel("Output Chatframe") | |
254 editbox:SetCallback("OnTextChanged", adv_careful_OnTextChanged) | |
255 editbox:SetCallback("OnEnterPressed", function(_w,event,value) | |
256 local prev = opts.chatty_on_remote_changes_frame | |
257 value = value:trim() | |
258 value = tonumber(value) or value | |
259 if addon:_set_remote_change_chatframe (value) then | |
260 opts.chatty_on_remote_changes_frame = value | |
261 _w:SetText(tostring(value)) | |
262 _w.editbox:ClearFocus() | |
263 else | |
264 _w:SetText(tostring(prev)) | |
265 end | |
266 end) | |
267 editbox:SetDisabled(not opts.chatty_on_remote_changes) | |
268 chatgroup:AddChild(editbox) | |
269 w = mkbutton("Chat Frame Numbers", | |
270 [[Print each chat window number in its own frame, for easy reference in the editing field.]]) | |
271 w:SetFullWidth(true) | |
272 w:SetCallback("OnClick", function() | |
273 for i = 1, NUM_CHAT_WINDOWS do | |
274 local cf = _G['ChatFrame'..i] | |
275 if not cf then break end | |
276 addon:CFPrint (cf, "This is frame number |cffff0000%d|r.", i) | |
277 end | |
278 end) | |
279 chatgroup:AddChild(w) | |
280 container:AddChild(chatgroup) | |
281 end | |
282 | |
283 -- boss mod selection | |
284 w = AceGUI:Create("Spacer") w:SetFullWidth(true) w:SetHeight(2) container:AddChild(w) | |
285 do | |
286 local list = {} | |
287 local current | |
288 for k,v in ipairs(addon.bossmods) do | |
289 list[k] = v.n | |
290 if v.n == opts.bossmod then | |
291 current = k | |
292 end | |
293 end | |
294 w = mkbutton("Dropdown", nil, "", [[Which 'boss mod' to use.]]) | |
295 w:SetRelativeWidth(0.3) | |
296 w:SetLabel("Boss Mod:") | |
297 w:SetList(list) | |
298 w:SetValue(current) | |
299 w:SetCallback("OnValueChanged", function(_w,event,choice) | |
300 opts.bossmod = list[choice] | |
301 end) | |
302 container:AddChild(w) | |
303 end | |
304 | |
305 container:ResumeLayout() | |
306 container:DoLayout() | |
307 AceGUI:ClearFocus() | |
308 end | |
309 | |
310 | |
311 --------------- | |
312 do | |
313 local warntext = [[At least one of the items in the filter list was not in your game client's cache. This is okay. Just wait a few seconds, display some other Ouro Loot tab or panel, and then display the Item Filters again.]] | |
314 local cache_warn, cache_warned = false, false | |
315 local function do_warning (cnt) | |
316 if cache_warn and not cache_warned then | |
317 cache_warned = true | |
318 addon:Print(warntext) | |
319 local t = AceGUI:Create("Label") | |
320 t:SetFullWidth(true) | |
321 t:SetText(warntext) | |
322 cnt:AddChild(t) | |
323 end | |
324 end | |
325 | |
326 controls.basic_filter = function (container) | |
327 container:AddChildren(mktitle[[Item-Specific Special Handling]]) | |
328 | |
329 cache_warn, cache_warned = false, false | |
330 local filterlist, vaultlist = {}, {} | |
331 for id in pairs(opts.itemfilter) do | |
332 local iname, _, iquality = GetItemInfo(id) | |
333 if iname then | |
334 filterlist[id] = ITEM_QUALITY_COLORS[iquality].hex .. iname .. "|r" | |
335 else | |
336 filterlist[id] = id | |
337 cache_warn = true | |
338 end | |
339 end | |
340 for id in pairs(opts.itemvault) do | |
341 local iname, _, iquality = GetItemInfo(id) | |
342 if iname then | |
343 vaultlist[id] = ITEM_QUALITY_COLORS[iquality].hex .. iname .. "|r" | |
344 else | |
345 vaultlist[id] = id | |
346 cache_warn = true | |
347 end | |
348 end | |
349 | |
350 local w = AceGUI:Create("EditBoxDropDown") | |
351 w:SetRelativeWidth(0.4) | |
352 w:SetText("Item filter") | |
353 w:SetEditBoxTooltip("Link items which should no longer be tracked.") | |
354 w:SetList(filterlist) | |
355 w:SetCallback("OnTextEnterPressed", function(_w, _, text) | |
356 local iname, ilink, iquality = GetItemInfo(text:trim()) | |
357 if not iname then | |
358 return addon:Print("Error: %s is not a valid item name/link!", text) | |
359 end | |
360 local id = tonumber(ilink:match("item:(%d+)")) | |
361 filterlist[id] = ITEM_QUALITY_COLORS[iquality].hex .. iname .. "|r" | |
362 opts.itemfilter[id] = true | |
363 addon:Print("Now filtering out", ilink) | |
364 end) | |
365 w:SetCallback("OnListItemClicked", function(_w, _, key_id, val_name) | |
366 --local ilink = select(2,GetItemInfo(key_id)) | |
367 opts.itemfilter[tonumber(key_id)] = nil | |
368 --addon:Print("No longer filtering out", ilink) | |
369 addon:Print("No longer filtering out", val_name) | |
370 end) | |
371 --w:SetCallback("OnDropdownShown",do_warning) | |
372 w:SetCallback("OnDropdownShown", function() | |
373 do_warning(container) | |
374 end) | |
375 container:AddChild(w) | |
376 | |
377 w = AceGUI:Create("Spacer") | |
378 w:SetRelativeWidth(0.1) | |
379 w:SetHeight(2) | |
380 container:AddChild(w) | |
381 | |
382 w = AceGUI:Create("EditBoxDropDown") | |
383 w:SetRelativeWidth(0.4) | |
384 w:SetText("Vault items") | |
385 w:SetEditBoxTooltip("Link items which should be automatically marked as guild vault.") | |
386 w:SetList(vaultlist) | |
387 w:SetCallback("OnTextEnterPressed", function(_w, _, text) | |
388 local iname, ilink, iquality = GetItemInfo(text:trim()) | |
389 if not iname then | |
390 return addon:Print("Error: %s is not a valid item name/link!", text) | |
391 end | |
392 local id = tonumber(ilink:match("item:(%d+)")) | |
393 vaultlist[id] = ITEM_QUALITY_COLORS[iquality].hex .. iname .. "|r" | |
394 opts.itemvault[id] = true | |
395 addon:Print("Now auto-vaulting", ilink) | |
396 end) | |
397 w:SetCallback("OnListItemClicked", function(_w, _, key_id, val_name) | |
398 --local ilink = select(2,GetItemInfo(key_id)) | |
399 opts.itemfilter[tonumber(key_id)] = nil | |
400 --addon:Print("No longer filtering out", ilink) | |
401 addon:Print("No longer auto-vaulting", val_name) | |
402 end) | |
403 w:SetCallback("OnDropdownShown",do_warning) | |
404 container:AddChild(w) | |
405 end | |
406 end | |
407 | |
408 | |
409 --------------- | |
410 local adv_real = function (container) | |
411 container:AddChildren(mktitle[[Debugging Options (not saved across sessions)]]) | |
412 | |
413 container:PauseLayout() | |
414 local w | |
415 | |
416 do | |
417 local grp = AceGUI:Create("InlineGroup") | |
418 grp:SetLayout("List") | |
419 grp:SetRelativeWidth(0.60) | |
420 grp:SetTitle("Output of debugging messages") | |
421 | |
422 w = AceGUI:Create("CheckBoxSmallLabel") | |
423 w:SetFullWidth(true) | |
424 w:SetType("checkbox") | |
425 w:SetLabel("master toggle") | |
426 w:SetValue(addon.DEBUG_PRINT) | |
427 w:SetCallback("OnValueChanged", function(_w,event,value) | |
428 addon.DEBUG_PRINT = value | |
429 addon:redisplay() | |
430 end) | |
431 grp:AddChild(w) | |
432 for d,v in pairs(addon.debug) do | |
433 w = AceGUI:Create("CheckBoxSmallLabel") | |
434 w:SetFullWidth(true) | |
435 w:SetType("checkbox") | |
436 w:SetLabel(d) | |
437 if d == "notraid" then | |
438 w:SetDescription[[Tick this before enabling to make the addon work outside of raid groups]] | |
439 else | |
440 if d == "alsolog" then | |
441 w:SetDescription[[Also log all debug messages to disk. See print_log.lua in the addon folder for later viewing.]] | |
442 end | |
443 w:SetDisabled(not addon.DEBUG_PRINT) | |
444 end | |
445 w:SetValue(v) | |
446 w:SetCallback("OnValueChanged", function(_w,event,value) addon.debug[d] = value end) | |
447 grp:AddChild(w) | |
448 end | |
449 container:AddChild(grp) | |
450 end | |
451 | |
452 do | |
453 local simple = AceGUI:Create("SimpleGroup") | |
454 simple:SetLayout("List") | |
455 simple:SetRelativeWidth(0.35) | |
456 w = AceGUI:Create("CheckBoxSmallLabel") | |
457 --w:SetRelativeWidth(0.35) | |
458 w:SetFullWidth(true) | |
459 w:SetType("checkbox") | |
460 w:SetLabel("GOP history mode") | |
461 w:SetValue(addon.history_suppress) | |
462 w:SetCallback("OnValueChanged", function(_w,event,value) addon.history_suppress = value end) | |
463 simple:AddChild(w) | |
464 w = mkbutton("Dropdown", nil, "", | |
465 [[if active, tooltip shown when hovering over Item column only]]) | |
466 --w:SetRelativeWidth(0.4) | |
467 w:SetFullWidth(true) | |
468 w:SetLabel("loot debugging tooltip") | |
469 w:SetList{ | |
470 [1] = "Off", | |
471 [2] = "/dump into tooltip", | |
472 [3] = "small fixed fields", | |
473 } | |
474 w:SetValue(gui._do_debugging_tooltip or 1) | |
475 w:SetCallback("OnValueChanged", function(_w,event,choice) | |
476 gui._do_debugging_tooltip = choice > 1 and choice or nil | |
477 end) | |
478 simple:AddChild(w) | |
479 container:AddChild(simple) | |
480 end | |
481 | |
482 w = AceGUI:Create("Spacer") w:SetFullWidth(true) w:SetHeight(10) container:AddChild(w) | |
483 | |
484 w = mkbutton("EditBox", 'comm_ident', addon.ident, | |
485 [[Set tracking to 'Disabled' in the top-right dropdown, then change this field (click Okay or press Enter).]]) | |
486 w:SetRelativeWidth(0.25) | |
487 w:SetLabel("Addon channel ID") | |
488 w:SetCallback("OnTextChanged", adv_careful_OnTextChanged) | |
489 w:SetCallback("OnEnterPressed", function(_w,event,value) | |
490 -- if they set it to blank spaces, they're boned. oh well. | |
491 -- Re-enabling will take care of propogating this new value. | |
492 addon.ident = (value == "") and "OuroLoot2" or value | |
493 _w:SetText(addon.ident) | |
494 addon:Print("Addon channel ID set to '".. addon.ident.. "' for rebroadcasting and listening.") | |
495 end) | |
496 w:SetDisabled(addon.enabled or addon.rebroadcast) | |
497 container:AddChild(w) | |
498 | |
499 w = mkbutton("EditBox", nil, addon.recent_messages.ttl, [[comm cache TTL]]) | |
500 w:SetRelativeWidth(0.1) | |
501 w:SetLabel("ttl") | |
502 w:SetCallback("OnTextChanged", adv_careful_OnTextChanged) | |
503 w:SetCallback("OnEnterPressed", function(_w,event,value) | |
504 value = tonumber(value) or addon.recent_messages.ttl | |
505 addon.recent_messages.ttl = value | |
506 _w:SetText(tostring(value)) | |
507 end) | |
508 container:AddChild(w) | |
509 | |
510 w = mkbutton("load nsaab1548", [[Cursed Darkhound]]) | |
511 w:SetRelativeWidth(0.25) | |
512 w:SetCallback("OnClick", function() | |
513 for i, v in ipairs(DBM.AddOns) do | |
514 if v.modId == "DBM-NotScaryAtAll" then | |
515 DBM:LoadMod(v) | |
516 break | |
517 end | |
518 end | |
519 local mod = DBM:GetModByName("NotScaryAtAll") | |
520 if mod then | |
521 mod:EnableMod() | |
522 addon:Print("Now tracking ID",mod.creatureId) | |
523 else | |
524 addon:Print("Can do nothing; DBM testing mod wasn't loaded.") | |
525 end | |
526 end) | |
527 w:SetDisabled(addon.bossmod_registered ~= 'DBM') | |
528 container:AddChild(w) | |
529 | |
530 w = mkbutton("GC", [[full GC cycle]]) | |
531 w:SetRelativeWidth(0.2) | |
532 w:SetCallback("OnClick", function() | |
533 local before = collectgarbage('count') | |
534 collectgarbage('collect') | |
535 local after = collectgarbage('count') | |
536 addon:Print("Collected %d KB, %d KB still in use by Lua universe.", before-after, after) | |
537 end) | |
538 container:AddChild(w) | |
539 | |
540 w = AceGUI:Create("Spacer") w:SetFullWidth(true) w:SetHeight(3) container:AddChild(w) | |
541 do | |
542 local simple = AceGUI:Create("SimpleGroup") | |
543 simple:SetLayout("Flow") | |
544 --simple:SetRelativeWidth(0.95) | |
545 simple:SetFullWidth(true) | |
546 w = mkbutton("MidS-H", [[not exactly an Easter egg, with sound]]) | |
547 w:SetRelativeWidth(0.2) | |
548 w:SetCallback("OnClick", function() | |
549 PlaySoundFile ([[Sound\Music\WorldEvents\HordeFirepole.mp3]], "Master") | |
550 end) | |
551 simple:AddChild(w) | |
552 w = mkbutton("MidS-A", [[not exactly an Easter egg, with sound]]) | |
553 w:SetRelativeWidth(0.2) | |
554 w:SetCallback("OnClick", function() | |
555 PlaySoundFile ([[Sound\Music\WorldEvents\AllianceFirepole.mp3]], "Master") | |
556 end) | |
557 simple:AddChild(w) | |
558 w = mkbutton("SFRR", [[test]]) | |
559 w:SetRelativeWidth(0.15) | |
560 w:SetCallback("OnClick", function() | |
561 PlaySoundFile ([[Interface\AddOns\Ouro_Loot\sfrr.ogg]], "Master") | |
562 end) | |
563 simple:AddChild(w) | |
564 | |
565 container:AddChild(simple) | |
566 end | |
567 | |
568 w = AceGUI:Create("Spacer") w:SetRelativeWidth(0.65) w:SetHeight(15) container:AddChild(w) | |
569 w = mkbutton("Clear All & Reload", | |
570 [[No confirmation! |cffff1010Erases absolutely all> Ouro Loot saved variables and reloads the UI.]]) | |
571 w:SetRelativeWidth(0.3) | |
572 w:SetCallback("OnClick", function() | |
573 addon:_clear_SVs() -- reloads | |
574 end) | |
575 container:AddChild(w) | |
576 | |
577 container:ResumeLayout() | |
578 container:DoLayout() | |
579 AceGUI:ClearFocus() | |
580 --container:SetScroll(1000) -- scrollframe widget's max value | |
581 end | |
582 | |
583 -- Initial advanced panel function (unless debug mode is on during load, which | |
584 -- means it was almost certainly hardcoded that way, which means it's probably | |
585 -- me testing). | |
586 if false and addon.DEBUG_PRINT then | |
587 controls.adv = adv_real | |
588 else | |
589 controls.adv = function (container) | |
590 local speedbump = AceGUI:Create("InteractiveLabel") | |
591 speedbump:SetFullWidth(true) | |
592 speedbump:SetFontObject(GameFontHighlightLarge) | |
593 speedbump:SetImage[[Interface\DialogFrame\DialogAlertIcon]] | |
594 speedbump:SetImageSize(50,50) | |
595 speedbump:SetText[[The debugging/testing settings on the advanced panel can seriously bork up the addon if you make a mistake. If you're okay with the possibility of losing data, click this warning to load the panel.]] | |
596 speedbump:SetCallback("OnClick", function (_sb) | |
597 controls.adv = { adv_real } | |
598 return addon:redisplay() | |
599 end) | |
600 container:AddChild(speedbump) | |
601 end | |
602 end | |
603 | |
604 | |
605 --------------- | |
606 -- Tab 6: Options | |
607 do | |
608 local funkified = {} | |
609 for key,f in pairs(controls) do | |
610 -- this is how TreeGroup makes unique keys | |
611 local funkykey = key:gsub('_','\001') | |
612 funkified[funkykey] = { f } | |
613 end | |
614 controls = funkified | |
615 end | |
616 | |
617 -- widget container status tables (will have things magically appear | |
618 -- inside them that we wish to preserve) | |
619 local status_for_scroll = {} | |
620 local status_for_select = { treewidth = 160 } | |
621 | |
622 -- Clicking an entry on the left tree column. | |
623 local opt_OnGroupSelected_func = function (treeg,event,category) | |
624 local catfuncs = controls[category] | |
625 if not catfuncs then | |
626 addon:horrible_horrible_error(("Category '%s' has no handler function!"):format(category:gsub('\001','_'))) | |
627 end | |
628 treeg:ReleaseChildren() | |
629 local sf = AceGUI:Create("ScrollFrame") | |
630 sf:SetStatusTable(status_for_scroll) | |
631 sf:SetLayout("Flow") | |
632 -- This forces the scrolling area to be bigger than the visible area; else | |
633 -- some of the text gets cut off without ever triggering the scrollbar. | |
634 sf.content:SetHeight(700) | |
635 for _,func in ipairs(catfuncs) do | |
636 if func(sf) then break end | |
637 end | |
638 treeg:AddChild(sf) | |
639 if treeg:GetUserData("options restore scroll") then | |
640 if status_for_scroll.scrollvalue then | |
641 sf:SetScroll(status_for_scroll.scrollvalue) | |
642 end | |
643 treeg:SetUserData("options restore scroll", false) | |
644 else | |
645 sf:SetScroll(0) | |
646 end | |
647 end | |
648 | |
649 -- Clicking the Options tab as a whole (tabs_OnGroupSelected["opt"]). | |
650 local tabs_OGS = function (container, specials) | |
651 opts = OuroLootSV_opts | |
652 | |
653 container:SetLayout("Fill") | |
654 local left = AceGUI:Create("TreeGroup") | |
655 left:SetStatusTable(status_for_select) | |
656 left:SetLayout("Fill") | |
657 left:SetFullWidth(true) | |
658 left:SetFullHeight(true) | |
659 left:EnableButtonTooltips(false) | |
660 left:SetTree(options_tree) | |
661 left:SetCallback("OnGroupSelected", opt_OnGroupSelected_func) | |
662 container:AddChild(left) | |
663 if status_for_select.selected then | |
664 left:SetUserData("options restore scroll", true) | |
665 left:SelectByValue(status_for_select.selected) | |
666 else | |
667 left:SelectByValue("basic") | |
668 end | |
669 | |
670 local w = mkbutton("ReloadUI", | |
671 [[Does what you think it does. Loot information is written out and restored.]]) | |
672 w:SetFullWidth(true) | |
673 w:SetCallback("OnClick", ReloadUI) | |
674 specials:AddChild(w) | |
675 | |
676 w = mkbutton("Ping!", | |
677 [[Queries other raid users for their addon version and current status. Results displayed on Pongs panel after five seconds.]]) | |
678 w:SetFullWidth(true) | |
679 w:SetCallback("OnClick", function(_w) | |
680 _w:SetText("5... 4... 3...") | |
681 _w:SetDisabled(true) | |
682 addon:DoPing() | |
683 addon:ScheduleTimer(function(b) | |
684 if b:IsVisible() then | |
685 return addon:redisplay() | |
686 end | |
687 end, 5, _w) | |
688 end) | |
689 specials:AddChild(w) | |
690 end | |
691 | |
692 addon:register_tab_control_AT_END ("opt", [[Options]], | |
693 [[Options for fine-tuning behavior]], tabs_OGS) | |
694 | |
695 -- vim:noet |