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