initial commit
This commit is contained in:
254
Core/UI/Elements/CommodityList.lua
Normal file
254
Core/UI/Elements/CommodityList.lua
Normal file
@@ -0,0 +1,254 @@
|
||||
-- ------------------------------------------------------------------------------ --
|
||||
-- TradeSkillMaster --
|
||||
-- https://tradeskillmaster.com --
|
||||
-- All Rights Reserved - Detailed license information included with addon. --
|
||||
-- ------------------------------------------------------------------------------ --
|
||||
|
||||
--- Commodity List UI Element Class.
|
||||
-- The element used to show the details of a selected commodity in shopping. It is a subclass of the @{ScrollingTable} class.
|
||||
-- @classmod CommodityList
|
||||
|
||||
local _, TSM = ...
|
||||
local L = TSM.Include("Locale").GetTable()
|
||||
local Money = TSM.Include("Util.Money")
|
||||
local Math = TSM.Include("Util.Math")
|
||||
local Theme = TSM.Include("Util.Theme")
|
||||
local UIElements = TSM.Include("UI.UIElements")
|
||||
local CommodityList = TSM.Include("LibTSMClass").DefineClass("CommodityList", TSM.UI.ScrollingTable)
|
||||
UIElements.Register(CommodityList)
|
||||
TSM.UI.CommodityList = CommodityList
|
||||
local private = {}
|
||||
|
||||
|
||||
|
||||
-- ============================================================================
|
||||
-- Public Class Methods
|
||||
-- ============================================================================
|
||||
|
||||
function CommodityList.__init(self)
|
||||
self.__super:__init()
|
||||
self._row = nil
|
||||
self._marketValueFunc = nil
|
||||
self._alertThreshold = math.huge
|
||||
end
|
||||
|
||||
function CommodityList.Acquire(self)
|
||||
self._headerHidden = true
|
||||
self.__super:Acquire()
|
||||
self:GetScrollingTableInfo()
|
||||
:NewColumn("warning")
|
||||
:SetWidth(12)
|
||||
:SetIconSize(12)
|
||||
:SetIconHoverEnabled(true)
|
||||
:SetIconFunction(private.GetWarningIcon)
|
||||
:SetJustifyH("CENTER")
|
||||
:SetFont("BODY_BODY3")
|
||||
:Commit()
|
||||
:NewColumn("itemBuyout")
|
||||
:SetFont("TABLE_TABLE1")
|
||||
:SetJustifyH("LEFT")
|
||||
:SetTextFunction(private.GetItemBuyoutText)
|
||||
:DisableHiding()
|
||||
:Commit()
|
||||
:NewColumn("quantity")
|
||||
:SetWidth(60)
|
||||
:SetFont("TABLE_TABLE1")
|
||||
:SetJustifyH("RIGHT")
|
||||
:SetTextFunction(private.GetQuantityText)
|
||||
:DisableHiding()
|
||||
:Commit()
|
||||
:NewColumn("pct")
|
||||
:SetWidth(50)
|
||||
:SetFont("TABLE_TABLE1")
|
||||
:SetJustifyH("RIGHT")
|
||||
:SetTextFunction(private.GetPercentText)
|
||||
:DisableHiding()
|
||||
:Commit()
|
||||
:Commit()
|
||||
end
|
||||
|
||||
function CommodityList.Release(self)
|
||||
self._row = nil
|
||||
self._marketValueFunc = nil
|
||||
self._alertThreshold = math.huge
|
||||
self.__super:Release()
|
||||
end
|
||||
|
||||
function CommodityList.GetTotalQuantity(self, maxIndex)
|
||||
local totalQuantity = 0
|
||||
for _, index in ipairs(self._data) do
|
||||
if index > maxIndex then
|
||||
break
|
||||
end
|
||||
local subRow = self:_GetSubRow(index)
|
||||
local _, numOwnerItems = subRow:GetOwnerInfo()
|
||||
local quantityAvailable = subRow:GetQuantities() - numOwnerItems
|
||||
totalQuantity = totalQuantity + quantityAvailable
|
||||
end
|
||||
return totalQuantity
|
||||
end
|
||||
|
||||
--- Sets the result row.
|
||||
-- @tparam CommodityList self The commodity list object
|
||||
-- @tparam table row The row to set
|
||||
-- @treturn CommodityList The commodity list object
|
||||
function CommodityList.SetData(self, row)
|
||||
self._row = row
|
||||
self:UpdateData()
|
||||
return self
|
||||
end
|
||||
|
||||
--- Sets the selected quantity.
|
||||
-- @tparam CommodityList self The commodity list object
|
||||
-- @tparam number quantity The selected quantity
|
||||
-- @treturn CommodityList The commodity list object
|
||||
function CommodityList.SelectQuantity(self, quantity)
|
||||
local maxIndex = nil
|
||||
for _, index in ipairs(self._data) do
|
||||
local subRow = self:_GetSubRow(index)
|
||||
local _, numOwnerItems = subRow:GetOwnerInfo()
|
||||
local quantityAvailable = subRow:GetQuantities() - numOwnerItems
|
||||
maxIndex = index
|
||||
quantity = quantity - quantityAvailable
|
||||
if quantity <= 0 then
|
||||
break
|
||||
end
|
||||
end
|
||||
self:SetSelection(maxIndex)
|
||||
return self
|
||||
end
|
||||
|
||||
--- Sets the market value function.
|
||||
-- @tparam CommodityList self The commodity list object
|
||||
-- @tparam function func The function to call with the ResultSubRow to get the market value
|
||||
-- @treturn CommodityList The commodity list object
|
||||
function CommodityList.SetMarketValueFunction(self, func)
|
||||
self._marketValueFunc = func
|
||||
return self
|
||||
end
|
||||
|
||||
--- Sets the alert threshold.
|
||||
-- @tparam CommodityList self The commodity list object
|
||||
-- @tparam number threshold The item buyout above which the alert icon should be shown
|
||||
-- @treturn CommodityList The commodity list object
|
||||
function CommodityList.SetAlertThreshold(self, threshold)
|
||||
self._alertThreshold = threshold or math.huge
|
||||
return self
|
||||
end
|
||||
|
||||
function CommodityList.SetSelection(self, selection)
|
||||
self.__super:SetSelection(selection and self:_SanitizeSelectionIndex(selection) or nil)
|
||||
return self
|
||||
end
|
||||
|
||||
|
||||
|
||||
-- ============================================================================
|
||||
-- Private Class Methods
|
||||
-- ============================================================================
|
||||
|
||||
function CommodityList._HandleRowClick(self, data, mouseButton)
|
||||
local index = self:_SanitizeSelectionIndex(data)
|
||||
if not index then
|
||||
return
|
||||
end
|
||||
self.__super:_HandleRowClick(index, mouseButton)
|
||||
end
|
||||
|
||||
function CommodityList._SanitizeSelectionIndex(self, selectedIndex)
|
||||
-- select the highest subrow which isn't the player's auction and isn't above the selection
|
||||
local highestIndex = nil
|
||||
for index, subRow in self._row:SubRowIterator() do
|
||||
if subRow:GetQuantities() - select(2, subRow:GetOwnerInfo()) ~= 0 then
|
||||
highestIndex = index
|
||||
end
|
||||
if index == selectedIndex then
|
||||
break
|
||||
end
|
||||
end
|
||||
return highestIndex
|
||||
end
|
||||
|
||||
function CommodityList._GetSubRow(self, index)
|
||||
return self._row._subRows[index]
|
||||
end
|
||||
|
||||
function CommodityList._UpdateData(self)
|
||||
wipe(self._data)
|
||||
if not self._row then
|
||||
return
|
||||
end
|
||||
for index in self._row:SubRowIterator() do
|
||||
tinsert(self._data, index)
|
||||
end
|
||||
end
|
||||
|
||||
function CommodityList._IsSelected(self, data)
|
||||
if data > (self._selection or 0) then
|
||||
return false
|
||||
end
|
||||
local subRow = self:_GetSubRow(data)
|
||||
local _, numOwnerItems = subRow:GetOwnerInfo()
|
||||
local quantityAvailable = subRow:GetQuantities() - numOwnerItems
|
||||
return quantityAvailable > 0
|
||||
end
|
||||
|
||||
function CommodityList._GetMarketValuePct(self, row)
|
||||
assert(row:IsSubRow())
|
||||
if not self._marketValueFunc then
|
||||
-- no market value function was set
|
||||
return nil, nil
|
||||
end
|
||||
local marketValue = self._marketValueFunc(row) or 0
|
||||
if marketValue == 0 then
|
||||
-- this item doesn't have a market value
|
||||
return nil, nil
|
||||
end
|
||||
local _, itemBuyout = row:GetBuyouts()
|
||||
return itemBuyout > 0 and Math.Round(100 * itemBuyout / marketValue) or nil
|
||||
end
|
||||
|
||||
|
||||
|
||||
-- ============================================================================
|
||||
-- Private Helper Functions
|
||||
-- ============================================================================
|
||||
|
||||
function private.GetWarningIcon(self, index)
|
||||
local subRow = self:_GetSubRow(index)
|
||||
assert(subRow)
|
||||
local _, itemBuyout = subRow:GetBuyouts()
|
||||
if itemBuyout < self._alertThreshold then
|
||||
return
|
||||
end
|
||||
return "iconPack.12x12/Attention", L["This price is above your confirmation alert threshold."]
|
||||
end
|
||||
|
||||
function private.GetItemBuyoutText(self, index)
|
||||
local _, itemBuyout = self:_GetSubRow(index):GetBuyouts()
|
||||
return Money.ToString(itemBuyout, nil, "OPT_83_NO_COPPER")
|
||||
end
|
||||
|
||||
function private.GetPercentText(self, index)
|
||||
local pct = self:_GetMarketValuePct(self:_GetSubRow(index))
|
||||
if not pct then
|
||||
return "---"
|
||||
end
|
||||
local pctColor = Theme.GetAuctionPercentColor(pct)
|
||||
if pct > 999 then
|
||||
pct = ">999"
|
||||
end
|
||||
return pctColor:ColorText(pct.."%")
|
||||
end
|
||||
|
||||
function private.GetQuantityText(self, index)
|
||||
local subRow = self:_GetSubRow(index)
|
||||
local _, numOwnerItems = subRow:GetOwnerInfo()
|
||||
local totalQuantity = subRow:GetQuantities()
|
||||
local quantityAvailable = totalQuantity - numOwnerItems
|
||||
if quantityAvailable == 0 then
|
||||
return Theme.GetColor("INDICATOR_ALT"):ColorText(totalQuantity)
|
||||
else
|
||||
return quantityAvailable
|
||||
end
|
||||
end
|
||||
Reference in New Issue
Block a user