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