annotate options.lua @ 149:df0ca8ed1aff

Be smarter when joining a raid. Add some more flow-control debug printing. Given (A) joining a raid, which triggers a delayed addon load, and seeing the "what to do next" popup, and (B) restoring previous data which contains only a raid roster or generated text, fix the interaction in which the activation from (B) overrides the user's choice in (A)'s popup.
author Farmbuyer of US-Kilrogg <farmbuyer@gmail.com>
date Thu, 08 Jan 2015 15:22:27 -0500
parents 113dd7c86222
children 42dd3076baaf
rev   line source
farmbuyer@96 1 local addon = select(2,...)
farmbuyer@96 2 if addon.NOLOAD then return end
farmbuyer@96 3
farmbuyer@96 4 -- Don't bother recording any of this loot:
farmbuyer@96 5 addon.default_itemfilter = {
farmbuyer@97 6 [52190] = true, -- Inferno Ruby
farmbuyer@97 7 [52191] = true, -- Ocean Sapphire
farmbuyer@97 8 [52192] = true, -- Dream Emerald
farmbuyer@97 9 [52193] = true, -- Ember Topaz
farmbuyer@97 10 [52194] = true, -- Demonseye
farmbuyer@97 11 [52195] = true, -- Amberjewel
farmbuyer@97 12 [52722] = true, -- Maelstrom Crystal
farmbuyer@97 13 [71716] = true, -- Soothsayer's Runes
farmbuyer@133 14 [74247] = true, -- Ethereal Shard
farmbuyer@133 15 [74248] = true, -- Sha Crystal
farmbuyer@107 16
farmbuyer@96 17 -- could probably remove most of this now
farmbuyer@97 18 -- [29434] = true, -- Badge of Justice
farmbuyer@97 19 -- [40752] = true, -- Emblem of Heroism
farmbuyer@97 20 -- [40753] = true, -- Emblem of Valor
farmbuyer@97 21 -- [45624] = true, -- Emblem of Conquest
farmbuyer@97 22 -- [43228] = true, -- Stone Keeper's Shard
farmbuyer@97 23 -- [47241] = true, -- Emblem of Triumph
farmbuyer@97 24 -- [49426] = true, -- Emblem of Frost
farmbuyer@96 25 }
farmbuyer@96 26
farmbuyer@96 27 -- Mark these as straight to guild vault:
farmbuyer@96 28 addon.default_itemvault = {
farmbuyer@99 29 [52078] = true, -- Chaos Orb (Cata heroics)
farmbuyer@99 30 [69237] = true, -- Living Ember (Cata Firelands)
farmbuyer@99 31 [71998] = true, -- Essence of Destruction (Cata Dragon Soul)
farmbuyer@96 32 }
farmbuyer@96 33
farmbuyer@96 34 local options_tree = {
farmbuyer@96 35 {
farmbuyer@96 36 value = "pong",
farmbuyer@96 37 text = "Pongs",
farmbuyer@96 38 },
farmbuyer@96 39 {
farmbuyer@96 40 value = "basic",
farmbuyer@99 41 text = "Main Options",
farmbuyer@96 42 children = {
farmbuyer@96 43 {
farmbuyer@96 44 value = "filter",
farmbuyer@96 45 text = "Item Filters",
farmbuyer@96 46 },
farmbuyer@97 47 {
farmbuyer@97 48 value = "profiles",
farmbuyer@97 49 text = "Profiles",
farmbuyer@97 50 },
farmbuyer@96 51 },
farmbuyer@96 52 },
farmbuyer@99 53 'NEW INSERTIONS HERE', -- commenting this puts them all at the bottom
farmbuyer@96 54 {
farmbuyer@96 55 value = "adv",
farmbuyer@96 56 text = "Advanced/Debugging",
farmbuyer@96 57 },
farmbuyer@96 58 }
farmbuyer@96 59
farmbuyer@96 60
farmbuyer@96 61 --[[
farmbuyer@96 62 mkbutton ("WidgetType", 'display key', "Text On Widget", "mouseover status text")
farmbuyer@96 63 mkbutton ( [Button] 'display key', "Text On Widget", "mouseover status text")
farmbuyer@96 64 mkbutton ( [Button] [text] "Text On Widget", "mouseover status text")
farmbuyer@96 65 ]]
farmbuyer@96 66 local mkbutton = addon.gui_state_pointer.mkbutton
farmbuyer@96 67 local gui = addon.gui_state_pointer
farmbuyer@96 68 local AceGUI = LibStub("AceGUI-3.0")
farmbuyer@96 69 local flib = LibStub("LibFarmbuyer")
farmbuyer@138 70 local opts
farmbuyer@96 71
farmbuyer@99 72 local error, assert = addon.error, addon.assert
farmbuyer@99 73
farmbuyer@96 74 local function mktoggle (opt, label, width, desc, opt_func)
farmbuyer@102 75 local w = mkbutton("CheckBox", nil, "", desc)
farmbuyer@96 76 w:SetRelativeWidth(width)
farmbuyer@96 77 w:SetType("checkbox")
farmbuyer@96 78 w:SetLabel(label)
farmbuyer@96 79 if opt then
farmbuyer@96 80 w:SetValue(opts[opt])
farmbuyer@96 81 w:SetCallback("OnValueChanged", opt_func or (function(_w,event,value)
farmbuyer@96 82 opts[opt] = value
farmbuyer@116 83 addon.loot_clean = nil
farmbuyer@116 84 addon.hist_clean = nil
farmbuyer@96 85 end))
farmbuyer@96 86 end
farmbuyer@96 87 return w
farmbuyer@96 88 end
farmbuyer@96 89
farmbuyer@97 90 local function spacer (height)
farmbuyer@97 91 local s = AceGUI:Create("Spacer")
farmbuyer@97 92 s:SetFullWidth(true)
farmbuyer@97 93 s:SetHeight(height)
farmbuyer@97 94 return s
farmbuyer@97 95 end
farmbuyer@97 96
farmbuyer@96 97 local function mktitle (txt)
farmbuyer@96 98 local t = AceGUI:Create("Label")
farmbuyer@96 99 t:SetFullWidth(true)
farmbuyer@96 100 t:SetColor (0.19, 0.68, 1) -- cff30adff
farmbuyer@96 101 t:SetFontObject(GameFontHighlightLarge)
farmbuyer@96 102 t:SetText(txt)
farmbuyer@97 103 return t, spacer(20)
farmbuyer@96 104 end
farmbuyer@96 105
farmbuyer@96 106 local function adv_careful_OnTextChanged (ebox,event,value)
farmbuyer@96 107 -- The EditBox widget's code will call an internal ShowButton routine
farmbuyer@96 108 -- after this callback returns. ShowButton will test for this flag:
farmbuyer@96 109 ebox:DisableButton (value == "")
farmbuyer@96 110 end
farmbuyer@96 111
farmbuyer@96 112
farmbuyer@96 113 ---------------
farmbuyer@96 114 -- All controls take a scrollframe container set to Flow layout.
farmbuyer@96 115 local controls = {}
farmbuyer@96 116 controls.pong = function (container)
farmbuyer@96 117 container:AddChildren(mktitle[[Echoes from latest ping:]])
farmbuyer@96 118 addon.sender_list.sort()
farmbuyer@96 119 if #addon.sender_list.namesI > 0 then
farmbuyer@96 120 local w = AceGUI:Create("Label")
farmbuyer@96 121 w:SetFullWidth(true)
farmbuyer@96 122 w:SetText(table.concat(addon.sender_list.namesI,'\n')) -- sigh
farmbuyer@96 123 container:AddChild(w)
farmbuyer@96 124 end
farmbuyer@96 125 end
farmbuyer@96 126
farmbuyer@96 127
farmbuyer@96 128 ---------------
farmbuyer@96 129 controls.basic = function (container)
farmbuyer@96 130 container:AddChildren(mktitle[[Account Options (saved across sessions)]])
farmbuyer@96 131
farmbuyer@96 132 container:PauseLayout()
farmbuyer@96 133 local w
farmbuyer@96 134 local stdw = 0.99 -- standard width
farmbuyer@96 135
farmbuyer@96 136 -- the nubtoggle!
farmbuyer@96 137 w = mktoggle('gui_noob', [[Show UI Tips]], stdw,
farmbuyer@96 138 [[Toggles display of the "helpful tips" box hanging off the right side. Useful if you've just installed/upgraded.]])
farmbuyer@115 139 w:SetImage[[Interface\OptionsFrame\UI-OptionsFrame-NewFeatureIcon]]
farmbuyer@96 140 container:AddChild(w)
farmbuyer@96 141
farmbuyer@96 142 -- reminder popup
farmbuyer@96 143 w = mktoggle('popup_on_join', "Show reminder popup on new raid", stdw,
farmbuyer@96 144 [[When joining a raid and not already tracking, display a dialog asking for instructions.]])
farmbuyer@96 145 container:AddChild(w)
farmbuyer@96 146
farmbuyer@96 147 -- toggle scroll-to-bottom on first tab
farmbuyer@96 148 w = mktoggle('scroll_to_bottom', "Scroll to bottom when opening display", stdw,
farmbuyer@96 149 [[Scroll to the bottom of the loot window (most recent entries) when displaying the GUI.]])
farmbuyer@96 150 container:AddChild(w)
farmbuyer@96 151
farmbuyer@96 152 -- chatty boss mode
farmbuyer@96 153 w = mktoggle('chatty_on_kill', "Be chatty on boss kill", stdw,
farmbuyer@96 154 [[Print something to chat output when the boss mod tells Ouro Loot about a successful boss kill.]])
farmbuyer@96 155 container:AddChild(w)
farmbuyer@96 156
farmbuyer@96 157 -- less noise in main panel
farmbuyer@96 158 w = mktoggle('no_tracking_wipes', "Do not track wipes", stdw,
farmbuyer@96 159 [[Do not add 'wipe' entries on the main loot grid, or generate any text for them.]])
farmbuyer@96 160 container:AddChild(w)
farmbuyer@96 161
farmbuyer@96 162 -- cutesy abbrevs
farmbuyer@96 163 w = mktoggle('snarky_boss', "Use snarky boss names", stdw,
farmbuyer@96 164 [[Irreverent replacement names for boss events. See abbreviations.lua for details.]])
farmbuyer@96 165 container:AddChild(w)
farmbuyer@96 166
farmbuyer@114 167 -- auto-GOP mode when in LFR
farmbuyer@114 168 w = mktoggle('history_suppress_LFR', "Suppress history in LFR", stdw,
farmbuyer@114 169 [[Do not record anything at all in the History tab while in an LFR raid. Changes only take effect outside of LFR.]])
farmbuyer@114 170 container:AddChild(w)
farmbuyer@114 171
farmbuyer@114 172 -- ignore cross realm players in history
farmbuyer@114 173 w = mktoggle('history_ignore_xrealm', "Suppress history for cross-realm players",
farmbuyer@114 174 stdw,
farmbuyer@114 175 [[Do not record anything in the History tab for players from other realms.]])
farmbuyer@114 176 container:AddChild(w)
farmbuyer@114 177
farmbuyer@148 178 do
farmbuyer@148 179 -- LOD plugins unloadable for reasons other than disabling
farmbuyer@148 180 local w_un = mktoggle('display_unusable_LODs', "Include unusable plugins", stdw,
farmbuyer@148 181 [[Show plugins even if they are flagged for reasons besides simply being disabled. Relog to take effect.]])
farmbuyer@148 182
farmbuyer@148 183 -- LOD plugins disabled in the addons menu
farmbuyer@148 184 w = mktoggle('display_disabled_LODs', "Include disabled plugins", stdw,
farmbuyer@148 185 [[Show loadable plugins even if they've been disabled (and offer to enable them if clicked).]],
farmbuyer@148 186 function (_w,_,value)
farmbuyer@148 187 opts.display_disabled_LODs = value
farmbuyer@148 188 w_un:SetDisabled(not opts.display_disabled_LODs)
farmbuyer@148 189 addon.loot_clean = nil
farmbuyer@148 190 addon.hist_clean = nil
farmbuyer@148 191 addon:_gui_add_disabled_LOD_tabs()
farmbuyer@148 192 end)
farmbuyer@148 193
farmbuyer@148 194 w_un:SetDisabled(not opts.display_disabled_LODs)
farmbuyer@148 195 container:AddChild(w)
farmbuyer@148 196 container:AddChild(w_un)
farmbuyer@148 197 end
farmbuyer@96 198
farmbuyer@96 199 -- showing the "(from Rebroadcasterdude)" in the notes column
farmbuyer@96 200 w = mktoggle('display_bcast_from', "Show rebroadcasting player", stdw,
farmbuyer@116 201 [[Include "from PlayerName" in the Notes column for loot that was broadcast to you. (Not included in forum output).]])--[[
farmbuyer@96 202 function(_w,_e,value)
farmbuyer@96 203 opts.display_bcast_from = value
farmbuyer@96 204 addon.loot_clean = nil
farmbuyer@116 205 end)]]
farmbuyer@96 206 container:AddChild(w)
farmbuyer@96 207
farmbuyer@96 208 -- prefilling g_uniques with history
farmbuyer@96 209 w = mktoggle('precache_history_uniques', "Prescan for faster handling", stdw,
farmbuyer@96 210 [[See description under +Help -- Handy Tips -- Prescanning> for instructions.]])
farmbuyer@96 211 container:AddChild(w)
farmbuyer@96 212
farmbuyer@97 213 container:AddChild(spacer(10))
farmbuyer@96 214 -- possible keybindings
farmbuyer@96 215 do
farmbuyer@96 216 local pair = AceGUI:Create("InlineGroup")
farmbuyer@96 217 pair:SetLayout("List")
farmbuyer@96 218 pair:SetRelativeWidth(0.49)
farmbuyer@104 219 pair:SetTitle('Keybinding for "/ouroloot toggle"')
farmbuyer@104 220 local checkbox, button
farmbuyer@96 221 checkbox = mktoggle('keybinding', "Register keybinding", 1,
farmbuyer@104 222 [[Whether to register a keybinding to toggle the loot display. Relog to take effect.]],
farmbuyer@96 223 function (_w,_,value)
farmbuyer@96 224 opts.keybinding = value
farmbuyer@104 225 button:SetDisabled(not opts.keybinding)
farmbuyer@96 226 end)
farmbuyer@96 227 checkbox:SetFullWidth(true)
farmbuyer@104 228 button = mkbutton("Keybinding", nil, "",
farmbuyer@104 229 -- This wording is not quite accurate, but auto-l10n is nice.
farmbuyer@104 230 _G.BIND_KEY_TO_COMMAND:format([['/ouroloot toggle']]))
farmbuyer@104 231 button:SetFullWidth(true)
farmbuyer@104 232 --button:SetLabel("this is label text")
farmbuyer@104 233 button:SetKey(opts.keybinding_text)
farmbuyer@104 234 button:SetCallback("OnKeyChanged", function(_b,event,value)
farmbuyer@104 235 local possible_prev = opts.keybinding_text
farmbuyer@104 236 opts.keybinding_text = value
farmbuyer@104 237 -- If they were already binding something at login, try updating.
farmbuyer@104 238 if not _G.OuroLootBindingOpen then return end
farmbuyer@104 239 if possible_prev and #possible_prev > 0 then
farmbuyer@104 240 addon:Print("Trying to unbind previous %s key.", possible_prev)
farmbuyer@104 241 SetBinding (possible_prev, nil)
farmbuyer@104 242 end
farmbuyer@104 243 if value and #value > 0 then
farmbuyer@104 244 addon:Print("Trying to bind new %s key.", value)
farmbuyer@104 245 if SetBindingClick (value, "OuroLootBindingOpen") then
farmbuyer@104 246 local c = GetCurrentBindingSet()
farmbuyer@104 247 if c == ACCOUNT_BINDINGS or c == CHARACTER_BINDINGS then
farmbuyer@104 248 SaveBindings(c)
farmbuyer@104 249 end
farmbuyer@104 250 end
farmbuyer@104 251 end
farmbuyer@104 252 end)
farmbuyer@122 253 pair:AddChildren (checkbox, button)
farmbuyer@96 254 container:AddChild(pair)
farmbuyer@96 255 end
farmbuyer@96 256
farmbuyer@96 257 -- replacement for slashloot
farmbuyer@96 258 do
farmbuyer@96 259 local pair = AceGUI:Create("InlineGroup")
farmbuyer@96 260 pair:SetLayout("List")
farmbuyer@96 261 pair:SetRelativeWidth(0.49)
farmbuyer@96 262 pair:SetTitle('Synonyms for "/ouroloot"')
farmbuyer@96 263 local editbox, checkbox
farmbuyer@96 264 editbox = mkbutton("EditBox", nil, opts.slash_synonyms,
farmbuyer@96 265 [[Separate multiple synonyms with a comma. Relog to take effect.]])
farmbuyer@96 266 editbox:SetFullWidth(true)
farmbuyer@96 267 editbox:SetLabel("Slash commands")
farmbuyer@96 268 editbox:SetCallback("OnEnterPressed", function(_e,event,value)
farmbuyer@96 269 -- Do the sanity checking here rather than at each login.
farmbuyer@96 270 -- This is not foolproof. That's okay.
farmbuyer@96 271 local t = { strsplit(',', tostring(value)) }
farmbuyer@96 272 for k,v in ipairs(t) do
farmbuyer@96 273 v = v:trim()
farmbuyer@96 274 if v:sub(1,1) ~= "/" then
farmbuyer@96 275 v = "/" .. v
farmbuyer@96 276 end
farmbuyer@96 277 t[k] = v
farmbuyer@96 278 end
farmbuyer@96 279 value = table.concat(t,',')
farmbuyer@96 280 _e:SetText(value)
farmbuyer@96 281 opts.slash_synonyms = value
farmbuyer@96 282 end)
farmbuyer@96 283 editbox:SetDisabled(not opts.register_slash_synonyms)
farmbuyer@96 284 checkbox = mktoggle('register_slash_synonyms', "Register slash commands", 1,
farmbuyer@96 285 [[Register these slash commands as synonyms for "/ouroloot". Relog to take effect.]],
farmbuyer@96 286 function (_w,_,value)
farmbuyer@96 287 opts.register_slash_synonyms = value
farmbuyer@96 288 editbox:SetDisabled(not opts.register_slash_synonyms)
farmbuyer@96 289 end)
farmbuyer@96 290 checkbox:SetFullWidth(true)
farmbuyer@96 291 pair:AddChild(checkbox)
farmbuyer@96 292 pair:AddChild(editbox)
farmbuyer@96 293 container:AddChild(pair)
farmbuyer@96 294 end
farmbuyer@96 295
farmbuyer@96 296 -- chatty disposition/assignment changes
farmbuyer@97 297 container:AddChild(spacer(10))
farmbuyer@96 298 do
farmbuyer@96 299 local chatgroup = AceGUI:Create("InlineGroup")
farmbuyer@96 300 chatgroup:SetLayout("List")
farmbuyer@96 301 chatgroup:SetRelativeWidth(0.75)
farmbuyer@101 302 chatgroup:SetTitle("Notify on Changes Chat")
farmbuyer@96 303 local toggle, editbox
farmbuyer@96 304 toggle = mktoggle('chatty_on_remote_changes', "Be chatty on remote changes", 1,
farmbuyer@96 305 [[Print something to chat when other users change recorded loot.]],
farmbuyer@96 306 function (_w,_,value)
farmbuyer@96 307 opts.chatty_on_remote_changes = value
farmbuyer@101 308 editbox:SetDisabled((not opts.chatty_on_remote_changes) and
farmbuyer@101 309 (not opts.chatty_on_local_changes))
farmbuyer@96 310 end)
farmbuyer@96 311 toggle:SetFullWidth(true)
farmbuyer@96 312 chatgroup:AddChild(toggle)
farmbuyer@101 313 toggle = mktoggle('chatty_on_local_changes', "Be chatty on your own changes", 1,
farmbuyer@101 314 [[Print something to chat when you change recorded loot (as a reminder).]],
farmbuyer@101 315 function (_w,_,value)
farmbuyer@101 316 opts.chatty_on_local_changes = value
farmbuyer@101 317 editbox:SetDisabled((not opts.chatty_on_remote_changes) and
farmbuyer@101 318 (not opts.chatty_on_local_changes))
farmbuyer@101 319 end)
farmbuyer@101 320 toggle:SetFullWidth(true)
farmbuyer@101 321 chatgroup:AddChild(toggle)
farmbuyer@101 322
farmbuyer@96 323 w = AceGUI:Create("Label")
farmbuyer@96 324 w:SetFullWidth(true)
farmbuyer@103 325 w:SetText("This controls the output of the two |cff00ffff'Be chatty on <X> changes'|r options. 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.")
farmbuyer@96 326 chatgroup:AddChild(w)
farmbuyer@101 327 editbox = mkbutton("EditBox", nil, opts.chatty_on_changes_frame,
farmbuyer@96 328 [[1 = default chat frame, 2 = combat log, etc]])
farmbuyer@96 329 editbox:SetFullWidth(true)
farmbuyer@96 330 editbox:SetLabel("Output Chatframe")
farmbuyer@96 331 editbox:SetCallback("OnTextChanged", adv_careful_OnTextChanged)
farmbuyer@96 332 editbox:SetCallback("OnEnterPressed", function(_w,event,value)
farmbuyer@101 333 local prev = opts.chatty_on_changes_frame
farmbuyer@96 334 value = value:trim()
farmbuyer@96 335 value = tonumber(value) or value
farmbuyer@101 336 if addon:_set_chatty_change_chatframe (value) then
farmbuyer@101 337 opts.chatty_on_changes_frame = value
farmbuyer@96 338 _w:SetText(tostring(value))
farmbuyer@96 339 _w.editbox:ClearFocus()
farmbuyer@96 340 else
farmbuyer@96 341 _w:SetText(tostring(prev))
farmbuyer@96 342 end
farmbuyer@96 343 end)
farmbuyer@101 344 editbox:SetDisabled((not opts.chatty_on_remote_changes) and
farmbuyer@101 345 (not opts.chatty_on_local_changes))
farmbuyer@96 346 chatgroup:AddChild(editbox)
farmbuyer@96 347 w = mkbutton("Chat Frame Numbers",
farmbuyer@96 348 [[Print each chat window number in its own frame, for easy reference in the editing field.]])
farmbuyer@96 349 w:SetFullWidth(true)
farmbuyer@96 350 w:SetCallback("OnClick", function()
farmbuyer@96 351 for i = 1, NUM_CHAT_WINDOWS do
farmbuyer@96 352 local cf = _G['ChatFrame'..i]
farmbuyer@96 353 if not cf then break end
farmbuyer@96 354 addon:CFPrint (cf, "This is frame number |cffff0000%d|r.", i)
farmbuyer@96 355 end
farmbuyer@96 356 end)
farmbuyer@96 357 chatgroup:AddChild(w)
farmbuyer@96 358 container:AddChild(chatgroup)
farmbuyer@96 359 end
farmbuyer@96 360
farmbuyer@96 361 -- boss mod selection
farmbuyer@97 362 container:AddChild(spacer(2))
farmbuyer@96 363 do
farmbuyer@96 364 local list = {}
farmbuyer@96 365 local current
farmbuyer@96 366 for k,v in ipairs(addon.bossmods) do
farmbuyer@96 367 list[k] = v.n
farmbuyer@96 368 if v.n == opts.bossmod then
farmbuyer@96 369 current = k
farmbuyer@96 370 end
farmbuyer@96 371 end
farmbuyer@96 372 w = mkbutton("Dropdown", nil, "", [[Which 'boss mod' to use.]])
farmbuyer@96 373 w:SetRelativeWidth(0.3)
farmbuyer@96 374 w:SetLabel("Boss Mod:")
farmbuyer@96 375 w:SetList(list)
farmbuyer@96 376 w:SetValue(current)
farmbuyer@96 377 w:SetCallback("OnValueChanged", function(_w,event,choice)
farmbuyer@96 378 opts.bossmod = list[choice]
farmbuyer@96 379 end)
farmbuyer@96 380 container:AddChild(w)
farmbuyer@96 381 end
farmbuyer@96 382
farmbuyer@96 383 container:ResumeLayout()
farmbuyer@96 384 container:DoLayout()
farmbuyer@96 385 AceGUI:ClearFocus()
farmbuyer@96 386 end
farmbuyer@96 387
farmbuyer@96 388
farmbuyer@96 389 ---------------
farmbuyer@96 390 do
farmbuyer@105 391 local description = [[These control automatic handling of specific items when they are looted.
farmbuyer@105 392
farmbuyer@105 393 "Item filter" is a list of items to ignore. "Vault items" is a list of items to mark as going to the guild vault (as if you had chosen "Mark as guild vault" from the Loot tab).
farmbuyer@97 394
farmbuyer@97 395 Proper use of these lists can avoid a lot of noise and tedious clicking during or after a raid. You will probably need to add/remove entries as you advance between expansions and tiers.]]
farmbuyer@97 396 local defaultstext = [[Clicking this button adds some reasonable defaults to your item lists. (This was done once automatically, the first time you loaded Ouro Loot, but you can delete them at any time.)]]
farmbuyer@97 397
farmbuyer@96 398 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.]]
farmbuyer@96 399 local cache_warn, cache_warned = false, false
farmbuyer@96 400 local function do_warning (cnt)
farmbuyer@96 401 if cache_warn and not cache_warned then
farmbuyer@96 402 cache_warned = true
farmbuyer@96 403 addon:Print(warntext)
farmbuyer@96 404 local t = AceGUI:Create("Label")
farmbuyer@96 405 t:SetFullWidth(true)
farmbuyer@96 406 t:SetText(warntext)
farmbuyer@96 407 cnt:AddChild(t)
farmbuyer@96 408 end
farmbuyer@96 409 end
farmbuyer@96 410
farmbuyer@96 411 controls.basic_filter = function (container)
farmbuyer@96 412 container:AddChildren(mktitle[[Item-Specific Special Handling]])
farmbuyer@96 413
farmbuyer@97 414 local w = AceGUI:Create("Label")
farmbuyer@97 415 w:SetFullWidth(true)
farmbuyer@97 416 w:SetText(description)
farmbuyer@97 417 container:AddChild(w)
farmbuyer@97 418 container:AddChild(spacer(20))
farmbuyer@97 419
farmbuyer@96 420 cache_warn, cache_warned = false, false
farmbuyer@96 421 local filterlist, vaultlist = {}, {}
farmbuyer@96 422 for id in pairs(opts.itemfilter) do
farmbuyer@96 423 local iname, _, iquality = GetItemInfo(id)
farmbuyer@96 424 if iname then
farmbuyer@96 425 filterlist[id] = ITEM_QUALITY_COLORS[iquality].hex .. iname .. "|r"
farmbuyer@96 426 else
farmbuyer@96 427 filterlist[id] = id
farmbuyer@96 428 cache_warn = true
farmbuyer@96 429 end
farmbuyer@96 430 end
farmbuyer@96 431 for id in pairs(opts.itemvault) do
farmbuyer@96 432 local iname, _, iquality = GetItemInfo(id)
farmbuyer@96 433 if iname then
farmbuyer@96 434 vaultlist[id] = ITEM_QUALITY_COLORS[iquality].hex .. iname .. "|r"
farmbuyer@96 435 else
farmbuyer@96 436 vaultlist[id] = id
farmbuyer@96 437 cache_warn = true
farmbuyer@96 438 end
farmbuyer@96 439 end
farmbuyer@97 440 -- This is so that the "add all defaults" button will never, ever,
farmbuyer@97 441 -- trip over cache misses.
farmbuyer@97 442 for id in pairs(addon.default_itemfilter) do GetItemInfo(id) end
farmbuyer@97 443 for id in pairs(addon.default_itemvault) do GetItemInfo(id) end
farmbuyer@96 444
farmbuyer@97 445 w = AceGUI:Create("EditBoxDropDown")
farmbuyer@96 446 w:SetRelativeWidth(0.4)
farmbuyer@96 447 w:SetText("Item filter")
farmbuyer@96 448 w:SetEditBoxTooltip("Link items which should no longer be tracked.")
farmbuyer@96 449 w:SetList(filterlist)
farmbuyer@96 450 w:SetCallback("OnTextEnterPressed", function(_w, _, text)
farmbuyer@96 451 local iname, ilink, iquality = GetItemInfo(text:trim())
farmbuyer@96 452 if not iname then
farmbuyer@96 453 return addon:Print("Error: %s is not a valid item name/link!", text)
farmbuyer@96 454 end
farmbuyer@96 455 local id = tonumber(ilink:match("item:(%d+)"))
farmbuyer@96 456 filterlist[id] = ITEM_QUALITY_COLORS[iquality].hex .. iname .. "|r"
farmbuyer@96 457 opts.itemfilter[id] = true
farmbuyer@96 458 addon:Print("Now filtering out", ilink)
farmbuyer@96 459 end)
farmbuyer@96 460 w:SetCallback("OnListItemClicked", function(_w, _, key_id, val_name)
farmbuyer@96 461 --local ilink = select(2,GetItemInfo(key_id))
farmbuyer@96 462 opts.itemfilter[tonumber(key_id)] = nil
farmbuyer@96 463 --addon:Print("No longer filtering out", ilink)
farmbuyer@96 464 addon:Print("No longer filtering out", val_name)
farmbuyer@96 465 end)
farmbuyer@96 466 w:SetCallback("OnDropdownShown", function()
farmbuyer@96 467 do_warning(container)
farmbuyer@96 468 end)
farmbuyer@96 469 container:AddChild(w)
farmbuyer@96 470
farmbuyer@96 471 w = AceGUI:Create("Spacer")
farmbuyer@96 472 w:SetRelativeWidth(0.1)
farmbuyer@96 473 w:SetHeight(2)
farmbuyer@96 474 container:AddChild(w)
farmbuyer@96 475
farmbuyer@96 476 w = AceGUI:Create("EditBoxDropDown")
farmbuyer@96 477 w:SetRelativeWidth(0.4)
farmbuyer@96 478 w:SetText("Vault items")
farmbuyer@96 479 w:SetEditBoxTooltip("Link items which should be automatically marked as guild vault.")
farmbuyer@96 480 w:SetList(vaultlist)
farmbuyer@96 481 w:SetCallback("OnTextEnterPressed", function(_w, _, text)
farmbuyer@96 482 local iname, ilink, iquality = GetItemInfo(text:trim())
farmbuyer@96 483 if not iname then
farmbuyer@96 484 return addon:Print("Error: %s is not a valid item name/link!", text)
farmbuyer@96 485 end
farmbuyer@96 486 local id = tonumber(ilink:match("item:(%d+)"))
farmbuyer@96 487 vaultlist[id] = ITEM_QUALITY_COLORS[iquality].hex .. iname .. "|r"
farmbuyer@96 488 opts.itemvault[id] = true
farmbuyer@96 489 addon:Print("Now auto-vaulting", ilink)
farmbuyer@96 490 end)
farmbuyer@96 491 w:SetCallback("OnListItemClicked", function(_w, _, key_id, val_name)
farmbuyer@96 492 --local ilink = select(2,GetItemInfo(key_id))
farmbuyer@96 493 opts.itemfilter[tonumber(key_id)] = nil
farmbuyer@96 494 --addon:Print("No longer filtering out", ilink)
farmbuyer@96 495 addon:Print("No longer auto-vaulting", val_name)
farmbuyer@96 496 end)
farmbuyer@96 497 w:SetCallback("OnDropdownShown",do_warning)
farmbuyer@96 498 container:AddChild(w)
farmbuyer@97 499
farmbuyer@97 500 local function MAYBE_ADD (destname, dest, id)
farmbuyer@97 501 local name, link = GetItemInfo(id)
farmbuyer@97 502 if not name then
farmbuyer@97 503 addon:Print("> No data on ID %d, this may be a bug.",id)
farmbuyer@97 504 return
farmbuyer@97 505 end
farmbuyer@97 506 if dest[id] then
farmbuyer@97 507 addon:Print("> Skipping %s as it's already in '%s' list.",
farmbuyer@97 508 link, destname)
farmbuyer@97 509 else
farmbuyer@97 510 dest[id] = true
farmbuyer@97 511 addon:Print("> Added %s to '%s' list.", link, destname)
farmbuyer@97 512 end
farmbuyer@97 513 end
farmbuyer@97 514
farmbuyer@97 515 container:AddChild(spacer(40))
farmbuyer@97 516 w = AceGUI:Create("Label")
farmbuyer@97 517 w:SetFullWidth(true)
farmbuyer@97 518 w:SetText(defaultstext)
farmbuyer@97 519 container:AddChild(w)
farmbuyer@97 520 w = AceGUI:Create("Button")
farmbuyer@97 521 w:SetRelativeWidth(0.4)
farmbuyer@97 522 w:SetText[[Add Default Entries]]
farmbuyer@97 523 w:SetCallback("OnClick", function()
farmbuyer@97 524 for id in pairs(addon.default_itemfilter) do
farmbuyer@97 525 MAYBE_ADD ("filter", opts.itemfilter, id)
farmbuyer@97 526 end
farmbuyer@97 527 for id in pairs(addon.default_itemvault) do
farmbuyer@97 528 MAYBE_ADD ("vault", opts.itemvault, id)
farmbuyer@97 529 end
farmbuyer@97 530 addon:redisplay()
farmbuyer@97 531 end)
farmbuyer@97 532 container:AddChild(w)
farmbuyer@97 533 end
farmbuyer@97 534 end
farmbuyer@97 535
farmbuyer@97 536
farmbuyer@97 537 ---------------
farmbuyer@97 538 do
farmbuyer@97 539 local profiles
farmbuyer@97 540 controls.basic_profiles = function (container)
farmbuyer@97 541 if not profiles then
farmbuyer@97 542 profiles = LibStub("AceDBOptions-3.0"):GetOptionsTable(addon.db)
farmbuyer@97 543 LibStub("AceConfig-3.0"):RegisterOptionsTable("OuroLootProfiles", profiles)
farmbuyer@97 544 end
farmbuyer@97 545 LibStub("AceConfigDialog-3.0"):Open ("OuroLootProfiles", container)
farmbuyer@96 546 end
farmbuyer@96 547 end
farmbuyer@96 548
farmbuyer@96 549
farmbuyer@96 550 ---------------
farmbuyer@96 551 local adv_real = function (container)
farmbuyer@96 552 container:AddChildren(mktitle[[Debugging Options (not saved across sessions)]])
farmbuyer@96 553
farmbuyer@96 554 container:PauseLayout()
farmbuyer@96 555 local w
farmbuyer@96 556
farmbuyer@96 557 do
farmbuyer@96 558 local grp = AceGUI:Create("InlineGroup")
farmbuyer@96 559 grp:SetLayout("List")
farmbuyer@96 560 grp:SetRelativeWidth(0.60)
farmbuyer@96 561 grp:SetTitle("Output of debugging messages")
farmbuyer@96 562
farmbuyer@102 563 w = AceGUI:Create("CheckBox")
farmbuyer@96 564 w:SetFullWidth(true)
farmbuyer@96 565 w:SetType("checkbox")
farmbuyer@96 566 w:SetLabel("master toggle")
farmbuyer@96 567 w:SetValue(addon.DEBUG_PRINT)
farmbuyer@96 568 w:SetCallback("OnValueChanged", function(_w,event,value)
farmbuyer@96 569 addon.DEBUG_PRINT = value
farmbuyer@96 570 addon:redisplay()
farmbuyer@96 571 end)
farmbuyer@96 572 grp:AddChild(w)
farmbuyer@96 573 for d,v in pairs(addon.debug) do
farmbuyer@102 574 w = AceGUI:Create("CheckBox")
farmbuyer@96 575 w:SetFullWidth(true)
farmbuyer@96 576 w:SetType("checkbox")
farmbuyer@96 577 w:SetLabel(d)
farmbuyer@96 578 if d == "notraid" then
farmbuyer@135 579 w:SetDescription[[Tick this before manually enabling to make the addon work outside of raid groups]]
farmbuyer@96 580 else
farmbuyer@96 581 if d == "alsolog" then
farmbuyer@96 582 w:SetDescription[[Also log all debug messages to disk. See print_log.lua in the addon folder for later viewing.]]
farmbuyer@96 583 end
farmbuyer@96 584 w:SetDisabled(not addon.DEBUG_PRINT)
farmbuyer@96 585 end
farmbuyer@96 586 w:SetValue(v)
farmbuyer@100 587 w:SetCallback("OnValueChanged", function(_w,event,value)
farmbuyer@100 588 addon.debug[d] = value
farmbuyer@100 589 if d == "comm" then
farmbuyer@100 590 addon.is_guilded = _G.IsInGuild()
farmbuyer@100 591 end
farmbuyer@100 592 end)
farmbuyer@96 593 grp:AddChild(w)
farmbuyer@96 594 end
farmbuyer@96 595 container:AddChild(grp)
farmbuyer@96 596 end
farmbuyer@96 597
farmbuyer@96 598 do
farmbuyer@96 599 local simple = AceGUI:Create("SimpleGroup")
farmbuyer@96 600 simple:SetLayout("List")
farmbuyer@96 601 simple:SetRelativeWidth(0.35)
farmbuyer@102 602 w = AceGUI:Create("CheckBox")
farmbuyer@96 603 --w:SetRelativeWidth(0.35)
farmbuyer@96 604 w:SetFullWidth(true)
farmbuyer@96 605 w:SetType("checkbox")
farmbuyer@96 606 w:SetLabel("GOP history mode")
farmbuyer@96 607 w:SetValue(addon.history_suppress)
farmbuyer@96 608 w:SetCallback("OnValueChanged", function(_w,event,value) addon.history_suppress = value end)
farmbuyer@96 609 simple:AddChild(w)
farmbuyer@96 610 w = mkbutton("Dropdown", nil, "",
farmbuyer@96 611 [[if active, tooltip shown when hovering over Item column only]])
farmbuyer@96 612 --w:SetRelativeWidth(0.4)
farmbuyer@96 613 w:SetFullWidth(true)
farmbuyer@96 614 w:SetLabel("loot debugging tooltip")
farmbuyer@96 615 w:SetList{
farmbuyer@96 616 [1] = "Off",
farmbuyer@96 617 [2] = "/dump into tooltip",
farmbuyer@96 618 [3] = "small fixed fields",
farmbuyer@96 619 }
farmbuyer@96 620 w:SetValue(gui._do_debugging_tooltip or 1)
farmbuyer@96 621 w:SetCallback("OnValueChanged", function(_w,event,choice)
farmbuyer@96 622 gui._do_debugging_tooltip = choice > 1 and choice or nil
farmbuyer@96 623 end)
farmbuyer@96 624 simple:AddChild(w)
farmbuyer@96 625 container:AddChild(simple)
farmbuyer@96 626 end
farmbuyer@96 627
farmbuyer@97 628 container:AddChild(spacer(10))
farmbuyer@96 629
farmbuyer@96 630 w = mkbutton("EditBox", 'comm_ident', addon.ident,
farmbuyer@96 631 [[Set tracking to 'Disabled' in the top-right dropdown, then change this field (click Okay or press Enter).]])
farmbuyer@96 632 w:SetRelativeWidth(0.25)
farmbuyer@96 633 w:SetLabel("Addon channel ID")
farmbuyer@96 634 w:SetCallback("OnTextChanged", adv_careful_OnTextChanged)
farmbuyer@96 635 w:SetCallback("OnEnterPressed", function(_w,event,value)
farmbuyer@96 636 -- if they set it to blank spaces, they're boned. oh well.
farmbuyer@96 637 -- Re-enabling will take care of propogating this new value.
farmbuyer@96 638 addon.ident = (value == "") and "OuroLoot2" or value
farmbuyer@96 639 _w:SetText(addon.ident)
farmbuyer@96 640 addon:Print("Addon channel ID set to '".. addon.ident.. "' for rebroadcasting and listening.")
farmbuyer@96 641 end)
farmbuyer@96 642 w:SetDisabled(addon.enabled or addon.rebroadcast)
farmbuyer@96 643 container:AddChild(w)
farmbuyer@96 644
farmbuyer@96 645 w = mkbutton("EditBox", nil, addon.recent_messages.ttl, [[comm cache TTL]])
farmbuyer@96 646 w:SetRelativeWidth(0.1)
farmbuyer@96 647 w:SetLabel("ttl")
farmbuyer@96 648 w:SetCallback("OnTextChanged", adv_careful_OnTextChanged)
farmbuyer@96 649 w:SetCallback("OnEnterPressed", function(_w,event,value)
farmbuyer@96 650 value = tonumber(value) or addon.recent_messages.ttl
farmbuyer@96 651 addon.recent_messages.ttl = value
farmbuyer@96 652 _w:SetText(tostring(value))
farmbuyer@96 653 end)
farmbuyer@96 654 container:AddChild(w)
farmbuyer@96 655
farmbuyer@96 656 w = mkbutton("load nsaab1548", [[Cursed Darkhound]])
farmbuyer@96 657 w:SetRelativeWidth(0.25)
farmbuyer@96 658 w:SetCallback("OnClick", function()
farmbuyer@96 659 for i, v in ipairs(DBM.AddOns) do
farmbuyer@96 660 if v.modId == "DBM-NotScaryAtAll" then
farmbuyer@96 661 DBM:LoadMod(v)
farmbuyer@96 662 break
farmbuyer@96 663 end
farmbuyer@96 664 end
farmbuyer@96 665 local mod = DBM:GetModByName("NotScaryAtAll")
farmbuyer@96 666 if mod then
farmbuyer@96 667 mod:EnableMod()
farmbuyer@96 668 addon:Print("Now tracking ID",mod.creatureId)
farmbuyer@96 669 else
farmbuyer@96 670 addon:Print("Can do nothing; DBM testing mod wasn't loaded.")
farmbuyer@96 671 end
farmbuyer@96 672 end)
farmbuyer@102 673 w:SetDisabled(addon.bossmod_registered ~= 'DBM') -- set by :Activate
farmbuyer@96 674 container:AddChild(w)
farmbuyer@96 675
farmbuyer@96 676 w = mkbutton("GC", [[full GC cycle]])
farmbuyer@96 677 w:SetRelativeWidth(0.2)
farmbuyer@96 678 w:SetCallback("OnClick", function()
farmbuyer@96 679 local before = collectgarbage('count')
farmbuyer@96 680 collectgarbage('collect')
farmbuyer@96 681 local after = collectgarbage('count')
farmbuyer@96 682 addon:Print("Collected %d KB, %d KB still in use by Lua universe.", before-after, after)
farmbuyer@96 683 end)
farmbuyer@96 684 container:AddChild(w)
farmbuyer@96 685
farmbuyer@97 686 container:AddChild(spacer(3))
farmbuyer@96 687 do
farmbuyer@96 688 local simple = AceGUI:Create("SimpleGroup")
farmbuyer@96 689 simple:SetLayout("Flow")
farmbuyer@96 690 --simple:SetRelativeWidth(0.95)
farmbuyer@96 691 simple:SetFullWidth(true)
farmbuyer@96 692 w = mkbutton("MidS-H", [[not exactly an Easter egg, with sound]])
farmbuyer@96 693 w:SetRelativeWidth(0.2)
farmbuyer@138 694 w:SetCallback("OnClick", function()
farmbuyer@96 695 PlaySoundFile ([[Sound\Music\WorldEvents\HordeFirepole.mp3]], "Master")
farmbuyer@96 696 end)
farmbuyer@96 697 simple:AddChild(w)
farmbuyer@96 698 w = mkbutton("MidS-A", [[not exactly an Easter egg, with sound]])
farmbuyer@96 699 w:SetRelativeWidth(0.2)
farmbuyer@138 700 w:SetCallback("OnClick", function()
farmbuyer@96 701 PlaySoundFile ([[Sound\Music\WorldEvents\AllianceFirepole.mp3]], "Master")
farmbuyer@96 702 end)
farmbuyer@96 703 simple:AddChild(w)
farmbuyer@96 704 w = mkbutton("SFRR", [[test]])
farmbuyer@96 705 w:SetRelativeWidth(0.15)
farmbuyer@138 706 w:SetCallback("OnClick", function()
farmbuyer@96 707 PlaySoundFile ([[Interface\AddOns\Ouro_Loot\sfrr.ogg]], "Master")
farmbuyer@96 708 end)
farmbuyer@96 709 simple:AddChild(w)
farmbuyer@138 710 w = mkbutton("Peppers!", [[test 3]])
farmbuyer@138 711 w:SetRelativeWidth(0.20)
farmbuyer@138 712 w:SetCallback("OnClick", function()
farmbuyer@138 713 PlaySoundFile ([[Sound\CREATURE\UncleGao\VO_SB_GAO_EVENT_04.OGG]], "Master")
farmbuyer@138 714 end)
farmbuyer@138 715 simple:AddChild(w)
farmbuyer@96 716
farmbuyer@96 717 container:AddChild(simple)
farmbuyer@96 718 end
farmbuyer@96 719
farmbuyer@96 720 w = AceGUI:Create("Spacer") w:SetRelativeWidth(0.65) w:SetHeight(15) container:AddChild(w)
farmbuyer@96 721 w = mkbutton("Clear All & Reload",
farmbuyer@147 722 [[No confirmation! |cffff1010Erases absolutely all> Ouro Loot saved variables and immediately reloads the UI.]])
farmbuyer@96 723 w:SetRelativeWidth(0.3)
farmbuyer@96 724 w:SetCallback("OnClick", function()
farmbuyer@96 725 addon:_clear_SVs() -- reloads
farmbuyer@96 726 end)
farmbuyer@96 727 container:AddChild(w)
farmbuyer@96 728
farmbuyer@96 729 container:ResumeLayout()
farmbuyer@96 730 container:DoLayout()
farmbuyer@96 731 AceGUI:ClearFocus()
farmbuyer@96 732 --container:SetScroll(1000) -- scrollframe widget's max value
farmbuyer@96 733 end
farmbuyer@96 734
farmbuyer@96 735 -- Initial advanced panel function (unless debug mode is on during load, which
farmbuyer@96 736 -- means it was almost certainly hardcoded that way, which means it's probably
farmbuyer@96 737 -- me testing).
farmbuyer@97 738 if addon.DEBUG_PRINT then
farmbuyer@96 739 controls.adv = adv_real
farmbuyer@96 740 else
farmbuyer@96 741 controls.adv = function (container)
farmbuyer@96 742 local speedbump = AceGUI:Create("InteractiveLabel")
farmbuyer@96 743 speedbump:SetFullWidth(true)
farmbuyer@96 744 speedbump:SetFontObject(GameFontHighlightLarge)
farmbuyer@96 745 speedbump:SetImage[[Interface\DialogFrame\DialogAlertIcon]]
farmbuyer@96 746 speedbump:SetImageSize(50,50)
farmbuyer@96 747 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.]]
farmbuyer@96 748 speedbump:SetCallback("OnClick", function (_sb)
farmbuyer@96 749 controls.adv = { adv_real }
farmbuyer@96 750 return addon:redisplay()
farmbuyer@96 751 end)
farmbuyer@96 752 container:AddChild(speedbump)
farmbuyer@96 753 end
farmbuyer@96 754 end
farmbuyer@96 755
farmbuyer@96 756
farmbuyer@96 757 ---------------
farmbuyer@96 758 -- Tab 6: Options
farmbuyer@96 759 do
farmbuyer@96 760 local funkified = {}
farmbuyer@96 761 for key,f in pairs(controls) do
farmbuyer@99 762 -- this is how TreeGroup makes unique keys out of nested entries
farmbuyer@96 763 local funkykey = key:gsub('_','\001')
farmbuyer@96 764 funkified[funkykey] = { f }
farmbuyer@96 765 end
farmbuyer@96 766 controls = funkified
farmbuyer@96 767 end
farmbuyer@96 768
farmbuyer@96 769 -- widget container status tables (will have things magically appear
farmbuyer@96 770 -- inside them that we wish to preserve)
farmbuyer@125 771 local options_treegroup -- careful, this is deliberately not preserved
farmbuyer@96 772 local status_for_scroll = {}
farmbuyer@96 773 local status_for_select = { treewidth = 160 }
farmbuyer@96 774
farmbuyer@97 775 local function preload()
farmbuyer@97 776 for id in pairs(opts.itemfilter) do GetItemInfo(id) end
farmbuyer@97 777 for id in pairs(opts.itemvault) do GetItemInfo(id) end
farmbuyer@97 778 preload = nil
farmbuyer@97 779 end
farmbuyer@97 780
farmbuyer@99 781 local aceconfig_list = {}
farmbuyer@99 782
farmbuyer@99 783 -- Selecting an entry on the left tree column.
farmbuyer@96 784 local opt_OnGroupSelected_func = function (treeg,event,category)
farmbuyer@98 785 opts = addon.db.profile
farmbuyer@96 786 local catfuncs = controls[category]
farmbuyer@96 787 if not catfuncs then
farmbuyer@96 788 addon:horrible_horrible_error(("Category '%s' has no handler function!"):format(category:gsub('\001','_')))
farmbuyer@96 789 end
farmbuyer@96 790 treeg:ReleaseChildren()
farmbuyer@99 791 if aceconfig_list[category] then
farmbuyer@99 792 -- aceconfigdialog makes too many assumptions about scrolling
farmbuyer@99 793 for _,func in ipairs(catfuncs) do
farmbuyer@99 794 if func(treeg,category) then break end
farmbuyer@96 795 end
farmbuyer@96 796 else
farmbuyer@99 797 local sf = AceGUI:Create("ScrollFrame")
farmbuyer@99 798 sf:SetStatusTable(status_for_scroll)
farmbuyer@99 799 sf:SetLayout("Flow")
farmbuyer@99 800 -- This forces the scrolling area to be bigger than the visible area; else
farmbuyer@99 801 -- some of the text gets cut off without ever triggering the scrollbar.
farmbuyer@99 802 sf.content:SetHeight(700)
farmbuyer@99 803 for _,func in ipairs(catfuncs) do
farmbuyer@99 804 if func(sf,category) then break end
farmbuyer@99 805 end
farmbuyer@99 806 treeg:AddChild(sf)
farmbuyer@99 807 if treeg:GetUserData("options restore scroll") then
farmbuyer@99 808 if status_for_scroll.scrollvalue then
farmbuyer@99 809 sf:SetScroll(status_for_scroll.scrollvalue)
farmbuyer@99 810 end
farmbuyer@99 811 treeg:SetUserData("options restore scroll", false)
farmbuyer@99 812 else
farmbuyer@99 813 sf:SetScroll(0)
farmbuyer@99 814 end
farmbuyer@96 815 end
farmbuyer@96 816 end
farmbuyer@96 817
farmbuyer@96 818 -- Clicking the Options tab as a whole (tabs_OnGroupSelected["opt"]).
farmbuyer@96 819 local tabs_OGS = function (container, specials)
farmbuyer@96 820 container:SetLayout("Fill")
farmbuyer@96 821 local left = AceGUI:Create("TreeGroup")
farmbuyer@125 822 options_treegroup = left
farmbuyer@96 823 left:SetStatusTable(status_for_select)
farmbuyer@96 824 left:SetLayout("Fill")
farmbuyer@96 825 left:SetFullWidth(true)
farmbuyer@96 826 left:SetFullHeight(true)
farmbuyer@96 827 left:EnableButtonTooltips(false)
farmbuyer@96 828 left:SetTree(options_tree)
farmbuyer@96 829 left:SetCallback("OnGroupSelected", opt_OnGroupSelected_func)
farmbuyer@96 830 container:AddChild(left)
farmbuyer@96 831 if status_for_select.selected then
farmbuyer@96 832 left:SetUserData("options restore scroll", true)
farmbuyer@96 833 left:SelectByValue(status_for_select.selected)
farmbuyer@96 834 else
farmbuyer@96 835 left:SelectByValue("basic")
farmbuyer@96 836 end
farmbuyer@96 837
farmbuyer@96 838 local w = mkbutton("ReloadUI",
farmbuyer@96 839 [[Does what you think it does. Loot information is written out and restored.]])
farmbuyer@96 840 w:SetFullWidth(true)
farmbuyer@96 841 w:SetCallback("OnClick", ReloadUI)
farmbuyer@96 842 specials:AddChild(w)
farmbuyer@96 843
farmbuyer@96 844 w = mkbutton("Ping!",
farmbuyer@96 845 [[Queries other raid users for their addon version and current status. Results displayed on Pongs panel after five seconds.]])
farmbuyer@96 846 w:SetFullWidth(true)
farmbuyer@96 847 w:SetCallback("OnClick", function(_w)
farmbuyer@96 848 _w:SetText("5... 4... 3...")
farmbuyer@96 849 _w:SetDisabled(true)
farmbuyer@96 850 addon:DoPing()
farmbuyer@96 851 addon:ScheduleTimer(function(b)
farmbuyer@96 852 if b:IsVisible() then
farmbuyer@96 853 return addon:redisplay()
farmbuyer@96 854 end
farmbuyer@96 855 end, 5, _w)
farmbuyer@96 856 end)
farmbuyer@96 857 specials:AddChild(w)
farmbuyer@97 858
farmbuyer@123 859 if #OuroLootSV_log > 0 then
farmbuyer@123 860 w = AceGUI:Create("Label")
farmbuyer@123 861 w:SetFullWidth(true)
farmbuyer@123 862 w:SetText(("Currently %d lines in disk log."):format(#OuroLootSV_log))
farmbuyer@123 863 specials:AddChild(w)
farmbuyer@123 864 end
farmbuyer@123 865
farmbuyer@97 866 if preload then preload() end
farmbuyer@96 867 end
farmbuyer@96 868
farmbuyer@125 869 local tabs_cli = function (unique)
farmbuyer@125 870 if not controls[unique] then return end
farmbuyer@125 871 options_treegroup:SetSelected(unique)
farmbuyer@125 872 options_treegroup:SetUserData("options restore scroll", false)
farmbuyer@125 873 end
farmbuyer@125 874
farmbuyer@96 875 addon:register_tab_control_AT_END ("opt", [[Options]],
farmbuyer@103 876 [[Options for fine-tuning behavior]], tabs_OGS, [[
farmbuyer@103 877 The "be chatty" options can be noisy, but they make the
farmbuyer@103 878 |cffff8000[Ouro Loot]|r link much more useful. See
farmbuyer@103 879 <Help -- Handy Tips> for details!
farmbuyer@125 880 ]], tabs_cli)
farmbuyer@96 881
farmbuyer@99 882
farmbuyer@99 883 ---------------
farmbuyer@99 884 -- Registering new options entries
farmbuyer@99 885 local insertion_index = #options_tree
farmbuyer@99 886 for i = #options_tree, 1, -1 do
farmbuyer@99 887 if options_tree[i] == 'NEW INSERTIONS HERE' then
farmbuyer@99 888 insertion_index = i
farmbuyer@99 889 break
farmbuyer@99 890 end
farmbuyer@99 891 end
farmbuyer@99 892 if insertion_index then
farmbuyer@99 893 table.remove (options_tree, insertion_index)
farmbuyer@99 894 else
farmbuyer@99 895 insertion_index = #options_tree + 1
farmbuyer@99 896 end
farmbuyer@99 897
farmbuyer@99 898
farmbuyer@99 899 --[[
farmbuyer@100 900 PLUGIN is the module table itself. (This does not actually have to be
farmbuyer@100 901 a plugin created with :[Constrained]NewModule, as long as it has a
farmbuyer@125 902 'name' field and
farmbuyer@102 903 - TEXT is passed
farmbuyer@102 904 - if OPTIONS is a table, then OPTIONS.args.name exists
farmbuyer@125 905 UNIQUE and PARENT control placement in the tree list. UNIQUE is a unique
farmbuyer@125 906 string, or nil to use the module's unique name (this can only be used once
farmbuyer@125 907 obviously, or it's not "unique"). PARENT is nil to display at the main
farmbuyer@125 908 level of options, or a previously-registered return value to display as a
farmbuyer@125 909 child of that option.
farmbuyer@125 910 TEXT is either the text to display in the tree list, or nil to use
farmbuyer@125 911 PLUGIN:GetName().
farmbuyer@99 912 OPTIONS is either
farmbuyer@125 913 I) an aceconfig-style options table (uses PLUGIN:GetName())
farmbuyer@102 914 II) a function to call directly
farmbuyer@99 915
farmbuyer@99 916 (I) Will augment options.args.name with coloring/sizing, if it exists.
farmbuyer@99 917 (Set options.args.name.name before registering.) Will create it if not
farmbuyer@99 918 present.
farmbuyer@99 919
farmbuyer@99 920 (II) Title added unconditionally. Callback is
farmbuyer@99 921 options (scrollframe_container, plugin, unique_code)
farmbuyer@99 922 where UNIQUE_CODE is what's used by the TreeGroup widget in identifying
farmbuyer@99 923 the "button" clicked in the lefthand tree list.
farmbuyer@99 924
farmbuyer@99 925 Will append a reset button IFF an options database has been registered already.
farmbuyer@125 926
farmbuyer@125 927 XXX - the PARENT functionality hasn't been implmented yet cuz I'm lazy
farmbuyer@99 928 ]]
farmbuyer@125 929 function addon:register_options_entry (plugin, unique, parent, text, options)
farmbuyer@125 930 unique = (unique and tostring(unique))
farmbuyer@125 931 or assert(plugin.name, "plugin has no 'name' field")
farmbuyer@125 932
farmbuyer@138 933 --if parent
farmbuyer@99 934
farmbuyer@125 935 text = text or plugin:GetName()
farmbuyer@99 936
farmbuyer@99 937 local handler
farmbuyer@102 938 local pdb = plugin.moduleName and
farmbuyer@102 939 self.db:GetNamespace (plugin.moduleName, --[[silent=]]true)
farmbuyer@102 940
farmbuyer@99 941 if type(options) == 'table' then
farmbuyer@99 942 -- AceConfig-style options table
farmbuyer@125 943 aceconfig_list[unique] = true
farmbuyer@99 944 if not options.args.name then
farmbuyer@99 945 options.args.name = {
farmbuyer@125 946 name = plugin:GetName(),
farmbuyer@99 947 type = 'description',
farmbuyer@99 948 }
farmbuyer@99 949 end
farmbuyer@99 950 options.args.name.name = '|cff30adff' .. options.args.name.name .. '|r'
farmbuyer@99 951 options.args.name.fontSize = 'large'
farmbuyer@99 952 options.args.name.width = 'full'
farmbuyer@99 953 options.args.name.cmdHidden = true
farmbuyer@99 954 options.args.name.order = 1
farmbuyer@99 955 if pdb then
farmbuyer@99 956 options.args.INSERTED_SPACER = {
farmbuyer@99 957 name = '',
farmbuyer@99 958 type = 'description',
farmbuyer@99 959 cmdHidden = true,
farmbuyer@99 960 width = 'full',
farmbuyer@99 961 order = 9000,
farmbuyer@99 962 }
farmbuyer@99 963 options.args.RESET = {
farmbuyer@99 964 name = "Reset",
farmbuyer@99 965 desc = ([[Reset settings for <%s> plugin back to defaults. Shift-click to also trigger a UI reload.]]):format(plugin:GetName()),
farmbuyer@99 966 type = 'execute',
farmbuyer@99 967 func = function()
farmbuyer@99 968 pdb:ResetProfile()
farmbuyer@99 969 if IsShiftKeyDown() then ReloadUI() end
farmbuyer@99 970 end,
farmbuyer@99 971 order = 9001,
farmbuyer@99 972 }
farmbuyer@99 973 end
farmbuyer@99 974 LibStub("AceConfig-3.0"):RegisterOptionsTable(plugin:GetName(), options)
farmbuyer@99 975 handler = function (sf)
farmbuyer@99 976 LibStub("AceConfigDialog-3.0"):Open (plugin:GetName(), sf)
farmbuyer@99 977 end
farmbuyer@99 978
farmbuyer@99 979 elseif type(options) == 'function' then
farmbuyer@99 980 -- AceGUI callback
farmbuyer@99 981 if pdb then
farmbuyer@99 982 handler = function (sf)
farmbuyer@99 983 sf:AddChildren(mktitle(text))
farmbuyer@125 984 local ret = options (sf, plugin, unique)
farmbuyer@99 985 local w = mkbutton("Reset",
farmbuyer@99 986 ([[Reset settings for <%s> plugin back to defaults. Shift-click to also trigger a UI reload.]]):format(text))
farmbuyer@99 987 w:SetRelativeWidth(0.3)
farmbuyer@99 988 w:SetCallback("OnClick", function(_w)
farmbuyer@99 989 pdb:ResetProfile()
farmbuyer@99 990 if IsShiftKeyDown() then ReloadUI() end
farmbuyer@99 991 end)
farmbuyer@99 992 sf:AddChildren(spacer(10),w)
farmbuyer@99 993 return ret
farmbuyer@99 994 end
farmbuyer@99 995 else
farmbuyer@99 996 handler = function (sf)
farmbuyer@99 997 sf:AddChildren(mktitle(text))
farmbuyer@125 998 return options (sf, plugin, unique)
farmbuyer@99 999 end
farmbuyer@99 1000 end
farmbuyer@99 1001
farmbuyer@99 1002 else
farmbuyer@99 1003 error(("Error: 'options' parameter for plugin '%s' is neither table nor function"):format(plugin:GetName()))
farmbuyer@99 1004 end
farmbuyer@99 1005
farmbuyer@125 1006 if not controls[unique] then
farmbuyer@125 1007 controls[unique] = {}
farmbuyer@99 1008 end
farmbuyer@125 1009 table.insert (controls[unique], handler)
farmbuyer@99 1010
farmbuyer@99 1011 table.insert (options_tree, insertion_index, {
farmbuyer@125 1012 value = unique,
farmbuyer@125 1013 text = '++ '..text, -- maybe call markup on this?
farmbuyer@99 1014 })
farmbuyer@99 1015 insertion_index = insertion_index + 1
farmbuyer@99 1016 -- The treegroup will rescan options_tree (via RefreshTree) several times
farmbuyer@99 1017 -- before the player actually sees anything; no more work needs doing.
farmbuyer@125 1018 return unique -- something that can be used as 'parent'?
farmbuyer@99 1019 end
farmbuyer@99 1020
farmbuyer@99 1021
farmbuyer@109 1022 addon.FILES_LOADED = addon.FILES_LOADED + 1
farmbuyer@96 1023 -- vim:noet