comparison gui.lua @ 96:780b7e0eeeeb

Break the options panel out of gui.lua into new options.lua. Move default item lists from verbage.lua there also. Redo options panel as a tree instead of a massive scrolling thing, and prepare data structures to let plugins/etc add their own options code.
author Farmbuyer of US-Kilrogg <farmbuyer@gmail.com>
date Thu, 26 Jul 2012 20:46:00 +0000
parents 3546c7b55986
children ba5ff82dcf19
comparison
equal deleted inserted replaced
95:3546c7b55986 96:780b7e0eeeeb
58 -- for the official source of mouseover tab titles, etc. Not completely 58 -- for the official source of mouseover tab titles, etc. Not completely
59 -- hidden because we need to reach in and fiddle too often to be worth it. 59 -- hidden because we need to reach in and fiddle too often to be worth it.
60 tabtexts = { 60 tabtexts = {
61 ["eoi"] = {title=[[Loot]], desc=[[Observed loot, plus boss kills and other events of interest]]}, 61 ["eoi"] = {title=[[Loot]], desc=[[Observed loot, plus boss kills and other events of interest]]},
62 ["hist"] = {title=[[History]], desc=[[A short semi-permanent record]]}, 62 ["hist"] = {title=[[History]], desc=[[A short semi-permanent record]]},
63 ["opt"] = {title=[[Options]], desc=[[Options for fine-tuning behavior]]},
64 }, 63 },
65 taborder = { "eoi" }, 64 taborder = { "eoi" },
66 taborder_APPEND = { "hist", "help", "opt" }, 65 taborder_APPEND = { "hist", "help", "opt" },
67 } 66 }
68 addon.gui_state_pointer = gui -- only during loading, then cleaned out 67 addon.gui_state_pointer = gui -- only during loading, then cleaned out
88 local IsInRaid = IsInRaid or (function() return GetNumRaidMembers() > 0 end) 87 local IsInRaid = IsInRaid or (function() return GetNumRaidMembers() > 0 end)
89 88
90 -- En masse forward decls of symbols defined inside local blocks 89 -- En masse forward decls of symbols defined inside local blocks
91 local _generate_text, _populate_text_specials, _markup 90 local _generate_text, _populate_text_specials, _markup
92 local eoi_dropdownfuncs -- filled out in gui block scope 91 local eoi_dropdownfuncs -- filled out in gui block scope
93 local _do_debugging_tooltip, _hide_debugging_tooltip, _build_debugging_tooltip 92 local _hide_debugging_tooltip, _build_debugging_tooltip
94 local _new_rebroadcast_hyperlink 93 local _new_rebroadcast_hyperlink
95 94
96 --[[ 95 --[[
97 This is a table of callback functions, each responsible for drawing a tab 96 This is a table of callback functions, each responsible for drawing a tab
98 into the container passed in the first argument. Special-purpose buttons 97 into the container passed in the first argument. Special-purpose buttons
513 do 512 do
514 local debug_tt 513 local debug_tt
515 514
516 local _creators, _builders = {}, {} 515 local _creators, _builders = {}, {}
517 local function _create_tooltip() 516 local function _create_tooltip()
518 local which = assert(tonumber(_do_debugging_tooltip)) 517 local which = assert(tonumber(gui._do_debugging_tooltip))
519 if type(_creators[which]) == 'function' then 518 if type(_creators[which]) == 'function' then
520 _creators[which]() 519 _creators[which]()
521 end 520 end
522 debug_tt = _creators[which] 521 debug_tt = _creators[which]
523 end 522 end
524 function _build_debugging_tooltip (parent, index) 523 function _build_debugging_tooltip (parent, index)
525 local which = assert(tonumber(_do_debugging_tooltip)) 524 local which = assert(tonumber(gui._do_debugging_tooltip))
526 if type(_builders[which]) == 'function' then 525 if type(_builders[which]) == 'function' then
527 _builders[which](parent,index) 526 _builders[which](parent,index)
528 end 527 end
529 end 528 end
530 function _hide_debugging_tooltip() 529 function _hide_debugging_tooltip()
1081 if (row == nil) or (realrow == nil) then return end -- mouseover column header 1080 if (row == nil) or (realrow == nil) then return end -- mouseover column header
1082 local e = data[realrow] 1081 local e = data[realrow]
1083 local kind = e.kind 1082 local kind = e.kind
1084 local tt = GameTooltip -- can this be hoisted? does GT ever get securely replaced? 1083 local tt = GameTooltip -- can this be hoisted? does GT ever get securely replaced?
1085 1084
1086 if _do_debugging_tooltip and column == 1 and kind ~= 'hist' then 1085 if gui._do_debugging_tooltip and column == 1 and kind ~= 'hist' then
1087 _build_debugging_tooltip (cellFrame, realrow) 1086 _build_debugging_tooltip (cellFrame, realrow)
1088 end 1087 end
1089 if (kind == 'loot' and column == 1) or (kind == 'hist' and column == 2) then 1088 if (kind == 'loot' and column == 1) or (kind == 'hist' and column == 2) then
1090 tt:SetOwner (cellFrame, "ANCHOR_RIGHT", -20, 0) 1089 tt:SetOwner (cellFrame, "ANCHOR_RIGHT", -20, 0)
1091 if e.cache_miss then 1090 if e.cache_miss then
1894 1893
1895 1894
1896 -- Tab 5: Help (content in verbage.lua) 1895 -- Tab 5: Help (content in verbage.lua)
1897 1896
1898 1897
1899 -- Tab 6: Options / Advanced 1898 -- Tab 6: Options (content in options.lua)
1900 do
1901 -- Local ref to OuroLootSV_opts, which may be reassigned after load.
1902 -- So instead this is updated when the tab is displayed.
1903 local opts
1904 local function mkoption (opt, label, width, desc, opt_func)
1905 local w = mkbutton("CheckBoxSmallLabel", nil, "", desc)
1906 w:SetRelativeWidth(width)
1907 w:SetType("checkbox")
1908 w:SetLabel(label)
1909 if opt then
1910 w:SetValue(opts[opt])
1911 w:SetCallback("OnValueChanged", opt_func or (function(_w,event,value)
1912 opts[opt] = value
1913 end))
1914 end
1915 return w
1916 end
1917
1918 local function adv_careful_OnTextChanged (ebox,event,value)
1919 -- The EditBox widget's code will call an internal ShowButton routine
1920 -- after this callback returns. ShowButton will test for this flag:
1921 ebox:DisableButton (value == "")
1922 end
1923
1924 -- Like the first tab, we use a pair of functions; first and repeating.
1925 local function adv_real (container, specials)
1926 local grp, w
1927
1928 grp = AceGUI:Create("InlineGroup")
1929 grp:SetLayout("Flow")
1930 grp:PauseLayout()
1931 grp:SetFullWidth(true)
1932 grp:SetTitle("Debugging/Testing Options [not saved across sessions]")
1933
1934 w = mkbutton("EditBox", 'comm_ident', addon.ident,
1935 [[Set tracking to 'Disabled' in the top-right dropdown, then change this field (click Okay or press Enter).]])
1936 w:SetRelativeWidth(0.2)
1937 w:SetLabel("Addon channel ID")
1938 w:SetCallback("OnTextChanged", adv_careful_OnTextChanged)
1939 w:SetCallback("OnEnterPressed", function(_w,event,value)
1940 -- if they set it to blank spaces, they're boned. oh well.
1941 -- Re-enabling will take care of propogating this new value.
1942 addon.ident = (value == "") and "OuroLoot2" or value
1943 _w:SetText(addon.ident)
1944 addon:Print("Addon channel ID set to '".. addon.ident.. "' for rebroadcasting and listening.")
1945 end)
1946 w:SetDisabled(addon.enabled or addon.rebroadcast)
1947 grp:AddChild(w)
1948
1949 w = mkbutton("EditBox", nil, addon.recent_messages.ttl, [[comm cache TTL]])
1950 w:SetRelativeWidth(0.05)
1951 w:SetLabel("ttl")
1952 w:SetCallback("OnTextChanged", adv_careful_OnTextChanged)
1953 w:SetCallback("OnEnterPressed", function(_w,event,value)
1954 value = tonumber(value) or addon.recent_messages.ttl
1955 addon.recent_messages.ttl = value
1956 _w:SetText(tostring(value))
1957 end)
1958 grp:AddChild(w)
1959
1960 w = mkbutton("load nsaab1548", [[Cursed Darkhound]])
1961 w:SetRelativeWidth(0.25)
1962 w:SetCallback("OnClick", function()
1963 for i, v in ipairs(DBM.AddOns) do
1964 if v.modId == "DBM-NotScaryAtAll" then
1965 DBM:LoadMod(v)
1966 break
1967 end
1968 end
1969 local mod = DBM:GetModByName("NotScaryAtAll")
1970 if mod then
1971 mod:EnableMod()
1972 addon:Print("Now tracking ID",mod.creatureId)
1973 else
1974 addon:Print("Can do nothing; DBM testing mod wasn't loaded.")
1975 end
1976 end)
1977 w:SetDisabled(addon.bossmod_registered ~= 'DBM')
1978 grp:AddChild(w)
1979
1980 w = mkbutton("GC", [[full GC cycle]])
1981 w:SetRelativeWidth(0.1)
1982 w:SetCallback("OnClick", function()
1983 local before = collectgarbage('count')
1984 collectgarbage('collect')
1985 local after = collectgarbage('count')
1986 addon:Print("Collected %d KB, %d KB still in use by Lua universe.", before-after, after)
1987 end)
1988 grp:AddChild(w)
1989
1990 w = AceGUI:Create("Spacer") w:SetFullWidth(true) w:SetHeight(1) grp:AddChild(w)
1991
1992 local simple = AceGUI:Create("SimpleGroup")
1993 simple:SetLayout("List")
1994 simple:SetRelativeWidth(0.3)
1995 w = mkbutton("Dropdown", nil, "", [[hovering over Item column only]])
1996 w:SetFullWidth(true)
1997 w:SetLabel("loot debugging tooltip")
1998 w:SetList{
1999 [1] = "Off",
2000 [2] = "/dump into tooltip",
2001 [3] = "small fixed fields",
2002 }
2003 w:SetValue(_do_debugging_tooltip or 1)
2004 w:SetCallback("OnValueChanged", function(_w,event,choice)
2005 _do_debugging_tooltip = choice > 1 and choice or nil
2006 end)
2007 simple:AddChild(w)
2008
2009 w = AceGUI:Create("Spacer") w:SetFullWidth(true) w:SetHeight(10) simple:AddChild(w)
2010
2011 w = AceGUI:Create("CheckBoxSmallLabel")
2012 w:SetFullWidth(true)
2013 w:SetType("checkbox")
2014 w:SetLabel("debug toggle --->")
2015 w:SetValue(addon.DEBUG_PRINT)
2016 w:SetCallback("OnValueChanged", function(_w,event,value)
2017 addon.DEBUG_PRINT = value
2018 addon:redisplay()
2019 end)
2020 simple:AddChild(w)
2021 w = AceGUI:Create("CheckBoxSmallLabel")
2022 w:SetFullWidth(true)
2023 w:SetType("checkbox")
2024 w:SetLabel("GOP history mode")
2025 w:SetValue(addon.history_suppress)
2026 w:SetCallback("OnValueChanged", function(_w,event,value) addon.history_suppress = value end)
2027 simple:AddChild(w)
2028 w = mkbutton("Clear All & Reload",
2029 [[No confirmation! |cffff1010Erases absolutely all> Ouro Loot saved variables and reloads the UI.]])
2030 w:SetFullWidth(true)
2031 w:SetCallback("OnClick", function()
2032 addon:_clear_SVs() -- reloads
2033 end)
2034 simple:AddChild(w)
2035 grp:AddChild(simple)
2036
2037 simple = AceGUI:Create("SimpleGroup")
2038 simple:SetLayout("List")
2039 simple:SetRelativeWidth(0.5)
2040 for d,v in pairs(addon.debug) do
2041 w = AceGUI:Create("CheckBoxSmallLabel")
2042 w:SetFullWidth(true)
2043 w:SetType("checkbox")
2044 w:SetLabel(d)
2045 if d == "notraid" then
2046 w:SetDescription[[Tick this before enabling to make the addon work outside of raid groups]]
2047 else
2048 if d == "alsolog" then
2049 w:SetDescription[[Also log all debug messages to disk. See print_log.lua in the addon folder for later viewing.]]
2050 end
2051 w:SetDisabled(not addon.DEBUG_PRINT)
2052 end
2053 w:SetValue(v)
2054 w:SetCallback("OnValueChanged", function(_w,event,value) addon.debug[d] = value end)
2055 simple:AddChild(w)
2056 end
2057 grp:AddChild(simple)
2058
2059 simple = AceGUI:Create("SimpleGroup")
2060 simple:SetLayout("Flow")
2061 simple:SetRelativeWidth(0.85)
2062 w = mkbutton("MidS-H", [[not exactly an Easter egg, with sound]])
2063 w:SetRelativeWidth(0.15)
2064 w:SetCallback("OnClick", function()
2065 PlaySoundFile ([[Sound\Music\WorldEvents\HordeFirepole.mp3]], "Master")
2066 end)
2067 simple:AddChild(w)
2068 w = mkbutton("MidS-A", [[not exactly an Easter egg, with sound]])
2069 w:SetRelativeWidth(0.15)
2070 w:SetCallback("OnClick", function()
2071 PlaySoundFile ([[Sound\Music\WorldEvents\AllianceFirepole.mp3]], "Master")
2072 end)
2073 simple:AddChild(w)
2074 w = mkbutton("SFRR", [[test]])
2075 w:SetRelativeWidth(0.15)
2076 w:SetCallback("OnClick", function()
2077 PlaySoundFile ([[Interface\AddOns\Ouro_Loot\sfrr.ogg]], "Master")
2078 end)
2079 simple:AddChild(w)
2080 grp:AddChild(simple)
2081
2082 grp:ResumeLayout()
2083 container:AddChild(grp)
2084 AceGUI:ClearFocus()
2085 container:SetScroll(1000) -- scrollframe's max value
2086 end
2087
2088 -- Initial lower panel function (unless debug mode is on during load, which
2089 -- means it was almost certainly hardcoded that way, which means it's
2090 -- probably me testing).
2091 local adv_lower
2092 if addon.DEBUG_PRINT then
2093 adv_lower = adv_real
2094 else
2095 function adv_lower (container, specials)
2096 local spacer = AceGUI:Create("Spacer")
2097 spacer:SetFullWidth(true)
2098 spacer:SetHeight(5)
2099 container:AddChild(spacer)
2100 local speedbump = AceGUI:Create("InteractiveLabel")
2101 speedbump:SetFullWidth(true)
2102 speedbump:SetFontObject(GameFontHighlightLarge)
2103 speedbump:SetImage[[Interface\DialogFrame\DialogAlertIcon]]
2104 speedbump:SetImageSize(50,50)
2105 speedbump:SetText("The debugging/testing settings on the rest of this 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.")
2106 speedbump:SetCallback("OnClick", function (_sb)
2107 adv_lower = adv_real
2108 return addon:redisplay()
2109 end)
2110 container:AddChild(speedbump)
2111 spacer = AceGUI:Create("Spacer")
2112 spacer:SetFullWidth(true)
2113 spacer:SetHeight(5)
2114 container:AddChild(spacer)
2115 end
2116 end
2117
2118 tabs_OnGroupSelected["opt"] = function(container,specials)
2119 opts = OuroLootSV_opts
2120
2121 container:SetLayout("Fill")
2122 local scroll, grp, w
2123
2124 scroll = AceGUI:Create("ScrollFrame")
2125 scroll:SetLayout("Flow")
2126
2127 grp = AceGUI:Create("InlineGroup")
2128 grp:SetLayout("Flow")
2129 grp:SetFullWidth(true)
2130 grp:SetTitle("User Options [these are saved across sessions]")
2131
2132 -- The relative width fields used to be done to take up less vertical
2133 -- space, but that turned out to look messy. Now they're just a
2134 -- straight line for the most part.
2135
2136 -- the nubtoggle!
2137 w = mkoption('gui_noob', [[Show UI Tips]], 0.85,
2138 [[Toggles display of the "helpful tips" box on the right side. Useful if you've just installed/upgraded.]])
2139 grp:AddChild(w)
2140
2141 -- reminder popup
2142 w = mkoption ('popup_on_join', "Show reminder popup on new raid", 0.49,
2143 [[When joining a raid and not already tracking, display a dialog asking for instructions.]])
2144 grp:AddChild(w)
2145
2146 -- toggle scroll-to-bottom on first tab
2147 w = mkoption('scroll_to_bottom', "Scroll to bottom when opening display", 0.49,
2148 [[Scroll to the bottom of the loot window (most recent entries) when displaying the GUI.]])
2149 grp:AddChild(w)
2150
2151 -- chatty boss mode
2152 w = mkoption('chatty_on_kill', "Be chatty on boss kill", 0.49,
2153 [[Print something to chat output when the boss mod tells Ouro Loot about a successful boss kill.]])
2154 grp:AddChild(w)
2155
2156 -- less noise in main panel
2157 w = mkoption('no_tracking_wipes', "Do not track wipes", 0.49,
2158 [[Do not add 'wipe' entries on the main loot grid, or generate any text for them.]])
2159 grp:AddChild(w)
2160
2161 -- cutesy abbrevs
2162 w = mkoption('snarky_boss', "Use snarky boss names", 0.49,
2163 [[Irreverent replacement names for boss events. See abbreviations.lua for details.]])
2164 grp:AddChild(w)
2165
2166 -- LOD plugins in all cases
2167 w = mkoption('display_disabled_LODs', "Include disabled plugins", 0.49,
2168 [[Show loadable plugins even if they've been disabled (and offer to enable them). Relog to take effect.]])
2169 grp:AddChild(w)
2170
2171 -- showing the "(from Rebroadcasterdude)" in the notes column
2172 w = mkoption('display_bcast_from', "Show rebroadcasting player", 0.49,
2173 [[Include "from PlayerName" in the Notes column for loot that was broadcast to you. (Not included in forum output).]],
2174 function(_w,_e,value)
2175 opts.display_bcast_from = value
2176 addon.loot_clean = nil
2177 end)
2178 grp:AddChild(w)
2179
2180 -- prefilling g_uniques with history
2181 w = mkoption('precache_history_uniques', "Prescan for faster handling", 0.49,
2182 [[See description under +Help -- Handy Tips -- Prescanning> for instructions.]])
2183 grp:AddChild(w)
2184
2185 w = AceGUI:Create("Spacer") w:SetFullWidth(true) w:SetHeight(5) grp:AddChild(w)
2186
2187 -- possible keybindings
2188 do
2189 local pair = AceGUI:Create("InlineGroup")
2190 pair:SetLayout("List")
2191 pair:SetRelativeWidth(0.49)
2192 pair:SetTitle("Keybinding for '/ouroloot'")
2193 local editbox, checkbox
2194 editbox = mkbutton("EditBox", nil, opts.keybinding_text,
2195 [[Keybinding text format is fragile (ALT then CTRL then SHIFT)! Relog to take effect.]])
2196 editbox:SetFullWidth(true)
2197 editbox:SetLabel("Keybinding text")
2198 editbox:SetCallback("OnEnterPressed", function(_w,event,value)
2199 opts.keybinding_text = value
2200 end)
2201 editbox:SetDisabled(not opts.keybinding)
2202 checkbox = mkoption('keybinding', "Register keybinding", 1,
2203 [[Register a keybinding to toggle the loot display. Relog to take effect.]],
2204 function (_w,_,value)
2205 opts.keybinding = value
2206 editbox:SetDisabled(not opts.keybinding)
2207 end)
2208 checkbox:SetFullWidth(true)
2209 pair:AddChild(checkbox)
2210 pair:AddChild(editbox)
2211 grp:AddChild(pair)
2212 end
2213
2214 -- replacement for slashloot
2215 do
2216 local pair = AceGUI:Create("InlineGroup")
2217 pair:SetLayout("List")
2218 pair:SetRelativeWidth(0.49)
2219 pair:SetTitle('Synonyms for "/ouroloot"')
2220 local editbox, checkbox
2221 editbox = mkbutton("EditBox", nil, opts.slash_synonyms,
2222 [[Separate multiple synonyms with a comma. Relog to take effect.]])
2223 editbox:SetFullWidth(true)
2224 editbox:SetLabel("Slash commands")
2225 editbox:SetCallback("OnEnterPressed", function(_e,event,value)
2226 -- Do the sanity checking here rather than at each login.
2227 -- This is not foolproof. That's okay.
2228 local t = { strsplit(',', tostring(value)) }
2229 for k,v in ipairs(t) do
2230 v = v:trim()
2231 if v:sub(1,1) ~= "/" then
2232 v = "/" .. v
2233 end
2234 t[k] = v
2235 end
2236 value = table.concat(t,',')
2237 _e:SetText(value)
2238 opts.slash_synonyms = value
2239 end)
2240 editbox:SetDisabled(not opts.register_slash_synonyms)
2241 checkbox = mkoption('register_slash_synonyms', "Register slash commands", 1,
2242 [[Register these slash commands as synonyms for "/ouroloot". Relog to take effect.]],
2243 function (_w,_,value)
2244 opts.register_slash_synonyms = value
2245 editbox:SetDisabled(not opts.register_slash_synonyms)
2246 end)
2247 checkbox:SetFullWidth(true)
2248 pair:AddChild(checkbox)
2249 pair:AddChild(editbox)
2250 grp:AddChild(pair)
2251 end
2252
2253 -- chatty disposition/assignment changes
2254 do
2255 local chatgroup = AceGUI:Create("InlineGroup")
2256 chatgroup:SetLayout("List")
2257 chatgroup:SetRelativeWidth(0.49)
2258 chatgroup:SetTitle("Remote Changes Chat")
2259 local toggle, editbox
2260 toggle = mkoption('chatty_on_remote_changes', "Be chatty on remote changes", 1,
2261 [[Print something to chat when other users change recorded loot.]],
2262 function (_w,_,value)
2263 opts.chatty_on_remote_changes = value
2264 editbox:SetDisabled(not opts.chatty_on_remote_changes)
2265 end)
2266 toggle:SetFullWidth(true)
2267 chatgroup:AddChild(toggle)
2268 w = AceGUI:Create("Label")
2269 w:SetFullWidth(true)
2270 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.")
2271 chatgroup:AddChild(w)
2272 editbox = mkbutton("EditBox", nil, opts.chatty_on_remote_changes_frame,
2273 [[1 = default chat frame, 2 = combat log, etc]])
2274 editbox:SetFullWidth(true)
2275 editbox:SetLabel("Output Chatframe")
2276 editbox:SetCallback("OnTextChanged", adv_careful_OnTextChanged)
2277 editbox:SetCallback("OnEnterPressed", function(_w,event,value)
2278 local prev = opts.chatty_on_remote_changes_frame
2279 value = value:trim()
2280 value = tonumber(value) or value
2281 if addon:_set_remote_change_chatframe (value) then
2282 opts.chatty_on_remote_changes_frame = value
2283 _w:SetText(tostring(value))
2284 _w.editbox:ClearFocus()
2285 else
2286 _w:SetText(tostring(prev))
2287 end
2288 end)
2289 editbox:SetDisabled(not opts.chatty_on_remote_changes)
2290 chatgroup:AddChild(editbox)
2291 w = mkbutton("Chat Frame Numbers",
2292 [[Print each chat window number in its own frame, for easy reference in the editing field.]])
2293 w:SetFullWidth(true)
2294 w:SetCallback("OnClick", function()
2295 for i = 1, NUM_CHAT_WINDOWS do
2296 local cf = _G['ChatFrame'..i]
2297 if not cf then break end
2298 addon:CFPrint (cf, "This is frame number |cffff0000%d|r.", i)
2299 end
2300 end)
2301 chatgroup:AddChild(w)
2302 grp:AddChild(chatgroup)
2303 end
2304
2305 -- boss mod selection
2306 w = AceGUI:Create("Spacer") w:SetFullWidth(true) w:SetHeight(2) grp:AddChild(w)
2307 do
2308 local list = {}
2309 local current
2310 for k,v in ipairs(addon.bossmods) do
2311 list[k] = v.n
2312 if v.n == opts.bossmod then
2313 current = k
2314 end
2315 end
2316 w = mkbutton("Dropdown", nil, "", [[Which 'boss mod' to use.]])
2317 w:SetRelativeWidth(0.2)
2318 w:SetLabel("Boss Mod:")
2319 w:SetList(list)
2320 w:SetValue(current)
2321 w:SetCallback("OnValueChanged", function(_w,event,choice)
2322 opts.bossmod = list[choice]
2323 end)
2324 grp:AddChild(w)
2325 end
2326
2327 -- item filters
2328 w = AceGUI:Create("Spacer") w:SetFullWidth(true) w:SetHeight(2) grp:AddChild(w)
2329 do
2330 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, and then display Options again."
2331 local cache_warn, cache_warned = false, false
2332 local function do_warning()
2333 if cache_warn and not cache_warned then
2334 cache_warned = true
2335 addon:Print(warntext)
2336 end
2337 end
2338
2339 local filterlist, vaultlist = {}, {}
2340 for id in pairs(opts.itemfilter) do
2341 local iname, _, iquality = GetItemInfo(id)
2342 if iname then
2343 filterlist[id] = ITEM_QUALITY_COLORS[iquality].hex .. iname .. "|r"
2344 else
2345 cache_warn = true
2346 end
2347 end
2348 for id in pairs(opts.itemvault) do
2349 local iname, _, iquality = GetItemInfo(id)
2350 if iname then
2351 vaultlist[id] = ITEM_QUALITY_COLORS[iquality].hex .. iname .. "|r"
2352 else
2353 cache_warn = true
2354 end
2355 end
2356
2357 w = AceGUI:Create("EditBoxDropDown")
2358 w:SetRelativeWidth(0.4)
2359 w:SetText("Item filter")
2360 w:SetEditBoxTooltip("Link items which should no longer be tracked.")
2361 w:SetList(filterlist)
2362 w:SetCallback("OnTextEnterPressed", function(_w, _, text)
2363 local iname, ilink, iquality = GetItemInfo(text:trim())
2364 if not iname then
2365 return addon:Print("Error: %s is not a valid item name/link!", text)
2366 end
2367 local id = tonumber(ilink:match("item:(%d+)"))
2368 filterlist[id] = ITEM_QUALITY_COLORS[iquality].hex .. iname .. "|r"
2369 opts.itemfilter[id] = true
2370 addon:Print("Now filtering out", ilink)
2371 end)
2372 w:SetCallback("OnListItemClicked", function(_w, _, key_id, val_name)
2373 --local ilink = select(2,GetItemInfo(key_id))
2374 opts.itemfilter[tonumber(key_id)] = nil
2375 --addon:Print("No longer filtering out", ilink)
2376 addon:Print("No longer filtering out", val_name)
2377 end)
2378 w:SetCallback("OnDropdownShown",do_warning)
2379 grp:AddChild(w)
2380
2381 w = AceGUI:Create("Spacer")
2382 w:SetRelativeWidth(0.1)
2383 w:SetHeight(2)
2384 grp:AddChild(w)
2385
2386 w = AceGUI:Create("EditBoxDropDown")
2387 w:SetRelativeWidth(0.4)
2388 w:SetText("Vault items")
2389 w:SetEditBoxTooltip("Link items which should be automatically marked as guild vault.")
2390 w:SetList(vaultlist)
2391 w:SetCallback("OnTextEnterPressed", function(_w, _, text)
2392 local iname, ilink, iquality = GetItemInfo(text:trim())
2393 if not iname then
2394 return addon:Print("Error: %s is not a valid item name/link!", text)
2395 end
2396 local id = tonumber(ilink:match("item:(%d+)"))
2397 vaultlist[id] = ITEM_QUALITY_COLORS[iquality].hex .. iname .. "|r"
2398 opts.itemvault[id] = true
2399 addon:Print("Now auto-vaulting", ilink)
2400 end)
2401 w:SetCallback("OnListItemClicked", function(_w, _, key_id, val_name)
2402 --local ilink = select(2,GetItemInfo(key_id))
2403 opts.itemfilter[tonumber(key_id)] = nil
2404 --addon:Print("No longer filtering out", ilink)
2405 addon:Print("No longer auto-vaulting", val_name)
2406 end)
2407 w:SetCallback("OnDropdownShown",do_warning)
2408 grp:AddChild(w)
2409 end
2410
2411 addon.sender_list.sort()
2412 if #addon.sender_list.namesI > 0 then
2413 local senders = table.concat(addon.sender_list.namesI,'\n') -- sigh
2414 -- If 39 other people in the raid are running this, the label will
2415 -- explode... is it likely enough to care about? No.
2416 w = AceGUI:Create("Spacer")
2417 w:SetFullWidth(true)
2418 w:SetHeight(20)
2419 grp:AddChild(w)
2420 w = AceGUI:Create("Label")
2421 w:SetRelativeWidth(0.4)
2422 w:SetText(ITEM_QUALITY_COLORS[3].hex .."Echo from latest ping:|r\n"..senders)
2423 grp:AddChild(w)
2424 end
2425
2426 scroll:AddChild(grp)
2427
2428 w = mkbutton("ReloadUI", [[Does what you think it does. Loot information is written out and restored.]])
2429 w:SetFullWidth(true)
2430 w:SetCallback("OnClick", ReloadUI)
2431 specials:AddChild(w)
2432
2433 w = mkbutton("Ping!",
2434 [[Asks other raid users for their addon version and current status. Results displayed on User Options panel.]])
2435 w:SetFullWidth(true)
2436 w:SetCallback("OnClick", function(_w)
2437 _w:SetText("5... 4... 3...")
2438 _w:SetDisabled(true)
2439 addon:DoPing()
2440 addon:ScheduleTimer(function(b)
2441 if b:IsVisible() then
2442 return addon:redisplay()
2443 end
2444 end, 5, _w)
2445 end)
2446 specials:AddChild(w)
2447
2448 -- Add appropriate lower panel
2449 adv_lower (scroll, specials)
2450
2451 -- Finish up
2452 container:AddChild(scroll)
2453 end
2454 end
2455 1899
2456 1900
2457 -- Simply to avoid recreating the same function over and over 1901 -- Simply to avoid recreating the same function over and over
2458 local tabs_OnGroupSelected_func_args = { [2] = "OnGroupSelected" } 1902 local tabs_OnGroupSelected_func_args = { [2] = "OnGroupSelected" }
2459 tabs_OnGroupSelected_func = function (tabs,event,group) 1903 tabs_OnGroupSelected_func = function (tabs,event,group)
2531 button:SetCallback("OnLeave", statusy_OnLeave) 1975 button:SetCallback("OnLeave", statusy_OnLeave)
2532 -- retrieval key may be specified as nil if all the parameters are given 1976 -- retrieval key may be specified as nil if all the parameters are given
2533 if opt_key then _d:SetUserData (opt_key, button) end 1977 if opt_key then _d:SetUserData (opt_key, button) end
2534 return button 1978 return button
2535 end 1979 end
1980 gui.mkbutton = mkbutton
2536 1981
2537 --[[ 1982 --[[
2538 Creates the main window. 1983 Creates the main window.
2539 ]] 1984 ]]
2540 function addon:BuildMainDisplay (opt_tabselect) 1985 function addon:BuildMainDisplay (opt_tabselect)
2563 display:SetTitle(window_title) 2008 display:SetTitle(window_title)
2564 display:SetStatusText(self.status_text) 2009 display:SetStatusText(self.status_text)
2565 display:SetLayout("Flow") 2010 display:SetLayout("Flow")
2566 display:SetStatusTable{width=900,height=550} -- default height is 500 2011 display:SetStatusTable{width=900,height=550} -- default height is 500
2567 display:EnableResize(false) 2012 display:EnableResize(false)
2013 display:SetUserData("GUI state",gui)
2568 display:SetCallback("OnClose", function(_display) 2014 display:SetCallback("OnClose", function(_display)
2569 UIDROPDOWNMENU_SHOW_TIME = prev_fade_time 2015 UIDROPDOWNMENU_SHOW_TIME = prev_fade_time
2570 hide_noobtips_frame() 2016 hide_noobtips_frame()
2571 _d = nil 2017 _d = nil
2572 self.display = nil 2018 self.display = nil