annotate options.lua @ 99:966d06c8d9c9

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