diff --git a/buy.lua b/buy.lua
index 422175b..0e87b65 100644
--- a/buy.lua
+++ b/buy.lua
@@ -1,6 +1,6 @@
Aux.buy = {}
-local process_auction, set_message, report, tooltip_match, show_buyout_dialog, show_bid_dialog
+local process_auction, set_message, report, tooltip_match, show_dialog
local entries
local selectedEntries = {}
local search_query
@@ -10,15 +10,14 @@ local refresh
function Aux.buy.exit()
-
- Aux.buy.buyout_dialog_cancel()
+ Aux.buy.dialog_cancel()
current_page = nil
end
-----------------------------------------
-function Aux_AuctionFrameBids_Update()
- Aux.orig.AuctionFrameBids_Update()
+function Aux_AuctionFrameBid_Update()
+ Aux.orig.AuctionFrameBid_Update()
if PanelTemplates_GetSelectedTab(AuctionFrame) == Aux.tabs.buy.index and AuctionFrame:IsShown() then
Aux_HideElems(Aux.tabs.buy.hiddenElements)
end
@@ -26,9 +25,9 @@ end
-----------------------------------------
-function Aux.buy.buyout_dialog_cancel()
+function Aux.buy.dialog_cancel()
Aux.scan.abort()
- AuxBuyBuyoutDialog:Hide()
+ AuxBuyDialog:Hide()
AuxBuySearchButton:Enable()
end
@@ -112,11 +111,12 @@ function set_message(msg)
end
-----------------------------------------
-function show_buyout_dialog(hyperlink, stack_size, buyout_price)
- AuxBuyBuyoutDialogBuyButton:Disable()
- AuxBuyBuyoutDialogHTML:SetFontObject('h1', GameFontWhite)
- AuxBuyBuyoutDialogHTML:SetScript('OnHyperlinkClick', function() SetItemRef(arg1) end)
- AuxBuyBuyoutDialogHTML:SetText(string.format(
+
+function show_dialog(buyout_mode, hyperlink, stack_size, amount)
+ AuxBuyDialogActionButton:Disable()
+ AuxBuyDialogHTML:SetFontObject('h1', GameFontWhite)
+ AuxBuyDialogHTML:SetScript('OnHyperlinkClick', function() SetItemRef(arg1) end)
+ AuxBuyDialogHTML:SetText(string.format(
[[
@@ -127,109 +127,108 @@ function show_buyout_dialog(hyperlink, stack_size, buyout_price)
hyperlink,
stack_size
))
- MoneyFrame_Update('AuxBuyBuyoutDialogBuyoutPrice', buyout_price)
- AuxBuyBuyoutDialog:Show()
+ if buyout_mode then
+ MoneyFrame_Update('AuxBuyDialogBuyoutPrice', amount)
+ AuxBuyDialogBid:Hide()
+ AuxBuyDialogBuyoutPrice:Show()
+ else
+ MoneyInputFrame_SetCopper(AuxBuyDialogBid, amount)
+ AuxBuyDialogBuyoutPrice:Hide()
+ AuxBuyDialogBid:Show()
+ end
+ AuxBuyDialog:Show()
end
-function show_bid_dialog(hyperlink, stack_size, highest_bid, min_increment)
- AuxBuyBidDialogBidButton:Disable()
- AuxBuyBidDialogHTML:SetFontObject('h1', GameFontWhite)
- AuxBuyBidDialogHTML:SetScript('OnHyperlinkClick', function() SetItemRef(arg1) end)
- AuxBuyBidDialogHTML:SetText(string.format(
- [[
-
-
- %s x %i
-
-
- ]],
- hyperlink,
- stack_size
- ))
- AuxBuyBidDialog:Show()
- MoneyFrame_Update('AuxBuyBuyoutDialogBuyoutPrice', buyout_price)
- MoneyInputFrame_SetCopper(AuxBuyBidDialogBid, highest_bid + min_increment)
-end
+-----------------------------------------
-function AuxBuyEntry_OnClick()
- local express_mode = IsControlKeyDown()
+function AuxBuyEntry_OnClick(i)
+ local express_mode = IsAltKeyDown()
+ local buyout_mode = arg1 == "LeftButton"
+
+ local entry = entries[i]
+
+ if IsControlKeyDown() then
+ DressUpItemLink(entry.hyperlink)
+ return
+ end
AuxBuySearchButton:Disable()
- local entry_index = this:GetID()
- local entry = entries[entry_index]
+ local amount
+ if buyout_mode then
+ amount = entry.buyout_price
+ else
+ amount = entry.bid
+ end
if not express_mode then
- if arg1 == "LeftButton" then
- show_buyout_dialog(entry.hyperlink, entry.stack_size, entry.buyout_price)
- elseif arg1 == "RightButton" then
- show_bid_dialog(entry.hyperlink, entry.stack_size, entry.buyout_price)
- end
+ show_dialog(buyout_mode, entry.hyperlink, entry.stack_size, amount)
end
PlaySound("igMainMenuOptionCheckBoxOn")
local found
- local order_key = Aux.auction_key(entry.tooltip, entry.stack_size, entry.buyout_price)
+ local order_key = Aux.auction_key(entry.tooltip, entry.stack_size, entry.bid, entry.buyout_price)
Aux.scan.start{
query = search_query,
page = entry.page ~= current_page and entry.page,
- on_start_page = function(k, page)
+ on_start_page = function(ok, page)
current_page = page
- k()
+ ok()
end,
- on_read_auction = function(k, i)
+ on_read_auction = function(ok, i)
local auction_item = Aux.info.auction_item(i)
if not auction_item then
- k()
+ ok()
return
end
local stack_size = auction_item.charges or auction_item.count
+ local bid = auction_item.current_bid > 0 and auction_item.current_bid or auction_item.min_bid + auction_item.min_increment
if not auction_item.tooltip or not stack_size or not auction_item.buyout_price then
- k()
+ ok()
return
end
- local key = Aux.auction_key(auction_item.tooltip, stack_size, auction_item.buyout_price)
+ local key = Aux.auction_key(auction_item.tooltip, stack_size, bid, auction_item.buyout_price)
if key == order_key then
found = true
-
- if express_mode then
- if GetMoney() >= auction_item.buyout_price then
+
+ if express_mode then
+ if GetMoney() >= amount then
tremove(entries, entry_index)
refresh = true
end
- PlaceAuctionBid("list", i, auction_item.buyout_price)
+ PlaceAuctionBid("list", i, amount)
Aux.scan.abort()
else
- Aux.buy.buyout_dialog_buy = function()
- if GetMoney() >= auction_item.buyout_price then
+ Aux.buy.dialog_action = function()
+ if GetMoney() >= amount then
tremove(entries, entry_index)
refresh = true
end
- PlaceAuctionBid("list", i, auction_item.buyout_price)
+ PlaceAuctionBid("list", i, amount)
Aux.scan.abort()
AuxBuySearchButton:Enable()
- AuxBuyBuyoutDialog:Hide()
+ AuxBuyDialog:Hide()
end
- AuxBuyBuyoutDialogBuyButton:Enable()
+ AuxBuyDialogActionButton:Enable()
end
end
- k()
+ ok()
end,
on_complete = function()
if not found then
tremove(entries, entry_index)
refresh = true
- Aux.buy.buyout_dialog_cancel()
+ Aux.buy.dialog_cancel()
end
if express_mode then
AuxBuySearchButton:Enable()
@@ -243,8 +242,7 @@ function AuxBuyEntry_OnClick()
}
end
-function AuxBuyEntry_OnEnter()
- local i = this:GetID()
+function AuxBuyEntry_OnEnter(i)
local entry = entries[i]
Aux.info.set_game_tooltip(this, entry.tooltip)
@@ -260,17 +258,25 @@ function process_auction(auction_item, current_page)
entries = entries or {}
local stack_size = auction_item.charges or auction_item.count
- if auction_item.buyout_price > 0 and auction_item.owner ~= UnitName("player") then
+ local bid = auction_item.current_bid > 0 and auction_item.current_bid or auction_item.min_bid + auction_item.min_increment
+ local buyout_price = auction_item.buyout_price > 0 and auction_item.buyout_price or nil
+ local buyout_price_per_unit = buyout_price and Aux_Round(auction_item.buyout_price / stack_size)
+
+ if auction_item.owner ~= UnitName("player") then
tinsert(entries, {
name = auction_item.name,
tooltip = auction_item.tooltip,
stack_size = stack_size,
- buyout_price = auction_item.buyout_price,
- unit_price = Aux_Round(auction_item.buyout_price / stack_size),
+ buyout_price = buyout_price,
+ buyout_price_per_unit = buyout_price_per_unit,
quality = auction_item.quality,
hyperlink = auction_item.hyperlink,
itemstring = auction_item.itemstring,
page = current_page,
+ bid = bid,
+ bid_per_unit = Aux_Round(bid / stack_size),
+ owner = auction_item.owner,
+ duration = auction_item.duration,
})
end
end
@@ -287,68 +293,17 @@ end
-----------------------------------------
function Aux_Buy_ScrollbarUpdate()
- if entries then
- table.sort(entries, function(a,b) return a.unit_price < b.unit_price end)
- end
+ Aux.list.populate(AuxBuyList, entries or {})
+
+ -- if entries then
+ -- table.sort(entries, function(a,b) return a.buyout_price_per_unit < b.buyout_price_per_unit end)
+ -- end
if entries and getn(entries) == 0 then
set_message("No auctions were found")
else
AuxBuyMessage:Hide()
end
-
- local numrows
- if not entries then
- numrows = 0
- else
- numrows = getn(entries)
- end
-
- FauxScrollFrame_Update(AuxBuyScrollFrame, numrows, 19, 16);
-
- for line = 1,19 do
-
- local dataOffset = line + FauxScrollFrame_GetOffset(AuxBuyScrollFrame)
- local lineEntry = getglobal("AuxBuyEntry"..line)
-
- if numrows <= 19 then
- lineEntry:SetWidth(800)
- else
- lineEntry:SetWidth(782)
- end
-
- lineEntry:SetID(dataOffset)
-
- if dataOffset <= numrows and entries[dataOffset] then
-
- local entry = entries[dataOffset]
-
- local lineEntry_name = getglobal("AuxBuyEntry"..line.."_Name")
- local lineEntry_stack_size = getglobal("AuxBuyEntry"..line.."_StackSize")
-
- local color = "ffffffff"
- if Aux_QualityColor(entry.quality) then
- color = Aux_QualityColor(entry.quality)
- end
-
- lineEntry_name:SetText("\124c" .. color .. entry.name .. "\124r")
-
- if Aux.util.set_contains(selectedEntries, entry) then
- lineEntry:LockHighlight()
- else
- lineEntry:UnlockHighlight()
- end
-
- lineEntry_stack_size:SetText(entry.stack_size)
-
- MoneyFrame_Update("AuxBuyEntry"..line.."_UnitPrice", Aux_Round(entry.buyout_price/entry.stack_size))
- MoneyFrame_Update("AuxBuyEntry"..line.."_TotalPrice", Aux_Round(entry.buyout_price))
-
- lineEntry:Show()
- else
- lineEntry:Hide()
- end
- end
end
-----------------------------------------
diff --git a/buy.xml b/buy.xml
index 77ae4fc..ecaa7c6 100644
--- a/buy.xml
+++ b/buy.xml
@@ -10,95 +10,48 @@
-
-
-
-
-
-
-
-
- FauxScrollFrame_OnVerticalScroll(16, Aux_Buy_ScrollbarUpdate)
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
@@ -390,7 +337,10 @@
-
+
+
+
+
@@ -400,12 +350,12 @@
-
+
- Aux.buy.buyout_dialog_buy()
+ Aux.buy.dialog_action()
@@ -414,60 +364,7 @@
- Aux.buy.buyout_dialog_cancel()
-
-
-
-
-
-
-
-
-
-
-
- this:RegisterForDrag("LeftButton")
- this:StartMoving()
- this:StopMovingOrSizing()
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- SmallMoneyFrame_OnLoad()
- MoneyFrame_SetType("STATIC")
-
-
-
-
-
-
-
-
-
-
-
- Aux.buy.bid_dialog_bid()
-
-
-
-
-
-
-
-
- Aux.buy.bid_dialog_cancel()
+ Aux.buy.dialog_cancel()
diff --git a/core.lua b/core.lua
index 3c0c120..0296844 100644
--- a/core.lua
+++ b/core.lua
@@ -166,8 +166,8 @@ function Aux_SetupHookFunctions()
Aux.orig.ContainerFrameItemButton_OnClick = ContainerFrameItemButton_OnClick
ContainerFrameItemButton_OnClick = Aux_ContainerFrameItemButton_OnClick
- Aux.orig.AuctionFrameBids_Update = AuctionFrameBids_Update
- AuctionFrameBids_Update = Aux_AuctionFrameBids_Update
+ Aux.orig.AuctionFrameBid_Update = AuctionFrameBid_Update
+ AuctionFrameBid_Update = Aux_AuctionFrameBid_Update
Aux.orig.AuctionFrameAuctions_Update = AuctionFrameAuctions_Update
AuctionFrameAuctions_Update = Aux_AuctionFrameAuctions_Update
@@ -478,7 +478,7 @@ end
-----------------------------------------
-function Aux.auction_key(tooltip, stack_size, buyout_price)
+function Aux.auction_key(tooltip, stack_size, bid, buyout_price)
local key = ''
for i, line in ipairs(tooltip) do
local left_text = line[1].text
@@ -490,5 +490,5 @@ function Aux.auction_key(tooltip, stack_size, buyout_price)
key = key .. right_text .. '_'
end
end
- return key .. stack_size .. '_' .. buyout_price
+ return key .. stack_size .. '_' .. bid .. '_' .. buyout_price
end
\ No newline at end of file
diff --git a/info.lua b/info.lua
index ec8fa5f..aaa32eb 100644
--- a/info.lua
+++ b/info.lua
@@ -26,7 +26,7 @@ function Aux.info.container_item(bag, slot)
end
function Aux.info.auction_sell_item()
- local name, texture, count, quality, usable, price, unit_price, max_stack, total_count = GetAuctionSellItemInfo()
+ local name, texture, count, quality, usable, price, buyout_price_per_unit, max_stack, total_count = GetAuctionSellItemInfo()
auction_sell_item = {
name = name,
texture = texture,
@@ -34,7 +34,7 @@ function Aux.info.auction_sell_item()
quality = quality,
usable = usable,
price = price,
- unit_price = unit_price,
+ buyout_price_per_unit = buyout_price_per_unit,
max_stack = max_stack,
total_count = total_count,
}
@@ -54,7 +54,7 @@ function Aux.info.auction_item(index)
local auction_item = hyperlink_item(hyperlink)
- local name, texture, count, quality, usable, level, min_bid, min_increment, buyout_price, bid_amount, high_bidder, owner, sale_status, id, has_all_info = GetAuctionItemInfo("list", index)
+ local name, texture, count, quality, usable, level, min_bid, min_increment, buyout_price, current_bid, high_bidder, owner, sale_status, id, has_all_info = GetAuctionItemInfo("list", index)
local duration = GetAuctionItemTimeLeft("list", index)
auction_item.texture = texture
@@ -62,7 +62,7 @@ function Aux.info.auction_item(index)
auction_item.min_bid = min_bid
auction_item.min_increment = min_increment
auction_item.buyout_price = buyout_price
- auction_item.bid_amount = bid_amount
+ auction_item.current_bid = current_bid
auction_item.high_bidder = high_bidder
auction_item.owner = owner
auction_item.sale_status = sale_status
diff --git a/list.lua b/list.lua
index 8140aa8..5456365 100644
--- a/list.lua
+++ b/list.lua
@@ -2,68 +2,137 @@ Aux.list = {}
local MAX_COLUMNS = 6
-local order = {
- BUYOUT = "Buyout price",
- BID = "Bid price",
- BUYOUT_UNIT = "Unit buyout price",
- BID_UNIT = "Unit bid price",
+local NAME, OWNER, BID, BID_UNIT, BUYOUT, BUYOUT_UNIT, QUANTITY = 1, 2, 3, 4, 5, 6, 7, 8
+
+MoneyTypeInfo["AUX_LIST"] = {
+ UpdateFunc = function()
+ return this.staticMoney
+ end,
+ collapse = 1,
+ fixedWidth = 1,
+ showSmallerCoins = 1,
}
+local logical_columns = {
+ {
+ type = 'STRING',
+ title = 'Name',
+ comparator = function(row1, row2) return Aux.util.compare(row1.name, row2.name, Aux.util.GT) end,
+ getter = function(row) return row.name end,
+ color = function(row) return ITEM_QUALITY_COLORS[row.quality] end,
+ },
+ {
+ type = 'STRING',
+ title = 'Owner',
+ comparator = function(row1, row2) return Aux.util.compare(row1.owner, row2.owner, Aux.util.GT) end,
+ getter = function(row) return row.owner end,
+ },
+ {
+ type = 'MONEY',
+ title = 'Bid',
+ comparator = function(row1, row2) return Aux.util.compare(row1.bid, row2.bid, Aux.util.GT) end,
+ getter = function(row) return row.bid end,
+ },
+ {
+ type = 'MONEY',
+ title = 'Bid (Unit)',
+ comparator = function(row1, row2) return Aux.util.compare(row1.bid_per_unit, row2.bid_per_unit, Aux.util.GT) end,
+ getter = function(row) return row.bid_per_unit end,
+ },
+ {
+ type = 'MONEY',
+ title = 'Buyout',
+ comparator = function(row1, row2) return Aux.util.compare(row1.buyout_price, row2.buyout_price, Aux.util.GT) end,
+ getter = function(row) return row.buyout_price end,
+ },
+ {
+ type = 'MONEY',
+ title = 'Buyout (Unit)',
+ comparator = function(row1, row2) return Aux.util.compare(row1.buyout_price_per_unit, row2.buyout_price_per_unit, Aux.util.GT) end,
+ getter = function(row) return row.buyout_price_per_unit end,
+ },
+ {
+ type = 'NUMBER',
+ title = 'Quantity',
+ comparator = function(row1, row2) return Aux.util.compare(row1.stack_size, row2.stack_size, Aux.util.LT) end,
+ getter = function(row) return row.stack_size end,
+ },
+ {
+ type = 'STRING',
+ title = 'Time Left',
+ comparator = function(row1, row2) return Aux.util.invert_order(Aux.util.compare(row1.duration, row2.duration, Aux.util.GT)) end,
+ getter = function(row)
+ if row.duration == 1 then
+ return 'Short'
+ elseif row.duration == 2 then
+ return 'Medium'
+ elseif row.duration == 3 then
+ return 'Long'
+ elseif row.duration == 4 then
+ return 'Very Long'
+ end
+ end,
+ },
+}
+
+local physical_columns = {
+ { logical_column = logical_columns[NAME], width = 156 },
+ { logical_column = logical_columns[OWNER], width = 156 },
+ { logical_column = logical_columns[BUYOUT_UNIT], width = 156 },
+ { logical_column = logical_columns[QUANTITY], width = 156 },
+ { logical_column = logical_columns[BUYOUT], width = 156 },
+}
+
+
+
+function Aux.list.on_load()
+ Aux.list.initialize(this, physical_columns, logical_columns)
+end
+
-------------------------------------------------------------------------------
--- Compare two rows
+-- Aux.util.compare two rows
-------------------------------------------------------------------------------
-local CurrentListFrame = nil;
-function ListTemplate_CompareRows(row1, row2)
- frame = CurrentListFrame;
- for index, value in ipairs(frame.sortOrder) do
- local column = value;
- local physicalColumn = frame.physicalColumns[column.columnIndex];
- local logicalColumn = physicalColumn.logicalColumn;
- if (logicalColumn.compareAscendingFunc and logicalColumn.compareDescendingFunc) then
- local ascending = logicalColumn.compareAscendingFunc(row1, row2);
- local descending = logicalColumn.compareDescendingFunc(row1, row2);
- if (ascending or descending) then
- if (column.sortAscending) then
- return ascending;
- else
- return descending;
+
+function Aux.list.row_comparator(list_frame)
+ return function(row1, row2)
+ for index, sort_info in ipairs(list_frame.sort_order) do
+ local physical_column = list_frame.physical_columns[sort_info.column_index]
+ local logical_column = physical_column.logical_column
+ if logical_column.comparator then
+ local ordering = logical_column.comparator(row1, row2)
+ if ordering ~= Aux.util.EQ then
+ return sort_info.sort_ascending and ordering or Aux.util.invert_order(ordering)
end
end
end
+ return Aux.util.EQ
end
- return false;
end
-------------------------------------------------------------------------------
-- Initialize the list with the column information
-------------------------------------------------------------------------------
-function Aux.list.initialize(frame, physicalColumns, logicalColumns)
+function Aux.list.initialize(frame, physical_columns, logical_columns)
frame.lines = 19
frame.lineHeight = 16
frame.content = {}
- frame.physicalColumns = physicalColumns
- frame.logicalColumns = logicalColumns
+ frame.physical_columns = physical_columns
+ frame.logical_columns = logical_columns
- frame.sortOrder = {}
- for physicalColumnIndex = 1, MAX_COLUMNS do
- local button = getglobal(frame:GetName().."Column"..physicalColumnIndex.."Sort")
- local dropdown = getglobal(frame:GetName().."Column"..physicalColumnIndex.."DropDown")
- if (physicalColumnIndex <= table.getn(physicalColumns)) then
- local physicalColumn = physicalColumns[physicalColumnIndex]
- local logicalColumn = {title='kek'} -- physicalColumn.logicalColumn
- local column = {}
- column.columnIndex = physicalColumnIndex
- column.sortAscending = true
- table.insert(frame.sortOrder, column)
+ frame.sort_order = {}
+ for i = 1, MAX_COLUMNS do
+ local button = getglobal(frame:GetName().."Column"..i.."Sort")
+ local dropdown = getglobal(frame:GetName().."Column"..i.."DropDown")
+ if (i <= table.getn(physical_columns)) then
+ local physical_column = physical_columns[i]
+ local logical_column = physical_column.logical_column
+ table.insert(frame.sort_order, { column_index = i, sort_ascending = true})
getglobal(button:GetName().."Arrow"):Hide()
- getglobal(button:GetName().."Text"):SetText(logicalColumn.title)
+ getglobal(button:GetName().."Text"):SetText(logical_column.title)
button:Show()
- if (table.getn(physicalColumn.logicalColumns) > 1) then
- dropdown:Show()
- else
- dropdown:Hide()
- end
- Aux.list.set_column_width(frame, physicalColumnIndex, physicalColumn.width);
+ dropdown:Show()
+
+ Aux.list.set_column_width(frame, i, physical_column.width);
else
button:Hide()
dropdown:Hide()
@@ -76,19 +145,18 @@ end
-------------------------------------------------------------------------------
-- Initialize the list with the column information
-------------------------------------------------------------------------------
-function Aux.list.set_column_width(frame, column, width)
+function Aux.list.set_column_width(frame, column_index, width)
-- Resize the header
- frame.physicalColumns[column].width = width
- local button = getglobal(frame:GetName().."Column"..column.."Sort")
+ local button = getglobal(frame:GetName().."Column"..column_index.."Sort")
button:SetWidth(width + 2)
- local dropdown = getglobal(frame:GetName().."Column"..column.."DropDown")
+ local dropdown = getglobal(frame:GetName().."Column"..column_index.."DropDown")
UIDropDownMenu_SetWidth(width - 18, dropdown)
-- Resize each cell in the columns
for line = 1, frame.lines do
- local textControl = getglobal(frame:GetName().."Item"..line.."Column"..column)
- if textControl then
- textControl:SetWidth(width - 20)
+ local text = getglobal(frame:GetName().."Item"..line.."Column"..column_index)
+ if text then
+ text:SetWidth(width - 20)
end
end
end
@@ -96,194 +164,168 @@ end
-------------------------------------------------------------------------------
-- Set the item to display.
-------------------------------------------------------------------------------
-function ListTemplate_SetContent(frame, content)
+function Aux.list.populate(frame, content)
frame.content = content
-- Perform the sort.
- CurrentListFrame = frame
- table.sort(frame.content, ListTemplate_CompareRows)
- CurrentListFrame = nil
+ Aux.util.merge_sort(frame.content, Aux.list.row_comparator(frame))
-- Update the scroll pane.
- ListTemplateScrollFrame_Update(getglobal(frame:GetName().."ScrollFrame"))
+ Aux.list.scroll_frame_update(getglobal(frame:GetName().."ScrollFrame"))
end
-------------------------------------------------------------------------------
-------------------------------------------------------------------------------
function ListTemplate_SelectRow(frame, row)
- if (frame.selectedRow ~= row) then
- local scrollFrame = getglobal(frame:GetName().."ScrollFrame");
- local firstVisibleRow = FauxScrollFrame_GetOffset(scrollFrame) + 1;
- local lastVisibleRow = firstVisibleRow + frame.lines - 1;
+ if frame.selectedRow ~= row then
+ local scrollFrame = getglobal(frame:GetName().."ScrollFrame")
+ local firstVisibleRow = FauxScrollFrame_GetOffset(scrollFrame) + 1
+ local lastVisibleRow = firstVisibleRow + frame.lines - 1
-- Deselect the previous row
- if (frame.selectedRow and firstVisibleRow <= frame.selectedRow and frame.selectedRow <= lastVisibleRow) then
- local line = frame.selectedRow - firstVisibleRow + 1;
- local item = getglobal(frame:GetName().."Item"..line);
- item:UnlockHighlight();
+ if frame.selectedRow and firstVisibleRow <= frame.selectedRow and frame.selectedRow <= lastVisibleRow then
+ local line = frame.selectedRow - firstVisibleRow + 1
+ local item = getglobal(frame:GetName().."Item"..line)
+ item:UnlockHighlight()
end
-- Update the selected item
- frame.selectedRow = row;
+ frame.selectedRow = row
-- Select the new row
- if (frame.selectedRow and firstVisibleRow <= frame.selectedRow and frame.selectedRow <= lastVisibleRow) then
- local line = frame.selectedRow - firstVisibleRow + 1;
- local item = getglobal(frame:GetName().."Item"..line);
- item:LockHighlight();
+ if frame.selectedRow and firstVisibleRow <= frame.selectedRow and frame.selectedRow <= lastVisibleRow then
+ local line = frame.selectedRow - firstVisibleRow + 1
+ local item = getglobal(frame:GetName().."Item"..line)
+ item:LockHighlight()
end
end
end
-------------------------------------------------------------------------------
-------------------------------------------------------------------------------
-function Aux.list.sort(frame, columnIndex)
- -- -- Update the SortColumn order
- -- if (frame.sortOrder[1].columnIndex == columnIndex) then
- -- frame.sortOrder[1].sortAscending = not frame.sortOrder[1].sortAscending;
- -- else
- -- getglobal(frame:GetName().."Column"..frame.sortOrder[1].columnIndex.."SortArrow"):Hide();
- -- for index, value in ipairs(frame.sortOrder) do
- -- if (value.columnIndex == columnIndex) then
- -- local temp = value;
- -- table.remove(frame.sortOrder, index);
- -- table.insert(frame.sortOrder, 1, temp);
- -- break;
- -- end
- -- end
- -- frame.sortOrder[1].sortAscending = true;
- -- getglobal(frame:GetName().."Column"..frame.sortOrder[1].columnIndex.."SortArrow"):Show();
- -- end
+function Aux.list.sort(frame, i)
- -- -- Perform the sort.
- -- CurrentListFrame = frame;
- -- table.sort(frame.content, ListTemplate_CompareRows);
- -- CurrentListFrame = nil;
+ if frame.sort_order[1].column_index == i then
+ frame.sort_order[1].sort_ascending = not frame.sort_order[1].sort_ascending
+ else
+ getglobal(frame:GetName().."Column"..frame.sort_order[1].column_index.."SortArrow"):Hide()
+ for index, value in ipairs(frame.sort_order) do
+ if value.column_index == i then
+ local temp = value
+ table.remove(frame.sort_order, index)
+ table.insert(frame.sort_order, 1, temp)
+ break
+ end
+ end
+ frame.sort_order[1].sort_ascending = true
+ getglobal(frame:GetName().."Column"..frame.sort_order[1].column_index.."SortArrow"):Show()
+ end
+
+ Aux.util.merge_sort(frame.content, Aux.list.row_comparator(frame))
- -- -- Update the sort arrow.
- -- if (frame.sortOrder[1].sortAscending) then
- -- getglobal(frame:GetName().."Column"..frame.sortOrder[1].columnIndex.."SortArrow"):SetTexCoord(0, 0.5625, 0, 1.0);
- -- else
- -- getglobal(frame:GetName().."Column"..frame.sortOrder[1].columnIndex.."SortArrow"):SetTexCoord(0, 0.5625, 1.0, 0);
- -- end
+ if frame.sort_order[1].sort_ascending then
+ getglobal(frame:GetName().."Column"..frame.sort_order[1].column_index.."SortArrow"):SetTexCoord(0, 0.5625, 0, 1.0)
+ else
+ getglobal(frame:GetName().."Column"..frame.sort_order[1].column_index.."SortArrow"):SetTexCoord(0, 0.5625, 1.0, 0)
+ end
- -- -- Update the scroll pane.
- -- ListTemplateScrollFrame_Update(getglobal(frame:GetName().."ScrollFrame"));
+ Aux.list.scroll_frame_update(getglobal(frame:GetName().."ScrollFrame"))
end
-------------------------------------------------------------------------------
-------------------------------------------------------------------------------
-function ListTemplateScrollFrame_Update(frame)
- if (not frame) then frame = this end;
- local parent = frame:GetParent();
- local content = parent.content;
- FauxScrollFrame_Update(frame, table.getn(content), parent.lines, parent.lineHeight);
+function Aux.list.scroll_frame_update(frame)
+ if not frame then frame = this end
+ local parent = frame:GetParent()
+ local content = parent.content
+ FauxScrollFrame_Update(frame, table.getn(content), parent.lines, parent.lineHeight)
for line = 1, parent.lines do
- local item = getglobal(parent:GetName().."Item"..line);
- local contentIndex = line + FauxScrollFrame_GetOffset(frame);
- if contentIndex <= table.getn(content) then
- for columnIndex = 1, MAX_COLUMNS do
- -- Get the text control (if any)
- local text = getglobal(parent:GetName().."Item"..line.."Column"..columnIndex);
- if (text) then
- text:Hide();
- end
+ local item = getglobal(parent:GetName().."Item"..line)
+ local row_index = line + FauxScrollFrame_GetOffset(frame)
+ if row_index <= table.getn(content) then
+ for column_index = 1, MAX_COLUMNS do
- -- Get the money frame (if any)
- local moneyFrame = getglobal(parent:GetName().."Item"..line.."Column"..columnIndex.."MoneyFrame");
- if (moneyFrame) then
- moneyFrame:Hide();
- end
+ local text = getglobal(parent:GetName().."Item"..line.."Column"..column_index)
+ -- text:Hide() TODO
+ text:SetText()
- -- If the column exists, update it
- if (columnIndex <= table.getn(parent.physicalColumns)) then
- local physicalColumn = parent.physicalColumns[columnIndex];
- local logicalColumn = physicalColumn.logicalColumn;
- local value = logicalColumn.valueFunc(content[contentIndex]);
+ local moneyFrame = getglobal(parent:GetName().."Item"..line.."Column"..column_index.."MoneyFrame")
+ moneyFrame:Hide()
- -- Setup the control based on the datatype
- if (value) then
- if (text and (logicalColumn.dataType == "Date" or logicalColumn.dataType == "Number" or logicalColumn.dataType == "String")) then
- text:SetText(value);
- if (logicalColumn.colorFunc) then
- local color = logicalColumn.colorFunc(content[contentIndex]);
- text:SetTextColor(color.r, color.g, color.b);
+ if column_index <= table.getn(parent.physical_columns) then
+ local physical_column = parent.physical_columns[column_index]
+ local logical_column = physical_column.logical_column
+ local value = logical_column.getter(content[row_index])
+
+ if value then
+ if text and (logical_column.type == "DATE" or logical_column.type == "NUMBER" or logical_column.type == "STRING") then
+ text:SetText(value)
+ if logical_column.color then
+ local color = logical_column.color(content[row_index])
+ text:SetTextColor(color.r, color.g, color.b)
else
- text:SetTextColor(255, 255, 255);
+ text:SetTextColor(255, 255, 255)
end
- if (logicalColumn.alphaFunc) then
- text:SetAlpha(logicalColumn.alphaFunc(content[contentIndex]));
+ if logical_column.alphaFunc then
+ text:SetAlpha(logical_column.alphaFunc(content[row_index]))
else
- text:SetAlpha(1.0);
+ text:SetAlpha(1.0)
end
- if (logicalColumn.dataType == "Number") then
- text:SetJustifyH("RIGHT");
+ if (logical_column.type == "NUMBER") then
+ text:SetJustifyH("RIGHT")
else
- text:SetJustifyH("LEFT");
+ text:SetJustifyH("LEFT")
end
- text:Show();
- elseif (moneyFrame and logicalColumn.dataType == "Money") then
- if (value >= 0) then
- MoneyFrame_Update(moneyFrame:GetName(), value);
- SetMoneyFrameColor(moneyFrame:GetName(), 255, 255, 255);
+ text:Show()
+ elseif moneyFrame and logical_column.type == "MONEY" then
+ if value >= 0 then
+ MoneyFrame_Update(moneyFrame:GetName(), value)
+ SetMoneyFrameColor(moneyFrame:GetName(), 255, 255, 255)
else
- MoneyFrame_Update(moneyFrame:GetName(), -value);
- SetMoneyFrameColor(moneyFrame:GetName(), 255, 0, 0);
+ MoneyFrame_Update(moneyFrame:GetName(), -value)
+ SetMoneyFrameColor(moneyFrame:GetName(), 255, 0, 0)
end
- if (logicalColumn.alphaFunc) then
- moneyFrame:SetAlpha(logicalColumn.alphaFunc(content[contentIndex]));
+ if logical_column.alphaFunc then
+ moneyFrame:SetAlpha(logical_column.alphaFunc(content[row_index]))
else
- moneyFrame:SetAlpha(1.0);
+ moneyFrame:SetAlpha(1.0)
end
- moneyFrame:Show();
+ moneyFrame:Show()
end
end
end
end
-- Update the row highlight
- if (parent.selectedRow and parent.selectedRow == contentIndex) then
- item:LockHighlight();
+ if parent.selectedRow and parent.selectedRow == row_index then
+ item:LockHighlight()
else
- item:UnlockHighlight();
+ item:UnlockHighlight()
end
- item:Show();
+ item:Show()
else
- item:Hide();
+ item:Hide()
end
end
end
-------------------------------------------------------------------------------
-------------------------------------------------------------------------------
-function Aux.list.dropdown_onload()
+function Aux.list.dropdown_on_load()
getglobal(this:GetName().."Text"):Hide()
- this.initialize = ListTemplate_DropDown_Initialize
- UIDropDownMenu_SetSelectedID(this, 1)
+ this.initialize = Aux.list.dropdown_initialize
+ -- UIDropDownMenu_SetSelectedID(this, 1) TODO
end
-------------------------------------------------------------------------------
-------------------------------------------------------------------------------
-function ListTemplate_DropDown_Initialize()
+function Aux.list.dropdown_initialize()
local dropdown = this:GetParent()
local frame = dropdown:GetParent()
-
- -- if (frame.physicalColumns) then
- -- local physicalColumnIndex = dropdown:GetID();
- -- local physicalColumn = frame.physicalColumns[physicalColumnIndex];
- -- for index, value in pairs(physicalColumn.logicalColumns) do
- -- local logicalColumn = value;
- -- local info = {};
- -- info.text = logicalColumn.title;
- -- info.func = ListTemplate_DropDownItem_OnClick;
- -- info.owner = dropdown;
- -- UIDropDownMenu_AddButton(info);
- -- end
- -- end
- for _, name in pairs(order) do
+ for _, logical_column in pairs(frame.logical_columns) do
UIDropDownMenu_AddButton({
- text = name,
+ text = logical_column.title,
owner = dropdown,
func = Aux.list.dropdown_item_onclick
})
@@ -292,25 +334,21 @@ end
-------------------------------------------------------------------------------
-------------------------------------------------------------------------------
-function Aux.list.dropdown_item_onclick()
- -- local logicalColumnIndex = this:GetID()
- -- local physicalColumnIndex = this.owner:GetID()
- -- local dropdown = this.owner
- -- local frame = dropdown:GetParent()
- -- if (frame.physicalColumns[physicalColumnIndex].logicalColumn ~= frame.physicalColumns[physicalColumnIndex].logicalColumns[logicalColumnIndex]) then
- -- -- Change the physical column's logical column
- -- frame.physicalColumns[physicalColumnIndex].logicalColumn = frame.physicalColumns[physicalColumnIndex].logicalColumns[logicalColumnIndex]
- -- getglobal(frame:GetName().."Column"..physicalColumnIndex.."SortText"):SetText(frame.physicalColumns[physicalColumnIndex].logicalColumn.title)
+function Aux.list.dropdown_item_onclick()
+ local logical_column_index = this:GetID()
+ local physical_column_index = this.owner:GetID()
+ local dropdown = this.owner
+ local frame = dropdown:GetParent()
+ if (frame.physical_columns[physical_column_index].logical_column ~= frame.logical_columns[logical_column_index]) then
- -- -- Sort the content based on the new logical column
- -- CurrentListFrame = frame;
- -- table.sort(frame.content, ListTemplate_CompareRows)
- -- CurrentListFrame = nil
+ frame.physical_columns[physical_column_index].logical_column = frame.logical_columns[logical_column_index]
+ getglobal(frame:GetName().."Column"..physical_column_index.."SortText"):SetText(frame.physical_columns[physical_column_index].logical_column.title)
- -- -- Update the combo and scroll pane.
- -- UIDropDownMenu_SetSelectedID(dropdown, logicalColumnIndex)
- -- ListTemplateScrollFrame_Update(getglobal(frame:GetName().."ScrollFrame"))
- -- end
+ Aux.util.merge_sort(frame.content, Aux.list.row_comparator(frame))
+
+ UIDropDownMenu_SetSelectedID(dropdown, logical_column_index)
+ Aux.list.scroll_frame_update(getglobal(frame:GetName().."ScrollFrame"))
+ end
end
diff --git a/list.xml b/list.xml
index 7c3e5d4..2013b95 100644
--- a/list.xml
+++ b/list.xml
@@ -2,149 +2,93 @@
-
+
@@ -234,7 +178,7 @@
- Aux.list.dropdown_onload()
+ Aux.list.dropdown_on_load()
@@ -248,30 +192,15 @@
-
-
-
-
-
-
-
+
- Aux.list.dropdown_onload()
+ Aux.list.dropdown_on_load()
-
-
-
-
-
-
-
-
-
-
+
Aux.list.sort(this:GetParent(), 3)
@@ -288,7 +217,7 @@
- Aux.list.dropdown_onload()
+ Aux.list.dropdown_on_load()
@@ -319,7 +248,7 @@
- Aux.list.dropdown_onload()
+ Aux.list.dropdown_on_load()
@@ -350,7 +279,7 @@
- Aux.list.dropdown_onload()
+ Aux.list.dropdown_on_load()
@@ -381,11 +310,11 @@
- Aux.list.dropdown_onload()
+ Aux.list.dropdown_on_load()
-
+
\ No newline at end of file
diff --git a/util.lua b/util.lua
index cc688c7..adc42b6 100644
--- a/util.lua
+++ b/util.lua
@@ -1,5 +1,11 @@
Aux.util = {}
+Aux.util.LT = {}
+Aux.util.EQ = {}
+Aux.util.GT = {}
+
+local merge, copy_array
+
function Aux.util.iter(array)
local with_index = ipairs(array)
return function()
@@ -93,4 +99,68 @@ function Aux.util.set_filter(set, p)
end
end
return filtered
+end
+
+function Aux.util.merge_sort(A, comp)
+ local n = getn(A)
+ local B = {}
+
+ local width = 1
+ while width <= n do
+
+ for i=1, n, 2 * width do
+ merge(A, i, min(i + width, n), min(i + 2 * width - 1, n), B, comp)
+ end
+
+ copy_array(B, A, n)
+
+ width = 2 * width
+ end
+end
+
+function merge(A, start1, start2, last, B, comp)
+ local i1 = start1
+ local i2 = start2
+
+ for i=start1,last do
+ if i1 < start2 and (i2 > last or comp(A[i1], A[i2]) == Aux.util.LT or comp(A[i1], A[i2]) == Aux.util.EQ) then
+ B[i] = A[i1]
+ i1 = i1 + 1
+ else
+ B[i] = A[i2]
+ i2 = i2 + 1
+ end
+ end
+end
+
+function copy_array(A, B, n)
+ for i=1,n do
+ B[i] = A[i]
+ end
+end
+
+function Aux.util.invert_order(ordering)
+ if ordering == Aux.util.LT then
+ return Aux.util.GT
+ elseif ordering == Aux.util.GT then
+ return Aux.util.LT
+ else
+ return Aux.util.EQ
+ end
+end
+
+function Aux.util.compare(a, b, nil_ordering)
+ if not a and b then
+ return nil_ordering
+ elseif a and not b then
+ return Aux.util.invert_order(nil_ordering)
+ elseif not a and not b then
+ return Aux.util.EQ
+ elseif a < b then
+ return Aux.util.LT
+ elseif a > b then
+ return Aux.util.GT
+ else
+ return Aux.util.EQ
+ end
end
\ No newline at end of file