TradeSkillMaster/Core/UI/Elements/MyAuctionsScrollingTable.lua

184 lines
6.2 KiB
Lua

-- ------------------------------------------------------------------------------ --
-- TradeSkillMaster --
-- https://tradeskillmaster.com --
-- All Rights Reserved - Detailed license information included with addon. --
-- ------------------------------------------------------------------------------ --
--- My Auctions Scrolling Table Class.
-- A scrolling table containing the player's auctions. It is a subclass of the @{QueryScrollingTable} class.
-- @classmod MyAuctionsScrollingTable
local _, TSM = ...
local MyAuctionsScrollingTable = TSM.Include("LibTSMClass").DefineClass("MyAuctionsScrollingTable", TSM.UI.QueryScrollingTable)
local TempTable = TSM.Include("Util.TempTable")
local UIElements = TSM.Include("UI.UIElements")
UIElements.Register(MyAuctionsScrollingTable)
TSM.UI.MyAuctionsScrollingTable = MyAuctionsScrollingTable
-- ============================================================================
-- Public Class Methods
-- ============================================================================
function MyAuctionsScrollingTable.__init(self)
self.__super:__init()
self._selectionSortValue = nil
self._selectionAuctionId = nil
end
function MyAuctionsScrollingTable.Release(self)
self._selectionSortValue = nil
self._selectionAuctionId = nil
self.__super:Release()
end
--- Sets the selected record.
-- @tparam MyAuctionsScrollingTable self The my auctions scrolling table object
-- @param selection The selected record or nil to clear the selection
-- @tparam[opt=false] bool redraw Whether or not to redraw the scrolling table
-- @treturn MyAuctionsScrollingTable The my auctions scrolling table object
function MyAuctionsScrollingTable.SetSelection(self, selection, redraw)
self.__super:SetSelection(selection, redraw)
if self._selection then
local selectedRow = self:GetSelection()
local sortField = TSM.IsWowClassic() and "index" or self._tableInfo:_GetSortFieldById(self._sortCol)
self._selectionSortValue = selectedRow:GetField(sortField)
if type(self._selectionSortValue) == "string" then
self._selectionSortValue = strlower(self._selectionSortValue)
end
self._selectionAuctionId = selectedRow:GetField("auctionId")
else
self._selectionSortValue = nil
self._selectionAuctionId = nil
end
return self
end
--- Selects the next row.
-- @tparam MyAuctionsScrollingTable self The my auctions scrolling table object
-- @treturn MyAuctionsScrollingTable The my auctions scrolling table object
function MyAuctionsScrollingTable.SelectNextRow(self)
local newSelection = nil
for i = 1, #self._data - 1 do
if self._data[i] == self._selection then
for j = i + 1, #self._data do
if not self._selectionValidator or self:_selectionValidator(self._query:GetResultRowByUUID(self._data[j])) then
newSelection = self._data[j]
break
end
end
break
end
end
self:SetSelection(newSelection, true)
return self
end
-- ============================================================================
-- Private Class Methods
-- ============================================================================
function MyAuctionsScrollingTable._UpdateSortFromQuery(self)
if self._tableInfo:_IsSortEnabled() then
assert(not TSM.IsWowClassic())
local sortField, sortAscending = self._query:GetOrderBy(2)
if sortField then
self._sortCol = self._tableInfo:_GetIdBySortField(sortField)
self._sortAscending = sortAscending
else
self._sortCol = nil
self._sortAscending = nil
end
end
end
function MyAuctionsScrollingTable._UpdateData(self)
-- we need to fix up the data within the rows updated to avoid errors with trying to access old DatabaseQueryResultRows
local prevRowIndex = TempTable.Acquire()
local newRowData = TempTable.Acquire()
for i, row in ipairs(self._rows) do
if row:IsVisible() then
prevRowIndex[row:GetData()] = i
end
end
local prevSelection = self._selection
wipe(self._data)
self._selection = nil
for _, uuid in self._query:UUIDIterator() do
local row = self._query:GetResultRowByUUID(uuid)
if (uuid == prevSelection or (row:GetField("auctionId") == self._selectionAuctionId)) and not row:GetField("isPending") then
self._selection = uuid
end
if prevRowIndex[uuid] then
newRowData[prevRowIndex[uuid]] = uuid
end
tinsert(self._data, uuid)
end
for i, row in ipairs(self._rows) do
if row:IsVisible() then
if newRowData[i] then
row:SetData(newRowData[i])
else
row:ClearData()
end
end
end
TempTable.Release(prevRowIndex)
TempTable.Release(newRowData)
if prevSelection and not self._selection then
local newSelection = nil
-- try to select the next row based on the sorting
local sortField = TSM.IsWowClassic() and "index" or self._tableInfo:_GetSortFieldById(self._sortCol)
local sortAscending = not TSM.IsWowClassic() and self._sortAscending
for _, uuid in ipairs(self._data) do
local row = self._query:GetResultRowByUUID(uuid)
local sortValue = row:GetField(sortField)
if type(sortValue) == "string" then
sortValue = strlower(sortValue)
end
if (sortAscending and sortValue > self._selectionSortValue) or (not sortAscending and sortValue < self._selectionSortValue) then
if not self._selectionValidator or self:_selectionValidator(row) then
newSelection = uuid
break
end
elseif not TSM.IsWowClassic() and sortValue == self._selectionSortValue and row:GetField("auctionId") > self._selectionAuctionId then
if not self._selectionValidator or self:_selectionValidator(row) then
newSelection = uuid
break
end
end
end
-- select either the next row
self:SetSelection(newSelection)
end
if self._onDataUpdated then
self:_onDataUpdated()
end
end
function MyAuctionsScrollingTable._ToggleSort(self, id)
local sortField = self._tableInfo:_GetSortFieldById(id)
if not self._sortCol or not self._query or not sortField then
-- sorting disabled so ignore
return
end
if id == self._sortCol then
self._sortAscending = not self._sortAscending
else
self._sortCol = id
self._sortAscending = true
end
assert(not TSM.IsWowClassic())
self._query:ResetOrderBy()
:OrderBy("saleStatus", false)
:OrderBy(sortField, self._sortAscending)
:OrderBy("auctionId", true)
self:_UpdateData()
self:Draw()
end