annotate options.lua @ 103:dc8a23a47b03

- Add 'chatprefix' function for building loot line jump links, and a 'PCFPrint' method which displays them. - Make use of them for local and remote notifications, boss kills, and manual insertions. - Document the additional slash commands and args feature from previous release. Oops. (Text mostly copied from webpage announcement.)
author Farmbuyer of US-Kilrogg <farmbuyer@gmail.com>
date Sun, 05 Aug 2012 07:26:06 +0000
parents fe04f5c4114a
children 04198c8d0717
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@102 72 local w = mkbutton("CheckBox", 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@101 253 chatgroup:SetTitle("Notify on 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@101 259 editbox:SetDisabled((not opts.chatty_on_remote_changes) and
farmbuyer@101 260 (not opts.chatty_on_local_changes))
farmbuyer@96 261 end)
farmbuyer@96 262 toggle:SetFullWidth(true)
farmbuyer@96 263 chatgroup:AddChild(toggle)
farmbuyer@101 264 toggle = mktoggle('chatty_on_local_changes', "Be chatty on your own changes", 1,
farmbuyer@101 265 [[Print something to chat when you change recorded loot (as a reminder).]],
farmbuyer@101 266 function (_w,_,value)
farmbuyer@101 267 opts.chatty_on_local_changes = value
farmbuyer@101 268 editbox:SetDisabled((not opts.chatty_on_remote_changes) and
farmbuyer@101 269 (not opts.chatty_on_local_changes))
farmbuyer@101 270 end)
farmbuyer@101 271 toggle:SetFullWidth(true)
farmbuyer@101 272 chatgroup:AddChild(toggle)
farmbuyer@101 273
farmbuyer@96 274 w = AceGUI:Create("Label")
farmbuyer@96 275 w:SetFullWidth(true)
farmbuyer@103 276 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 277 chatgroup:AddChild(w)
farmbuyer@101 278 editbox = mkbutton("EditBox", nil, opts.chatty_on_changes_frame,
farmbuyer@96 279 [[1 = default chat frame, 2 = combat log, etc]])
farmbuyer@96 280 editbox:SetFullWidth(true)
farmbuyer@96 281 editbox:SetLabel("Output Chatframe")
farmbuyer@96 282 editbox:SetCallback("OnTextChanged", adv_careful_OnTextChanged)
farmbuyer@96 283 editbox:SetCallback("OnEnterPressed", function(_w,event,value)
farmbuyer@101 284 local prev = opts.chatty_on_changes_frame
farmbuyer@96 285 value = value:trim()
farmbuyer@96 286 value = tonumber(value) or value
farmbuyer@101 287 if addon:_set_chatty_change_chatframe (value) then
farmbuyer@101 288 opts.chatty_on_changes_frame = value
farmbuyer@96 289 _w:SetText(tostring(value))
farmbuyer@96 290 _w.editbox:ClearFocus()
farmbuyer@96 291 else
farmbuyer@96 292 _w:SetText(tostring(prev))
farmbuyer@96 293 end
farmbuyer@96 294 end)
farmbuyer@101 295 editbox:SetDisabled((not opts.chatty_on_remote_changes) and
farmbuyer@101 296 (not opts.chatty_on_local_changes))
farmbuyer@96 297 chatgroup:AddChild(editbox)
farmbuyer@96 298 w = mkbutton("Chat Frame Numbers",
farmbuyer@96 299 [[Print each chat window number in its own frame, for easy reference in the editing field.]])
farmbuyer@96 300 w:SetFullWidth(true)
farmbuyer@96 301 w:SetCallback("OnClick", function()
farmbuyer@96 302 for i = 1, NUM_CHAT_WINDOWS do
farmbuyer@96 303 local cf = _G['ChatFrame'..i]
farmbuyer@96 304 if not cf then break end
farmbuyer@96 305 addon:CFPrint (cf, "This is frame number |cffff0000%d|r.", i)
farmbuyer@96 306 end
farmbuyer@96 307 end)
farmbuyer@96 308 chatgroup:AddChild(w)
farmbuyer@96 309 container:AddChild(chatgroup)
farmbuyer@96 310 end
farmbuyer@96 311
farmbuyer@96 312 -- boss mod selection
farmbuyer@97 313 container:AddChild(spacer(2))
farmbuyer@96 314 do
farmbuyer@96 315 local list = {}
farmbuyer@96 316 local current
farmbuyer@96 317 for k,v in ipairs(addon.bossmods) do
farmbuyer@96 318 list[k] = v.n
farmbuyer@96 319 if v.n == opts.bossmod then
farmbuyer@96 320 current = k
farmbuyer@96 321 end
farmbuyer@96 322 end
farmbuyer@96 323 w = mkbutton("Dropdown", nil, "", [[Which 'boss mod' to use.]])
farmbuyer@96 324 w:SetRelativeWidth(0.3)
farmbuyer@96 325 w:SetLabel("Boss Mod:")
farmbuyer@96 326 w:SetList(list)
farmbuyer@96 327 w:SetValue(current)
farmbuyer@96 328 w:SetCallback("OnValueChanged", function(_w,event,choice)
farmbuyer@96 329 opts.bossmod = list[choice]
farmbuyer@96 330 end)
farmbuyer@96 331 container:AddChild(w)
farmbuyer@96 332 end
farmbuyer@96 333
farmbuyer@96 334 container:ResumeLayout()
farmbuyer@96 335 container:DoLayout()
farmbuyer@96 336 AceGUI:ClearFocus()
farmbuyer@96 337 end
farmbuyer@96 338
farmbuyer@96 339
farmbuyer@96 340 ---------------
farmbuyer@96 341 do
farmbuyer@97 342 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 343
farmbuyer@97 344 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 345 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 346
farmbuyer@96 347 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 348 local cache_warn, cache_warned = false, false
farmbuyer@96 349 local function do_warning (cnt)
farmbuyer@96 350 if cache_warn and not cache_warned then
farmbuyer@96 351 cache_warned = true
farmbuyer@96 352 addon:Print(warntext)
farmbuyer@96 353 local t = AceGUI:Create("Label")
farmbuyer@96 354 t:SetFullWidth(true)
farmbuyer@96 355 t:SetText(warntext)
farmbuyer@96 356 cnt:AddChild(t)
farmbuyer@96 357 end
farmbuyer@96 358 end
farmbuyer@96 359
farmbuyer@96 360 controls.basic_filter = function (container)
farmbuyer@96 361 container:AddChildren(mktitle[[Item-Specific Special Handling]])
farmbuyer@96 362
farmbuyer@97 363 local w = AceGUI:Create("Label")
farmbuyer@97 364 w:SetFullWidth(true)
farmbuyer@97 365 w:SetText(description)
farmbuyer@97 366 container:AddChild(w)
farmbuyer@97 367 container:AddChild(spacer(20))
farmbuyer@97 368
farmbuyer@96 369 cache_warn, cache_warned = false, false
farmbuyer@96 370 local filterlist, vaultlist = {}, {}
farmbuyer@96 371 for id in pairs(opts.itemfilter) do
farmbuyer@96 372 local iname, _, iquality = GetItemInfo(id)
farmbuyer@96 373 if iname then
farmbuyer@96 374 filterlist[id] = ITEM_QUALITY_COLORS[iquality].hex .. iname .. "|r"
farmbuyer@96 375 else
farmbuyer@96 376 filterlist[id] = id
farmbuyer@96 377 cache_warn = true
farmbuyer@96 378 end
farmbuyer@96 379 end
farmbuyer@96 380 for id in pairs(opts.itemvault) do
farmbuyer@96 381 local iname, _, iquality = GetItemInfo(id)
farmbuyer@96 382 if iname then
farmbuyer@96 383 vaultlist[id] = ITEM_QUALITY_COLORS[iquality].hex .. iname .. "|r"
farmbuyer@96 384 else
farmbuyer@96 385 vaultlist[id] = id
farmbuyer@96 386 cache_warn = true
farmbuyer@96 387 end
farmbuyer@96 388 end
farmbuyer@97 389 -- This is so that the "add all defaults" button will never, ever,
farmbuyer@97 390 -- trip over cache misses.
farmbuyer@97 391 for id in pairs(addon.default_itemfilter) do GetItemInfo(id) end
farmbuyer@97 392 for id in pairs(addon.default_itemvault) do GetItemInfo(id) end
farmbuyer@96 393
farmbuyer@97 394 w = AceGUI:Create("EditBoxDropDown")
farmbuyer@96 395 w:SetRelativeWidth(0.4)
farmbuyer@96 396 w:SetText("Item filter")
farmbuyer@96 397 w:SetEditBoxTooltip("Link items which should no longer be tracked.")
farmbuyer@96 398 w:SetList(filterlist)
farmbuyer@96 399 w:SetCallback("OnTextEnterPressed", function(_w, _, text)
farmbuyer@96 400 local iname, ilink, iquality = GetItemInfo(text:trim())
farmbuyer@96 401 if not iname then
farmbuyer@96 402 return addon:Print("Error: %s is not a valid item name/link!", text)
farmbuyer@96 403 end
farmbuyer@96 404 local id = tonumber(ilink:match("item:(%d+)"))
farmbuyer@96 405 filterlist[id] = ITEM_QUALITY_COLORS[iquality].hex .. iname .. "|r"
farmbuyer@96 406 opts.itemfilter[id] = true
farmbuyer@96 407 addon:Print("Now filtering out", ilink)
farmbuyer@96 408 end)
farmbuyer@96 409 w:SetCallback("OnListItemClicked", function(_w, _, key_id, val_name)
farmbuyer@96 410 --local ilink = select(2,GetItemInfo(key_id))
farmbuyer@96 411 opts.itemfilter[tonumber(key_id)] = nil
farmbuyer@96 412 --addon:Print("No longer filtering out", ilink)
farmbuyer@96 413 addon:Print("No longer filtering out", val_name)
farmbuyer@96 414 end)
farmbuyer@96 415 --w:SetCallback("OnDropdownShown",do_warning)
farmbuyer@96 416 w:SetCallback("OnDropdownShown", function()
farmbuyer@96 417 do_warning(container)
farmbuyer@96 418 end)
farmbuyer@96 419 container:AddChild(w)
farmbuyer@96 420
farmbuyer@96 421 w = AceGUI:Create("Spacer")
farmbuyer@96 422 w:SetRelativeWidth(0.1)
farmbuyer@96 423 w:SetHeight(2)
farmbuyer@96 424 container:AddChild(w)
farmbuyer@96 425
farmbuyer@96 426 w = AceGUI:Create("EditBoxDropDown")
farmbuyer@96 427 w:SetRelativeWidth(0.4)
farmbuyer@96 428 w:SetText("Vault items")
farmbuyer@96 429 w:SetEditBoxTooltip("Link items which should be automatically marked as guild vault.")
farmbuyer@96 430 w:SetList(vaultlist)
farmbuyer@96 431 w:SetCallback("OnTextEnterPressed", function(_w, _, text)
farmbuyer@96 432 local iname, ilink, iquality = GetItemInfo(text:trim())
farmbuyer@96 433 if not iname then
farmbuyer@96 434 return addon:Print("Error: %s is not a valid item name/link!", text)
farmbuyer@96 435 end
farmbuyer@96 436 local id = tonumber(ilink:match("item:(%d+)"))
farmbuyer@96 437 vaultlist[id] = ITEM_QUALITY_COLORS[iquality].hex .. iname .. "|r"
farmbuyer@96 438 opts.itemvault[id] = true
farmbuyer@96 439 addon:Print("Now auto-vaulting", ilink)
farmbuyer@96 440 end)
farmbuyer@96 441 w:SetCallback("OnListItemClicked", function(_w, _, key_id, val_name)
farmbuyer@96 442 --local ilink = select(2,GetItemInfo(key_id))
farmbuyer@96 443 opts.itemfilter[tonumber(key_id)] = nil
farmbuyer@96 444 --addon:Print("No longer filtering out", ilink)
farmbuyer@96 445 addon:Print("No longer auto-vaulting", val_name)
farmbuyer@96 446 end)
farmbuyer@96 447 w:SetCallback("OnDropdownShown",do_warning)
farmbuyer@96 448 container:AddChild(w)
farmbuyer@97 449
farmbuyer@97 450 local function MAYBE_ADD (destname, dest, id)
farmbuyer@97 451 local name, link = GetItemInfo(id)
farmbuyer@97 452 if not name then
farmbuyer@97 453 addon:Print("> No data on ID %d, this may be a bug.",id)
farmbuyer@97 454 return
farmbuyer@97 455 end
farmbuyer@97 456 if dest[id] then
farmbuyer@97 457 addon:Print("> Skipping %s as it's already in '%s' list.",
farmbuyer@97 458 link, destname)
farmbuyer@97 459 else
farmbuyer@97 460 dest[id] = true
farmbuyer@97 461 addon:Print("> Added %s to '%s' list.", link, destname)
farmbuyer@97 462 end
farmbuyer@97 463 end
farmbuyer@97 464
farmbuyer@97 465 container:AddChild(spacer(40))
farmbuyer@97 466 w = AceGUI:Create("Label")
farmbuyer@97 467 w:SetFullWidth(true)
farmbuyer@97 468 w:SetText(defaultstext)
farmbuyer@97 469 container:AddChild(w)
farmbuyer@97 470 w = AceGUI:Create("Button")
farmbuyer@97 471 w:SetRelativeWidth(0.4)
farmbuyer@97 472 w:SetText[[Add Default Entries]]
farmbuyer@97 473 w:SetCallback("OnClick", function()
farmbuyer@97 474 for id in pairs(addon.default_itemfilter) do
farmbuyer@97 475 MAYBE_ADD ("filter", opts.itemfilter, id)
farmbuyer@97 476 end
farmbuyer@97 477 for id in pairs(addon.default_itemvault) do
farmbuyer@97 478 MAYBE_ADD ("vault", opts.itemvault, id)
farmbuyer@97 479 end
farmbuyer@97 480 addon:redisplay()
farmbuyer@97 481 end)
farmbuyer@97 482 container:AddChild(w)
farmbuyer@97 483 end
farmbuyer@97 484 end
farmbuyer@97 485
farmbuyer@97 486
farmbuyer@97 487 ---------------
farmbuyer@97 488 do
farmbuyer@97 489 local profiles
farmbuyer@97 490 controls.basic_profiles = function (container)
farmbuyer@97 491 if not profiles then
farmbuyer@97 492 profiles = LibStub("AceDBOptions-3.0"):GetOptionsTable(addon.db)
farmbuyer@97 493 LibStub("AceConfig-3.0"):RegisterOptionsTable("OuroLootProfiles", profiles)
farmbuyer@97 494 end
farmbuyer@97 495 LibStub("AceConfigDialog-3.0"):Open ("OuroLootProfiles", container)
farmbuyer@96 496 end
farmbuyer@96 497 end
farmbuyer@96 498
farmbuyer@96 499
farmbuyer@96 500 ---------------
farmbuyer@96 501 local adv_real = function (container)
farmbuyer@96 502 container:AddChildren(mktitle[[Debugging Options (not saved across sessions)]])
farmbuyer@96 503
farmbuyer@96 504 container:PauseLayout()
farmbuyer@96 505 local w
farmbuyer@96 506
farmbuyer@96 507 do
farmbuyer@96 508 local grp = AceGUI:Create("InlineGroup")
farmbuyer@96 509 grp:SetLayout("List")
farmbuyer@96 510 grp:SetRelativeWidth(0.60)
farmbuyer@96 511 grp:SetTitle("Output of debugging messages")
farmbuyer@96 512
farmbuyer@102 513 w = AceGUI:Create("CheckBox")
farmbuyer@96 514 w:SetFullWidth(true)
farmbuyer@96 515 w:SetType("checkbox")
farmbuyer@96 516 w:SetLabel("master toggle")
farmbuyer@96 517 w:SetValue(addon.DEBUG_PRINT)
farmbuyer@96 518 w:SetCallback("OnValueChanged", function(_w,event,value)
farmbuyer@96 519 addon.DEBUG_PRINT = value
farmbuyer@96 520 addon:redisplay()
farmbuyer@96 521 end)
farmbuyer@96 522 grp:AddChild(w)
farmbuyer@96 523 for d,v in pairs(addon.debug) do
farmbuyer@102 524 w = AceGUI:Create("CheckBox")
farmbuyer@96 525 w:SetFullWidth(true)
farmbuyer@96 526 w:SetType("checkbox")
farmbuyer@96 527 w:SetLabel(d)
farmbuyer@96 528 if d == "notraid" then
farmbuyer@96 529 w:SetDescription[[Tick this before enabling to make the addon work outside of raid groups]]
farmbuyer@96 530 else
farmbuyer@96 531 if d == "alsolog" then
farmbuyer@96 532 w:SetDescription[[Also log all debug messages to disk. See print_log.lua in the addon folder for later viewing.]]
farmbuyer@96 533 end
farmbuyer@96 534 w:SetDisabled(not addon.DEBUG_PRINT)
farmbuyer@96 535 end
farmbuyer@96 536 w:SetValue(v)
farmbuyer@100 537 w:SetCallback("OnValueChanged", function(_w,event,value)
farmbuyer@100 538 addon.debug[d] = value
farmbuyer@100 539 if d == "comm" then
farmbuyer@100 540 addon.is_guilded = _G.IsInGuild()
farmbuyer@100 541 end
farmbuyer@100 542 end)
farmbuyer@96 543 grp:AddChild(w)
farmbuyer@96 544 end
farmbuyer@96 545 container:AddChild(grp)
farmbuyer@96 546 end
farmbuyer@96 547
farmbuyer@96 548 do
farmbuyer@96 549 local simple = AceGUI:Create("SimpleGroup")
farmbuyer@96 550 simple:SetLayout("List")
farmbuyer@96 551 simple:SetRelativeWidth(0.35)
farmbuyer@102 552 w = AceGUI:Create("CheckBox")
farmbuyer@96 553 --w:SetRelativeWidth(0.35)
farmbuyer@96 554 w:SetFullWidth(true)
farmbuyer@96 555 w:SetType("checkbox")
farmbuyer@96 556 w:SetLabel("GOP history mode")
farmbuyer@96 557 w:SetValue(addon.history_suppress)
farmbuyer@96 558 w:SetCallback("OnValueChanged", function(_w,event,value) addon.history_suppress = value end)
farmbuyer@96 559 simple:AddChild(w)
farmbuyer@96 560 w = mkbutton("Dropdown", nil, "",
farmbuyer@96 561 [[if active, tooltip shown when hovering over Item column only]])
farmbuyer@96 562 --w:SetRelativeWidth(0.4)
farmbuyer@96 563 w:SetFullWidth(true)
farmbuyer@96 564 w:SetLabel("loot debugging tooltip")
farmbuyer@96 565 w:SetList{
farmbuyer@96 566 [1] = "Off",
farmbuyer@96 567 [2] = "/dump into tooltip",
farmbuyer@96 568 [3] = "small fixed fields",
farmbuyer@96 569 }
farmbuyer@96 570 w:SetValue(gui._do_debugging_tooltip or 1)
farmbuyer@96 571 w:SetCallback("OnValueChanged", function(_w,event,choice)
farmbuyer@96 572 gui._do_debugging_tooltip = choice > 1 and choice or nil
farmbuyer@96 573 end)
farmbuyer@96 574 simple:AddChild(w)
farmbuyer@96 575 container:AddChild(simple)
farmbuyer@96 576 end
farmbuyer@96 577
farmbuyer@97 578 container:AddChild(spacer(10))
farmbuyer@96 579
farmbuyer@96 580 w = mkbutton("EditBox", 'comm_ident', addon.ident,
farmbuyer@96 581 [[Set tracking to 'Disabled' in the top-right dropdown, then change this field (click Okay or press Enter).]])
farmbuyer@96 582 w:SetRelativeWidth(0.25)
farmbuyer@96 583 w:SetLabel("Addon channel ID")
farmbuyer@96 584 w:SetCallback("OnTextChanged", adv_careful_OnTextChanged)
farmbuyer@96 585 w:SetCallback("OnEnterPressed", function(_w,event,value)
farmbuyer@96 586 -- if they set it to blank spaces, they're boned. oh well.
farmbuyer@96 587 -- Re-enabling will take care of propogating this new value.
farmbuyer@96 588 addon.ident = (value == "") and "OuroLoot2" or value
farmbuyer@96 589 _w:SetText(addon.ident)
farmbuyer@96 590 addon:Print("Addon channel ID set to '".. addon.ident.. "' for rebroadcasting and listening.")
farmbuyer@96 591 end)
farmbuyer@96 592 w:SetDisabled(addon.enabled or addon.rebroadcast)
farmbuyer@96 593 container:AddChild(w)
farmbuyer@96 594
farmbuyer@96 595 w = mkbutton("EditBox", nil, addon.recent_messages.ttl, [[comm cache TTL]])
farmbuyer@96 596 w:SetRelativeWidth(0.1)
farmbuyer@96 597 w:SetLabel("ttl")
farmbuyer@96 598 w:SetCallback("OnTextChanged", adv_careful_OnTextChanged)
farmbuyer@96 599 w:SetCallback("OnEnterPressed", function(_w,event,value)
farmbuyer@96 600 value = tonumber(value) or addon.recent_messages.ttl
farmbuyer@96 601 addon.recent_messages.ttl = value
farmbuyer@96 602 _w:SetText(tostring(value))
farmbuyer@96 603 end)
farmbuyer@96 604 container:AddChild(w)
farmbuyer@96 605
farmbuyer@96 606 w = mkbutton("load nsaab1548", [[Cursed Darkhound]])
farmbuyer@96 607 w:SetRelativeWidth(0.25)
farmbuyer@96 608 w:SetCallback("OnClick", function()
farmbuyer@96 609 for i, v in ipairs(DBM.AddOns) do
farmbuyer@96 610 if v.modId == "DBM-NotScaryAtAll" then
farmbuyer@96 611 DBM:LoadMod(v)
farmbuyer@96 612 break
farmbuyer@96 613 end
farmbuyer@96 614 end
farmbuyer@96 615 local mod = DBM:GetModByName("NotScaryAtAll")
farmbuyer@96 616 if mod then
farmbuyer@96 617 mod:EnableMod()
farmbuyer@96 618 addon:Print("Now tracking ID",mod.creatureId)
farmbuyer@96 619 else
farmbuyer@96 620 addon:Print("Can do nothing; DBM testing mod wasn't loaded.")
farmbuyer@96 621 end
farmbuyer@96 622 end)
farmbuyer@102 623 w:SetDisabled(addon.bossmod_registered ~= 'DBM') -- set by :Activate
farmbuyer@96 624 container:AddChild(w)
farmbuyer@96 625
farmbuyer@96 626 w = mkbutton("GC", [[full GC cycle]])
farmbuyer@96 627 w:SetRelativeWidth(0.2)
farmbuyer@96 628 w:SetCallback("OnClick", function()
farmbuyer@96 629 local before = collectgarbage('count')
farmbuyer@96 630 collectgarbage('collect')
farmbuyer@96 631 local after = collectgarbage('count')
farmbuyer@96 632 addon:Print("Collected %d KB, %d KB still in use by Lua universe.", before-after, after)
farmbuyer@96 633 end)
farmbuyer@96 634 container:AddChild(w)
farmbuyer@96 635
farmbuyer@97 636 container:AddChild(spacer(3))
farmbuyer@96 637 do
farmbuyer@96 638 local simple = AceGUI:Create("SimpleGroup")
farmbuyer@96 639 simple:SetLayout("Flow")
farmbuyer@96 640 --simple:SetRelativeWidth(0.95)
farmbuyer@96 641 simple:SetFullWidth(true)
farmbuyer@96 642 w = mkbutton("MidS-H", [[not exactly an Easter egg, with sound]])
farmbuyer@96 643 w:SetRelativeWidth(0.2)
farmbuyer@96 644 w:SetCallback("OnClick", function()
farmbuyer@96 645 PlaySoundFile ([[Sound\Music\WorldEvents\HordeFirepole.mp3]], "Master")
farmbuyer@96 646 end)
farmbuyer@96 647 simple:AddChild(w)
farmbuyer@96 648 w = mkbutton("MidS-A", [[not exactly an Easter egg, with sound]])
farmbuyer@96 649 w:SetRelativeWidth(0.2)
farmbuyer@96 650 w:SetCallback("OnClick", function()
farmbuyer@96 651 PlaySoundFile ([[Sound\Music\WorldEvents\AllianceFirepole.mp3]], "Master")
farmbuyer@96 652 end)
farmbuyer@96 653 simple:AddChild(w)
farmbuyer@96 654 w = mkbutton("SFRR", [[test]])
farmbuyer@96 655 w:SetRelativeWidth(0.15)
farmbuyer@96 656 w:SetCallback("OnClick", function()
farmbuyer@96 657 PlaySoundFile ([[Interface\AddOns\Ouro_Loot\sfrr.ogg]], "Master")
farmbuyer@96 658 end)
farmbuyer@96 659 simple:AddChild(w)
farmbuyer@96 660
farmbuyer@96 661 container:AddChild(simple)
farmbuyer@96 662 end
farmbuyer@96 663
farmbuyer@96 664 w = AceGUI:Create("Spacer") w:SetRelativeWidth(0.65) w:SetHeight(15) container:AddChild(w)
farmbuyer@96 665 w = mkbutton("Clear All & Reload",
farmbuyer@96 666 [[No confirmation! |cffff1010Erases absolutely all> Ouro Loot saved variables and reloads the UI.]])
farmbuyer@96 667 w:SetRelativeWidth(0.3)
farmbuyer@96 668 w:SetCallback("OnClick", function()
farmbuyer@96 669 addon:_clear_SVs() -- reloads
farmbuyer@96 670 end)
farmbuyer@96 671 container:AddChild(w)
farmbuyer@96 672
farmbuyer@96 673 container:ResumeLayout()
farmbuyer@96 674 container:DoLayout()
farmbuyer@96 675 AceGUI:ClearFocus()
farmbuyer@96 676 --container:SetScroll(1000) -- scrollframe widget's max value
farmbuyer@96 677 end
farmbuyer@96 678
farmbuyer@96 679 -- Initial advanced panel function (unless debug mode is on during load, which
farmbuyer@96 680 -- means it was almost certainly hardcoded that way, which means it's probably
farmbuyer@96 681 -- me testing).
farmbuyer@97 682 if addon.DEBUG_PRINT then
farmbuyer@96 683 controls.adv = adv_real
farmbuyer@96 684 else
farmbuyer@96 685 controls.adv = function (container)
farmbuyer@96 686 local speedbump = AceGUI:Create("InteractiveLabel")
farmbuyer@96 687 speedbump:SetFullWidth(true)
farmbuyer@96 688 speedbump:SetFontObject(GameFontHighlightLarge)
farmbuyer@96 689 speedbump:SetImage[[Interface\DialogFrame\DialogAlertIcon]]
farmbuyer@96 690 speedbump:SetImageSize(50,50)
farmbuyer@96 691 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 692 speedbump:SetCallback("OnClick", function (_sb)
farmbuyer@96 693 controls.adv = { adv_real }
farmbuyer@96 694 return addon:redisplay()
farmbuyer@96 695 end)
farmbuyer@96 696 container:AddChild(speedbump)
farmbuyer@96 697 end
farmbuyer@96 698 end
farmbuyer@96 699
farmbuyer@96 700
farmbuyer@96 701 ---------------
farmbuyer@96 702 -- Tab 6: Options
farmbuyer@96 703 do
farmbuyer@96 704 local funkified = {}
farmbuyer@96 705 for key,f in pairs(controls) do
farmbuyer@99 706 -- this is how TreeGroup makes unique keys out of nested entries
farmbuyer@96 707 local funkykey = key:gsub('_','\001')
farmbuyer@96 708 funkified[funkykey] = { f }
farmbuyer@96 709 end
farmbuyer@96 710 controls = funkified
farmbuyer@96 711 end
farmbuyer@96 712
farmbuyer@96 713 -- widget container status tables (will have things magically appear
farmbuyer@96 714 -- inside them that we wish to preserve)
farmbuyer@96 715 local status_for_scroll = {}
farmbuyer@96 716 local status_for_select = { treewidth = 160 }
farmbuyer@96 717
farmbuyer@97 718 local function preload()
farmbuyer@97 719 for id in pairs(opts.itemfilter) do GetItemInfo(id) end
farmbuyer@97 720 for id in pairs(opts.itemvault) do GetItemInfo(id) end
farmbuyer@97 721 preload = nil
farmbuyer@97 722 end
farmbuyer@97 723
farmbuyer@99 724 local aceconfig_list = {}
farmbuyer@99 725
farmbuyer@99 726 -- Selecting an entry on the left tree column.
farmbuyer@96 727 local opt_OnGroupSelected_func = function (treeg,event,category)
farmbuyer@98 728 opts = addon.db.profile
farmbuyer@96 729 local catfuncs = controls[category]
farmbuyer@96 730 if not catfuncs then
farmbuyer@96 731 addon:horrible_horrible_error(("Category '%s' has no handler function!"):format(category:gsub('\001','_')))
farmbuyer@96 732 end
farmbuyer@96 733 treeg:ReleaseChildren()
farmbuyer@99 734 if aceconfig_list[category] then
farmbuyer@99 735 -- aceconfigdialog makes too many assumptions about scrolling
farmbuyer@99 736 for _,func in ipairs(catfuncs) do
farmbuyer@99 737 if func(treeg,category) then break end
farmbuyer@96 738 end
farmbuyer@96 739 else
farmbuyer@99 740 local sf = AceGUI:Create("ScrollFrame")
farmbuyer@99 741 sf:SetStatusTable(status_for_scroll)
farmbuyer@99 742 sf:SetLayout("Flow")
farmbuyer@99 743 -- This forces the scrolling area to be bigger than the visible area; else
farmbuyer@99 744 -- some of the text gets cut off without ever triggering the scrollbar.
farmbuyer@99 745 sf.content:SetHeight(700)
farmbuyer@99 746 for _,func in ipairs(catfuncs) do
farmbuyer@99 747 if func(sf,category) then break end
farmbuyer@99 748 end
farmbuyer@99 749 treeg:AddChild(sf)
farmbuyer@99 750 if treeg:GetUserData("options restore scroll") then
farmbuyer@99 751 if status_for_scroll.scrollvalue then
farmbuyer@99 752 sf:SetScroll(status_for_scroll.scrollvalue)
farmbuyer@99 753 end
farmbuyer@99 754 treeg:SetUserData("options restore scroll", false)
farmbuyer@99 755 else
farmbuyer@99 756 sf:SetScroll(0)
farmbuyer@99 757 end
farmbuyer@96 758 end
farmbuyer@96 759 end
farmbuyer@96 760
farmbuyer@96 761 -- Clicking the Options tab as a whole (tabs_OnGroupSelected["opt"]).
farmbuyer@96 762 local tabs_OGS = function (container, specials)
farmbuyer@96 763 container:SetLayout("Fill")
farmbuyer@96 764 local left = AceGUI:Create("TreeGroup")
farmbuyer@96 765 left:SetStatusTable(status_for_select)
farmbuyer@96 766 left:SetLayout("Fill")
farmbuyer@96 767 left:SetFullWidth(true)
farmbuyer@96 768 left:SetFullHeight(true)
farmbuyer@96 769 left:EnableButtonTooltips(false)
farmbuyer@96 770 left:SetTree(options_tree)
farmbuyer@96 771 left:SetCallback("OnGroupSelected", opt_OnGroupSelected_func)
farmbuyer@96 772 container:AddChild(left)
farmbuyer@96 773 if status_for_select.selected then
farmbuyer@96 774 left:SetUserData("options restore scroll", true)
farmbuyer@96 775 left:SelectByValue(status_for_select.selected)
farmbuyer@96 776 else
farmbuyer@96 777 left:SelectByValue("basic")
farmbuyer@96 778 end
farmbuyer@96 779
farmbuyer@96 780 local w = mkbutton("ReloadUI",
farmbuyer@96 781 [[Does what you think it does. Loot information is written out and restored.]])
farmbuyer@96 782 w:SetFullWidth(true)
farmbuyer@96 783 w:SetCallback("OnClick", ReloadUI)
farmbuyer@96 784 specials:AddChild(w)
farmbuyer@96 785
farmbuyer@96 786 w = mkbutton("Ping!",
farmbuyer@96 787 [[Queries other raid users for their addon version and current status. Results displayed on Pongs panel after five seconds.]])
farmbuyer@96 788 w:SetFullWidth(true)
farmbuyer@96 789 w:SetCallback("OnClick", function(_w)
farmbuyer@96 790 _w:SetText("5... 4... 3...")
farmbuyer@96 791 _w:SetDisabled(true)
farmbuyer@96 792 addon:DoPing()
farmbuyer@96 793 addon:ScheduleTimer(function(b)
farmbuyer@96 794 if b:IsVisible() then
farmbuyer@96 795 return addon:redisplay()
farmbuyer@96 796 end
farmbuyer@96 797 end, 5, _w)
farmbuyer@96 798 end)
farmbuyer@96 799 specials:AddChild(w)
farmbuyer@97 800
farmbuyer@97 801 if preload then preload() end
farmbuyer@96 802 end
farmbuyer@96 803
farmbuyer@96 804 addon:register_tab_control_AT_END ("opt", [[Options]],
farmbuyer@103 805 [[Options for fine-tuning behavior]], tabs_OGS, [[
farmbuyer@103 806 The "be chatty" options can be noisy, but they make the
farmbuyer@103 807 |cffff8000[Ouro Loot]|r link much more useful. See
farmbuyer@103 808 <Help -- Handy Tips> for details!
farmbuyer@103 809 ]])
farmbuyer@96 810
farmbuyer@99 811
farmbuyer@99 812 ---------------
farmbuyer@99 813 -- Registering new options entries
farmbuyer@99 814 local insertion_index = #options_tree
farmbuyer@99 815 for i = #options_tree, 1, -1 do
farmbuyer@99 816 if options_tree[i] == 'NEW INSERTIONS HERE' then
farmbuyer@99 817 insertion_index = i
farmbuyer@99 818 break
farmbuyer@99 819 end
farmbuyer@99 820 end
farmbuyer@99 821 if insertion_index then
farmbuyer@99 822 table.remove (options_tree, insertion_index)
farmbuyer@99 823 else
farmbuyer@99 824 insertion_index = #options_tree + 1
farmbuyer@99 825 end
farmbuyer@99 826
farmbuyer@99 827
farmbuyer@99 828 --[[
farmbuyer@100 829 PLUGIN is the module table itself. (This does not actually have to be
farmbuyer@100 830 a plugin created with :[Constrained]NewModule, as long as it has a
farmbuyer@102 831 GetName method and
farmbuyer@102 832 - TEXT is passed
farmbuyer@102 833 - if OPTIONS is a table, then OPTIONS.args.name exists
farmbuyer@99 834 PARENT is nil to register in the tree list directly.
farmbuyer@99 835 TEXT is either the text to display in the tree list, or nil to use the
farmbuyer@99 836 moduleName field out of PLUGIN (not :GetName()).
farmbuyer@99 837 OPTIONS is either
farmbuyer@102 838 I) an aceconfig-style options table
farmbuyer@102 839 II) a function to call directly
farmbuyer@99 840
farmbuyer@99 841 (I) Will augment options.args.name with coloring/sizing, if it exists.
farmbuyer@99 842 (Set options.args.name.name before registering.) Will create it if not
farmbuyer@99 843 present.
farmbuyer@99 844
farmbuyer@99 845 (II) Title added unconditionally. Callback is
farmbuyer@99 846 options (scrollframe_container, plugin, unique_code)
farmbuyer@99 847 where UNIQUE_CODE is what's used by the TreeGroup widget in identifying
farmbuyer@99 848 the "button" clicked in the lefthand tree list.
farmbuyer@99 849
farmbuyer@99 850 Will append a reset button IFF an options database has been registered already.
farmbuyer@99 851 ]]
farmbuyer@99 852 function addon:register_options_entry (plugin, parent, text, options)
farmbuyer@99 853 -- if this changes at all, fix up plugin_reset_button accordingly
farmbuyer@99 854 local code = plugin:GetName()
farmbuyer@99 855 --if parent
farmbuyer@99 856
farmbuyer@99 857 text = text or plugin.moduleName
farmbuyer@99 858
farmbuyer@99 859 local handler
farmbuyer@102 860 local pdb = plugin.moduleName and
farmbuyer@102 861 self.db:GetNamespace (plugin.moduleName, --[[silent=]]true)
farmbuyer@102 862
farmbuyer@99 863 if type(options) == 'table' then
farmbuyer@99 864 -- AceConfig-style options table
farmbuyer@99 865 aceconfig_list[code] = true
farmbuyer@99 866 if not options.args.name then
farmbuyer@99 867 options.args.name = {
farmbuyer@99 868 name = plugin.moduleName,
farmbuyer@99 869 type = 'description',
farmbuyer@99 870 }
farmbuyer@99 871 end
farmbuyer@99 872 options.args.name.name = '|cff30adff' .. options.args.name.name .. '|r'
farmbuyer@99 873 options.args.name.fontSize = 'large'
farmbuyer@99 874 options.args.name.width = 'full'
farmbuyer@99 875 options.args.name.cmdHidden = true
farmbuyer@99 876 options.args.name.order = 1
farmbuyer@99 877 if pdb then
farmbuyer@99 878 options.args.INSERTED_SPACER = {
farmbuyer@99 879 name = '',
farmbuyer@99 880 type = 'description',
farmbuyer@99 881 cmdHidden = true,
farmbuyer@99 882 width = 'full',
farmbuyer@99 883 order = 9000,
farmbuyer@99 884 }
farmbuyer@99 885 options.args.RESET = {
farmbuyer@99 886 name = "Reset",
farmbuyer@99 887 desc = ([[Reset settings for <%s> plugin back to defaults. Shift-click to also trigger a UI reload.]]):format(plugin:GetName()),
farmbuyer@99 888 type = 'execute',
farmbuyer@99 889 func = function()
farmbuyer@99 890 pdb:ResetProfile()
farmbuyer@99 891 if IsShiftKeyDown() then ReloadUI() end
farmbuyer@99 892 end,
farmbuyer@99 893 order = 9001,
farmbuyer@99 894 }
farmbuyer@99 895 end
farmbuyer@99 896 LibStub("AceConfig-3.0"):RegisterOptionsTable(plugin:GetName(), options)
farmbuyer@99 897 handler = function (sf)
farmbuyer@99 898 LibStub("AceConfigDialog-3.0"):Open (plugin:GetName(), sf)
farmbuyer@99 899 end
farmbuyer@99 900
farmbuyer@99 901 elseif type(options) == 'function' then
farmbuyer@99 902 -- AceGUI callback
farmbuyer@99 903 if pdb then
farmbuyer@99 904 handler = function (sf)
farmbuyer@99 905 sf:AddChildren(mktitle(text))
farmbuyer@99 906 local ret = options (sf, plugin, code)
farmbuyer@99 907 local w = mkbutton("Reset",
farmbuyer@99 908 ([[Reset settings for <%s> plugin back to defaults. Shift-click to also trigger a UI reload.]]):format(text))
farmbuyer@99 909 w:SetRelativeWidth(0.3)
farmbuyer@99 910 w:SetCallback("OnClick", function(_w)
farmbuyer@99 911 pdb:ResetProfile()
farmbuyer@99 912 if IsShiftKeyDown() then ReloadUI() end
farmbuyer@99 913 end)
farmbuyer@99 914 sf:AddChildren(spacer(10),w)
farmbuyer@99 915 return ret
farmbuyer@99 916 end
farmbuyer@99 917 else
farmbuyer@99 918 handler = function (sf)
farmbuyer@99 919 sf:AddChildren(mktitle(text))
farmbuyer@99 920 return options (sf, plugin, code)
farmbuyer@99 921 end
farmbuyer@99 922 end
farmbuyer@99 923
farmbuyer@99 924 else
farmbuyer@99 925 error(("Error: 'options' parameter for plugin '%s' is neither table nor function"):format(plugin:GetName()))
farmbuyer@99 926 end
farmbuyer@99 927
farmbuyer@99 928 if not controls[code] then
farmbuyer@99 929 controls[code] = {}
farmbuyer@99 930 end
farmbuyer@99 931 table.insert (controls[code], handler)
farmbuyer@99 932
farmbuyer@99 933 table.insert (options_tree, insertion_index, {
farmbuyer@99 934 value = code,
farmbuyer@99 935 text = text, -- maybe call markup on this?
farmbuyer@99 936 })
farmbuyer@99 937 insertion_index = insertion_index + 1
farmbuyer@99 938 -- The treegroup will rescan options_tree (via RefreshTree) several times
farmbuyer@99 939 -- before the player actually sees anything; no more work needs doing.
farmbuyer@99 940 return -- something that can be used as 'parent'
farmbuyer@99 941 end
farmbuyer@99 942
farmbuyer@99 943
farmbuyer@96 944 -- vim:noet