From d5e5449a01ca007f2fdf6fc015baa8b4f323a454 Mon Sep 17 00:00:00 2001 From: Manuel Simon Hirsig Date: Sat, 3 Oct 2015 20:22:30 +0200 Subject: [PATCH] massive buy upgrade, sorting and bidding --- buy.lua | 197 ++++++++++---------------- buy.xml | 303 ++++++++++++++-------------------------- core.lua | 8 +- info.lua | 8 +- list.lua | 412 ++++++++++++++++++++++++++++++------------------------- list.xml | 185 ++++++++----------------- util.lua | 70 ++++++++++ 7 files changed, 536 insertions(+), 647 deletions(-) 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 @@ - - - - - - - - + + @@ -109,47 +62,77 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + @@ -335,44 +318,8 @@ - - - - - - - - FauxScrollFrame_OnVerticalScroll(16, Aux_Buy_ScrollbarUpdate) - - - - - - - - - - - - - - - - - - - - - - - - - - - + @@ -390,7 +337,10 @@ - + + + + @@ -400,12 +350,12 @@ - @@ -414,60 +364,7 @@ - Aux.buy.buyout_dialog_cancel() - - - - - - - - - - - - this:RegisterForDrag("LeftButton") - this:StartMoving() - this:StopMovingOrSizing() - - - - - - - - - - - - - - - - - SmallMoneyFrame_OnLoad() - MoneyFrame_SetType("STATIC") - - - - - - - - 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 @@