diff --git a/Auctionator.lua b/Auctionator.lua index 9b11399..2bb9eb3 100644 --- a/Auctionator.lua +++ b/Auctionator.lua @@ -165,10 +165,18 @@ end function Auctionator_ContainerFrameItemButton_OnClick(button) - if AuctionFrameBrowse:IsVisible() and IsShiftKeyDown() and not ChatFrameEditBox:IsVisible() and button == "LeftButton" then + if button == "LeftButton" + and IsShiftKeyDown() + and not ChatFrameEditBox:IsVisible() + and (PanelTemplates_GetSelectedTab(AuctionFrame) == 1 or PanelTemplates_GetSelectedTab(AuctionFrame) == Auctionator.tabs.buy.index) + then local itemLink = GetContainerItemLink(this:GetParent():GetID(), this:GetID()) local itemName = string.gsub(itemLink, "^.-%[(.*)%].*", "%1") - BrowseName:SetText(itemName) + if PanelTemplates_GetSelectedTab(AuctionFrame) == 1 then + BrowseName:SetText(itemName) + elseif PanelTemplates_GetSelectedTab(AuctionFrame) == Auctionator.tabs.buy.index then + AuctionatorBuySearchBox:SetText(itemName) + end else Auctionator_Orig_ContainerFrameItemButton_OnClick(button) @@ -513,17 +521,18 @@ function Auctionator_RefreshEntries() local currentAuctionClass = ItemType2AuctionClass(sType) local currentAuctionSubclass = nil -- SubType2AuctionSubclass(currentAuctionClass, sSubType) - Auctionator_Scan_Start(Auctionator_Scan_CreateQuery{ - name = currentAuctionItemName, - exactMatch = true, - classIndex = currentAuctionClass, - subclassIndex = currentAuctionSubclass, - onComplete = function(data) - processScanResults(data, currentAuctionItemName) - Auctionator_SelectAuctionatorEntry() - Auctionator_UpdateRecommendation() - end - }) + Auctionator_Scan_Start{ + query = Auctionator_Scan_CreateQuery{ + name = currentAuctionItemName, + classIndex = currentAuctionClass, + subclassIndex = currentAuctionSubclass + }, + onComplete = function(data) + processScanResults(data, currentAuctionItemName) + Auctionator_SelectAuctionatorEntry() + Auctionator_UpdateRecommendation() + end + } end ----------------------------------------- @@ -642,19 +651,20 @@ function processScanResults(rawData, auctionItemName) local condData = {} for _,rawDatum in ipairs(rawData) do - - local key = "_"..rawDatum.stackSize.."_"..rawDatum.buyoutPrice - - if condData[key] then - condData[key].count = condData[key].count + 1 - else - condData[key] = { - stackSize = rawDatum.stackSize, - buyoutPrice = rawDatum.buyoutPrice, - itemPrice = rawDatum.buyoutPrice / rawDatum.stackSize, - count = 1, - numYours = rawDatum.owner == UnitName("player") and 1 or 0 - } + if auctionItemName == rawDatum.name and rawDatum.buyoutPrice > 0 then + local key = "_"..rawDatum.stackSize.."_"..rawDatum.buyoutPrice + + if condData[key] then + condData[key].count = condData[key].count + 1 + else + condData[key] = { + stackSize = rawDatum.stackSize, + buyoutPrice = rawDatum.buyoutPrice, + itemPrice = rawDatum.buyoutPrice / rawDatum.stackSize, + count = 1, + numYours = rawDatum.owner == UnitName("player") and 1 or 0 + } + end end end diff --git a/Buy.lua b/Buy.lua index e3e1df3..8d9b54c 100644 --- a/Buy.lua +++ b/Buy.lua @@ -1,61 +1,97 @@ local processScanResults -local processedData +local entries +local selectedEntries = {} +local searchQuery function AuctionatorBuySearchButton_OnClick() - - Auctionator_Scan_Start(Auctionator_Scan_CreateQuery{ + searchQuery = Auctionator_Scan_CreateQuery{ name = AuctionatorBuySearchBox:GetText(), - exactMatch = true, - onComplete = function(data) - processScanResults(data) - Auctionator_Buy_ScrollbarUpdate() + exactMatch = true + } + Auctionator_Scan_Start{ + query = searchQuery, + onComplete = function(data) + processScanResults(data) + Auctionator_Buy_ScrollbarUpdate() + end + } +end + +----------------------------------------- + +function condensedSelection() + local selection = {} + for entry,_ in pairs(selectedEntries) do + local key = "_"..entry.stackSize.."_"..entry.buyoutPrice + + if selection[key] then + selection[key] = selection[key] + 1 + else + selection[key] = 1 end - }) - + end + return selection; +end + +----------------------------------------- + +function AuctionatorBuyBuySelectedButton_OnClick() + local selection = condensedSelection(selectedEntries) + Auctionator_Scan_Start{ + query = searchQuery, + onReadDatum = function(datum) + local key = "_"..datum.stackSize.."_"..datum.buyoutPrice + if selection[key] then + -- Auctionator_Log("match: "..key) + PlaceAuctionBid("list", datum.pageIndex, datum.buyoutPrice) + if selection[key] > 1 then + selection[key] = selection[key] - 1 + else + selection[key] = nil + end + end + end + } end ----------------------------------------- function AuctionatorBuyEntry_OnClick() + local entryIndex = this:GetID() + local entry = entries[entryIndex] + + if Auctionator_SetContains(selectedEntries, entry) then + Auctionator_RemoveFromSet(selectedEntries, entry) + else + Auctionator_AddToSet(selectedEntries, entry) + end + + Auctionator_Buy_ScrollbarUpdate() + + PlaySound("igMainMenuOptionCheckBoxOn") end ----------------------------------------- function processScanResults(rawData) - processedData = {} - - ----- Condense the scan rawData into a table that has only a single entry per stacksize/price combo - - local condData = {} + entries = {} for _,rawDatum in ipairs(rawData) do - - local key = "_"..rawDatum.stackSize.."_"..rawDatum.buyoutPrice - - if condData[key] then - condData[key].count = condData[key].count + 1 - else - condData[key] = { + + if rawDatum.buyoutPrice > 0 then + tinsert(entries, { stackSize = rawDatum.stackSize, buyoutPrice = rawDatum.buyoutPrice, itemPrice = rawDatum.buyoutPrice / rawDatum.stackSize, count = 1, numYours = rawDatum.owner == UnitName("player") and 1 or 0 - } + }) end end - - ----- create a table of these entries sorted by itemPrice - local n = 1 - for _,condDatum in pairs(condData) do - processedData[n] = condDatum - n = n + 1 - end - - table.sort(processedData, function(a,b) return a.itemPrice < b.itemPrice end) + table.sort(entries, function(a,b) return a.itemPrice < b.itemPrice end) end ----------------------------------------- @@ -66,10 +102,10 @@ function Auctionator_Buy_ScrollbarUpdate() local dataOffset -- an index into our data calculated from the scroll offset local numrows - if not processedData then + if not entries then numrows = 0 else - numrows = getn(processedData) + numrows = getn(entries) end FauxScrollFrame_Update(AuctionatorBuyScrollFrame, numrows, 12, 16); @@ -87,35 +123,35 @@ function Auctionator_Buy_ScrollbarUpdate() lineEntry:SetID(dataOffset) - if dataOffset <= numrows and processedData[dataOffset] then + if dataOffset <= numrows and entries[dataOffset] then - local auctionatorEntry = processedData[dataOffset] + local entry = entries[dataOffset] local lineEntry_avail = getglobal("AuctionatorBuyEntry"..line.."_Availability") local lineEntry_comm = getglobal("AuctionatorBuyEntry"..line.."_Comment") local lineEntry_stack = getglobal("AuctionatorBuyEntry"..line.."_StackPrice") - if selectedAuctionatorEntry and auctionatorEntry.itemPrice == selectedAuctionatorEntry.itemPrice and auctionatorEntry.stackSize == selectedAuctionatorEntry.stackSize then + if Auctionator_SetContains(selectedEntries, entry) then lineEntry:LockHighlight() else lineEntry:UnlockHighlight() end - if auctionatorEntry.numYours == 0 then + if entry.numYours == 0 then lineEntry_comm:SetText("") elseif - auctionatorEntry.numYours == auctionatorEntry.count then + entry.numYours == entry.count then lineEntry_comm:SetText("yours") else - lineEntry_comm:SetText("yours: "..auctionatorEntry.numYours) + lineEntry_comm:SetText("yours: "..entry.numYours) end - local tx = string.format("%i %s of %i", auctionatorEntry.count, Auctionator_PluralizeIf("stack", auctionatorEntry.count), auctionatorEntry.stackSize) + local tx = string.format("%i %s of %i", entry.count, Auctionator_PluralizeIf("stack", entry.count), entry.stackSize) - MoneyFrame_Update("AuctionatorBuyEntry"..line.."_PerItem_Price", Auctionator_Round(auctionatorEntry.buyoutPrice/auctionatorEntry.stackSize)) + MoneyFrame_Update("AuctionatorBuyEntry"..line.."_PerItem_Price", Auctionator_Round(entry.buyoutPrice/entry.stackSize)) lineEntry_avail:SetText(tx) - lineEntry_stack:SetText(Auctionator_PriceToString(auctionatorEntry.buyoutPrice)) + lineEntry_stack:SetText(Auctionator_PriceToString(entry.buyoutPrice)) lineEntry:Show() else diff --git a/Buy.xml b/Buy.xml index fa20289..8331e74 100644 --- a/Buy.xml +++ b/Buy.xml @@ -110,15 +110,15 @@ - + diff --git a/Core.lua b/Core.lua index 2ea1930..ad58690 100644 --- a/Core.lua +++ b/Core.lua @@ -74,6 +74,20 @@ end ----------------------------------------- +function Auctionator_AddToSet(set, key) + set[key] = true +end + +function Auctionator_RemoveFromSet(set, key) + set[key] = nil +end + +function Auctionator_SetContains(set, key) + return set[key] ~= nil +end + +----------------------------------------- + function Auctionator_OnLoad() Auctionator_Log("Auctionator Loaded") AuctionatorLoaded = true diff --git a/Scan.lua b/Scan.lua index e56f2ed..4dcad77 100644 --- a/Scan.lua +++ b/Scan.lua @@ -4,7 +4,7 @@ local STATE_POSTQUERY = 2 local NUM_AUCTION_ITEMS_PER_PAGE = 50 -local currentQuery +local currentJob local currentPage local state = STATE_IDLE @@ -23,27 +23,28 @@ end ----------------------------------------- -function Auctionator_Scan_Complete() - - if currentQuery.onComplete then - currentQuery.onComplete(scanData) +function Auctionator_Scan_Complete() + if state ~= STATE_IDLE then + if currentJob.onComplete then + currentJob.onComplete(scanData) + end + + currentJob = nil + currentPage = nil + scanData = nil + state = STATE_IDLE end - - currentQuery = nil - currentPage = nil - scanData = nil - state = STATE_IDLE end ----------------------------------------- function Auctionator_Scan_Abort() - if currentQuery and currentQuery.onAbort then - currentQuery.onAbort() + if currentJob and currentJob.onAbort then + currentJob.onAbort() end - currentQuery = nil + currentJob = nil currentPage = nil scanData = nil state = STATE_IDLE @@ -51,7 +52,7 @@ end ----------------------------------------- -function Auctionator_Scan_Start(query) +function Auctionator_Scan_Start(job) Auctionator_SetMessage("Scanning auctions ...") @@ -59,7 +60,7 @@ function Auctionator_Scan_Start(query) Auctionator_Scan_Abort() end - currentQuery = query + currentJob = job currentPage = 0 scanData = {} state = STATE_PREQUERY @@ -70,7 +71,6 @@ end function Auctionator_Scan_CreateQuery(parameterMap) local query = { name = nil, - exactMatch = false, minLevel = "", maxLevel = "", invTypeIndex = nil, @@ -91,15 +91,15 @@ end function submitQuery() QueryAuctionItems( - currentQuery.name, - currentQuery.minLevel, - currentQuery.maxLevel, - currentQuery.invTypeIndex, - currentQuery.classIndex, - currentQuery.subclassIndex, + currentJob.query.name, + currentJob.query.minLevel, + currentJob.query.maxLevel, + currentJob.query.invTypeIndex, + currentJob.query.classIndex, + currentJob.query.subclassIndex, currentPage, - currentQuery.isUsable, - currentQuery.qualityIndex + currentJob.query.isUsable, + currentJob.query.qualityIndex ) state = STATE_POSTQUERY currentPage = currentPage + 1 @@ -138,14 +138,14 @@ function processQueryResults() bidAmount = bidAmount, highBidder = highBidder, owner = owner, - duration = duration + duration = duration, + page = currentPage, + pageIndex = i } - if not currentQuery.exactMatch or (currentQuery.name == scanDatum.name and scanDatum.buyoutPrice > 0) then -- TODO separate option for buyout price - tinsert(scanData, scanDatum) - if currentQuery.onReadDatum then - currentQuery.onReadDatum(scanDatum) - end + tinsert(scanData, scanDatum) + if currentJob.onReadDatum then + currentJob.onReadDatum(scanDatum) end end