Files
aux-addon-ClassicAPI/aux-addon/gui/listing.lua
T
geojak 02cfc420dd aux auto bid and price heuristics
this commit does two things
1. it implements auto bid just like auto buy
2. it has some minimum pricing heuristics when posting items. this behavoiur actiaves when the post bid price is set to 0, the buyout price behaves like a minimum
2022-02-20 23:51:19 +01:00

300 lines
8.6 KiB
Lua

module 'aux.gui.listing'
local T = require 'T'
local aux = require 'aux'
local gui = require 'aux.gui'
local ROW_HEIGHT = 15
local ROW_TEXT_SIZE = 14
local HEAD_HEIGHT = 27
local HEAD_SPACE = 2
local DEFAULT_COL_INFO = {{width=1}}
local handlers = {
OnEnter = function()
this.mouseover = true
if not this.data then return end
if not this.st.highlightDisabled then
this.highlight:Show()
end
local handler = this.st.handlers.OnEnter
if handler then
handler(this.st, this.data, this)
end
end,
OnLeave = function()
this.mouseover = false
if not this.data then return end
if not (this.st.selected and this.st.selected(this.data)) then
this.highlight:Hide()
end
local handler = this.st.handlers.OnLeave
if handler then
handler(this.st, this.data, this)
end
end,
OnClick = function()
if not this.data then return end
local handler = this.st.handlers.OnClick
if handler then
handler(this.st, this.data, this, arg1)
end
end,
OnDoubleClick = function()
if not this.data then return end
local handler = this.st.handlers.OnDoubleClick
if handler then
handler(this.st, this.data, this, arg1)
end
end,
}
local methods = {
Update = function(self)
if getn(self.colInfo) > 1 or self.colInfo[1].name then
self.headHeight = HEAD_HEIGHT
else
self.headHeight = 0
end
if getn(self.rowData or T.empty) > self.numRows then
self.contentFrame:SetPoint('BOTTOMRIGHT', -15, 0)
else
self.contentFrame:SetPoint('BOTTOMRIGHT', 0, 0)
end
local width = self.contentFrame:GetRight() - self.contentFrame:GetLeft()
while getn(self.headCols) < getn(self.colInfo) do
self:AddColumn()
end
for i, col in self.headCols do
if self.colInfo[i] then
col:Show()
col:SetWidth(self.colInfo[i].width * width)
col:SetHeight(self.headHeight)
col.text:SetText(self.colInfo[i].name or '')
col.text:SetJustifyH(self.colInfo[i].headAlign or 'CENTER')
else
col:Hide()
end
end
while getn(self.rows) < self.numRows do
self:AddRow()
end
for i, row in self.rows do
if i > self.numRows then
row.data = nil
row:Hide()
else
row:Show()
while getn(row.cols) < getn(self.colInfo) do
self:AddCell(i)
end
for j, col in row.cols do
if self.headCols[j] and self.colInfo[j] then
col:Show()
col:SetWidth(self.colInfo[j].width * width)
col.text:SetJustifyH(self.colInfo[j].align or 'LEFT')
else
col:Hide()
end
end
end
end
if not self.rowData then return end
FauxScrollFrame_Update(self.scrollFrame, getn(self.rowData), self.numRows, ROW_HEIGHT)
local offset = FauxScrollFrame_GetOffset(self.scrollFrame)
self.offset = offset
for i = 1, self.numRows do
local row = self.rows[i]
row.data = nil
if i > getn(self.rowData) then
row:Hide()
else
row:Show()
local data = self.rowData[i + offset]
if not data then break end
row.data = data
if row.mouseover or self.selected and self.selected(data) then
row.highlight:Show()
else
row.highlight:Hide()
end
for j, col in row.cols do
if self.colInfo[j] then
local colData = data.cols[j]
if type(colData.value) == 'function' then
col.text:SetText(colData.value(unpack(colData.args)))
else
col.text:SetText(colData.value)
end
end
end
end
end
end,
SetData = function(self, rowData)
for _, row in self.rowData or T.empty do
for _, col in row.cols do T.release(col) end
T.release(row.cols)
T.release(row)
end
self.rowData = rowData
self.updateSort = true
self:Update()
end,
AddColumn = function(self)
local colNum = getn(self.headCols) + 1
local col = CreateFrame('Frame', nil, self.contentFrame)
if colNum == 1 then
col:SetPoint('TOPLEFT', 0, 0)
else
col:SetPoint('TOPLEFT', self.headCols[colNum - 1], 'TOPRIGHT')
end
col.st = self
col.colNum = colNum
local text = col:CreateFontString()
text:SetAllPoints()
text:SetFont(gui.font, 12)
text:SetTextColor(aux.color.label.enabled())
col.text = text
local tex = col:CreateTexture()
tex:SetAllPoints()
tex:SetTexture([[Interface\AddOns\aux-AddOn\WorldStateFinalScore-Highlight]])
tex:SetTexCoord(.017, 1, .083, .909)
tex:SetAlpha(.5)
tinsert(self.headCols, col)
for i, row in self.rows do
while getn(row.cols) < getn(self.headCols) do
self:AddCell(i)
end
end
end,
AddCell = function(self, rowNum)
local row = self.rows[rowNum]
local colNum = getn(row.cols) + 1
local cell = CreateFrame('Frame', nil, row)
local text = cell:CreateFontString()
cell.text = text
text:SetFont(gui.font, ROW_TEXT_SIZE)
text:SetJustifyV('CENTER')
text:SetPoint('TOPLEFT', 1, -1)
text:SetPoint('BOTTOMRIGHT', -1, 1)
cell:SetHeight(ROW_HEIGHT)
cell.st = self
if colNum == 1 then
cell:SetPoint('TOPLEFT', 0, 0)
else
cell:SetPoint('TOPLEFT', row.cols[colNum - 1], 'TOPRIGHT')
end
tinsert(row.cols, cell)
end,
AddRow = function(self)
local row = CreateFrame('Button', nil, self.contentFrame)
row:SetHeight(ROW_HEIGHT)
row:RegisterForClicks('LeftButtonUp', 'RightButtonUp')
for name, func in handlers do
row:SetScript(name, func)
end
local rowNum = getn(self.rows) + 1
if rowNum == 1 then
row:SetPoint('TOPLEFT', 0, -(self.headHeight + HEAD_SPACE))
row:SetPoint('TOPRIGHT', 0, -(self.headHeight + HEAD_SPACE))
else
row:SetPoint('TOPLEFT', 0, -(self.headHeight + HEAD_SPACE + (rowNum - 1) * ROW_HEIGHT))
row:SetPoint('TOPRIGHT', 0, -(self.headHeight + HEAD_SPACE + (rowNum - 1) * ROW_HEIGHT))
end
local highlight = row:CreateTexture()
highlight:SetAllPoints()
highlight:SetTexture(1, .9, 0, .4)
highlight:Hide()
row.highlight = highlight
row.st = self
row.cols = T.acquire()
self.rows[rowNum] = row
for _ = 1, getn(self.colInfo) do
self:AddCell(rowNum)
end
end,
SetSelection = function(self, f)
self.selected = f
end,
SetHandler = function(self, event, handler)
self.handlers[event] = handler
end,
SetColInfo = function(self, colInfo)
colInfo = colInfo or DEFAULT_COL_INFO
self.colInfo = colInfo
self:Update()
end,
}
function M.new(parent)
local st = CreateFrame('Frame', gui.unique_name(), parent)
st:SetAllPoints()
st.numRows = max(floor((parent:GetHeight() - HEAD_HEIGHT - HEAD_SPACE) / ROW_HEIGHT), 0)
local contentFrame = CreateFrame('Frame', nil, st)
contentFrame:SetPoint('TOPLEFT', 0, 0)
contentFrame:SetPoint('BOTTOMRIGHT', 0, 0)
st.contentFrame = contentFrame
local scrollFrame = CreateFrame('ScrollFrame', st:GetName() .. 'ScrollFrame', st, 'FauxScrollFrameTemplate')
scrollFrame:SetScript('OnVerticalScroll', function()
FauxScrollFrame_OnVerticalScroll(ROW_HEIGHT, function() st:Update() end)
end)
scrollFrame:SetAllPoints(contentFrame)
st.scrollFrame = scrollFrame
local scroll_bar = _G[scrollFrame:GetName() .. 'ScrollBar']
scroll_bar:ClearAllPoints()
scroll_bar:SetPoint('TOPRIGHT', st, -4, -HEAD_HEIGHT)
scroll_bar:SetPoint('BOTTOMRIGHT', st, -4, 4)
scroll_bar:SetWidth(10)
local thumbTex = scroll_bar:GetThumbTexture()
thumbTex:SetPoint('CENTER', 0, 0)
thumbTex:SetTexture(aux.color.content.background())
thumbTex:SetHeight(150)
thumbTex:SetWidth(scroll_bar:GetWidth())
_G[scroll_bar:GetName() .. 'ScrollUpButton']:Hide()
_G[scroll_bar:GetName() .. 'ScrollDownButton']:Hide()
for name, func in methods do
st[name] = func
end
st.headCols = T.acquire()
st.rows = T.acquire()
st.handlers = T.acquire()
st.colInfo = DEFAULT_COL_INFO
return st
end