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.
412 lines
11 KiB
412 lines
11 KiB
|
4 years ago
|
-- ------------------------------------------------------------------------------ --
|
||
|
|
-- TradeSkillMaster_Destroying --
|
||
|
|
-- http://www.curse.com/addons/wow/tradeskillmaster_destroying --
|
||
|
|
-- --
|
||
|
|
-- 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 Options = TSM:NewModule("Options", "AceHook-3.0")
|
||
|
|
local AceGUI = LibStub("AceGUI-3.0") -- load the AceGUI libraries
|
||
|
|
|
||
|
|
-- loads the localization table --
|
||
|
|
local L = LibStub("AceLocale-3.0"):GetLocale("TradeSkillMaster_Destroying")
|
||
|
|
local logST, averageST, ignoreST
|
||
|
|
|
||
|
|
function Options:Load(container)
|
||
|
|
local tabGroup = AceGUI:Create("TSMTabGroup")
|
||
|
|
tabGroup:SetLayout("Fill")
|
||
|
|
tabGroup:SetTabs({{text=L["Destroying Log"], value=1}, {text=L["Averages"], value=2}, {text=L["Ignored Items"], value=3}, {text=L["Options"], value=4}})
|
||
|
|
tabGroup:SetCallback("OnGroupSelected", function(self, _, value)
|
||
|
|
tabGroup:ReleaseChildren()
|
||
|
|
if logST then logST:Hide() end
|
||
|
|
if ignoreST then ignoreST:Hide() end
|
||
|
|
if averageST then averageST:Hide() end
|
||
|
|
if value == 1 then
|
||
|
|
-- load Destroying log
|
||
|
|
Options:LoadLog(self)
|
||
|
|
elseif value == 2 then
|
||
|
|
-- load Destroying log
|
||
|
|
Options:LoadAverages(self)
|
||
|
|
elseif value == 3 then
|
||
|
|
-- load ignored items list
|
||
|
|
Options:LoadIgnored(self)
|
||
|
|
elseif value == 4 then
|
||
|
|
-- load Destroying options
|
||
|
|
Options:LoadOptions(self)
|
||
|
|
end
|
||
|
|
tabGroup.children[1]:DoLayout()
|
||
|
|
end)
|
||
|
|
container:AddChild(tabGroup)
|
||
|
|
tabGroup:SelectTab(1)
|
||
|
|
|
||
|
|
Options:HookScript(tabGroup.frame, "OnHide", function()
|
||
|
|
Options:UnhookAll()
|
||
|
|
if logST then logST:Hide() end
|
||
|
|
if ignoreST then ignoreST:Hide() end
|
||
|
|
if averageST then averageST:Hide() end
|
||
|
|
end)
|
||
|
|
end
|
||
|
|
|
||
|
|
function Options:GetFormattedTime(rTime)
|
||
|
|
if TSM.db.global.timeFormat == "ago" then
|
||
|
|
if time() == rTime then
|
||
|
|
return format(L["now"])
|
||
|
|
end
|
||
|
|
return format("%s ago", SecondsToTime(time()-rTime) or "?")
|
||
|
|
elseif TSM.db.global.timeFormat == "usdate" then
|
||
|
|
return date("%m/%d/%y %H:%M", rTime)
|
||
|
|
elseif TSM.db.global.timeFormat == "eudate" then
|
||
|
|
return date("%d/%m/%y %H:%M", rTime)
|
||
|
|
elseif TSM.db.global.timeFormat == "aidate" then
|
||
|
|
return date("%y/%m/%d %H:%M", rTime)
|
||
|
|
end
|
||
|
|
end
|
||
|
|
|
||
|
|
function Options:UpdateLogST()
|
||
|
|
if not logST or not logST:IsVisible() then return end
|
||
|
|
|
||
|
|
-- clear old data
|
||
|
|
for spell, entries in pairs(TSM.db.global.history) do
|
||
|
|
for i=#entries, 1, -1 do
|
||
|
|
if (entries[i].time + TSM.db.global.logDays*24*60*60) < time() then
|
||
|
|
tremove(entries, i)
|
||
|
|
end
|
||
|
|
end
|
||
|
|
end
|
||
|
|
|
||
|
|
local stData = {}
|
||
|
|
for spell, entries in pairs(TSM.db.global.history) do
|
||
|
|
for _, entry in ipairs(entries) do
|
||
|
|
local result = {}
|
||
|
|
for itemString, quantity in pairs(entry.result) do
|
||
|
|
local link = select(2, TSMAPI:GetSafeItemInfo(itemString)) or itemString
|
||
|
|
tinsert(result, format("%sx%d", link, quantity))
|
||
|
|
end
|
||
|
|
sort(result, function(a,b) return a > b end)
|
||
|
|
local name, link = TSMAPI:GetSafeItemInfo(entry.item)
|
||
|
|
name = name or entry.item
|
||
|
|
link = link or entry.item
|
||
|
|
local resultStr = table.concat(result, ", ") or ""
|
||
|
|
local row = {
|
||
|
|
cols = {
|
||
|
|
{
|
||
|
|
value = spell,
|
||
|
|
sortArg = spell,
|
||
|
|
},
|
||
|
|
{
|
||
|
|
value = link,
|
||
|
|
sortArg = spell,
|
||
|
|
},
|
||
|
|
{
|
||
|
|
value = resultStr,
|
||
|
|
sortArg = resultStr,
|
||
|
|
},
|
||
|
|
{
|
||
|
|
value = Options:GetFormattedTime(entry.time),
|
||
|
|
sortArg = entry.time or 0,
|
||
|
|
},
|
||
|
|
},
|
||
|
|
}
|
||
|
|
tinsert(stData, row)
|
||
|
|
end
|
||
|
|
end
|
||
|
|
logST:SetData(stData)
|
||
|
|
end
|
||
|
|
|
||
|
|
function Options:LoadLog(container)
|
||
|
|
local page = {
|
||
|
|
{
|
||
|
|
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].frame
|
||
|
|
|
||
|
|
if not logST then
|
||
|
|
local stCols = {
|
||
|
|
{
|
||
|
|
name = L["Spell"],
|
||
|
|
width = 0.08,
|
||
|
|
},
|
||
|
|
{
|
||
|
|
name = L["Destroyed Item"],
|
||
|
|
width = 0.2,
|
||
|
|
},
|
||
|
|
{
|
||
|
|
name = L["Result"],
|
||
|
|
width = 0.56,
|
||
|
|
},
|
||
|
|
{
|
||
|
|
name = L["Time"],
|
||
|
|
width = 0.14,
|
||
|
|
}
|
||
|
|
}
|
||
|
|
logST = TSMAPI:CreateScrollingTable(stParent, stCols)
|
||
|
|
logST:EnableSorting(true, -4)
|
||
|
|
end
|
||
|
|
|
||
|
|
logST:Show()
|
||
|
|
logST:SetParent(stParent)
|
||
|
|
logST:SetAllPoints()
|
||
|
|
Options:UpdateLogST()
|
||
|
|
end
|
||
|
|
|
||
|
|
function Options:UpdateAverageST()
|
||
|
|
if not averageST or not averageST:IsVisible() then return end
|
||
|
|
|
||
|
|
local items = {}
|
||
|
|
for spell, entries in pairs(TSM.db.global.history) do
|
||
|
|
for _, entry in ipairs(entries) do
|
||
|
|
items[entry.item] = items[entry.item] or {spell=spell, num=0}
|
||
|
|
items[entry.item].num = items[entry.item].num + 1
|
||
|
|
for itemString, quantity in pairs(entry.result) do
|
||
|
|
items[entry.item][itemString] = items[entry.item][itemString] or {total=0}
|
||
|
|
items[entry.item][itemString].total = items[entry.item][itemString].total + quantity
|
||
|
|
end
|
||
|
|
end
|
||
|
|
end
|
||
|
|
|
||
|
|
local stData = {}
|
||
|
|
for destroyedItem, resultItems in pairs(items) do
|
||
|
|
local spell = resultItems.spell
|
||
|
|
resultItems.spell = nil
|
||
|
|
local totalNum = resultItems.num
|
||
|
|
resultItems.num = nil
|
||
|
|
local result = {}
|
||
|
|
for itemString, data in pairs(resultItems) do
|
||
|
|
local link = select(2, TSMAPI:GetSafeItemInfo(itemString)) or itemString
|
||
|
|
local average = floor((data.total/totalNum) * 100 + 0.5) / 100
|
||
|
|
tinsert(result, format("%sx%.2f", link, average))
|
||
|
|
end
|
||
|
|
sort(result, function(a,b) return a > b end)
|
||
|
|
local name, link = TSMAPI:GetSafeItemInfo(destroyedItem)
|
||
|
|
name = name or destroyedItem
|
||
|
|
link = link or destroyedItem
|
||
|
|
local resultStr = table.concat(result, ", ") or ""
|
||
|
|
local row = {
|
||
|
|
cols = {
|
||
|
|
{
|
||
|
|
value = spell,
|
||
|
|
sortArg = spell,
|
||
|
|
},
|
||
|
|
{
|
||
|
|
value = totalNum,
|
||
|
|
sortArg = totalNum,
|
||
|
|
},
|
||
|
|
{
|
||
|
|
value = link,
|
||
|
|
sorgArg = name,
|
||
|
|
},
|
||
|
|
{
|
||
|
|
value = resultStr,
|
||
|
|
sortArg = resultStr,
|
||
|
|
},
|
||
|
|
},
|
||
|
|
}
|
||
|
|
tinsert(stData, row)
|
||
|
|
end
|
||
|
|
averageST:SetData(stData)
|
||
|
|
end
|
||
|
|
|
||
|
|
function Options:LoadAverages(container)
|
||
|
|
local page = {
|
||
|
|
{
|
||
|
|
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].frame
|
||
|
|
|
||
|
|
if not averageST then
|
||
|
|
local stCols = {
|
||
|
|
{
|
||
|
|
name = L["Spell"],
|
||
|
|
width = 0.1,
|
||
|
|
},
|
||
|
|
{
|
||
|
|
name = L["Times Destroyed"],
|
||
|
|
width = 0.15,
|
||
|
|
},
|
||
|
|
{
|
||
|
|
name = L["Destroyed Item"],
|
||
|
|
width = 0.3,
|
||
|
|
},
|
||
|
|
{
|
||
|
|
name = L["Average Result (per Destroy)"],
|
||
|
|
width = 0.45,
|
||
|
|
}
|
||
|
|
}
|
||
|
|
averageST = TSMAPI:CreateScrollingTable(stParent, stCols)
|
||
|
|
averageST:EnableSorting(true, -2)
|
||
|
|
end
|
||
|
|
|
||
|
|
averageST:Show()
|
||
|
|
averageST:SetParent(stParent)
|
||
|
|
averageST:SetAllPoints()
|
||
|
|
Options:UpdateAverageST()
|
||
|
|
end
|
||
|
|
|
||
|
|
function Options:UpdateIgnoreST()
|
||
|
|
if not ignoreST or not ignoreST:IsVisible() then return end
|
||
|
|
local stData = {}
|
||
|
|
for itemString in pairs(TSM.db.global.ignore) do
|
||
|
|
local name, link = TSMAPI:GetSafeItemInfo(itemString)
|
||
|
|
name = name or itemString
|
||
|
|
link = link or itemString
|
||
|
|
local row = {
|
||
|
|
cols = {
|
||
|
|
{
|
||
|
|
value = link,
|
||
|
|
},
|
||
|
|
},
|
||
|
|
name = name,
|
||
|
|
link = link,
|
||
|
|
itemString = itemString,
|
||
|
|
}
|
||
|
|
tinsert(stData, row)
|
||
|
|
end
|
||
|
|
sort(stData, function(a, b) return a.name < b.name end)
|
||
|
|
ignoreST:SetData(stData)
|
||
|
|
end
|
||
|
|
|
||
|
|
function Options:LoadIgnored(container)
|
||
|
|
local page = {
|
||
|
|
{
|
||
|
|
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].frame
|
||
|
|
|
||
|
|
if not ignoreST then
|
||
|
|
local stCols = {
|
||
|
|
{
|
||
|
|
name = L["Ignored Item"],
|
||
|
|
width = 1,
|
||
|
|
}
|
||
|
|
}
|
||
|
|
local handlers = {
|
||
|
|
OnEnter = function(_, data, self)
|
||
|
|
if not data.itemString then return end
|
||
|
|
GameTooltip:SetOwner(self, "ANCHOR_NONE")
|
||
|
|
GameTooltip:SetPoint("BOTTOMLEFT", self, "TOPLEFT")
|
||
|
|
GameTooltip:AddLine(L["Right click on this row to remove this item from the permanent ignore list."], 1, 1, 1, true)
|
||
|
|
GameTooltip:Show()
|
||
|
|
end,
|
||
|
|
OnLeave = function()
|
||
|
|
GameTooltip:ClearLines()
|
||
|
|
GameTooltip:Hide()
|
||
|
|
end,
|
||
|
|
OnClick = function(_, data, _, button)
|
||
|
|
if not data.itemString then return end
|
||
|
|
if button == "RightButton" then
|
||
|
|
TSM.db.global.ignore[data.itemString] = nil
|
||
|
|
TSM:Printf(L["Removed %s from the permanent ignore list."], data.link)
|
||
|
|
Options:UpdateIgnoreST()
|
||
|
|
end
|
||
|
|
end
|
||
|
|
}
|
||
|
|
ignoreST = TSMAPI:CreateScrollingTable(stParent, stCols, handlers)
|
||
|
|
end
|
||
|
|
|
||
|
|
ignoreST:Show()
|
||
|
|
ignoreST:SetParent(stParent)
|
||
|
|
ignoreST:SetAllPoints()
|
||
|
|
Options:UpdateIgnoreST()
|
||
|
|
end
|
||
|
|
|
||
|
|
function Options:LoadOptions(container)
|
||
|
|
local page = {
|
||
|
|
{
|
||
|
|
type = "ScrollFrame",
|
||
|
|
layout = "Flow",
|
||
|
|
fullHeight = true,
|
||
|
|
children = {
|
||
|
|
{
|
||
|
|
type = "InlineGroup",
|
||
|
|
title = L["General Options"],
|
||
|
|
layout = "Flow",
|
||
|
|
children = {
|
||
|
|
{
|
||
|
|
type = "CheckBox",
|
||
|
|
label = L["Enable Automatic Stack Combination"],
|
||
|
|
relativeWidth = 0.5,
|
||
|
|
settingInfo = {TSM.db.global, "autoStack"},
|
||
|
|
tooltip = L["If checked, partial stacks of herbs/ore will automatically be combined."],
|
||
|
|
},
|
||
|
|
{
|
||
|
|
type = "CheckBox",
|
||
|
|
label = L["Show Destroying Frame Automatically"],
|
||
|
|
relativeWidth = 0.49,
|
||
|
|
settingInfo = {TSM.db.global, "autoShow"},
|
||
|
|
tooltip = L["If checked, the Destroying window will automatically be shown when there's items to destroy in your bags. Otherwise, you can open it up by typing '/tsm destroy'."],
|
||
|
|
},
|
||
|
|
{
|
||
|
|
type = "Dropdown",
|
||
|
|
label = "Time Format",
|
||
|
|
relativeWidth = 0.5,
|
||
|
|
list = {["ago"]=L["_ Hr _ Min ago"], ["usdate"]="MM/DD/YY HH:MM", ["aidate"]="YY/MM/DD HH:MM", ["eudate"]="DD/MM/YY HH:MM"},
|
||
|
|
settingInfo = {TSM.db.global, "timeFormat"},
|
||
|
|
tooltip = L["Select what format Destroying should use to display times in the Destroying log."],
|
||
|
|
},
|
||
|
|
{
|
||
|
|
type = "Slider",
|
||
|
|
label = L["Days of Log Data"],
|
||
|
|
relativeWidth = 0.49,
|
||
|
|
min = 0,
|
||
|
|
max = 30,
|
||
|
|
step = 1,
|
||
|
|
settingInfo = {TSM.db.global, "logDays"},
|
||
|
|
tooltip = L["The destroying log will throw out any data that is older than this many days."],
|
||
|
|
}
|
||
|
|
},
|
||
|
|
},
|
||
|
|
{
|
||
|
|
type = "InlineGroup",
|
||
|
|
title = L["Disenchanting Options"],
|
||
|
|
layout = "Flow",
|
||
|
|
children = {
|
||
|
|
{
|
||
|
|
type = "Dropdown",
|
||
|
|
label = L["Maximum Disenchant Quality"],
|
||
|
|
list = {[2]=ITEM_QUALITY2_DESC, [3]=ITEM_QUALITY3_DESC, [4]=ITEM_QUALITY4_DESC},
|
||
|
|
relativeWidth = 0.5,
|
||
|
|
settingInfo = {TSM.db.global, "deMaxQuality"},
|
||
|
|
tooltip = L["Destroying not list any items above this quality for disenchnting."],
|
||
|
|
},
|
||
|
|
{
|
||
|
|
type = "CheckBox",
|
||
|
|
label = L["Include Soulbound Items"],
|
||
|
|
relativeWidth = 0.49,
|
||
|
|
settingInfo = {TSM.db.global, "includeSoulbound"},
|
||
|
|
tooltip = L["If checked, soulbound items can be destroyed by TSM_Destroying. USE THIS WITH EXTREME CAUTION!"],
|
||
|
|
},
|
||
|
|
},
|
||
|
|
},
|
||
|
|
},
|
||
|
|
},
|
||
|
|
}
|
||
|
|
|
||
|
|
TSMAPI:BuildPage(container, page)
|
||
|
|
end
|