184 lines
6.2 KiB
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
|