You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

368 lines
10 KiB

-- ------------------------------------------------------------------------------ --
-- 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