annotate options.lua @ 100:a57133ee3c9b

- Allow event callbacks using the standard CallbackHandler scheme. Add a debug.callback flag with usual semantics. - Fire an initial set of events. This will take experimentation. - If restoring g_loot, set metatables on previous entries also.
author Farmbuyer of US-Kilrogg <farmbuyer@gmail.com>
date Mon, 30 Jul 2012 19:25:46 +0000
parents 966d06c8d9c9
children f7162a1cadc7
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@100 525 w:SetCallback("OnValueChanged", function(_w,event,value)
farmbuyer@100 526 addon.debug[d] = value
farmbuyer@100 527 if d == "comm" then
farmbuyer@100 528 addon.is_guilded = _G.IsInGuild()
farmbuyer@100 529 end
farmbuyer@100 530 end)
farmbuyer@96 531 grp:AddChild(w)
farmbuyer@96 532 end
farmbuyer@96 533 container:AddChild(grp)
farmbuyer@96 534 end
farmbuyer@96 535
farmbuyer@96 536 do
farmbuyer@96 537 local simple = AceGUI:Create("SimpleGroup")
farmbuyer@96 538 simple:SetLayout("List")
farmbuyer@96 539 simple:SetRelativeWidth(0.35)
farmbuyer@96 540 w = AceGUI:Create("CheckBoxSmallLabel")
farmbuyer@96 541 --w:SetRelativeWidth(0.35)
farmbuyer@96 542 w:SetFullWidth(true)
farmbuyer@96 543 w:SetType("checkbox")
farmbuyer@96 544 w:SetLabel("GOP history mode")
farmbuyer@96 545 w:SetValue(addon.history_suppress)
farmbuyer@96 546 w:SetCallback("OnValueChanged", function(_w,event,value) addon.history_suppress = value end)
farmbuyer@96 547 simple:AddChild(w)
farmbuyer@96 548 w = mkbutton("Dropdown", nil, "",
farmbuyer@96 549 [[if active, tooltip shown when hovering over Item column only]])
farmbuyer@96 550 --w:SetRelativeWidth(0.4)
farmbuyer@96 551 w:SetFullWidth(true)
farmbuyer@96 552 w:SetLabel("loot debugging tooltip")
farmbuyer@96 553 w:SetList{
farmbuyer@96 554 [1] = "Off",
farmbuyer@96 555 [2] = "/dump into tooltip",
farmbuyer@96 556 [3] = "small fixed fields",
farmbuyer@96 557 }
farmbuyer@96 558 w:SetValue(gui._do_debugging_tooltip or 1)
farmbuyer@96 559 w:SetCallback("OnValueChanged", function(_w,event,choice)
farmbuyer@96 560 gui._do_debugging_tooltip = choice > 1 and choice or nil
farmbuyer@96 561 end)
farmbuyer@96 562 simple:AddChild(w)
farmbuyer@96 563 container:AddChild(simple)
farmbuyer@96 564 end
farmbuyer@96 565
farmbuyer@97 566 container:AddChild(spacer(10))
farmbuyer@96 567
farmbuyer@96 568 w = mkbutton("EditBox", 'comm_ident', addon.ident,
farmbuyer@96 569 [[Set tracking to 'Disabled' in the top-right dropdown, then change this field (click Okay or press Enter).]])
farmbuyer@96 570 w:SetRelativeWidth(0.25)
farmbuyer@96 571 w:SetLabel("Addon channel ID")
farmbuyer@96 572 w:SetCallback("OnTextChanged", adv_careful_OnTextChanged)
farmbuyer@96 573 w:SetCallback("OnEnterPressed", function(_w,event,value)
farmbuyer@96 574 -- if they set it to blank spaces, they're boned. oh well.
farmbuyer@96 575 -- Re-enabling will take care of propogating this new value.
farmbuyer@96 576 addon.ident = (value == "") and "OuroLoot2" or value
farmbuyer@96 577 _w:SetText(addon.ident)
farmbuyer@96 578 addon:Print("Addon channel ID set to '".. addon.ident.. "' for rebroadcasting and listening.")
farmbuyer@96 579 end)
farmbuyer@96 580 w:SetDisabled(addon.enabled or addon.rebroadcast)
farmbuyer@96 581 container:AddChild(w)
farmbuyer@96 582
farmbuyer@96 583 w = mkbutton("EditBox", nil, addon.recent_messages.ttl, [[comm cache TTL]])
farmbuyer@96 584 w:SetRelativeWidth(0.1)
farmbuyer@96 585 w:SetLabel("ttl")
farmbuyer@96 586 w:SetCallback("OnTextChanged", adv_careful_OnTextChanged)
farmbuyer@96 587 w:SetCallback("OnEnterPressed", function(_w,event,value)
farmbuyer@96 588 value = tonumber(value) or addon.recent_messages.ttl
farmbuyer@96 589 addon.recent_messages.ttl = value
farmbuyer@96 590 _w:SetText(tostring(value))
farmbuyer@96 591 end)
farmbuyer@96 592 container:AddChild(w)
farmbuyer@96 593
farmbuyer@96 594 w = mkbutton("load nsaab1548", [[Cursed Darkhound]])
farmbuyer@96 595 w:SetRelativeWidth(0.25)
farmbuyer@96 596 w:SetCallback("OnClick", function()
farmbuyer@96 597 for i, v in ipairs(DBM.AddOns) do
farmbuyer@96 598 if v.modId == "DBM-NotScaryAtAll" then
farmbuyer@96 599 DBM:LoadMod(v)
farmbuyer@96 600 break
farmbuyer@96 601 end
farmbuyer@96 602 end
farmbuyer@96 603 local mod = DBM:GetModByName("NotScaryAtAll")
farmbuyer@96 604 if mod then
farmbuyer@96 605 mod:EnableMod()
farmbuyer@96 606 addon:Print("Now tracking ID",mod.creatureId)
farmbuyer@96 607 else
farmbuyer@96 608 addon:Print("Can do nothing; DBM testing mod wasn't loaded.")
farmbuyer@96 609 end
farmbuyer@96 610 end)
farmbuyer@96 611 w:SetDisabled(addon.bossmod_registered ~= 'DBM')
farmbuyer@96 612 container:AddChild(w)
farmbuyer@96 613
farmbuyer@96 614 w = mkbutton("GC", [[full GC cycle]])
farmbuyer@96 615 w:SetRelativeWidth(0.2)
farmbuyer@96 616 w:SetCallback("OnClick", function()
farmbuyer@96 617 local before = collectgarbage('count')
farmbuyer@96 618 collectgarbage('collect')
farmbuyer@96 619 local after = collectgarbage('count')
farmbuyer@96 620 addon:Print("Collected %d KB, %d KB still in use by Lua universe.", before-after, after)
farmbuyer@96 621 end)
farmbuyer@96 622 container:AddChild(w)
farmbuyer@96 623
farmbuyer@97 624 container:AddChild(spacer(3))
farmbuyer@96 625 do
farmbuyer@96 626 local simple = AceGUI:Create("SimpleGroup")
farmbuyer@96 627 simple:SetLayout("Flow")
farmbuyer@96 628 --simple:SetRelativeWidth(0.95)
farmbuyer@96 629 simple:SetFullWidth(true)
farmbuyer@96 630 w = mkbutton("MidS-H", [[not exactly an Easter egg, with sound]])
farmbuyer@96 631 w:SetRelativeWidth(0.2)
farmbuyer@96 632 w:SetCallback("OnClick", function()
farmbuyer@96 633 PlaySoundFile ([[Sound\Music\WorldEvents\HordeFirepole.mp3]], "Master")
farmbuyer@96 634 end)
farmbuyer@96 635 simple:AddChild(w)
farmbuyer@96 636 w = mkbutton("MidS-A", [[not exactly an Easter egg, with sound]])
farmbuyer@96 637 w:SetRelativeWidth(0.2)
farmbuyer@96 638 w:SetCallback("OnClick", function()
farmbuyer@96 639 PlaySoundFile ([[Sound\Music\WorldEvents\AllianceFirepole.mp3]], "Master")
farmbuyer@96 640 end)
farmbuyer@96 641 simple:AddChild(w)
farmbuyer@96 642 w = mkbutton("SFRR", [[test]])
farmbuyer@96 643 w:SetRelativeWidth(0.15)
farmbuyer@96 644 w:SetCallback("OnClick", function()
farmbuyer@96 645 PlaySoundFile ([[Interface\AddOns\Ouro_Loot\sfrr.ogg]], "Master")
farmbuyer@96 646 end)
farmbuyer@96 647 simple:AddChild(w)
farmbuyer@96 648
farmbuyer@96 649 container:AddChild(simple)
farmbuyer@96 650 end
farmbuyer@96 651
farmbuyer@96 652 w = AceGUI:Create("Spacer") w:SetRelativeWidth(0.65) w:SetHeight(15) container:AddChild(w)
farmbuyer@96 653 w = mkbutton("Clear All & Reload",
farmbuyer@96 654 [[No confirmation! |cffff1010Erases absolutely all> Ouro Loot saved variables and reloads the UI.]])
farmbuyer@96 655 w:SetRelativeWidth(0.3)
farmbuyer@96 656 w:SetCallback("OnClick", function()
farmbuyer@96 657 addon:_clear_SVs() -- reloads
farmbuyer@96 658 end)
farmbuyer@96 659 container:AddChild(w)
farmbuyer@96 660
farmbuyer@96 661 container:ResumeLayout()
farmbuyer@96 662 container:DoLayout()
farmbuyer@96 663 AceGUI:ClearFocus()
farmbuyer@96 664 --container:SetScroll(1000) -- scrollframe widget's max value
farmbuyer@96 665 end
farmbuyer@96 666
farmbuyer@96 667 -- Initial advanced panel function (unless debug mode is on during load, which
farmbuyer@96 668 -- means it was almost certainly hardcoded that way, which means it's probably
farmbuyer@96 669 -- me testing).
farmbuyer@97 670 if addon.DEBUG_PRINT then
farmbuyer@96 671 controls.adv = adv_real
farmbuyer@96 672 else
farmbuyer@96 673 controls.adv = function (container)
farmbuyer@96 674 local speedbump = AceGUI:Create("InteractiveLabel")
farmbuyer@96 675 speedbump:SetFullWidth(true)
farmbuyer@96 676 speedbump:SetFontObject(GameFontHighlightLarge)
farmbuyer@96 677 speedbump:SetImage[[Interface\DialogFrame\DialogAlertIcon]]
farmbuyer@96 678 speedbump:SetImageSize(50,50)
farmbuyer@96 679 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 680 speedbump:SetCallback("OnClick", function (_sb)
farmbuyer@96 681 controls.adv = { adv_real }
farmbuyer@96 682 return addon:redisplay()
farmbuyer@96 683 end)
farmbuyer@96 684 container:AddChild(speedbump)
farmbuyer@96 685 end
farmbuyer@96 686 end
farmbuyer@96 687
farmbuyer@96 688
farmbuyer@96 689 ---------------
farmbuyer@96 690 -- Tab 6: Options
farmbuyer@96 691 do
farmbuyer@96 692 local funkified = {}
farmbuyer@96 693 for key,f in pairs(controls) do
farmbuyer@99 694 -- this is how TreeGroup makes unique keys out of nested entries
farmbuyer@96 695 local funkykey = key:gsub('_','\001')
farmbuyer@96 696 funkified[funkykey] = { f }
farmbuyer@96 697 end
farmbuyer@96 698 controls = funkified
farmbuyer@96 699 end
farmbuyer@96 700
farmbuyer@96 701 -- widget container status tables (will have things magically appear
farmbuyer@96 702 -- inside them that we wish to preserve)
farmbuyer@96 703 local status_for_scroll = {}
farmbuyer@96 704 local status_for_select = { treewidth = 160 }
farmbuyer@96 705
farmbuyer@97 706 local function preload()
farmbuyer@97 707 for id in pairs(opts.itemfilter) do GetItemInfo(id) end
farmbuyer@97 708 for id in pairs(opts.itemvault) do GetItemInfo(id) end
farmbuyer@97 709 preload = nil
farmbuyer@97 710 end
farmbuyer@97 711
farmbuyer@99 712 local aceconfig_list = {}
farmbuyer@99 713
farmbuyer@99 714 -- Selecting an entry on the left tree column.
farmbuyer@96 715 local opt_OnGroupSelected_func = function (treeg,event,category)
farmbuyer@98 716 opts = addon.db.profile
farmbuyer@96 717 local catfuncs = controls[category]
farmbuyer@96 718 if not catfuncs then
farmbuyer@96 719 addon:horrible_horrible_error(("Category '%s' has no handler function!"):format(category:gsub('\001','_')))
farmbuyer@96 720 end
farmbuyer@96 721 treeg:ReleaseChildren()
farmbuyer@99 722 if aceconfig_list[category] then
farmbuyer@99 723 -- aceconfigdialog makes too many assumptions about scrolling
farmbuyer@99 724 for _,func in ipairs(catfuncs) do
farmbuyer@99 725 if func(treeg,category) then break end
farmbuyer@96 726 end
farmbuyer@96 727 else
farmbuyer@99 728 local sf = AceGUI:Create("ScrollFrame")
farmbuyer@99 729 sf:SetStatusTable(status_for_scroll)
farmbuyer@99 730 sf:SetLayout("Flow")
farmbuyer@99 731 -- This forces the scrolling area to be bigger than the visible area; else
farmbuyer@99 732 -- some of the text gets cut off without ever triggering the scrollbar.
farmbuyer@99 733 sf.content:SetHeight(700)
farmbuyer@99 734 for _,func in ipairs(catfuncs) do
farmbuyer@99 735 if func(sf,category) then break end
farmbuyer@99 736 end
farmbuyer@99 737 treeg:AddChild(sf)
farmbuyer@99 738 if treeg:GetUserData("options restore scroll") then
farmbuyer@99 739 if status_for_scroll.scrollvalue then
farmbuyer@99 740 sf:SetScroll(status_for_scroll.scrollvalue)
farmbuyer@99 741 end
farmbuyer@99 742 treeg:SetUserData("options restore scroll", false)
farmbuyer@99 743 else
farmbuyer@99 744 sf:SetScroll(0)
farmbuyer@99 745 end
farmbuyer@96 746 end
farmbuyer@96 747 end
farmbuyer@96 748
farmbuyer@96 749 -- Clicking the Options tab as a whole (tabs_OnGroupSelected["opt"]).
farmbuyer@96 750 local tabs_OGS = function (container, specials)
farmbuyer@96 751 container:SetLayout("Fill")
farmbuyer@96 752 local left = AceGUI:Create("TreeGroup")
farmbuyer@96 753 left:SetStatusTable(status_for_select)
farmbuyer@96 754 left:SetLayout("Fill")
farmbuyer@96 755 left:SetFullWidth(true)
farmbuyer@96 756 left:SetFullHeight(true)
farmbuyer@96 757 left:EnableButtonTooltips(false)
farmbuyer@96 758 left:SetTree(options_tree)
farmbuyer@96 759 left:SetCallback("OnGroupSelected", opt_OnGroupSelected_func)
farmbuyer@96 760 container:AddChild(left)
farmbuyer@96 761 if status_for_select.selected then
farmbuyer@96 762 left:SetUserData("options restore scroll", true)
farmbuyer@96 763 left:SelectByValue(status_for_select.selected)
farmbuyer@96 764 else
farmbuyer@96 765 left:SelectByValue("basic")
farmbuyer@96 766 end
farmbuyer@96 767
farmbuyer@96 768 local w = mkbutton("ReloadUI",
farmbuyer@96 769 [[Does what you think it does. Loot information is written out and restored.]])
farmbuyer@96 770 w:SetFullWidth(true)
farmbuyer@96 771 w:SetCallback("OnClick", ReloadUI)
farmbuyer@96 772 specials:AddChild(w)
farmbuyer@96 773
farmbuyer@96 774 w = mkbutton("Ping!",
farmbuyer@96 775 [[Queries other raid users for their addon version and current status. Results displayed on Pongs panel after five seconds.]])
farmbuyer@96 776 w:SetFullWidth(true)
farmbuyer@96 777 w:SetCallback("OnClick", function(_w)
farmbuyer@96 778 _w:SetText("5... 4... 3...")
farmbuyer@96 779 _w:SetDisabled(true)
farmbuyer@96 780 addon:DoPing()
farmbuyer@96 781 addon:ScheduleTimer(function(b)
farmbuyer@96 782 if b:IsVisible() then
farmbuyer@96 783 return addon:redisplay()
farmbuyer@96 784 end
farmbuyer@96 785 end, 5, _w)
farmbuyer@96 786 end)
farmbuyer@96 787 specials:AddChild(w)
farmbuyer@97 788
farmbuyer@97 789 if preload then preload() end
farmbuyer@96 790 end
farmbuyer@96 791
farmbuyer@96 792 addon:register_tab_control_AT_END ("opt", [[Options]],
farmbuyer@96 793 [[Options for fine-tuning behavior]], tabs_OGS)
farmbuyer@96 794
farmbuyer@99 795
farmbuyer@99 796 ---------------
farmbuyer@99 797 -- Registering new options entries
farmbuyer@99 798 local insertion_index = #options_tree
farmbuyer@99 799 for i = #options_tree, 1, -1 do
farmbuyer@99 800 if options_tree[i] == 'NEW INSERTIONS HERE' then
farmbuyer@99 801 insertion_index = i
farmbuyer@99 802 break
farmbuyer@99 803 end
farmbuyer@99 804 end
farmbuyer@99 805 if insertion_index then
farmbuyer@99 806 table.remove (options_tree, insertion_index)
farmbuyer@99 807 else
farmbuyer@99 808 insertion_index = #options_tree + 1
farmbuyer@99 809 end
farmbuyer@99 810
farmbuyer@99 811
farmbuyer@99 812 --[[
farmbuyer@100 813 PLUGIN is the module table itself. (This does not actually have to be
farmbuyer@100 814 a plugin created with :[Constrained]NewModule, as long as it has a
farmbuyer@100 815 GetName method and other parameters here are used appropriately.)
farmbuyer@99 816 PARENT is nil to register in the tree list directly.
farmbuyer@99 817 TEXT is either the text to display in the tree list, or nil to use the
farmbuyer@99 818 moduleName field out of PLUGIN (not :GetName()).
farmbuyer@99 819 OPTIONS is either
farmbuyer@99 820 I) a function to call directly
farmbuyer@99 821 II) an aceconfig-style options table
farmbuyer@99 822
farmbuyer@99 823 (I) Will augment options.args.name with coloring/sizing, if it exists.
farmbuyer@99 824 (Set options.args.name.name before registering.) Will create it if not
farmbuyer@99 825 present.
farmbuyer@99 826
farmbuyer@99 827 (II) Title added unconditionally. Callback is
farmbuyer@99 828 options (scrollframe_container, plugin, unique_code)
farmbuyer@99 829 where UNIQUE_CODE is what's used by the TreeGroup widget in identifying
farmbuyer@99 830 the "button" clicked in the lefthand tree list.
farmbuyer@99 831
farmbuyer@99 832 Will append a reset button IFF an options database has been registered already.
farmbuyer@99 833 ]]
farmbuyer@99 834 function addon:register_options_entry (plugin, parent, text, options)
farmbuyer@99 835 -- if this changes at all, fix up plugin_reset_button accordingly
farmbuyer@99 836 local code = plugin:GetName()
farmbuyer@99 837 --if parent
farmbuyer@99 838
farmbuyer@99 839 text = text or plugin.moduleName
farmbuyer@99 840
farmbuyer@99 841 local handler
farmbuyer@99 842 local pdb = self.db:GetNamespace (plugin.moduleName, --[[silent=]]true)
farmbuyer@99 843 if type(options) == 'table' then
farmbuyer@99 844 -- AceConfig-style options table
farmbuyer@99 845 aceconfig_list[code] = true
farmbuyer@99 846 if not options.args.name then
farmbuyer@99 847 options.args.name = {
farmbuyer@99 848 name = plugin.moduleName,
farmbuyer@99 849 type = 'description',
farmbuyer@99 850 }
farmbuyer@99 851 end
farmbuyer@99 852 options.args.name.name = '|cff30adff' .. options.args.name.name .. '|r'
farmbuyer@99 853 options.args.name.fontSize = 'large'
farmbuyer@99 854 options.args.name.width = 'full'
farmbuyer@99 855 options.args.name.cmdHidden = true
farmbuyer@99 856 options.args.name.order = 1
farmbuyer@99 857 if pdb then
farmbuyer@99 858 options.args.INSERTED_SPACER = {
farmbuyer@99 859 name = '',
farmbuyer@99 860 type = 'description',
farmbuyer@99 861 cmdHidden = true,
farmbuyer@99 862 width = 'full',
farmbuyer@99 863 order = 9000,
farmbuyer@99 864 }
farmbuyer@99 865 options.args.RESET = {
farmbuyer@99 866 name = "Reset",
farmbuyer@99 867 desc = ([[Reset settings for <%s> plugin back to defaults. Shift-click to also trigger a UI reload.]]):format(plugin:GetName()),
farmbuyer@99 868 type = 'execute',
farmbuyer@99 869 func = function()
farmbuyer@99 870 pdb:ResetProfile()
farmbuyer@99 871 if IsShiftKeyDown() then ReloadUI() end
farmbuyer@99 872 end,
farmbuyer@99 873 order = 9001,
farmbuyer@99 874 }
farmbuyer@99 875 end
farmbuyer@99 876 LibStub("AceConfig-3.0"):RegisterOptionsTable(plugin:GetName(), options)
farmbuyer@99 877 handler = function (sf)
farmbuyer@99 878 LibStub("AceConfigDialog-3.0"):Open (plugin:GetName(), sf)
farmbuyer@99 879 end
farmbuyer@99 880
farmbuyer@99 881 elseif type(options) == 'function' then
farmbuyer@99 882 -- AceGUI callback
farmbuyer@99 883 if pdb then
farmbuyer@99 884 handler = function (sf)
farmbuyer@99 885 sf:AddChildren(mktitle(text))
farmbuyer@99 886 local ret = options (sf, plugin, code)
farmbuyer@99 887 local w = mkbutton("Reset",
farmbuyer@99 888 ([[Reset settings for <%s> plugin back to defaults. Shift-click to also trigger a UI reload.]]):format(text))
farmbuyer@99 889 w:SetRelativeWidth(0.3)
farmbuyer@99 890 w:SetCallback("OnClick", function(_w)
farmbuyer@99 891 pdb:ResetProfile()
farmbuyer@99 892 if IsShiftKeyDown() then ReloadUI() end
farmbuyer@99 893 end)
farmbuyer@99 894 sf:AddChildren(spacer(10),w)
farmbuyer@99 895 return ret
farmbuyer@99 896 end
farmbuyer@99 897 else
farmbuyer@99 898 handler = function (sf)
farmbuyer@99 899 sf:AddChildren(mktitle(text))
farmbuyer@99 900 return options (sf, plugin, code)
farmbuyer@99 901 end
farmbuyer@99 902 end
farmbuyer@99 903
farmbuyer@99 904 else
farmbuyer@99 905 error(("Error: 'options' parameter for plugin '%s' is neither table nor function"):format(plugin:GetName()))
farmbuyer@99 906 end
farmbuyer@99 907
farmbuyer@99 908 if not controls[code] then
farmbuyer@99 909 controls[code] = {}
farmbuyer@99 910 end
farmbuyer@99 911 table.insert (controls[code], handler)
farmbuyer@99 912
farmbuyer@99 913 table.insert (options_tree, insertion_index, {
farmbuyer@99 914 value = code,
farmbuyer@99 915 text = text, -- maybe call markup on this?
farmbuyer@99 916 })
farmbuyer@99 917 insertion_index = insertion_index + 1
farmbuyer@99 918 -- The treegroup will rescan options_tree (via RefreshTree) several times
farmbuyer@99 919 -- before the player actually sees anything; no more work needs doing.
farmbuyer@99 920 return -- something that can be used as 'parent'
farmbuyer@99 921 end
farmbuyer@99 922
farmbuyer@99 923
farmbuyer@96 924 -- vim:noet