annotate options.lua @ 114:67bf97136273

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