TradeSkillMaster/Core/UI/MainUI/Settings/Tooltip.lua

396 lines
16 KiB
Lua

-- ------------------------------------------------------------------------------ --
-- TradeSkillMaster --
-- https://tradeskillmaster.com --
-- All Rights Reserved - Detailed license information included with addon. --
-- ------------------------------------------------------------------------------ --
local _, TSM = ...
local Tooltip = TSM.MainUI.Settings:NewPackage("Tooltip")
local L = TSM.Include("Locale").GetTable()
local Money = TSM.Include("Util.Money")
local Table = TSM.Include("Util.Table")
local TempTable = TSM.Include("Util.TempTable")
local CustomPrice = TSM.Include("Service.CustomPrice")
local UIElements = TSM.Include("UI.UIElements")
local private = {
operationModules = {},
operationModuleNames = {},
destroySources = {},
destroySourceKeys = {},
}
local INVALID_DESTROY_PRICE_SOURCES = {
crafting = true,
vendorbuy = true,
vendorsell = true,
destroy = true,
itemquality = true,
itemlevel = true,
requiredlevel = true,
numinventory = true,
numexpires = true,
salerate = true,
dbregionsalerate = true,
dbregionsoldperday = true,
auctioningopmin = true,
auctioningopmax = true,
auctioningopnormal = true,
shoppingopmax = true,
sniperopmax = true,
}
local GROUPS_OPS_SETTINGS_INFO = {
{ label = L["Group name"], settingKey = "groupNameTooltip" },
{ label = L["Auctioning operation"], settingTbl = "operationTooltips", settingKey = "Auctioning" },
{ label = L["Crafting operation"], settingTbl = "operationTooltips", settingKey = "Crafting" },
{ label = L["Mailing operation"], settingTbl = "operationTooltips", settingKey = "Mailing" },
{ label = L["Shopping operation"], settingTbl = "operationTooltips", settingKey = "Shopping" },
{ label = L["Sniper operation"], settingTbl = "operationTooltips", settingKey = "Sniper" },
{ label = L["Vendoring operation"], settingTbl = "operationTooltips", settingKey = "Vendoring" },
{ label = L["Warehousing operation"], settingTbl = "operationTooltips", settingKey = "Warehousing" },
}
local VALUES_SETTINGS_INFO = {
{ label = L["Disenchant value"], settingKey = "deTooltip" },
{ label = L["Mill value"], settingKey = "millTooltip" },
{ label = L["Prospect value"], settingKey = "prospectTooltip" },
{ label = L["Transform value"], settingKey = "transformTooltip" },
{ label = L["Detailed destroy information"], settingKey = "detailedDestroyTooltip" },
{ label = L["Vendor buy price"], settingKey = "vendorBuyTooltip" },
{ label = L["Vendor sell price"], settingKey = "vendorSellTooltip" },
}
local INVENTORY_SETTINGS_INFO = {
{ label = L["Full inventory"], settingKey = "inventoryTooltipFormat", setValue = "full", clearValue = "none" },
{ label = L["Simple inventory"], settingKey = "inventoryTooltipFormat", setValue = "simple", clearValue = "none" },
}
local ACCOUNTING_SETTINGS_INFO = {
{ label = L["Purchase information"], settingModule = "Accounting", settingKey = "purchase" },
{ label = L["Sale information"], settingModule = "Accounting", settingKey = "sale" },
{ label = L["Sale rate"], settingModule = "Accounting", settingKey = "saleRate" },
{ label = L["Expired information"], settingModule = "Accounting", settingKey = "expiredAuctions" },
{ label = L["Canceled information"], settingModule = "Accounting", settingKey = "cancelledAuctions" },
}
local AUCTIONDB_SETTINGS_INFO = {
{ label = L["Min buyout"], settingModule = "AuctionDB", settingKey = "minBuyout" },
{ label = L["Market value"], settingModule = "AuctionDB", settingKey = "marketValue" },
{ label = L["Historical price"], settingModule = "AuctionDB", settingKey = "historical" },
{ label = L["Region min buyout avg"], settingModule = "AuctionDB", settingKey = "regionMinBuyout" },
{ label = L["Region market value"], settingModule = "AuctionDB", settingKey = "regionMarketValue" },
{ label = L["Region historical price"], settingModule = "AuctionDB", settingKey = "regionHistorical" },
{ label = L["Region sale avg"], settingModule = "AuctionDB", settingKey = "regionSale" },
{ label = L["Region sale rate"], settingModule = "AuctionDB", settingKey = "regionSalePercent" },
{ label = L["Region avg daily sold"], settingModule = "AuctionDB", settingKey = "regionSoldPerDay" },
}
local AUCTIONING_SETTINGS_INFO = {
{ label = L["Post Quantity"], settingModule = "Auctioning", settingKey = "postQuantity" },
{ label = L["Min/Normal/Max price"], settingModule = "Auctioning", settingKey = "operationPrices" },
}
local CRAFTING_SETTINGS_INFO = {
{ label = L["Crafting cost"], settingModule = "Crafting", settingKey = "craftingCost" },
{ label = L["Detailed crafting cost"], settingModule = "Crafting", settingKey = "detailedMats" },
{ label = L["Mat cost"], settingModule = "Crafting", settingKey = "matPrice" },
}
local SHOPPING_SETTINGS_INFO = {
{ label = L["Max shopping price"], settingModule = "Shopping", settingKey = "maxPrice" },
}
local SNIPER_SETTINGS_INFO = {
{ label = L["Max sniper price"], settingModule = "Sniper", settingKey = "belowPrice" },
}
-- ============================================================================
-- Module Functions
-- ============================================================================
function Tooltip.OnInitialize()
TSM.MainUI.Settings.RegisterSettingPage(L["Tooltip Settings"], "top", private.GetTooltipSettingsFrame)
end
-- ============================================================================
-- Tooltip Settings UI
-- ============================================================================
function private.GetTooltipSettingsFrame()
TSM.UI.AnalyticsRecordPathChange("main", "settings", "tooltips", "main")
wipe(private.operationModules)
wipe(private.operationModuleNames)
for _, moduleName in TSM.Operations.ModuleIterator() do
tinsert(private.operationModules, moduleName)
tinsert(private.operationModuleNames, TSM.Operations.GetLocalizedName(moduleName))
end
wipe(private.destroySources)
wipe(private.destroySourceKeys)
local foundCurrentSetting = false
for key, _, label in CustomPrice.Iterator() do
key = strlower(key)
if not INVALID_DESTROY_PRICE_SOURCES[key] then
tinsert(private.destroySources, label)
tinsert(private.destroySourceKeys, key)
if TSM.db.global.coreOptions.destroyValueSource == key then
foundCurrentSetting = true
end
end
end
if not foundCurrentSetting then
-- the current setting isn't in the list, so reset it to the default
TSM.db.global.coreOptions.destroyValueSource = strlower(TSM.db:GetDefaultReadOnly("global", "coreOptions", "destroyValueSource"))
end
return UIElements.New("ScrollFrame", "tooltipSettings")
:SetPadding(8, 8, 8, 0)
:AddChild(TSM.MainUI.Settings.CreateExpandableSection("Tooltip", "general", L["General Options"], L["Some general options for the TSM tooltip information are below."])
:AddChild(UIElements.New("Text", "label")
:SetHeight(20)
:SetMargin(0, 0, 0, 4)
:SetFont("BODY_BODY2_MEDIUM")
:SetText(L["Enable TSM tooltips"])
)
:AddChild(UIElements.New("ToggleOnOff", "enableToggle")
:SetHeight(24)
:SetMargin(0, 0, 0, 12)
:SetSettingInfo(TSM.db.global.tooltipOptions, "enabled")
)
:AddChild(UIElements.New("Frame", "content")
:SetLayout("HORIZONTAL")
:SetHeight(20)
:SetMargin(0, 0, 0, 12)
:AddChild(UIElements.New("Checkbox", "embedCheckbox")
:SetWidth("AUTO")
:SetFont("BODY_BODY2_MEDIUM")
:SetText(L["Embed TSM tooltip"])
:SetSettingInfo(TSM.db.global.tooltipOptions, "embeddedTooltip")
)
:AddChild(UIElements.New("Spacer", "spacer"))
)
:AddChild(UIElements.New("Frame", "labelRow1")
:SetLayout("HORIZONTAL")
:SetHeight(20)
:SetMargin(0, 0, 0, 4)
:AddChild(UIElements.New("Text", "priceFormatLabel")
:SetMargin(0, 8, 0, 0)
:SetFont("BODY_BODY2_MEDIUM")
:SetText(L["Tooltip price format"])
)
:AddChild(UIElements.New("Text", "modifierLabel")
:SetMargin(0, 8, 0, 0)
:SetFont("BODY_BODY2_MEDIUM")
:SetText(L["Show on modifier"])
)
:AddChild(UIElements.New("Text", "destroyLabel")
:SetFont("BODY_BODY2_MEDIUM")
:SetText(L["Destroy value source"])
)
)
:AddChild(UIElements.New("Frame", "dropdownRow1")
:SetLayout("HORIZONTAL")
:SetHeight(24)
:AddChild(UIElements.New("SelectionDropdown", "priceFormatDropdown")
:SetMargin(0, 8, 0, 0)
:AddItem(format(L["Coins (%s)"], Money.ToString(3451267, nil, "OPT_ICON")), "icon")
:AddItem(format(L["Text (%s)"], Money.ToString(3451267)), "text")
:SetSettingInfo(TSM.db.global.tooltipOptions, "tooltipPriceFormat")
:SetScript("OnSelectionChanged", private.OnSettingChange)
)
:AddChild(UIElements.New("SelectionDropdown", "modifierDropdown")
:SetMargin(0, 8, 0, 0)
:AddItem(L["None (Always Show)"], "none")
:AddItem(ALT_KEY, "alt")
:AddItem(CTRL_KEY, "ctrl")
:SetSettingInfo(TSM.db.global.tooltipOptions, "tooltipShowModifier")
)
:AddChild(UIElements.New("SelectionDropdown", "dropdown")
:SetItems(private.destroySources, private.destroySourceKeys)
:SetSettingInfo(TSM.db.global.coreOptions, "destroyValueSource")
:SetScript("OnSelectionChanged", private.OnSettingChange)
)
)
)
:AddChild(TSM.MainUI.Settings.CreateExpandableSection("Tooltip", "options", L["Tooltip Options"], L["Use the settings below to control which lines are shown in tooltips."])
:AddChild(UIElements.New("Frame", "content")
:SetLayout("HORIZONTAL")
:SetHeight(private.GetSettingsHeight())
:AddChild(UIElements.New("Frame", "settings")
:SetLayout("VERTICAL")
:SetMargin(0, 8, 0, -12)
:AddChildrenWithFunction(private.AddTooltipSettings)
)
:AddChild(UIElements.New("Frame", "example")
:SetLayout("VERTICAL")
:AddChild(UIElements.New("Text", "label")
:SetHeight(20)
:SetMargin(0, 0, 0, 6)
:SetFont("BODY_BODY2_BOLD")
:SetText(L["Example Tooltip"])
)
:AddChild(UIElements.New("Frame", "tooltip")
:SetLayout("VERTICAL")
:SetPadding(4)
:SetBackgroundColor("PRIMARY_BG")
:AddChildrenWithFunction(private.AddExampleTooltip)
)
:AddChild(UIElements.New("Spacer", "spacer"))
)
)
)
end
function private.GetSettingsHeight()
-- calculate the height of the settings and use that for the content height since the settings will always be larger than the tooltip
local height = 0
height = height + 32 + #GROUPS_OPS_SETTINGS_INFO * 32
height = height + 32 + #VALUES_SETTINGS_INFO * 32 + Table.Count(TSM.db.global.userData.customPriceSources) * 32
height = height + 32 + #INVENTORY_SETTINGS_INFO * 32
height = height + 32 + #ACCOUNTING_SETTINGS_INFO * 32
height = height + 32 + #AUCTIONDB_SETTINGS_INFO * 32
height = height + 32 + #AUCTIONING_SETTINGS_INFO * 32
height = height + 32 + #CRAFTING_SETTINGS_INFO * 32
height = height + 32 + #SHOPPING_SETTINGS_INFO * 32
height = height + 32 + #SNIPER_SETTINGS_INFO * 32
height = height - 12
return height
end
function private.AddTooltipSettings(frame)
private.AddSettingHeading(frame, "groupsOpsHeading", L["Groups & Operations"])
private.AddSettingsFromInfoTable(frame, GROUPS_OPS_SETTINGS_INFO)
private.AddSettingHeading(frame, "valuesHeading", L["Values"])
private.AddSettingsFromInfoTable(frame, VALUES_SETTINGS_INFO)
local customPriceSources = TempTable.Acquire()
for name in pairs(TSM.db.global.userData.customPriceSources) do
tinsert(customPriceSources, name)
end
sort(customPriceSources)
for _, name in ipairs(customPriceSources) do
frame:AddChild(UIElements.New("Checkbox", "checkbox_"..name)
:SetHeight(20)
:SetMargin(0, 0, 0, 12)
:SetFont("BODY_BODY2")
:SetCheckboxPosition("LEFT")
:SetText(format(L["Custom source (%s)"], name))
:SetSettingInfo(TSM.db.global.tooltipOptions.customPriceTooltips, name)
:SetScript("OnValueChanged", private.CustomPriceSourceOnValueChanged)
)
end
TempTable.Release(customPriceSources)
private.AddSettingHeading(frame, "inventoryHeading", L["Inventory"])
private.AddSettingsFromInfoTable(frame, INVENTORY_SETTINGS_INFO)
private.AddSettingHeading(frame, "accountingHeading", L["Accounting"])
private.AddSettingsFromInfoTable(frame, ACCOUNTING_SETTINGS_INFO)
private.AddSettingHeading(frame, "auctiondbHeading", L["AuctionDB"])
private.AddSettingsFromInfoTable(frame, AUCTIONDB_SETTINGS_INFO)
private.AddSettingHeading(frame, "auctioningHeading", L["Auctioning"])
private.AddSettingsFromInfoTable(frame, AUCTIONING_SETTINGS_INFO)
private.AddSettingHeading(frame, "craftingHeading", L["Crafting"])
private.AddSettingsFromInfoTable(frame, CRAFTING_SETTINGS_INFO)
private.AddSettingHeading(frame, "shoppingHeading", L["Shopping"])
private.AddSettingsFromInfoTable(frame, SHOPPING_SETTINGS_INFO)
private.AddSettingHeading(frame, "sniperHeading", L["Sniper"])
private.AddSettingsFromInfoTable(frame, SNIPER_SETTINGS_INFO)
end
function private.AddSettingHeading(frame, id, heading)
frame:AddChild(UIElements.New("Text", id)
:SetHeight(20)
:SetMargin(0, 0, 0, 12)
:SetFont("BODY_BODY2_BOLD")
:SetText(heading)
)
end
function private.GetSettingTableFromInfo(info)
local settingTbl = TSM.db.global.tooltipOptions
if info.settingModule then
settingTbl = settingTbl.moduleTooltips[info.settingModule]
end
if info.settingTbl then
settingTbl = settingTbl[info.settingTbl]
end
return settingTbl
end
function private.AddSettingsFromInfoTable(frame, infoTbl)
for i, info in ipairs(infoTbl) do
local settingTbl = private.GetSettingTableFromInfo(info)
frame:AddChild(UIElements.New("Checkbox", "checkbox_"..i)
:SetHeight(20)
:SetMargin(0, 0, 0, 12)
:SetFont("BODY_BODY2")
:SetCheckboxPosition("LEFT")
:SetContext(info)
:SetText(info.label)
:SetChecked(settingTbl[info.settingKey] == (info.setValue or true))
:SetScript("OnValueChanged", private.ContentCheckboxOnValueChanged)
)
end
end
function private.AddExampleTooltip(frame)
for i, left, right, lineColor in TSM.Tooltip.SettingsLineIterator() do
frame:AddChild(UIElements.New("Frame", "row_"..i)
:SetLayout("HORIZONTAL")
:SetHeight(20)
:AddChild(UIElements.New("Text", "left_"..i)
:SetWidth("AUTO")
:SetFont("ITEM_BODY3")
:SetTextColor(lineColor)
:SetText(left)
)
:AddChild(UIElements.New("Spacer", "spacer"))
:AddChildIf(right, UIElements.New("Text", "right_"..i)
:SetWidth("AUTO")
:SetFont("ITEM_BODY3")
:SetTextColor(lineColor)
:SetJustifyH("RIGHT")
:SetText(right or "")
)
)
end
end
-- ============================================================================
-- Local Script Handlers
-- ============================================================================
function private.OnSettingChange(checkbox)
private.RebuildExampleTooltip(checkbox:GetElement("__parent.__parent.__parent.__parent.options.content.content.example.tooltip"))
end
function private.ContentCheckboxOnValueChanged(checkbox)
local info = checkbox:GetContext()
local settingTbl = private.GetSettingTableFromInfo(info)
if checkbox:IsChecked() then
settingTbl[info.settingKey] = info.setValue or true
else
settingTbl[info.settingKey] = info.clearValue or false
end
local frame = checkbox:GetParentElement()
for _, child in frame:LayoutChildrenIterator() do
local childContext = child:GetContext()
if child ~= checkbox and childContext and childContext.settingTbl == info.settingTbl and childContext.settingKey == info.settingKey then
child:SetChecked(settingTbl[childContext.settingKey] == (childContext.setValue or true), true)
:Draw()
end
end
private.RebuildExampleTooltip(checkbox:GetElement("__parent.__parent.example.tooltip"))
end
function private.CustomPriceSourceOnValueChanged(checkbox)
private.RebuildExampleTooltip(checkbox:GetElement("__parent.__parent.example.tooltip"))
end
function private.RebuildExampleTooltip(tooltipFrame)
tooltipFrame:ReleaseAllChildren()
tooltipFrame:AddChildrenWithFunction(private.AddExampleTooltip)
tooltipFrame:Draw()
end