farmbuyer@96: local addon = select(2,...) farmbuyer@96: if addon.NOLOAD then return end farmbuyer@96: farmbuyer@96: -- Don't bother recording any of this loot: farmbuyer@96: addon.default_itemfilter = { farmbuyer@97: [52190] = true, -- Inferno Ruby farmbuyer@97: [52191] = true, -- Ocean Sapphire farmbuyer@97: [52192] = true, -- Dream Emerald farmbuyer@97: [52193] = true, -- Ember Topaz farmbuyer@97: [52194] = true, -- Demonseye farmbuyer@97: [52195] = true, -- Amberjewel farmbuyer@97: [52722] = true, -- Maelstrom Crystal farmbuyer@97: [71716] = true, -- Soothsayer's Runes farmbuyer@96: -- could probably remove most of this now farmbuyer@97: -- [29434] = true, -- Badge of Justice farmbuyer@97: -- [40752] = true, -- Emblem of Heroism farmbuyer@97: -- [40753] = true, -- Emblem of Valor farmbuyer@97: -- [45624] = true, -- Emblem of Conquest farmbuyer@97: -- [43228] = true, -- Stone Keeper's Shard farmbuyer@97: -- [47241] = true, -- Emblem of Triumph farmbuyer@97: -- [49426] = true, -- Emblem of Frost farmbuyer@96: } farmbuyer@96: farmbuyer@96: -- Mark these as straight to guild vault: farmbuyer@96: addon.default_itemvault = { farmbuyer@97: [52078] = true, -- Chaos Orb farmbuyer@97: [69237] = true, -- Living Ember farmbuyer@97: [71998] = true, -- Essence of Destruction farmbuyer@96: } farmbuyer@96: farmbuyer@96: local options_tree = { farmbuyer@96: { farmbuyer@96: value = "pong", farmbuyer@96: text = "Pongs", farmbuyer@96: }, farmbuyer@96: { farmbuyer@96: value = "basic", farmbuyer@96: text = "Options", farmbuyer@96: children = { farmbuyer@96: { farmbuyer@96: value = "filter", farmbuyer@96: text = "Item Filters", farmbuyer@96: }, farmbuyer@97: { farmbuyer@97: value = "profiles", farmbuyer@97: text = "Profiles", farmbuyer@97: }, farmbuyer@96: }, farmbuyer@96: }, farmbuyer@96: { farmbuyer@96: value = "adv", farmbuyer@96: text = "Advanced/Debugging", farmbuyer@96: }, farmbuyer@96: } farmbuyer@96: farmbuyer@96: farmbuyer@96: --[[ farmbuyer@96: mkbutton ("WidgetType", 'display key', "Text On Widget", "mouseover status text") farmbuyer@96: mkbutton ( [Button] 'display key', "Text On Widget", "mouseover status text") farmbuyer@96: mkbutton ( [Button] [text] "Text On Widget", "mouseover status text") farmbuyer@96: ]] farmbuyer@96: local mkbutton = addon.gui_state_pointer.mkbutton farmbuyer@96: local gui = addon.gui_state_pointer farmbuyer@96: local AceGUI = LibStub("AceGUI-3.0") farmbuyer@96: local flib = LibStub("LibFarmbuyer") farmbuyer@96: local opts farmbuyer@96: farmbuyer@96: local function mktoggle (opt, label, width, desc, opt_func) farmbuyer@96: local w = mkbutton("CheckBoxSmallLabel", nil, "", desc) farmbuyer@96: w:SetRelativeWidth(width) farmbuyer@96: w:SetType("checkbox") farmbuyer@96: w:SetLabel(label) farmbuyer@96: if opt then farmbuyer@96: w:SetValue(opts[opt]) farmbuyer@96: w:SetCallback("OnValueChanged", opt_func or (function(_w,event,value) farmbuyer@96: opts[opt] = value farmbuyer@96: end)) farmbuyer@96: end farmbuyer@96: return w farmbuyer@96: end farmbuyer@96: farmbuyer@97: local function spacer (height) farmbuyer@97: local s = AceGUI:Create("Spacer") farmbuyer@97: s:SetFullWidth(true) farmbuyer@97: s:SetHeight(height) farmbuyer@97: return s farmbuyer@97: end farmbuyer@97: farmbuyer@96: local function mktitle (txt) farmbuyer@96: local t = AceGUI:Create("Label") farmbuyer@96: t:SetFullWidth(true) farmbuyer@96: t:SetColor (0.19, 0.68, 1) -- cff30adff farmbuyer@96: t:SetFontObject(GameFontHighlightLarge) farmbuyer@96: t:SetText(txt) farmbuyer@97: return t, spacer(20) farmbuyer@96: end farmbuyer@96: farmbuyer@96: local function adv_careful_OnTextChanged (ebox,event,value) farmbuyer@96: -- The EditBox widget's code will call an internal ShowButton routine farmbuyer@96: -- after this callback returns. ShowButton will test for this flag: farmbuyer@96: ebox:DisableButton (value == "") farmbuyer@96: end farmbuyer@96: farmbuyer@96: farmbuyer@96: --------------- farmbuyer@96: -- All controls take a scrollframe container set to Flow layout. farmbuyer@96: local controls = {} farmbuyer@96: controls.pong = function (container) farmbuyer@96: container:AddChildren(mktitle[[Echoes from latest ping:]]) farmbuyer@96: addon.sender_list.sort() farmbuyer@96: if #addon.sender_list.namesI > 0 then farmbuyer@96: local w = AceGUI:Create("Label") farmbuyer@96: w:SetFullWidth(true) farmbuyer@96: w:SetText(table.concat(addon.sender_list.namesI,'\n')) -- sigh farmbuyer@96: container:AddChild(w) farmbuyer@96: end farmbuyer@96: end farmbuyer@96: farmbuyer@96: farmbuyer@96: --------------- farmbuyer@96: controls.basic = function (container) farmbuyer@96: container:AddChildren(mktitle[[Account Options (saved across sessions)]]) farmbuyer@96: farmbuyer@96: container:PauseLayout() farmbuyer@96: local w farmbuyer@96: local stdw = 0.99 -- standard width farmbuyer@96: farmbuyer@96: -- the nubtoggle! farmbuyer@96: w = mktoggle('gui_noob', [[Show UI Tips]], stdw, farmbuyer@96: [[Toggles display of the "helpful tips" box hanging off the right side. Useful if you've just installed/upgraded.]]) farmbuyer@96: container:AddChild(w) farmbuyer@96: farmbuyer@96: -- reminder popup farmbuyer@96: w = mktoggle('popup_on_join', "Show reminder popup on new raid", stdw, farmbuyer@96: [[When joining a raid and not already tracking, display a dialog asking for instructions.]]) farmbuyer@96: container:AddChild(w) farmbuyer@96: farmbuyer@96: -- toggle scroll-to-bottom on first tab farmbuyer@96: w = mktoggle('scroll_to_bottom', "Scroll to bottom when opening display", stdw, farmbuyer@96: [[Scroll to the bottom of the loot window (most recent entries) when displaying the GUI.]]) farmbuyer@96: container:AddChild(w) farmbuyer@96: farmbuyer@96: -- chatty boss mode farmbuyer@96: w = mktoggle('chatty_on_kill', "Be chatty on boss kill", stdw, farmbuyer@96: [[Print something to chat output when the boss mod tells Ouro Loot about a successful boss kill.]]) farmbuyer@96: container:AddChild(w) farmbuyer@96: farmbuyer@96: -- less noise in main panel farmbuyer@96: w = mktoggle('no_tracking_wipes', "Do not track wipes", stdw, farmbuyer@96: [[Do not add 'wipe' entries on the main loot grid, or generate any text for them.]]) farmbuyer@96: container:AddChild(w) farmbuyer@96: farmbuyer@96: -- cutesy abbrevs farmbuyer@96: w = mktoggle('snarky_boss', "Use snarky boss names", stdw, farmbuyer@96: [[Irreverent replacement names for boss events. See abbreviations.lua for details.]]) farmbuyer@96: container:AddChild(w) farmbuyer@96: farmbuyer@96: -- LOD plugins in all cases farmbuyer@96: w = mktoggle('display_disabled_LODs', "Include disabled plugins", stdw, farmbuyer@96: [[Show loadable plugins even if they've been disabled (and offer to enable them). Relog to take effect.]]) farmbuyer@96: container:AddChild(w) farmbuyer@96: farmbuyer@96: -- showing the "(from Rebroadcasterdude)" in the notes column farmbuyer@96: w = mktoggle('display_bcast_from', "Show rebroadcasting player", stdw, farmbuyer@96: [[Include "from PlayerName" in the Notes column for loot that was broadcast to you. (Not included in forum output).]], farmbuyer@96: function(_w,_e,value) farmbuyer@96: opts.display_bcast_from = value farmbuyer@96: addon.loot_clean = nil farmbuyer@96: end) farmbuyer@96: container:AddChild(w) farmbuyer@96: farmbuyer@96: -- prefilling g_uniques with history farmbuyer@96: w = mktoggle('precache_history_uniques', "Prescan for faster handling", stdw, farmbuyer@96: [[See description under +Help -- Handy Tips -- Prescanning> for instructions.]]) farmbuyer@96: container:AddChild(w) farmbuyer@96: farmbuyer@97: container:AddChild(spacer(10)) farmbuyer@96: -- possible keybindings farmbuyer@96: do farmbuyer@96: local pair = AceGUI:Create("InlineGroup") farmbuyer@96: pair:SetLayout("List") farmbuyer@96: pair:SetRelativeWidth(0.49) farmbuyer@96: pair:SetTitle("Keybinding for '/ouroloot'") farmbuyer@96: local editbox, checkbox farmbuyer@96: editbox = mkbutton("EditBox", nil, opts.keybinding_text, farmbuyer@96: [[Keybinding text format is fragile! (All caps, ALT then CTRL then SHIFT.) Relog to take effect.]]) farmbuyer@96: editbox:SetFullWidth(true) farmbuyer@96: editbox:SetLabel("Keybinding text") farmbuyer@96: editbox:SetCallback("OnEnterPressed", function(_w,event,value) farmbuyer@96: opts.keybinding_text = value farmbuyer@96: end) farmbuyer@96: editbox:SetDisabled(not opts.keybinding) farmbuyer@96: checkbox = mktoggle('keybinding', "Register keybinding", 1, farmbuyer@96: [[Register a keybinding to toggle the loot display. Relog to take effect.]], farmbuyer@96: function (_w,_,value) farmbuyer@96: opts.keybinding = value farmbuyer@96: editbox:SetDisabled(not opts.keybinding) farmbuyer@96: end) farmbuyer@96: checkbox:SetFullWidth(true) farmbuyer@96: pair:AddChild(checkbox) farmbuyer@96: pair:AddChild(editbox) farmbuyer@96: container:AddChild(pair) farmbuyer@96: end farmbuyer@96: farmbuyer@96: -- replacement for slashloot farmbuyer@96: do farmbuyer@96: local pair = AceGUI:Create("InlineGroup") farmbuyer@96: pair:SetLayout("List") farmbuyer@96: pair:SetRelativeWidth(0.49) farmbuyer@96: pair:SetTitle('Synonyms for "/ouroloot"') farmbuyer@96: local editbox, checkbox farmbuyer@96: editbox = mkbutton("EditBox", nil, opts.slash_synonyms, farmbuyer@96: [[Separate multiple synonyms with a comma. Relog to take effect.]]) farmbuyer@96: editbox:SetFullWidth(true) farmbuyer@96: editbox:SetLabel("Slash commands") farmbuyer@96: editbox:SetCallback("OnEnterPressed", function(_e,event,value) farmbuyer@96: -- Do the sanity checking here rather than at each login. farmbuyer@96: -- This is not foolproof. That's okay. farmbuyer@96: local t = { strsplit(',', tostring(value)) } farmbuyer@96: for k,v in ipairs(t) do farmbuyer@96: v = v:trim() farmbuyer@96: if v:sub(1,1) ~= "/" then farmbuyer@96: v = "/" .. v farmbuyer@96: end farmbuyer@96: t[k] = v farmbuyer@96: end farmbuyer@96: value = table.concat(t,',') farmbuyer@96: _e:SetText(value) farmbuyer@96: opts.slash_synonyms = value farmbuyer@96: end) farmbuyer@96: editbox:SetDisabled(not opts.register_slash_synonyms) farmbuyer@96: checkbox = mktoggle('register_slash_synonyms', "Register slash commands", 1, farmbuyer@96: [[Register these slash commands as synonyms for "/ouroloot". Relog to take effect.]], farmbuyer@96: function (_w,_,value) farmbuyer@96: opts.register_slash_synonyms = value farmbuyer@96: editbox:SetDisabled(not opts.register_slash_synonyms) farmbuyer@96: end) farmbuyer@96: checkbox:SetFullWidth(true) farmbuyer@96: pair:AddChild(checkbox) farmbuyer@96: pair:AddChild(editbox) farmbuyer@96: container:AddChild(pair) farmbuyer@96: end farmbuyer@96: farmbuyer@96: -- chatty disposition/assignment changes farmbuyer@97: container:AddChild(spacer(10)) farmbuyer@96: do farmbuyer@96: local chatgroup = AceGUI:Create("InlineGroup") farmbuyer@96: chatgroup:SetLayout("List") farmbuyer@96: chatgroup:SetRelativeWidth(0.75) farmbuyer@96: chatgroup:SetTitle("Remote Changes Chat") farmbuyer@96: local toggle, editbox farmbuyer@96: toggle = mktoggle('chatty_on_remote_changes', "Be chatty on remote changes", 1, farmbuyer@96: [[Print something to chat when other users change recorded loot.]], farmbuyer@96: function (_w,_,value) farmbuyer@96: opts.chatty_on_remote_changes = value farmbuyer@96: editbox:SetDisabled(not opts.chatty_on_remote_changes) farmbuyer@96: end) farmbuyer@96: toggle:SetFullWidth(true) farmbuyer@96: chatgroup:AddChild(toggle) farmbuyer@96: w = AceGUI:Create("Label") farmbuyer@96: w:SetFullWidth(true) farmbuyer@96: w:SetText("This controls the output of the |cff00ffff'Be chatty on remote changes'|r option. If this field is a number, it designates which chat frame to use. Otherwise it is the Lua variable name of a frame with AddMessage capability.") farmbuyer@96: chatgroup:AddChild(w) farmbuyer@96: editbox = mkbutton("EditBox", nil, opts.chatty_on_remote_changes_frame, farmbuyer@96: [[1 = default chat frame, 2 = combat log, etc]]) farmbuyer@96: editbox:SetFullWidth(true) farmbuyer@96: editbox:SetLabel("Output Chatframe") farmbuyer@96: editbox:SetCallback("OnTextChanged", adv_careful_OnTextChanged) farmbuyer@96: editbox:SetCallback("OnEnterPressed", function(_w,event,value) farmbuyer@96: local prev = opts.chatty_on_remote_changes_frame farmbuyer@96: value = value:trim() farmbuyer@96: value = tonumber(value) or value farmbuyer@96: if addon:_set_remote_change_chatframe (value) then farmbuyer@96: opts.chatty_on_remote_changes_frame = value farmbuyer@96: _w:SetText(tostring(value)) farmbuyer@96: _w.editbox:ClearFocus() farmbuyer@96: else farmbuyer@96: _w:SetText(tostring(prev)) farmbuyer@96: end farmbuyer@96: end) farmbuyer@96: editbox:SetDisabled(not opts.chatty_on_remote_changes) farmbuyer@96: chatgroup:AddChild(editbox) farmbuyer@96: w = mkbutton("Chat Frame Numbers", farmbuyer@96: [[Print each chat window number in its own frame, for easy reference in the editing field.]]) farmbuyer@96: w:SetFullWidth(true) farmbuyer@96: w:SetCallback("OnClick", function() farmbuyer@96: for i = 1, NUM_CHAT_WINDOWS do farmbuyer@96: local cf = _G['ChatFrame'..i] farmbuyer@96: if not cf then break end farmbuyer@96: addon:CFPrint (cf, "This is frame number |cffff0000%d|r.", i) farmbuyer@96: end farmbuyer@96: end) farmbuyer@96: chatgroup:AddChild(w) farmbuyer@96: container:AddChild(chatgroup) farmbuyer@96: end farmbuyer@96: farmbuyer@96: -- boss mod selection farmbuyer@97: container:AddChild(spacer(2)) farmbuyer@96: do farmbuyer@96: local list = {} farmbuyer@96: local current farmbuyer@96: for k,v in ipairs(addon.bossmods) do farmbuyer@96: list[k] = v.n farmbuyer@96: if v.n == opts.bossmod then farmbuyer@96: current = k farmbuyer@96: end farmbuyer@96: end farmbuyer@96: w = mkbutton("Dropdown", nil, "", [[Which 'boss mod' to use.]]) farmbuyer@96: w:SetRelativeWidth(0.3) farmbuyer@96: w:SetLabel("Boss Mod:") farmbuyer@96: w:SetList(list) farmbuyer@96: w:SetValue(current) farmbuyer@96: w:SetCallback("OnValueChanged", function(_w,event,choice) farmbuyer@96: opts.bossmod = list[choice] farmbuyer@96: end) farmbuyer@96: container:AddChild(w) farmbuyer@96: end farmbuyer@96: farmbuyer@96: container:ResumeLayout() farmbuyer@96: container:DoLayout() farmbuyer@96: AceGUI:ClearFocus() farmbuyer@96: end farmbuyer@96: farmbuyer@96: farmbuyer@96: --------------- farmbuyer@96: do farmbuyer@97: local description = [[These control automatic handling of specific items when they are looted. "Item filter" is a list of items to ignore. "Vault items" is a list of items to mark as going to the guild vault (as if you had chosen "Mark as guild vault" from the Loot tab). farmbuyer@97: farmbuyer@97: 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: 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: farmbuyer@96: 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: local cache_warn, cache_warned = false, false farmbuyer@96: local function do_warning (cnt) farmbuyer@96: if cache_warn and not cache_warned then farmbuyer@96: cache_warned = true farmbuyer@96: addon:Print(warntext) farmbuyer@96: local t = AceGUI:Create("Label") farmbuyer@96: t:SetFullWidth(true) farmbuyer@96: t:SetText(warntext) farmbuyer@96: cnt:AddChild(t) farmbuyer@96: end farmbuyer@96: end farmbuyer@96: farmbuyer@96: controls.basic_filter = function (container) farmbuyer@96: container:AddChildren(mktitle[[Item-Specific Special Handling]]) farmbuyer@96: farmbuyer@97: local w = AceGUI:Create("Label") farmbuyer@97: w:SetFullWidth(true) farmbuyer@97: w:SetText(description) farmbuyer@97: container:AddChild(w) farmbuyer@97: container:AddChild(spacer(20)) farmbuyer@97: farmbuyer@96: cache_warn, cache_warned = false, false farmbuyer@96: local filterlist, vaultlist = {}, {} farmbuyer@96: for id in pairs(opts.itemfilter) do farmbuyer@96: local iname, _, iquality = GetItemInfo(id) farmbuyer@96: if iname then farmbuyer@96: filterlist[id] = ITEM_QUALITY_COLORS[iquality].hex .. iname .. "|r" farmbuyer@96: else farmbuyer@96: filterlist[id] = id farmbuyer@96: cache_warn = true farmbuyer@96: end farmbuyer@96: end farmbuyer@96: for id in pairs(opts.itemvault) do farmbuyer@96: local iname, _, iquality = GetItemInfo(id) farmbuyer@96: if iname then farmbuyer@96: vaultlist[id] = ITEM_QUALITY_COLORS[iquality].hex .. iname .. "|r" farmbuyer@96: else farmbuyer@96: vaultlist[id] = id farmbuyer@96: cache_warn = true farmbuyer@96: end farmbuyer@96: end farmbuyer@97: -- This is so that the "add all defaults" button will never, ever, farmbuyer@97: -- trip over cache misses. farmbuyer@97: for id in pairs(addon.default_itemfilter) do GetItemInfo(id) end farmbuyer@97: for id in pairs(addon.default_itemvault) do GetItemInfo(id) end farmbuyer@96: farmbuyer@97: w = AceGUI:Create("EditBoxDropDown") farmbuyer@96: w:SetRelativeWidth(0.4) farmbuyer@96: w:SetText("Item filter") farmbuyer@96: w:SetEditBoxTooltip("Link items which should no longer be tracked.") farmbuyer@96: w:SetList(filterlist) farmbuyer@96: w:SetCallback("OnTextEnterPressed", function(_w, _, text) farmbuyer@96: local iname, ilink, iquality = GetItemInfo(text:trim()) farmbuyer@96: if not iname then farmbuyer@96: return addon:Print("Error: %s is not a valid item name/link!", text) farmbuyer@96: end farmbuyer@96: local id = tonumber(ilink:match("item:(%d+)")) farmbuyer@96: filterlist[id] = ITEM_QUALITY_COLORS[iquality].hex .. iname .. "|r" farmbuyer@96: opts.itemfilter[id] = true farmbuyer@96: addon:Print("Now filtering out", ilink) farmbuyer@96: end) farmbuyer@96: w:SetCallback("OnListItemClicked", function(_w, _, key_id, val_name) farmbuyer@96: --local ilink = select(2,GetItemInfo(key_id)) farmbuyer@96: opts.itemfilter[tonumber(key_id)] = nil farmbuyer@96: --addon:Print("No longer filtering out", ilink) farmbuyer@96: addon:Print("No longer filtering out", val_name) farmbuyer@96: end) farmbuyer@96: --w:SetCallback("OnDropdownShown",do_warning) farmbuyer@96: w:SetCallback("OnDropdownShown", function() farmbuyer@96: do_warning(container) farmbuyer@96: end) farmbuyer@96: container:AddChild(w) farmbuyer@96: farmbuyer@96: w = AceGUI:Create("Spacer") farmbuyer@96: w:SetRelativeWidth(0.1) farmbuyer@96: w:SetHeight(2) farmbuyer@96: container:AddChild(w) farmbuyer@96: farmbuyer@96: w = AceGUI:Create("EditBoxDropDown") farmbuyer@96: w:SetRelativeWidth(0.4) farmbuyer@96: w:SetText("Vault items") farmbuyer@96: w:SetEditBoxTooltip("Link items which should be automatically marked as guild vault.") farmbuyer@96: w:SetList(vaultlist) farmbuyer@96: w:SetCallback("OnTextEnterPressed", function(_w, _, text) farmbuyer@96: local iname, ilink, iquality = GetItemInfo(text:trim()) farmbuyer@96: if not iname then farmbuyer@96: return addon:Print("Error: %s is not a valid item name/link!", text) farmbuyer@96: end farmbuyer@96: local id = tonumber(ilink:match("item:(%d+)")) farmbuyer@96: vaultlist[id] = ITEM_QUALITY_COLORS[iquality].hex .. iname .. "|r" farmbuyer@96: opts.itemvault[id] = true farmbuyer@96: addon:Print("Now auto-vaulting", ilink) farmbuyer@96: end) farmbuyer@96: w:SetCallback("OnListItemClicked", function(_w, _, key_id, val_name) farmbuyer@96: --local ilink = select(2,GetItemInfo(key_id)) farmbuyer@96: opts.itemfilter[tonumber(key_id)] = nil farmbuyer@96: --addon:Print("No longer filtering out", ilink) farmbuyer@96: addon:Print("No longer auto-vaulting", val_name) farmbuyer@96: end) farmbuyer@96: w:SetCallback("OnDropdownShown",do_warning) farmbuyer@96: container:AddChild(w) farmbuyer@97: farmbuyer@97: local function MAYBE_ADD (destname, dest, id) farmbuyer@97: local name, link = GetItemInfo(id) farmbuyer@97: if not name then farmbuyer@97: addon:Print("> No data on ID %d, this may be a bug.",id) farmbuyer@97: return farmbuyer@97: end farmbuyer@97: if dest[id] then farmbuyer@97: addon:Print("> Skipping %s as it's already in '%s' list.", farmbuyer@97: link, destname) farmbuyer@97: else farmbuyer@97: dest[id] = true farmbuyer@97: addon:Print("> Added %s to '%s' list.", link, destname) farmbuyer@97: end farmbuyer@97: end farmbuyer@97: farmbuyer@97: container:AddChild(spacer(40)) farmbuyer@97: w = AceGUI:Create("Label") farmbuyer@97: w:SetFullWidth(true) farmbuyer@97: w:SetText(defaultstext) farmbuyer@97: container:AddChild(w) farmbuyer@97: w = AceGUI:Create("Button") farmbuyer@97: w:SetRelativeWidth(0.4) farmbuyer@97: w:SetText[[Add Default Entries]] farmbuyer@97: w:SetCallback("OnClick", function() farmbuyer@97: for id in pairs(addon.default_itemfilter) do farmbuyer@97: MAYBE_ADD ("filter", opts.itemfilter, id) farmbuyer@97: end farmbuyer@97: for id in pairs(addon.default_itemvault) do farmbuyer@97: MAYBE_ADD ("vault", opts.itemvault, id) farmbuyer@97: end farmbuyer@97: addon:redisplay() farmbuyer@97: end) farmbuyer@97: container:AddChild(w) farmbuyer@97: end farmbuyer@97: end farmbuyer@97: farmbuyer@97: farmbuyer@97: --------------- farmbuyer@97: do farmbuyer@97: local profiles farmbuyer@97: controls.basic_profiles = function (container) farmbuyer@97: if not profiles then farmbuyer@97: profiles = LibStub("AceDBOptions-3.0"):GetOptionsTable(addon.db) farmbuyer@97: LibStub("AceConfig-3.0"):RegisterOptionsTable("OuroLootProfiles", profiles) farmbuyer@97: end farmbuyer@97: LibStub("AceConfigDialog-3.0"):Open ("OuroLootProfiles", container) farmbuyer@96: end farmbuyer@96: end farmbuyer@96: farmbuyer@96: farmbuyer@96: --------------- farmbuyer@96: local adv_real = function (container) farmbuyer@96: container:AddChildren(mktitle[[Debugging Options (not saved across sessions)]]) farmbuyer@96: farmbuyer@96: container:PauseLayout() farmbuyer@96: local w farmbuyer@96: farmbuyer@96: do farmbuyer@96: local grp = AceGUI:Create("InlineGroup") farmbuyer@96: grp:SetLayout("List") farmbuyer@96: grp:SetRelativeWidth(0.60) farmbuyer@96: grp:SetTitle("Output of debugging messages") farmbuyer@96: farmbuyer@96: w = AceGUI:Create("CheckBoxSmallLabel") farmbuyer@96: w:SetFullWidth(true) farmbuyer@96: w:SetType("checkbox") farmbuyer@96: w:SetLabel("master toggle") farmbuyer@96: w:SetValue(addon.DEBUG_PRINT) farmbuyer@96: w:SetCallback("OnValueChanged", function(_w,event,value) farmbuyer@96: addon.DEBUG_PRINT = value farmbuyer@96: addon:redisplay() farmbuyer@96: end) farmbuyer@96: grp:AddChild(w) farmbuyer@96: for d,v in pairs(addon.debug) do farmbuyer@96: w = AceGUI:Create("CheckBoxSmallLabel") farmbuyer@96: w:SetFullWidth(true) farmbuyer@96: w:SetType("checkbox") farmbuyer@96: w:SetLabel(d) farmbuyer@96: if d == "notraid" then farmbuyer@96: w:SetDescription[[Tick this before enabling to make the addon work outside of raid groups]] farmbuyer@96: else farmbuyer@96: if d == "alsolog" then farmbuyer@96: w:SetDescription[[Also log all debug messages to disk. See print_log.lua in the addon folder for later viewing.]] farmbuyer@96: end farmbuyer@96: w:SetDisabled(not addon.DEBUG_PRINT) farmbuyer@96: end farmbuyer@96: w:SetValue(v) farmbuyer@96: w:SetCallback("OnValueChanged", function(_w,event,value) addon.debug[d] = value end) farmbuyer@96: grp:AddChild(w) farmbuyer@96: end farmbuyer@96: container:AddChild(grp) farmbuyer@96: end farmbuyer@96: farmbuyer@96: do farmbuyer@96: local simple = AceGUI:Create("SimpleGroup") farmbuyer@96: simple:SetLayout("List") farmbuyer@96: simple:SetRelativeWidth(0.35) farmbuyer@96: w = AceGUI:Create("CheckBoxSmallLabel") farmbuyer@96: --w:SetRelativeWidth(0.35) farmbuyer@96: w:SetFullWidth(true) farmbuyer@96: w:SetType("checkbox") farmbuyer@96: w:SetLabel("GOP history mode") farmbuyer@96: w:SetValue(addon.history_suppress) farmbuyer@96: w:SetCallback("OnValueChanged", function(_w,event,value) addon.history_suppress = value end) farmbuyer@96: simple:AddChild(w) farmbuyer@96: w = mkbutton("Dropdown", nil, "", farmbuyer@96: [[if active, tooltip shown when hovering over Item column only]]) farmbuyer@96: --w:SetRelativeWidth(0.4) farmbuyer@96: w:SetFullWidth(true) farmbuyer@96: w:SetLabel("loot debugging tooltip") farmbuyer@96: w:SetList{ farmbuyer@96: [1] = "Off", farmbuyer@96: [2] = "/dump into tooltip", farmbuyer@96: [3] = "small fixed fields", farmbuyer@96: } farmbuyer@96: w:SetValue(gui._do_debugging_tooltip or 1) farmbuyer@96: w:SetCallback("OnValueChanged", function(_w,event,choice) farmbuyer@96: gui._do_debugging_tooltip = choice > 1 and choice or nil farmbuyer@96: end) farmbuyer@96: simple:AddChild(w) farmbuyer@96: container:AddChild(simple) farmbuyer@96: end farmbuyer@96: farmbuyer@97: container:AddChild(spacer(10)) farmbuyer@96: farmbuyer@96: w = mkbutton("EditBox", 'comm_ident', addon.ident, farmbuyer@96: [[Set tracking to 'Disabled' in the top-right dropdown, then change this field (click Okay or press Enter).]]) farmbuyer@96: w:SetRelativeWidth(0.25) farmbuyer@96: w:SetLabel("Addon channel ID") farmbuyer@96: w:SetCallback("OnTextChanged", adv_careful_OnTextChanged) farmbuyer@96: w:SetCallback("OnEnterPressed", function(_w,event,value) farmbuyer@96: -- if they set it to blank spaces, they're boned. oh well. farmbuyer@96: -- Re-enabling will take care of propogating this new value. farmbuyer@96: addon.ident = (value == "") and "OuroLoot2" or value farmbuyer@96: _w:SetText(addon.ident) farmbuyer@96: addon:Print("Addon channel ID set to '".. addon.ident.. "' for rebroadcasting and listening.") farmbuyer@96: end) farmbuyer@96: w:SetDisabled(addon.enabled or addon.rebroadcast) farmbuyer@96: container:AddChild(w) farmbuyer@96: farmbuyer@96: w = mkbutton("EditBox", nil, addon.recent_messages.ttl, [[comm cache TTL]]) farmbuyer@96: w:SetRelativeWidth(0.1) farmbuyer@96: w:SetLabel("ttl") farmbuyer@96: w:SetCallback("OnTextChanged", adv_careful_OnTextChanged) farmbuyer@96: w:SetCallback("OnEnterPressed", function(_w,event,value) farmbuyer@96: value = tonumber(value) or addon.recent_messages.ttl farmbuyer@96: addon.recent_messages.ttl = value farmbuyer@96: _w:SetText(tostring(value)) farmbuyer@96: end) farmbuyer@96: container:AddChild(w) farmbuyer@96: farmbuyer@96: w = mkbutton("load nsaab1548", [[Cursed Darkhound]]) farmbuyer@96: w:SetRelativeWidth(0.25) farmbuyer@96: w:SetCallback("OnClick", function() farmbuyer@96: for i, v in ipairs(DBM.AddOns) do farmbuyer@96: if v.modId == "DBM-NotScaryAtAll" then farmbuyer@96: DBM:LoadMod(v) farmbuyer@96: break farmbuyer@96: end farmbuyer@96: end farmbuyer@96: local mod = DBM:GetModByName("NotScaryAtAll") farmbuyer@96: if mod then farmbuyer@96: mod:EnableMod() farmbuyer@96: addon:Print("Now tracking ID",mod.creatureId) farmbuyer@96: else farmbuyer@96: addon:Print("Can do nothing; DBM testing mod wasn't loaded.") farmbuyer@96: end farmbuyer@96: end) farmbuyer@96: w:SetDisabled(addon.bossmod_registered ~= 'DBM') farmbuyer@96: container:AddChild(w) farmbuyer@96: farmbuyer@96: w = mkbutton("GC", [[full GC cycle]]) farmbuyer@96: w:SetRelativeWidth(0.2) farmbuyer@96: w:SetCallback("OnClick", function() farmbuyer@96: local before = collectgarbage('count') farmbuyer@96: collectgarbage('collect') farmbuyer@96: local after = collectgarbage('count') farmbuyer@96: addon:Print("Collected %d KB, %d KB still in use by Lua universe.", before-after, after) farmbuyer@96: end) farmbuyer@96: container:AddChild(w) farmbuyer@96: farmbuyer@97: container:AddChild(spacer(3)) farmbuyer@96: do farmbuyer@96: local simple = AceGUI:Create("SimpleGroup") farmbuyer@96: simple:SetLayout("Flow") farmbuyer@96: --simple:SetRelativeWidth(0.95) farmbuyer@96: simple:SetFullWidth(true) farmbuyer@96: w = mkbutton("MidS-H", [[not exactly an Easter egg, with sound]]) farmbuyer@96: w:SetRelativeWidth(0.2) farmbuyer@96: w:SetCallback("OnClick", function() farmbuyer@96: PlaySoundFile ([[Sound\Music\WorldEvents\HordeFirepole.mp3]], "Master") farmbuyer@96: end) farmbuyer@96: simple:AddChild(w) farmbuyer@96: w = mkbutton("MidS-A", [[not exactly an Easter egg, with sound]]) farmbuyer@96: w:SetRelativeWidth(0.2) farmbuyer@96: w:SetCallback("OnClick", function() farmbuyer@96: PlaySoundFile ([[Sound\Music\WorldEvents\AllianceFirepole.mp3]], "Master") farmbuyer@96: end) farmbuyer@96: simple:AddChild(w) farmbuyer@96: w = mkbutton("SFRR", [[test]]) farmbuyer@96: w:SetRelativeWidth(0.15) farmbuyer@96: w:SetCallback("OnClick", function() farmbuyer@96: PlaySoundFile ([[Interface\AddOns\Ouro_Loot\sfrr.ogg]], "Master") farmbuyer@96: end) farmbuyer@96: simple:AddChild(w) farmbuyer@96: farmbuyer@96: container:AddChild(simple) farmbuyer@96: end farmbuyer@96: farmbuyer@96: w = AceGUI:Create("Spacer") w:SetRelativeWidth(0.65) w:SetHeight(15) container:AddChild(w) farmbuyer@96: w = mkbutton("Clear All & Reload", farmbuyer@96: [[No confirmation! |cffff1010Erases absolutely all> Ouro Loot saved variables and reloads the UI.]]) farmbuyer@96: w:SetRelativeWidth(0.3) farmbuyer@96: w:SetCallback("OnClick", function() farmbuyer@96: addon:_clear_SVs() -- reloads farmbuyer@96: end) farmbuyer@96: container:AddChild(w) farmbuyer@96: farmbuyer@96: container:ResumeLayout() farmbuyer@96: container:DoLayout() farmbuyer@96: AceGUI:ClearFocus() farmbuyer@96: --container:SetScroll(1000) -- scrollframe widget's max value farmbuyer@96: end farmbuyer@96: farmbuyer@96: -- Initial advanced panel function (unless debug mode is on during load, which farmbuyer@96: -- means it was almost certainly hardcoded that way, which means it's probably farmbuyer@96: -- me testing). farmbuyer@97: if addon.DEBUG_PRINT then farmbuyer@96: controls.adv = adv_real farmbuyer@96: else farmbuyer@96: controls.adv = function (container) farmbuyer@96: local speedbump = AceGUI:Create("InteractiveLabel") farmbuyer@96: speedbump:SetFullWidth(true) farmbuyer@96: speedbump:SetFontObject(GameFontHighlightLarge) farmbuyer@96: speedbump:SetImage[[Interface\DialogFrame\DialogAlertIcon]] farmbuyer@96: speedbump:SetImageSize(50,50) farmbuyer@96: 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: speedbump:SetCallback("OnClick", function (_sb) farmbuyer@96: controls.adv = { adv_real } farmbuyer@96: return addon:redisplay() farmbuyer@96: end) farmbuyer@96: container:AddChild(speedbump) farmbuyer@96: end farmbuyer@96: end farmbuyer@96: farmbuyer@96: farmbuyer@96: --------------- farmbuyer@96: -- Tab 6: Options farmbuyer@96: do farmbuyer@96: local funkified = {} farmbuyer@96: for key,f in pairs(controls) do farmbuyer@96: -- this is how TreeGroup makes unique keys farmbuyer@96: local funkykey = key:gsub('_','\001') farmbuyer@96: funkified[funkykey] = { f } farmbuyer@96: end farmbuyer@96: controls = funkified farmbuyer@96: end farmbuyer@96: farmbuyer@96: -- widget container status tables (will have things magically appear farmbuyer@96: -- inside them that we wish to preserve) farmbuyer@96: local status_for_scroll = {} farmbuyer@96: local status_for_select = { treewidth = 160 } farmbuyer@96: farmbuyer@97: local function preload() farmbuyer@97: for id in pairs(opts.itemfilter) do GetItemInfo(id) end farmbuyer@97: for id in pairs(opts.itemvault) do GetItemInfo(id) end farmbuyer@97: preload = nil farmbuyer@97: end farmbuyer@97: farmbuyer@96: -- Clicking an entry on the left tree column. farmbuyer@96: local opt_OnGroupSelected_func = function (treeg,event,category) farmbuyer@98: opts = addon.db.profile farmbuyer@96: local catfuncs = controls[category] farmbuyer@96: if not catfuncs then farmbuyer@96: addon:horrible_horrible_error(("Category '%s' has no handler function!"):format(category:gsub('\001','_'))) farmbuyer@96: end farmbuyer@96: treeg:ReleaseChildren() farmbuyer@96: local sf = AceGUI:Create("ScrollFrame") farmbuyer@96: sf:SetStatusTable(status_for_scroll) farmbuyer@96: sf:SetLayout("Flow") farmbuyer@96: -- This forces the scrolling area to be bigger than the visible area; else farmbuyer@96: -- some of the text gets cut off without ever triggering the scrollbar. farmbuyer@96: sf.content:SetHeight(700) farmbuyer@96: for _,func in ipairs(catfuncs) do farmbuyer@96: if func(sf) then break end farmbuyer@96: end farmbuyer@96: treeg:AddChild(sf) farmbuyer@96: if treeg:GetUserData("options restore scroll") then farmbuyer@96: if status_for_scroll.scrollvalue then farmbuyer@96: sf:SetScroll(status_for_scroll.scrollvalue) farmbuyer@96: end farmbuyer@96: treeg:SetUserData("options restore scroll", false) farmbuyer@96: else farmbuyer@96: sf:SetScroll(0) farmbuyer@96: end farmbuyer@96: end farmbuyer@96: farmbuyer@96: -- Clicking the Options tab as a whole (tabs_OnGroupSelected["opt"]). farmbuyer@96: local tabs_OGS = function (container, specials) farmbuyer@96: container:SetLayout("Fill") farmbuyer@96: local left = AceGUI:Create("TreeGroup") farmbuyer@96: left:SetStatusTable(status_for_select) farmbuyer@96: left:SetLayout("Fill") farmbuyer@96: left:SetFullWidth(true) farmbuyer@96: left:SetFullHeight(true) farmbuyer@96: left:EnableButtonTooltips(false) farmbuyer@96: left:SetTree(options_tree) farmbuyer@96: left:SetCallback("OnGroupSelected", opt_OnGroupSelected_func) farmbuyer@96: container:AddChild(left) farmbuyer@96: if status_for_select.selected then farmbuyer@96: left:SetUserData("options restore scroll", true) farmbuyer@96: left:SelectByValue(status_for_select.selected) farmbuyer@96: else farmbuyer@96: left:SelectByValue("basic") farmbuyer@96: end farmbuyer@96: farmbuyer@96: local w = mkbutton("ReloadUI", farmbuyer@96: [[Does what you think it does. Loot information is written out and restored.]]) farmbuyer@96: w:SetFullWidth(true) farmbuyer@96: w:SetCallback("OnClick", ReloadUI) farmbuyer@96: specials:AddChild(w) farmbuyer@96: farmbuyer@96: w = mkbutton("Ping!", farmbuyer@96: [[Queries other raid users for their addon version and current status. Results displayed on Pongs panel after five seconds.]]) farmbuyer@96: w:SetFullWidth(true) farmbuyer@96: w:SetCallback("OnClick", function(_w) farmbuyer@96: _w:SetText("5... 4... 3...") farmbuyer@96: _w:SetDisabled(true) farmbuyer@96: addon:DoPing() farmbuyer@96: addon:ScheduleTimer(function(b) farmbuyer@96: if b:IsVisible() then farmbuyer@96: return addon:redisplay() farmbuyer@96: end farmbuyer@96: end, 5, _w) farmbuyer@96: end) farmbuyer@96: specials:AddChild(w) farmbuyer@97: farmbuyer@97: if preload then preload() end farmbuyer@96: end farmbuyer@96: farmbuyer@96: addon:register_tab_control_AT_END ("opt", [[Options]], farmbuyer@96: [[Options for fine-tuning behavior]], tabs_OGS) farmbuyer@96: farmbuyer@96: -- vim:noet