# HG changeset patch # User Farmbuyer of US-Kilrogg # Date 1343273696 0 # Node ID 3546c7b559869522d7ff5e4031050b5e83829fc2 # Parent db1d5d09e5f574873fc2a86f5ba5bc3a1d3cc52b Move generation of the Help tab to the same file as the help text. Allow registration of arbitrary tab controls, not just text generation. Move some shared data out of the addon table into a 'gui' state table in preparation for more of the same. Clean some cruft out of the default itemfilter list. diff -r db1d5d09e5f5 -r 3546c7b55986 LibFarmbuyer.lua --- a/LibFarmbuyer.lua Tue Jul 24 23:04:51 2012 +0000 +++ b/LibFarmbuyer.lua Thu Jul 26 03:34:56 2012 +0000 @@ -101,7 +101,7 @@ ---------------------------------------------------------------------- --[[ - safeprint + safeprint and company (primarily for on-the-fly debugging) ]] local tconcat, tostring, tonumber = table.concat, tostring, tonumber local function undocontrol(c) diff -r db1d5d09e5f5 -r 3546c7b55986 Ouro_Loot.toc --- a/Ouro_Loot.toc Tue Jul 24 23:04:51 2012 +0000 +++ b/Ouro_Loot.toc Thu Jul 26 03:34:56 2012 +0000 @@ -6,8 +6,7 @@ ## SavedVariables: OuroLootSV, OuroLootSV_saved, OuroLootSV_opts, OuroLootSV_hist, OuroLootSV_log ## OptionalDeps: Ace3, DBM-Core, lib-st, LibFarmbuyer, tekDebug ## LoadManagers: AddonLoader -# Do not use /loot in this list, Blizzard's ChatTypeInfo gets confused: -## X-LoadOn-Slash: /ouroloot +## X-LoadOn-Slash: /ouroloot, /ol ## X-LoadOn-InterfaceOptions: Ouro Loot ## X-LoadOn-Raid: true ## X-LoadOn-Events: LFG_PROPOSAL_SHOW diff -r db1d5d09e5f5 -r 3546c7b55986 core.lua --- a/core.lua Tue Jul 24 23:04:51 2012 +0000 +++ b/core.lua Thu Jul 26 03:34:56 2012 +0000 @@ -139,7 +139,7 @@ ['chatty_on_remote_changes'] = false, ['chatty_on_remote_changes_frame'] = 1, } -local virgin = "First time loaded? Hi! Use the /ouroloot or /loot command" +local virgin = "First time loaded? Hi! Use the /ouroloot command" .." to show the main display. You should probably browse the instructions" .." if you've never used this before; %s to display the help window. This" .." welcome message will not intrude again." @@ -765,6 +765,16 @@ -- get item filter table if needed if opts.itemfilter == nil then opts.itemfilter = self.default_itemfilter + else + -- remove old stuff that doesn't "drop" anymore + -- find some way of only doing this once + opts.itemfilter[29434] = nil -- Badge of Justice + opts.itemfilter[40752] = nil -- Emblem of Heroism + opts.itemfilter[40753] = nil -- Emblem of Valor + opts.itemfilter[45624] = nil -- Emblem of Conquest + opts.itemfilter[43228] = nil -- Stone Keeper's Shard + opts.itemfilter[47241] = nil -- Emblem of Triumph + opts.itemfilter[49426] = nil -- Emblem of Frost end self.default_itemfilter = nil if opts.itemvault == nil then @@ -891,8 +901,10 @@ if dirty then self:Print("Saved data has been massaged into shape.") end end + self:FINISH_SPECIAL_TABS() _init(self) self.dprint('flow', "version strings:", version_large, self.revision, self.status_text) + self.gui_state_pointer = nil self.load_assert = nil self.OnInitialize = nil -- free up ALL the things! end @@ -1033,6 +1045,27 @@ do local prototype = {} + local registry + + -- By default, no plugins. First one in sets up code for any after. + addon.get_plugin = flib.nullfunc + + -- Fires before the plugin's own OnEnable (inherited or otherwise). + function addon:OnModuleCreated (plugin) + if not registry then + registry = {} + addon.get_plugin = function(a,t) return registry[t] end + prototype.register_text_generator = function(p,t,...) + registry[t] = p + return addon:register_text_generator(t,...) + end + prototype.register_tab_control = function(p,t,...) + registry[t] = p + return addon:register_tab_control(t,...) + end + end + end + local function module_OnEnable (plugin) if plugin.option_defaults then local SVname = 'OuroLoot'..plugin:GetName()..'_opts' @@ -1052,29 +1085,11 @@ end end - -- By default, no plugins. First plugin to use the special registration - -- sets up code for any subsequent plugins. - addon.is_plugin = flib.nullfunc - local function module_rtg (plugin, text_type, ...) - local registry = { [text_type]=plugin } - addon.is_plugin = function(a,t) return registry[t] end - prototype.register_text_generator = function(p,t,...) - registry[t] = p - return addon:register_text_generator(t,...) - end - return addon:register_text_generator(text_type,...) - end - prototype.OnEnable = module_OnEnable prototype.default_OnEnable = module_OnEnable - prototype.register_text_generator = module_rtg addon:SetDefaultModuleLibraries("AceConsole-3.0") addon:SetDefaultModulePrototype(prototype) - -- Fires before the plugin's own OnEnable (inherited or otherwise). - --function addon:OnModuleCreated (plugin) - -- print("created plugin", plugin:GetName()) - --end local err = [[Module '%s' cannot register itself because it failed a required condition: '%s']] function addon:ConstrainedNewModule (modname, minrev, mincomm, mindata) @@ -1685,9 +1700,9 @@ elseif cmd == "fix" then if arg == "?" then - self:Print[['/loot fix cache' updates loot that wasn't in the cache]] - self:Print[['/loot fix history' repairs inconsistent data on the History tab]] - self:Print[['/loot fix' changes no stored data, only allows the window to be displayed again (this is built into all fixes above)]] + self:Print[['/ouroloot fix cache' updates loot that wasn't in the cache]] + self:Print[['/ouroloot fix history' repairs inconsistent data on the History tab]] + self:Print[['/ouroloot fix' changes no stored data, only allows the window to be displayed again (this is built into all fixes above)]] return elseif arg == "cache" then self:do_item_cache_fixup() @@ -1766,7 +1781,7 @@ self:broadcast('revcheck',version_large) end --- Note: running '/loot off' will also avoid the popup reminder when +-- Note: running '/ouroloot off' will also avoid the popup reminder when -- joining a raid, but will not change the saved option setting. function addon:Deactivate() self.enabled = false @@ -3514,7 +3529,7 @@ OCR_funcs.bcast_req = function (sender) if addon.debug.comm or ((not g_wafer_thin) and (not addon.rebroadcast)) then - addon:Print("%s has requested additional broadcasters! Choose %s to enable rebroadcasting, or %s to remain off and also ignore rebroadcast requests for as long as you're logged in.", + addon:Print("%s has requested additional broadcasters! Click %s to enable rebroadcasting, or %s to remain off and also ignore rebroadcast requests for as long as you're logged in.", sender, tostring(bcast_on), tostring(waferthin)) diff -r db1d5d09e5f5 -r 3546c7b55986 gui.lua --- a/gui.lua Tue Jul 24 23:04:51 2012 +0000 +++ b/gui.lua Thu Jul 26 03:34:56 2012 +0000 @@ -43,17 +43,33 @@ local disp = data[realrow].disposition return eoi_st_lootrow_col3_colortable[disp or 'normal'] end -addon.time_column1_used_mt = { __index = { +local time_column1_used_mt = { __index = { [2] = {value=""}, [3] = {value=""}, } } -local time_column1_used_mt = addon.time_column1_used_mt ------ Globals -local GUI = LibStub("AceGUI-3.0") +local AceGUI = LibStub("AceGUI-3.0") local flib = LibStub("LibFarmbuyer") +local gui = { + -- These are used to build the tabgroup_tabs array fed to TabGroup, and + -- for the official source of mouseover tab titles, etc. Not completely + -- hidden because we need to reach in and fiddle too often to be worth it. + tabtexts = { + ["eoi"] = {title=[[Loot]], desc=[[Observed loot, plus boss kills and other events of interest]]}, + ["hist"] = {title=[[History]], desc=[[A short semi-permanent record]]}, + ["opt"] = {title=[[Options]], desc=[[Options for fine-tuning behavior]]}, + }, + taborder = { "eoi" }, + taborder_APPEND = { "hist", "help", "opt" }, +} +addon.gui_state_pointer = gui -- only during loading, then cleaned out +if addon.author_debug then + _G.OLgui = gui +end + local g_loot = nil local g_uniques = nil local g_generated = nil @@ -73,7 +89,7 @@ -- En masse forward decls of symbols defined inside local blocks local _generate_text, _populate_text_specials, _markup -local eoi_dropdownfuncs, _tabtexts, _taborder -- filled out in gui block scope +local eoi_dropdownfuncs -- filled out in gui block scope local _do_debugging_tooltip, _hide_debugging_tooltip, _build_debugging_tooltip local _new_rebroadcast_hyperlink @@ -135,6 +151,36 @@ local text_gen_funcs, specials_gen_funcs = {}, {} local accumulator = {} + local function _reg (tab_code, title, description, --[[unused]]generator, + opt_specgen, opt_noobtip, opt_cli + ) + assert(type(tab_code)=='string') + assert(type(title)=='string') + assert(type(description)=='string') + gui.tabtexts[tab_code] = { title=title, desc=description } + if not gui.suppress_taborder then + gui:tabposition_insert (tab_code) + end + if opt_specgen then + assert(type(opt_specgen)=='function') + specials_gen_funcs[tab_code] = opt_specgen + end + if opt_noobtip then + if type(opt_noobtip) == 'string' then + noob_tips[tab_code] = _markup(opt_noobtip) + elseif type(opt_noobtip) == 'function' then + noob_tips[tab_code] = opt_noobtip + else + error(("Optional new user tip argument for '%s' must be a string or function!"):format(tab_code)) + end + end + if opt_cli then + assert(type(opt_cli)=='function') + tabs_CLI_special[tab_code] = opt_cli + end + dirty_tabs = true + end + -- Can do clever things by passing other halting points as zero function addon:zero_printed_fenceposts (zero) for t in pairs(text_gen_funcs) do @@ -147,15 +193,15 @@ end -- This function is called during load, so be careful! - function addon:register_text_generator (text_type, title, description, generator, opt_specgen) + function addon:register_text_generator (text_type, title, description, + generator, opt_specgen, opt_noobtip, opt_cli + ) + if self.NOLOAD then return end if type(generator) ~= 'function' then error(("Generator for text type '%s' must be a function!"):format(text_type)) end - _tabtexts[text_type] = { title=title, desc=description } - self:tabposition_insert (text_type) + _reg (text_type, title, description, generator, opt_specgen, opt_noobtip, opt_cli) text_gen_funcs[text_type] = generator - specials_gen_funcs[text_type] = opt_specgen - dirty_tabs = true end -- These two called by tabs_generated_text_OGS @@ -195,19 +241,19 @@ -- LOD tab has been clicked on. local function _handle_LOD (tabs_container,specials,tabtitle) - -- "tabtitle" here is the name in _taborder, not the colorized string - local what = _tabtexts[tabtitle] + -- "tabtitle" here is the name in taborder, not the colorized string + local what = gui.tabtexts[tabtitle] local addon_index = what.LOD local function LOAD() - _tabtexts[tabtitle] = nil - addon:tabposition_remove_and_remember (tabtitle) + gui.tabtexts[tabtitle] = nil + gui:tabposition_remove_and_remember (tabtitle) local loaded, whynot = LoadAddOn(addon_index) - local tabdelta = addon:tabposition_restore() + local tabdelta = gui:tabposition_restore() if loaded then addon:Print("%s loaded, %d |4tab:tabs; added.", tabtitle, tabdelta) else what.disabled = true - _tabtexts[tabtitle] = what -- restore this for mouseovers + gui.tabtexts[tabtitle] = what -- restore this for mouseovers addon:Print("%s could not load (game client reason was '%s').", tabtitle, whynot) DisableAddOn(addon_index) end @@ -243,7 +289,7 @@ -- already been called, we flag the dirty bit and let the main building -- routine handle it like any other plugin. function addon:_gui_add_LOD_tab (tabtitle, folder, addon_index, enabled_p, why_not) - _tabtexts[tabtitle] = { + gui.tabtexts[tabtitle] = { title = ("|cffff0000(%s)|r"):format(tabtitle), desc = ("Plugin '|cffff0000%s|r' is not loaded yet. Click the tab to load it now."):format(folder), LOD = addon_index, @@ -251,9 +297,30 @@ LOD_why_not = why_not, } tabs_OnGroupSelected[tabtitle] = _handle_LOD - self:tabposition_insert (tabtitle) + gui:tabposition_insert (tabtitle) dirty_tabs = true end + + -- Registering truly arbitrary tab controls, not just text generators. + -- (This is slightly out of place, but no more so than the LOD stuff.) + -- The arguments are nearly the same as those of :register_text_generator + -- but the "generator" function is the full-blown callback and there is + -- no "specgen" (since it's handled in the main generator). + function addon:register_tab_control (tab_code, title, description, + generator, opt_noobtip, opt_cli + ) + if self.NOLOAD then return end + if type(generator) ~= 'function' then + error(("Generator for tab code '%s' must be a function!"):format(tab_code)) + end + _reg (tab_code, title, description, generator, --[[opt_specgen=]]nil, opt_noobtip, opt_cli) + tabs_OnGroupSelected[tab_code] = generator + end + function addon:register_tab_control_AT_END (...) + gui.suppress_taborder = true + self:register_tab_control(...) + gui.suppress_taborder = nil + end end --[[ @@ -681,7 +748,7 @@ ------ Main GUI Window -local _d -- display when it's open, eoiST when it's not +local _d -- display when it's open, nil when it's not local function setstatus(txt) _d:SetStatusText(txt) end local function statusy_OnLeave() setstatus("") end local tabgroup_tabs @@ -690,24 +757,13 @@ Controls for the tabs on the left side of the main display. ]] --- The _tabtexts and _taborder tables have distressingly wide visibility. --- They are used to build the tabgroup_tabs array fed to TabGroup, and for the --- official source of mouseover tab titles, etc. Not completely encapsulated --- because we need to reach in and fiddle too often to be worth it. -_tabtexts = { - ["eoi"] = {title=[[Loot]], desc=[[Observed loot, plus boss kills and other events of interest]]}, - ["hist"] = {title=[[History]], desc=[[A short semi-permanent record]]}, - ["help"] = {title=[[Help]], desc=[[Instructions, reminders, and tips for non-obvious features]]}, - ["opt"] = {title=[[Options]], desc=[[Options for fine-tuning behavior]]}, -} -_taborder = { "eoi", "hist", "help", "opt" } - do - local next_insertion_position = 2 -- position in _taborder + --local next_insertion_position = 2 -- position in taborder + local next_insertion_position = #gui.taborder + 1 local removed, saved_offset - function addon:tabposition_insert (tabcode) - tinsert (_taborder, next_insertion_position, tabcode) + function gui:tabposition_insert (tabcode) + tinsert (gui.taborder, next_insertion_position, tabcode) next_insertion_position = next_insertion_position + 1 end @@ -715,11 +771,11 @@ -- a tab and prepares to insert more tab(s) in its place. The second -- returns the "next tab goes here" marker back to the proper end. (And -- doing all 3 adjustments below at once is amazingly hard to read.) - function addon:tabposition_remove_and_remember (tabcode) + function gui:tabposition_remove_and_remember (tabcode) assert(not removed) -- enforce stack-ish discipline - for i = 2, #_taborder do - if _taborder[i] == tabcode then - tremove (_taborder, i) + for i = 2, #gui.taborder do + if gui.taborder[i] == tabcode then + tremove (gui.taborder, i) saved_offset = next_insertion_position - i - 1 removed, next_insertion_position = i, i return @@ -727,13 +783,23 @@ end error(("'%s' not used as a tab-text code"):format(tabcode)) end - function addon:tabposition_restore() + function gui:tabposition_restore() assert(removed) local count = next_insertion_position - removed next_insertion_position = next_insertion_position + saved_offset removed, saved_offset = nil, nil return count end + + function addon:FINISH_SPECIAL_TABS() + -- very carefully not touching next_insertion_position + for i,v in ipairs(gui.taborder_APPEND) do + gui.taborder[#gui.taborder+1] = v + end + gui.taborder_APPEND = nil + self.register_tab_control_AT_END = nil + self.FINISH_SPECIAL_TABS = nil + end end -- Done at startup, and whenever we've changed the population of tabs. @@ -747,12 +813,12 @@ -- row is already full. It turns out that not doing this looks like ass. -- If we won't have enough tabs to trigger this on its own, pad out the tab -- titles (not looking quite as nice, ah well) to force it to trigger. - local fmtstr = #_taborder > 6 and "%s" or " %s " - for i,name in ipairs(_taborder) do + local fmtstr = #gui.taborder > 6 and "%s" or " %s " + for i,name in ipairs(gui.taborder) do tabgroup_tabs[i] = { value = name, - text = fmtstr:format(_tabtexts[name].title), - disabled = _tabtexts[name].disabled, + text = fmtstr:format(gui.tabtexts[name].title), + disabled = gui.tabtexts[name].disabled, } -- By default, tabs are editboxes with generated text if not tabs_OnGroupSelected[name] then @@ -785,7 +851,7 @@ local i = _d and _d.GetUserData and _d:GetUserData("DD index") if i then subfunc(i,arg) - _d:GetUserData("which ST"):OuroLoot_Refresh(i) + gui.which_ST:OuroLoot_Refresh(i) end end @@ -886,7 +952,7 @@ end, ["Show only this player"] = function(rowi) - local st = _d:GetUserData("eoiST") + local st = assert(gui.eoiST) _d:SetUserData("player filter name", g_loot[rowi].person) st:SetFilter(_d:GetUserData("player filter by name")) _d:GetUserData("eoi_filter_reset"):SetDisabled(false) @@ -898,7 +964,7 @@ ["Change from 'wipe' to 'kill'"] = function(rowi) addon:_mark_boss_kill(rowi) -- the fillout function called automatically will start too far down the list - _d:GetUserData("eoiST"):OuroLoot_Refresh() + gui.eoiST:OuroLoot_Refresh() end, ["Edit note"] = function(rowi) @@ -1144,7 +1210,7 @@ local e = g_loot[row_index] if not e then return end -- how the hell could we get this far? local celldata = e.cols[3] - local box = GUI:Create("EditBox") + local box = AceGUI:Create("EditBox") box:SetText(celldata.value) box:SetUserData("old show", box.editbox:GetScript("OnShow")) box:SetUserData("old escape", box.editbox:GetScript("OnEscapePressed")) @@ -1161,7 +1227,7 @@ value = value and value:match("^(x%d+)") if value then e.count = value end _b:Release() - return _d:GetUserData("eoiST"):OuroLoot_Refresh(row_index) + return gui.eoiST:OuroLoot_Refresh(row_index) end) box:SetCallback("OnRelease", function(_b) _b.editbox:ClearFocus() @@ -1271,7 +1337,7 @@ -- this function replaces itself with a smaller, sleeker, sexier one. -- This function will later be garbage collected. local ST = LibStub("ScrollingTable"):CreateST(eoi_st_cols,eoi_st_displayed_rows,eoi_st_rowheight) - _d:SetUserData("eoiST",ST) + gui.eoiST = assert(ST) if addon.author_debug then _G.OLST = ST end @@ -1335,10 +1401,10 @@ -- Now set up the future drawing function... tabs_OnGroupSelected["eoi"] = function(container,specials) - local st_widget = GUI:Create("lib-st") - local st = _d:GetUserData("eoiST") + local st_widget = AceGUI:Create("lib-st") + local st = assert(gui.eoiST) - _d:SetUserData("which ST",st) + gui.which_ST = st -- This is actually required each time _d:SetUserData ("player filter clear", player_filter_all) @@ -1372,13 +1438,13 @@ [[Return to showing complete loot information.]]) b:SetFullWidth(true) b:SetCallback("OnClick", function (_b) - local st = _d:GetUserData("eoiST") - st:SetFilter(player_filter_all) + gui.eoiST:SetFilter(player_filter_all) _b:SetDisabled(true) end) b:SetDisabled(st.Filter == player_filter_all) specials:AddChild(b) + -- FIXME iterate over the new raiders table instead local people = { "" } for i = 1, GetNumRaidMembers() do tinsert(people,(GetRaidRosterInfo(i))) @@ -1427,7 +1493,7 @@ -- Tab 2/3 (generated text) function tabs_generated_text_OGS (container, specials, text_kind) container:SetLayout("Fill") - local box = GUI:Create("MultiLineEditBox") + local box = AceGUI:Create("MultiLineEditBox") box:SetFullWidth(true) box:SetFullHeight(true) box:SetLabel("Pressing the Escape key while typing will return keystroke control to the usual chat window.") @@ -1467,12 +1533,12 @@ g_loot.printed[text_kind] = 0 g_generated.last_instance = nil g_generated[pos] = nil - addon:Print("'%s' has been regenerated.", _tabtexts[text_kind].title) + addon:Print("'%s' has been regenerated.", gui.tabtexts[text_kind].title) return addon:redisplay() end) specials:AddChild(w) - if addon:is_plugin(text_kind) then - local pname = addon:is_plugin(text_kind):GetName() + if addon:get_plugin(text_kind) then + local pname = addon:get_plugin(text_kind):GetName() w = mkbutton("Reset SVs & ReloadUI", ([[ Reset savedvariables for %s plugin back to defaults, and trigger a UI reload.]]):format(pname)) w:SetFullWidth(true) @@ -1516,7 +1582,6 @@ h.itemlink, addon:colorize(h.OLwho,h.OLclass)) if numleft < 1 then history_filter_who = nil - --_d:GetUserData("histST"):SetFilter(history_filter_by_recent) histST:SetFilter(history_filter_by_recent) setstatus(hist_normal_status) end @@ -1663,7 +1728,7 @@ -- Tab 4: History (implementation) tabs_OnGroupSelected["hist"] = function(container,specials) histST = LibStub("ScrollingTable"):CreateST(hist_st_cols,eoi_st_displayed_rows,eoi_st_rowheight) - _d:SetUserData("histST",histST) + gui.histST = histST if addon.author_debug then _G.OLHST = histST end @@ -1710,9 +1775,8 @@ end tabs_OnGroupSelected["hist"] = function(container,specials) - local st_widget = GUI:Create("lib-st") - -- don't need _d:GetUserData("histST") here, as it's already a local - _d:SetUserData("which ST",histST) + local st_widget = AceGUI:Create("lib-st") + gui.which_ST = histST histST:OuroLoot_Refresh() st_widget:WrapST(histST) st_widget.head_offset = 15 @@ -1750,7 +1814,7 @@ specials:AddChild(b) end - --[[ b = GUI:Create("Spacer") b:SetFullWidth(true) b:SetHeight(10) specials:AddChild(b) ]] + --[[ b = AceGUI:Create("Spacer") b:SetFullWidth(true) b:SetHeight(10) specials:AddChild(b) ]] b = mkbutton("Regenerate", [[Erases all history entries from the displayed realm, and regenerates it from current loot information.]]) @@ -1814,13 +1878,12 @@ while over an item link to paste it into chat. any row to display a dropdown menu.]] --- '/loot hi pla' -> set filter on Playername +-- '/ol hi pla' -> set filter on Playername tabs_CLI_special["hist"] = function (name) name = '^'..name -- already tolower'd by onslash for _,player in ipairs(addon.history) do if player.name:lower():find(name) then history_filter_who = player.name - --_d:GetUserData("histST"):SetFilter(history_filter_by_name) histST:SetFilter(history_filter_by_name) setstatus(hist_name_status) break @@ -1831,58 +1894,6 @@ -- Tab 5: Help (content in verbage.lua) -do - local tabs_help_OnGroupSelected_func = function (treeg,event,category) - treeg:ReleaseChildren() - local txt = GUI:Create("Label") - txt:SetFullWidth(true) - txt:SetFontObject(GameFontNormal)--Highlight) - txt:SetText(addon.helptext[category]) - local sf = GUI:Create("ScrollFrame") - local sfstat = _d:GetUserData("help tab scroll status") or {} - sf:SetStatusTable(sfstat) - _d:SetUserData("help tab scroll status",sfstat) - sf:SetLayout("Fill") - -- This forces the scrolling area to be bigger than the visible area; else - -- some of the text gets cut off. - sf.content:SetHeight(700) - sf:AddChild(txt) - treeg:AddChild(sf) - if treeg:GetUserData("help restore scroll") then - sfstat = sfstat.scrollvalue - if sfstat then sf:SetScroll(sfstat) end - treeg:SetUserData("help restore scroll", false) - else - sf:SetScroll(0) - end - end - tabs_OnGroupSelected["help"] = function(container,specials) - container:SetLayout("Fill") - local left = GUI:Create("TreeGroup") - local leftstat = _d:GetUserData("help tab select status") - or {treewidth=145} - left:SetStatusTable(leftstat) - _d:SetUserData("help tab select status",leftstat) - left:SetLayout("Fill") - left:SetFullWidth(true) - left:SetFullHeight(true) - left:EnableButtonTooltips(false) - left:SetTree(addon.helptree) - left:SetCallback("OnGroupSelected", tabs_help_OnGroupSelected_func) - container:AddChild(left) - leftstat = leftstat.selected - if leftstat then - left:SetUserData("help restore scroll", true) - left:SelectByValue(leftstat) - else - left:SelectByValue("basic") - end - end - noob_tips["help"] = _markup[[ -Every tab across the top also gets its own special buttons here in the lower -right, under the same name as the tab. Some controls do not become visible -until that tab has data to work with.]] -end -- Tab 6: Options / Advanced @@ -1914,7 +1925,7 @@ local function adv_real (container, specials) local grp, w - grp = GUI:Create("InlineGroup") + grp = AceGUI:Create("InlineGroup") grp:SetLayout("Flow") grp:PauseLayout() grp:SetFullWidth(true) @@ -1976,9 +1987,9 @@ end) grp:AddChild(w) - w = GUI:Create("Spacer") w:SetFullWidth(true) w:SetHeight(1) grp:AddChild(w) + w = AceGUI:Create("Spacer") w:SetFullWidth(true) w:SetHeight(1) grp:AddChild(w) - local simple = GUI:Create("SimpleGroup") + local simple = AceGUI:Create("SimpleGroup") simple:SetLayout("List") simple:SetRelativeWidth(0.3) w = mkbutton("Dropdown", nil, "", [[hovering over Item column only]]) @@ -1995,9 +2006,9 @@ end) simple:AddChild(w) - w = GUI:Create("Spacer") w:SetFullWidth(true) w:SetHeight(10) simple:AddChild(w) + w = AceGUI:Create("Spacer") w:SetFullWidth(true) w:SetHeight(10) simple:AddChild(w) - w = GUI:Create("CheckBoxSmallLabel") + w = AceGUI:Create("CheckBoxSmallLabel") w:SetFullWidth(true) w:SetType("checkbox") w:SetLabel("debug toggle --->") @@ -2007,7 +2018,7 @@ addon:redisplay() end) simple:AddChild(w) - w = GUI:Create("CheckBoxSmallLabel") + w = AceGUI:Create("CheckBoxSmallLabel") w:SetFullWidth(true) w:SetType("checkbox") w:SetLabel("GOP history mode") @@ -2023,11 +2034,11 @@ simple:AddChild(w) grp:AddChild(simple) - simple = GUI:Create("SimpleGroup") + simple = AceGUI:Create("SimpleGroup") simple:SetLayout("List") simple:SetRelativeWidth(0.5) for d,v in pairs(addon.debug) do - w = GUI:Create("CheckBoxSmallLabel") + w = AceGUI:Create("CheckBoxSmallLabel") w:SetFullWidth(true) w:SetType("checkbox") w:SetLabel(d) @@ -2045,7 +2056,7 @@ end grp:AddChild(simple) - simple = GUI:Create("SimpleGroup") + simple = AceGUI:Create("SimpleGroup") simple:SetLayout("Flow") simple:SetRelativeWidth(0.85) w = mkbutton("MidS-H", [[not exactly an Easter egg, with sound]]) @@ -2070,7 +2081,7 @@ grp:ResumeLayout() container:AddChild(grp) - GUI:ClearFocus() + AceGUI:ClearFocus() container:SetScroll(1000) -- scrollframe's max value end @@ -2082,11 +2093,11 @@ adv_lower = adv_real else function adv_lower (container, specials) - local spacer = GUI:Create("Spacer") + local spacer = AceGUI:Create("Spacer") spacer:SetFullWidth(true) spacer:SetHeight(5) container:AddChild(spacer) - local speedbump = GUI:Create("InteractiveLabel") + local speedbump = AceGUI:Create("InteractiveLabel") speedbump:SetFullWidth(true) speedbump:SetFontObject(GameFontHighlightLarge) speedbump:SetImage[[Interface\DialogFrame\DialogAlertIcon]] @@ -2097,7 +2108,7 @@ return addon:redisplay() end) container:AddChild(speedbump) - spacer = GUI:Create("Spacer") + spacer = AceGUI:Create("Spacer") spacer:SetFullWidth(true) spacer:SetHeight(5) container:AddChild(spacer) @@ -2110,10 +2121,10 @@ container:SetLayout("Fill") local scroll, grp, w - scroll = GUI:Create("ScrollFrame") + scroll = AceGUI:Create("ScrollFrame") scroll:SetLayout("Flow") - grp = GUI:Create("InlineGroup") + grp = AceGUI:Create("InlineGroup") grp:SetLayout("Flow") grp:SetFullWidth(true) grp:SetTitle("User Options [these are saved across sessions]") @@ -2171,11 +2182,11 @@ [[See description under +Help -- Handy Tips -- Prescanning> for instructions.]]) grp:AddChild(w) - w = GUI:Create("Spacer") w:SetFullWidth(true) w:SetHeight(5) grp:AddChild(w) + w = AceGUI:Create("Spacer") w:SetFullWidth(true) w:SetHeight(5) grp:AddChild(w) -- possible keybindings do - local pair = GUI:Create("InlineGroup") + local pair = AceGUI:Create("InlineGroup") pair:SetLayout("List") pair:SetRelativeWidth(0.49) pair:SetTitle("Keybinding for '/ouroloot'") @@ -2202,7 +2213,7 @@ -- replacement for slashloot do - local pair = GUI:Create("InlineGroup") + local pair = AceGUI:Create("InlineGroup") pair:SetLayout("List") pair:SetRelativeWidth(0.49) pair:SetTitle('Synonyms for "/ouroloot"') @@ -2241,7 +2252,7 @@ -- chatty disposition/assignment changes do - local chatgroup = GUI:Create("InlineGroup") + local chatgroup = AceGUI:Create("InlineGroup") chatgroup:SetLayout("List") chatgroup:SetRelativeWidth(0.49) chatgroup:SetTitle("Remote Changes Chat") @@ -2254,7 +2265,7 @@ end) toggle:SetFullWidth(true) chatgroup:AddChild(toggle) - w = GUI:Create("Label") + w = AceGUI:Create("Label") w:SetFullWidth(true) 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.") chatgroup:AddChild(w) @@ -2292,7 +2303,7 @@ end -- boss mod selection - w = GUI:Create("Spacer") w:SetFullWidth(true) w:SetHeight(2) grp:AddChild(w) + w = AceGUI:Create("Spacer") w:SetFullWidth(true) w:SetHeight(2) grp:AddChild(w) do local list = {} local current @@ -2314,7 +2325,7 @@ end -- item filters - w = GUI:Create("Spacer") w:SetFullWidth(true) w:SetHeight(2) grp:AddChild(w) + w = AceGUI:Create("Spacer") w:SetFullWidth(true) w:SetHeight(2) grp:AddChild(w) do 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." local cache_warn, cache_warned = false, false @@ -2343,7 +2354,7 @@ end end - w = GUI:Create("EditBoxDropDown") + w = AceGUI:Create("EditBoxDropDown") w:SetRelativeWidth(0.4) w:SetText("Item filter") w:SetEditBoxTooltip("Link items which should no longer be tracked.") @@ -2367,12 +2378,12 @@ w:SetCallback("OnDropdownShown",do_warning) grp:AddChild(w) - w = GUI:Create("Spacer") + w = AceGUI:Create("Spacer") w:SetRelativeWidth(0.1) w:SetHeight(2) grp:AddChild(w) - w = GUI:Create("EditBoxDropDown") + w = AceGUI:Create("EditBoxDropDown") w:SetRelativeWidth(0.4) w:SetText("Vault items") w:SetEditBoxTooltip("Link items which should be automatically marked as guild vault.") @@ -2402,11 +2413,11 @@ local senders = table.concat(addon.sender_list.namesI,'\n') -- sigh -- If 39 other people in the raid are running this, the label will -- explode... is it likely enough to care about? No. - w = GUI:Create("Spacer") + w = AceGUI:Create("Spacer") w:SetFullWidth(true) w:SetHeight(20) grp:AddChild(w) - w = GUI:Create("Label") + w = AceGUI:Create("Label") w:SetRelativeWidth(0.4) w:SetText(ITEM_QUALITY_COLORS[3].hex .."Echo from latest ping:|r\n"..senders) grp:AddChild(w) @@ -2452,9 +2463,9 @@ tabs:ReleaseChildren() local spec = tabs:GetUserData("special buttons group") spec:ReleaseChildren() - local h = GUI:Create("Heading") + local h = AceGUI:Create("Heading") h:SetFullWidth(true) - h:SetText(_tabtexts[group].title) + h:SetText(gui.tabtexts[group].title) spec:AddChild(h) do addon.sender_list.sort() @@ -2513,7 +2524,7 @@ elseif not status then opt_widget_type, opt_key, label, status = "Button", opt_widget_type, opt_key, label end - local button = assert(GUI:Create(opt_widget_type)) + local button = assert(AceGUI:Create(opt_widget_type)) if button.SetText then button:SetText(tostring(label)) end status = _markup(status) button:SetCallback("OnEnter", function() setstatus(status) end) -- maybe factor that closure out @@ -2546,10 +2557,7 @@ self:zero_printed_fenceposts() end - local display = GUI:Create("Frame") - if _d then - display:SetUserData("eoiST",_d) -- warning! warning! kludge detected! - end + local display = AceGUI:Create("Frame") _d = display self.display = display display:SetTitle(window_title) @@ -2560,16 +2568,16 @@ display:SetCallback("OnClose", function(_display) UIDROPDOWNMENU_SHOW_TIME = prev_fade_time hide_noobtips_frame() - _d = _display:GetUserData("eoiST") + _d = nil self.display = nil - GUI:Release(_display) + AceGUI:Release(_display) flib.clear() collectgarbage() end) ----- Right-hand panel local rhs_width = 0.20 - local control = GUI:Create("SimpleGroup") + local control = AceGUI:Create("SimpleGroup") control:SetLayout("Flow") control:SetRelativeWidth(rhs_width) control.alignoffset = 25 @@ -2577,7 +2585,7 @@ local h,b --- Main --- - h = GUI:Create("Heading") + h = AceGUI:Create("Heading") h:SetFullWidth(true) h:SetText("Main") control:AddChild(h) @@ -2625,7 +2633,7 @@ end) control:AddChild(b) - b = GUI:Create("Spacer") + b = AceGUI:Create("Spacer") b:SetFullWidth(true) b:SetHeight(10) control:AddChild(b) @@ -2638,7 +2646,7 @@ ... [ Load ] [ Delete ] ]] - h = GUI:Create("Heading") + h = AceGUI:Create("Heading") h:SetFullWidth(true) h:SetText("Saved Texts") control:AddChild(h) @@ -2652,17 +2660,17 @@ control:AddChild(b) do - local scontainer = GUI:Create("SimpleGroup") + local scontainer = AceGUI:Create("SimpleGroup") scontainer:SetFullWidth(true) scontainer:SetFullHeight(false) scontainer:SetAutoAdjustHeight(false) scontainer:SetHeight(40) -- no relative height available anymore scontainer:SetLayout("Fill") - local scroll = GUI:Create("ScrollFrame") + local scroll = AceGUI:Create("ScrollFrame") scroll:SetLayout("List") local saved = self:check_saved_table(--[[silent_on_empty=]]true) if saved then for i,s in ipairs(saved) do - local il = GUI:Create("InteractiveLabel") + local il = AceGUI:Create("InteractiveLabel") il:SetFullWidth(true) il:SetText(s.name) il:SetUserData("num",i) @@ -2709,20 +2717,20 @@ b:SetDisabled(true) control:AddChild(b) - b = GUI:Create("Spacer") + b = AceGUI:Create("Spacer") b:SetFullWidth(true) b:SetHeight(10) control:AddChild(b) -- Other stuff on right-hand side - local tab_specials = GUI:Create("SimpleGroup") + local tab_specials = AceGUI:Create("SimpleGroup") tab_specials:SetLayout("Flow") tab_specials:SetFullWidth(true) control:AddChild(tab_specials) control:ResumeLayout() ----- Left-hand group - local tabs = GUI:Create("TabGroup") + local tabs = AceGUI:Create("TabGroup") tabs:SetLayout("Flow") tabs.alignoffset = 25 local titletext_orig_fo = tabs.titletext:GetFontObject() @@ -2735,7 +2743,7 @@ tabs:SetTabs(tabgroup_tabs) tabs:SetCallback("OnGroupSelected", tabs_OnGroupSelected_func) tabs:SetCallback("OnTabEnter", function(_tabs,event,value,tab) - setstatus(_tabtexts[value].desc) + setstatus(gui.tabtexts[value].desc) end) tabs:SetCallback("OnTabLeave", statusy_OnLeave) tabs:SetUserData("special buttons group",tab_specials) @@ -2749,10 +2757,12 @@ return display end +-- Searches tab titles from left to right. function addon:OpenMainDisplayToTab (text, opt_arg) text = '^'..text:lower() - for tab,v in pairs(_tabtexts) do - if v.title:lower():find(text) then + for _,tab in ipairs(gui.taborder) do + local v = gui.tabtexts[tab] + if v and v.title:lower():find(text) then self:BuildMainDisplay(tab) if opt_arg and tabs_CLI_special[tab] then tabs_CLI_special[tab](opt_arg) @@ -2947,7 +2957,7 @@ local entry = tremove(g_loot,boss_index) tinsert(g_loot,data.rowindex,entry) addon:_mark_boss_kill(data.rowindex) - data.display:GetUserData("eoiST"):OuroLoot_Refresh(data.rowindex) + gui.eoiST:OuroLoot_Refresh(data.rowindex) dialog.data = nil -- free up memory addon:Print("Inserted %s %s at entry %d.", data.kind, data.name, data.rowindex) return @@ -3112,7 +3122,7 @@ OnAccept = function(dialog, data) local name = dialog.usertext --editBox:GetText() addon:reassign_loot ("local", data.index, name) - data.display:GetUserData("eoiST"):OuroLoot_Refresh(data.index) + gui.eoiST:OuroLoot_Refresh(data.index) end, } diff -r db1d5d09e5f5 -r 3546c7b55986 verbage.lua --- a/verbage.lua Tue Jul 24 23:04:51 2012 +0000 +++ b/verbage.lua Thu Jul 26 03:34:56 2012 +0000 @@ -1,9 +1,26 @@ +local addon = select(2,...) +if addon.NOLOAD then return end + +-- Don't bother recording any of this loot: +addon.default_itemfilter = { + -- could probably remove most of this now +-- [29434] = true, -- Badge of Justice +-- [40752] = true, -- Emblem of Heroism +-- [40753] = true, -- Emblem of Valor +-- [45624] = true, -- Emblem of Conquest +-- [43228] = true, -- Stone Keeper's Shard +-- [47241] = true, -- Emblem of Triumph +-- [49426] = true, -- Emblem of Frost +} + +-- Mark these as straight to guild vault: +addon.default_itemvault = { + [52078] = true, -- Chaos Orb + [69237] = true, -- Living Ember + [71998] = true, -- Essence of Destruction +} local todo = [[ -- When using slash command to go directly to a tab, accept additional arguments -and let the tab decide how to interpret them. (For starters, History should -search for a player's name and do the current "magnify" action.) - - Right-clicking the [ouroloot] chat link could do something different than the current left-clicking. Popup small menu in place? @@ -15,9 +32,6 @@ that would be likely to drive me batshiat insane. ]] -local addon = select(2,...) -if addon.NOLOAD then return end - addon.helptree = { { value = "about", @@ -114,12 +128,16 @@ local T={} T.about = [[ Ouro Loot is the fault of Farmbuyer of Ouroboros on US-Kilrogg. Bug reports, -comments, and suggestions are welcome at the project page at curse.com or send -them to . +comments, and suggestions are welcome at the project page: + + + + +or send them to . ]] T.basic = [[ -The (and by default) command opens this display. The buttons +The command opens this display. The buttons on the right side control operation and are mostly self-explanatory. Hovering over things will usually display some additional text in the gray line at the bottom. @@ -274,8 +292,8 @@ If you logout for any reason, the addon will not reactivate when you log back in. -You can use or to turn on rebroadcasting without -opening the GUI. +You can use or to turn on rebroadcasting +without opening the GUI. ]] T.texts = [[ @@ -440,11 +458,15 @@ ]] T.tips_slashies = [[ -If you give an unrecognized argument to the slash command, it will +A field in the tab lets you use additional slash commands as a +shortcut for . The author prefers , as an example. The +default used to be until that became a builtin command in MoP. + +If you give an unrecognized argument to a slash command, it will search the tab titles left to right for a title beginning with the same letters as -the argument, and open the display to that tab. For example, <"/loot a"> would -open the tab, and <"/loot ad"> would open the tab. If -you had added a theoretical tab, then <"/loot eq"> would be the fastest +the argument, and open the display to that tab. For example, <"/ol a"> would +open the tab, and <"/ol ad"> would open the tab. If +you had added a theoretical tab, then <"/ol eq"> would be the fastest way to see it. The command can take arguments to do things without going through @@ -578,23 +600,67 @@ todo = nil --- Don't bother recording any of this loot: -addon.default_itemfilter = { - [29434] = true, -- Badge of Justice - [40752] = true, -- Emblem of Heroism - [40753] = true, -- Emblem of Valor - [45624] = true, -- Emblem of Conquest - -- could probably remove most of this now - [43228] = true, -- Stone Keeper's Shard - [47241] = true, -- Emblem of Triumph - [49426] = true, -- Emblem of Frost -} +-- Tab 5: Help +do + local AceGUI = LibStub("AceGUI-3.0") + -- widget container status tables (will have things magically appear + -- inside them that we wish to preserve) + local status_for_scroll = {} + local status_for_select = { treewidth = 145 } --- Mark these as straight to guild vault: -addon.default_itemvault = { - [52078] = true, -- Chaos Orb - [69237] = true, -- Living Ember - [71998] = true, -- Essence of Destruction -} + -- Clicking an entry on the left tree column. + local help_OnGroupSelected_func = function (treeg,event,category) + treeg:ReleaseChildren() + local txt = AceGUI:Create("Label") + txt:SetFullWidth(true) + txt:SetFontObject(GameFontNormal)--Highlight) + txt:SetText(addon.helptext[category]) + local sf = AceGUI:Create("ScrollFrame") + sf:SetStatusTable(status_for_scroll) + sf:SetLayout("Fill") + -- This forces the scrolling area to be bigger than the visible area; else + -- some of the text gets cut off without ever triggering the scrollbar. + sf.content:SetHeight(700) + sf:AddChild(txt) + treeg:AddChild(sf) + if treeg:GetUserData("help restore scroll") then + if status_for_scroll.scrollvalue then + sf:SetScroll(status_for_scroll.scrollvalue) + end + treeg:SetUserData("help restore scroll", false) + else + sf:SetScroll(0) + end + end + + -- Clicking the Help tab as a whole (tabs_OnGroupSelected["help"]). + local tabs_OGS = function(container,specials) + container:SetLayout("Fill") + local left = AceGUI:Create("TreeGroup") + left:SetStatusTable(status_for_select) + left:SetLayout("Fill") + left:SetFullWidth(true) + left:SetFullHeight(true) + left:EnableButtonTooltips(false) + left:SetTree(addon.helptree) + left:SetCallback("OnGroupSelected", help_OnGroupSelected_func) + container:AddChild(left) + if status_for_select.selected then + left:SetUserData("help restore scroll", true) + left:SelectByValue(status_for_select.selected) + else + left:SelectByValue("basic") + end + end + + local noob = [[ +Every tab across the top also gets its own special buttons here in the lower +right, under the same name as the tab. Some controls do not become visible +until that tab has data to work with.]] + + addon:register_tab_control_AT_END ("help", [[Help]], + [[Instructions, reminders, and tips for non-obvious features]], + tabs_OGS, --[[opt_noobtip=]]noob) +end -- vim:noet