annotate options.lua @ 151:42dd3076baaf

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