-- ------------------------------------------------------------------------------ -- -- TradeSkillMaster_ItemTracker -- -- http://www.curse.com/addons/wow/tradeskillmaster_itemtracker -- -- -- -- A TradeSkillMaster Addon (http://tradeskillmaster.com) -- -- All Rights Reserved* - Detailed license information included with addon. -- -- ------------------------------------------------------------------------------ -- -- load the parent file (TSM) into a local variable and register this file as a module local TSM = select(2, ...) local Config = TSM:NewModule("Config", "AceEvent-3.0", "AceHook-3.0") local AceGUI = LibStub("AceGUI-3.0") -- load the AceGUI libraries local L = LibStub("AceLocale-3.0"):GetLocale("TradeSkillMaster_ItemTracker") local viewerST local filters = { characters = {}, guilds = {}, name = "", group = nil } function Config:Load(container) local tabGroup = AceGUI:Create("TSMTabGroup") tabGroup:SetLayout("Fill") tabGroup:SetTabs({ { text = L["Inventory Viewer"], value = 1 }, { text = L["Options"], value = 2 } }) tabGroup:SetCallback("OnGroupSelected", function(self, _, value) tabGroup:ReleaseChildren() if viewerST then viewerST:Hide() end if value == 1 then Config:LoadInventoryViewer(self) elseif value == 2 then Config:LoadOptions(self) end tabGroup.children[1]:DoLayout() end) container:AddChild(tabGroup) tabGroup:SelectTab(1) Config:HookScript(tabGroup.frame, "OnHide", function() Config:UnhookAll() if viewerST then viewerST:Hide() end end) end local function GetSTData() local items, rowData = {}, {} local function AddItem(itemString, key, quantity) items[itemString] = items[itemString] or { total = 0, bags = 0, bank = 0, guild = 0, auctions = 0, mail = 0 } items[itemString].total = items[itemString].total + quantity items[itemString][key] = items[itemString][key] + quantity end for name, selected in pairs(filters.characters) do if selected then for itemString, quantity in pairs(TSM:GetPlayerBags(name) or {}) do AddItem(itemString, "bags", quantity) end for itemString, quantity in pairs(TSM:GetPlayerBank(name) or {}) do AddItem(itemString, "bank", quantity) end for itemString, quantity in pairs(TSM:GetPlayerMail(name) or {}) do AddItem(itemString, "mail", quantity) end for itemString, quantity in pairs(TSM:GetPlayerAuctions(name) or {}) do if itemString ~= "time" then AddItem(itemString, "auctions", quantity) end end end end for name, selected in pairs(filters.guilds) do if selected then for itemString, quantity in pairs(TSM:GetGuildBank(name) or {}) do AddItem(itemString, "guild", quantity) end end end for itemString, data in pairs(items) do local name, itemLink = TSMAPI:GetSafeItemInfo(itemString) local marketValue = TSMAPI:GetItemValue(itemString, TSM.db.profile.marketValue) or 0 local groupPath = TSMAPI:GetGroupPath(itemString) if (not name or filters.name == "" or strfind(strlower(name), filters.name)) and (not filters.group or groupPath and strfind(groupPath, "^" .. TSMAPI:StrEscape(filters.group))) then tinsert(rowData, { cols = { { value = itemLink or name or itemString, sortArg = name or "", }, { value = data.bags, sortArg = data.bags, }, { value = data.bank, sortArg = data.bank, }, { value = data.mail, sortArg = data.mail, }, { value = data.guild, sortArg = data.guild, }, { value = data.auctions, sortArg = data.auctions, }, { value = data.total, sortArg = data.total, }, { value = TSMAPI:FormatTextMoney(data.total * marketValue) or "---", sortArg = data.total * marketValue, }, }, itemString = itemString, }) end end sort(rowData, function(a, b) return a.cols[#a.cols].value > b.cols[#a.cols].value end) return rowData end function Config:LoadInventoryViewer(container) -- top AceGUI widgets local playerList, guildList = {}, {} for name in pairs(TSM.characters) do playerList[name] = name filters.characters[name] = true end for name in pairs(TSM.guilds) do if not TSM.db.realm.ignoreGuilds[name] then guildList[name] = name filters.guilds[name] = true end end filters.group = nil local page = { { type = "SimpleGroup", layout = "Flow", fullHeight = true, children = { { type = "EditBox", label = L["Item Search"], relativeWidth = 0.24, onTextChanged = true, callback = function(_, _, value) filters.name = value:trim() viewerST:SetData(GetSTData()) end, }, { type = "GroupBox", label = "Group", relativeWidth = 0.25, callback = function(_, _, value) filters.group = value viewerST:SetData(GetSTData()) end, }, { type = "Dropdown", label = L["Characters"], relativeWidth = 0.25, list = playerList, value = filters.characters, multiselect = true, callback = function(_, _, key, value) filters.characters[key] = value viewerST:SetData(GetSTData()) end, }, { type = "Dropdown", label = L["Guilds"], relativeWidth = 0.25, list = guildList, value = filters.guilds, multiselect = true, callback = function(_, _, key, value) filters.guilds[key] = value viewerST:SetData(GetSTData()) end, }, { type = "ScrollFrame", -- simple group didn't work here for some reason fullHeight = true, layout = "Flow", children = {}, }, }, }, } TSMAPI:BuildPage(container, page) -- scrolling table local stParent = container.children[1].children[#container.children[1].children].frame if not viewerST then local stCols = { { name = L["Item Name"], width = 0.35, }, { name = L["Bags"], width = 0.08, }, { name = L["Bank"], width = 0.08, }, { name = L["Mail"], width = 0.08, }, { name = L["GBank"], width = 0.08, }, { name = L["AH"], width = 0.08, }, { name = L["Total"], width = 0.08, }, { name = L["Total Value"], width = 0.17, } } local handlers = { OnEnter = function(_, data, self) GameTooltip:SetOwner(self, "ANCHOR_RIGHT") TSMAPI:SafeTooltipLink(data.itemString) GameTooltip:Show() end, OnLeave = function() GameTooltip:ClearLines() GameTooltip:Hide() end } viewerST = TSMAPI:CreateScrollingTable(stParent, stCols, handlers) viewerST:EnableSorting(true) end viewerST:Show() viewerST:SetParent(stParent) viewerST:SetAllPoints() viewerST:SetData(GetSTData()) end function Config:LoadOptions(container) local players, guildList = {}, {} for _, v in ipairs(TSM:GetPlayers()) do players[v] = v end for name in pairs(TSM.guilds) do guildList[name] = name end local page = { { -- scroll frame to contain everything type = "ScrollFrame", layout = "flow", children = { { type = "InlineGroup", title = L["Options"], layout = "flow", children = { { type = "Dropdown", label = L["Delete Character:"], list = players, relativeWidth = 0.49, callback = function(self, _, value) if value == UnitName("player") then -- don't delete the current player, just reset to defaults TSM.characters[value] = TSM.characterDefaults TSM:Print(L["Reset current player's inventory data."]) self:SetValue() return end local charGuild = TSM.characters[value].guild if charGuild then local hasMembersLeft = false for player, data in pairs(TSM.characters) do if player ~= value and data.guild == charGuild then hasMembersLeft = true end end if not hasMembersLeft then TSM.guilds[charGuild] = nil end end TSM.characters[value] = nil TSM:Printf(L["\"%s\" removed from ItemTracker."], value) players[value] = nil self:SetList(players) self:SetValue() end, tooltip = L["If you rename / transfer / delete one of your characters, use this dropdown to remove that character from ItemTracker. There is no confirmation. If you accidentally delete a character that still exists, simply log onto that character to re-add it to ItemTracker."], }, { type = "Dropdown", label = L["Guilds (Guild Banks) to Ignore:"], value = TSM.db.realm.ignoreGuilds, list = guildList, relativeWidth = 0.49, multiselect = true, callback = function(_, _, key, value) TSM.db.realm.ignoreGuilds[key] = value end, tooltip = L["Select guilds to ingore in ItemTracker. Inventory will still be tracked but not displayed or taken into consideration by Itemtracker."], }, { type = "Dropdown", label = L["Market Value Price Source"], relativeWidth = 1, list = TSMAPI:GetPriceSources(), value = TSM.db.profile.marketValue, callback = function(_, _, value) TSM.db.profile.marketValue = value end, tooltip = L["Specifies the market value price source used for \"Total Market Value\" in the Inventory Viewer."], }, }, }, }, }, } TSMAPI:BuildPage(container, page) end function Config:LoadTooltipOptions(container) local page = { { type = "SimpleGroup", layout = "Flow", fullHeight = true, children = { { type = "Dropdown", label = "Tooltip:", value = TSM.db.global.tooltip, list = { hide = L["No Tooltip Info"], simple = L["Simple"], full = L["Full"] }, relativeWidth = 0.49, callback = function(_, _, value) TSM.db.global.tooltip = value end, tooltip = L["Here, you can choose what ItemTracker info, if any, to show in tooltips. \"Simple\" will only show totals for bags/banks and for guild banks. \"Full\" will show detailed information for every character and guild."], }, }, }, } TSMAPI:BuildPage(container, page) end