vanilla-wow-addons – Rev 1
?pathlinks?
--[[
Auctioneer Addon for World of Warcraft(tm).
Version: 3.9.0.1000 (Kangaroo)
Revision: $Id: AuctionFrameSearch.lua 980 2006-08-31 05:29:48Z mentalpower $
Auctioneer Search Auctions tab
License:
This program is free software; you can redistribute it and/or
modify it under the terms of the GNU General Public License
as published by the Free Software Foundation; either version 2
of the License, or (at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program(see GPL.txt); if not, write to the Free Software
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
--]]
local TIME_LEFT_NAMES =
{
AUCTION_TIME_LEFT1, -- Short
AUCTION_TIME_LEFT2, -- Medium
AUCTION_TIME_LEFT3, -- Long
AUCTION_TIME_LEFT4 -- Very Long
};
local AUCTION_STATUS_UNKNOWN = 1;
local AUCTION_STATUS_HIGH_BIDDER = 2;
local AUCTION_STATUS_NOT_FOUND = 3;
local AUCTION_STATUS_BIDDING = 4;
-------------------------------------------------------------------------------
-------------------------------------------------------------------------------
function AuctionFrameSearch_OnLoad()
-- Methods
this.SearchBids = AuctionFrameSearch_SearchBids;
this.SearchBuyouts = AuctionFrameSearch_SearchBuyouts;
this.SearchCompetition = AuctionFrameSearch_SearchCompetition;
this.SearchPlain = AuctionFrameSearch_SearchPlain;
this.SelectResultByIndex = AuctionFrameSearch_SelectResultByIndex;
-- Controls
this.savedSearchDropDown = getglobal(this:GetName().."SavedSearchDropDown");
this.searchDropDown = getglobal(this:GetName().."SearchDropDown");
this.bidFrame = getglobal(this:GetName().."Bid");
this.buyoutFrame = getglobal(this:GetName().."Buyout");
this.competeFrame = getglobal(this:GetName().."Compete");
this.plainFrame = getglobal(this:GetName().."Plain");
this.resultsList = getglobal(this:GetName().."List");
this.bidButton = getglobal(this:GetName().."BidButton");
this.buyoutButton = getglobal(this:GetName().."BuyoutButton");
this.pendingBidStatusText = getglobal(this:GetName().."PendingBidStatusText");
-- Data members
this.results = {};
this.resultsType = nil;
this.selectedResult = nil;
-- Initialize the Search drop down
AuctioneerDropDownMenu_Initialize(this.searchDropDown, AuctionFrameSearch_SearchDropDown_Initialize);
AuctionFrameSearch_SearchDropDownItem_SetSelectedID(this.searchDropDown, 1);
-- Configure the logical columns
this.logicalColumns =
{
Quantity =
{
title = _AUCT("UiQuantityHeader");
dataType = "Number";
valueFunc = (function(record) return record.count end);
alphaFunc = AuctionFrameSearch_GetAuctionAlpha;
compareAscendingFunc = (function(record1, record2) return record1.count < record2.count end);
compareDescendingFunc = (function(record1, record2) return record1.count > record2.count end);
},
Name =
{
title = _AUCT("UiNameHeader");
dataType = "String";
valueFunc = (function(record) return record.name end);
colorFunc = AuctionFrameSearch_GetItemColor;
alphaFunc = AuctionFrameSearch_GetAuctionAlpha;
compareAscendingFunc = (function(record1, record2) return record1.name < record2.name end);
compareDescendingFunc = (function(record1, record2) return record1.name > record2.name end);
},
TimeLeft =
{
title = _AUCT("UiTimeLeftHeader");
dataType = "String";
valueFunc = (function(record) return Auctioneer.Util.GetTimeLeftString(record.timeLeft) end);
alphaFunc = AuctionFrameSearch_GetAuctionAlpha;
compareAscendingFunc = (function(record1, record2) return record1.timeLeft < record2.timeLeft end);
compareDescendingFunc = (function(record1, record2) return record1.timeLeft > record2.timeLeft end);
},
Bid =
{
title = _AUCT("UiBidHeader");
dataType = "Money";
valueFunc = (function(record) return record.bid end);
alphaFunc = AuctionFrameSearch_GetAuctionAlpha;
compareAscendingFunc = (function(record1, record2) return record1.bid < record2.bid end);
compareDescendingFunc = (function(record1, record2) return record1.bid > record2.bid end);
},
BidPer =
{
title = _AUCT("UiBidPerHeader");
dataType = "Money";
valueFunc = (function(record) return record.bidPer end);
alphaFunc = AuctionFrameSearch_GetAuctionAlpha;
compareAscendingFunc = (function(record1, record2) return record1.bidPer < record2.bidPer end);
compareDescendingFunc = (function(record1, record2) return record1.bidPer > record2.bidPer end);
},
Buyout =
{
title = _AUCT("UiBuyoutHeader");
dataType = "Money";
valueFunc = (function(record) return record.buyout end);
alphaFunc = AuctionFrameSearch_GetAuctionAlpha;
compareAscendingFunc = (function(record1, record2) return record1.buyout < record2.buyout end);
compareDescendingFunc = (function(record1, record2) return record1.buyout > record2.buyout end);
},
BuyoutPer =
{
title = _AUCT("UiBuyoutPerHeader");
dataType = "Money";
valueFunc = (function(record) return record.buyoutPer end);
alphaFunc = AuctionFrameSearch_GetAuctionAlpha;
compareAscendingFunc = (function(record1, record2) return record1.buyoutPer < record2.buyoutPer end);
compareDescendingFunc = (function(record1, record2) return record1.buyoutPer > record2.buyoutPer end);
},
Profit =
{
title = _AUCT("UiProfitHeader");
dataType = "Money";
valueFunc = (function(record) return record.profit end);
alphaFunc = AuctionFrameSearch_GetAuctionAlpha;
compareAscendingFunc = (function(record1, record2) return record1.profit < record2.profit end);
compareDescendingFunc = (function(record1, record2) return record1.profit > record2.profit end);
},
ProfitPer =
{
title = _AUCT("UiProfitPerHeader");
dataType = "Money";
valueFunc = (function(record) return record.profitPer end);
alphaFunc = AuctionFrameSearch_GetAuctionAlpha;
compareAscendingFunc = (function(record1, record2) return record1.profitPer < record2.profitPer end);
compareDescendingFunc = (function(record1, record2) return record1.profitPer > record2.profitPer end);
},
PercentLess =
{
title = _AUCT("UiPercentLessHeader");
dataType = "Number";
valueFunc = (function(record) return record.percentLess end);
alphaFunc = AuctionFrameSearch_GetAuctionAlpha;
compareAscendingFunc = (function(record1, record2) return record1.percentLess < record2.percentLess end);
compareDescendingFunc = (function(record1, record2) return record1.percentLess > record2.percentLess end);
},
ItemLevel =
{
title = _AUCT("UiItemLevelHeader");
dataType = "Number";
valueFunc = (function(record) return record.level end);
alphaFunc = AuctionFrameSearch_GetAuctionAlpha;
compareAscendingFunc = (function(record1, record2) return record1.level < record2.level end);
compareDescendingFunc = (function(record1, record2) return record1.level > record2.level end);
},
};
-- Configure the bid search physical columns
this.bidSearchPhysicalColumns =
{
{
width = 50;
logicalColumn = this.logicalColumns.Quantity;
logicalColumns = { this.logicalColumns.Quantity };
sortAscending = true;
},
{
width = 160;
logicalColumn = this.logicalColumns.Name;
logicalColumns = { this.logicalColumns.Name };
sortAscending = true;
},
{
width = 90;
logicalColumn = this.logicalColumns.TimeLeft;
logicalColumns = { this.logicalColumns.TimeLeft };
sortAscending = true;
},
{
width = 130;
logicalColumn = this.logicalColumns.Bid;
logicalColumns =
{
this.logicalColumns.Bid,
this.logicalColumns.BidPer
};
sortAscending = true;
},
{
width = 130;
logicalColumn = this.logicalColumns.Profit;
logicalColumns =
{
this.logicalColumns.Profit,
this.logicalColumns.ProfitPer,
this.logicalColumns.Buyout,
this.logicalColumns.BuyoutPer
};
sortAscending = true;
},
{
width = 50;
logicalColumn = this.logicalColumns.PercentLess;
logicalColumns =
{
this.logicalColumns.PercentLess
};
sortAscending = true;
},
};
-- Configure the buyout search physical columns
this.buyoutSearchPhysicalColumns =
{
{
width = 50;
logicalColumn = this.logicalColumns.Quantity;
logicalColumns = { this.logicalColumns.Quantity };
sortAscending = true;
},
{
width = 250;
logicalColumn = this.logicalColumns.Name;
logicalColumns = { this.logicalColumns.Name };
sortAscending = true;
},
{
width = 130;
logicalColumn = this.logicalColumns.Buyout;
logicalColumns =
{
this.logicalColumns.Bid,
this.logicalColumns.BidPer,
this.logicalColumns.Buyout,
this.logicalColumns.BuyoutPer
};
sortAscending = true;
},
{
width = 130;
logicalColumn = this.logicalColumns.Profit;
logicalColumns =
{
this.logicalColumns.Bid,
this.logicalColumns.BidPer,
this.logicalColumns.Profit,
this.logicalColumns.ProfitPer
};
sortAscending = true;
},
{
width = 50;
logicalColumn = this.logicalColumns.PercentLess;
logicalColumns =
{
this.logicalColumns.PercentLess
};
sortAscending = true;
},
};
-- Configure the compete search physical columns
this.competeSearchPhysicalColumns =
{
{
width = 50;
logicalColumn = this.logicalColumns.Quantity;
logicalColumns = { this.logicalColumns.Quantity };
sortAscending = true;
},
{
width = 250;
logicalColumn = this.logicalColumns.Name;
logicalColumns = { this.logicalColumns.Name };
sortAscending = true;
},
{
width = 130;
logicalColumn = this.logicalColumns.Bid;
logicalColumns =
{
this.logicalColumns.Bid,
this.logicalColumns.BidPer
};
sortAscending = true;
},
{
width = 130;
logicalColumn = this.logicalColumns.Buyout;
logicalColumns =
{
this.logicalColumns.Buyout,
this.logicalColumns.BuyoutPer
};
sortAscending = true;
},
{
width = 50;
logicalColumn = this.logicalColumns.PercentLess;
logicalColumns =
{
this.logicalColumns.PercentLess
};
sortAscending = true;
},
};
-- Configure the plain search physical columns
this.plainSearchPhysicalColumns =
{
{
width = 50;
logicalColumn = this.logicalColumns.Quantity;
logicalColumns = { this.logicalColumns.Quantity };
sortAscending = true;
},
{
width = 160;
logicalColumn = this.logicalColumns.Name;
logicalColumns = { this.logicalColumns.Name };
sortAscending = true;
},
{
width = 90;
logicalColumn = this.logicalColumns.TimeLeft;
logicalColumns = { this.logicalColumns.TimeLeft };
sortAscending = true;
},
{
width = 130;
logicalColumn = this.logicalColumns.Bid;
logicalColumns =
{
this.logicalColumns.Bid,
this.logicalColumns.BidPer,
this.logicalColumns.Buyout,
this.logicalColumns.BuyoutPer
};
sortAscending = true;
},
{
width = 130;
logicalColumn = this.logicalColumns.Buyout;
logicalColumns =
{
this.logicalColumns.Profit,
this.logicalColumns.ProfitPer,
this.logicalColumns.Buyout,
this.logicalColumns.BuyoutPer
};
sortAscending = true;
},
{
width = 50;
logicalColumn = this.logicalColumns.PercentLess;
logicalColumns =
{
this.logicalColumns.PercentLess,
this.logicalColumns.ItemLevel
};
sortAscending = true;
},
};
-- Initialize the list to show nothing at first.
ListTemplate_Initialize(this.resultsList, this.results, this.results);
this:SelectResultByIndex(nil);
end
-------------------------------------------------------------------------------
-------------------------------------------------------------------------------
function AuctionFrameSearch_OnShow()
AuctionFrameSearch_UpdatePendingBidStatus(this);
end
-------------------------------------------------------------------------------
-------------------------------------------------------------------------------
AUCTIONEER_SEARCH_TYPES = {}
function AuctionFrameSearch_SearchDropDown_Initialize()
local dropdown = this:GetParent();
local frame = dropdown:GetParent();
AUCTIONEER_SEARCH_TYPES[1] = _AUCT("UiSearchTypeBids");
AUCTIONEER_SEARCH_TYPES[2] = _AUCT("UiSearchTypeBuyouts");
AUCTIONEER_SEARCH_TYPES[3] = _AUCT("UiSearchTypeCompetition");
AUCTIONEER_SEARCH_TYPES[4] = _AUCT("UiSearchTypePlain");
for i=1, 4 do
UIDropDownMenu_AddButton({
text = AUCTIONEER_SEARCH_TYPES[i],
func = AuctionFrameSearch_SearchDropDownItem_OnClick,
owner = dropdown
})
end
end
-------------------------------------------------------------------------------
-------------------------------------------------------------------------------
function AuctionFrameSearch_MinQualityDropDown_Initialize()
local dropdown = this:GetParent();
local frame = dropdown:GetParent();
for i=0, 6 do
UIDropDownMenu_AddButton({
text = getglobal("ITEM_QUALITY"..i.."_DESC"),
func = AuctionFrameSearch_MinQualityDropDownItem_OnClick,
value = i,
owner = dropdown
});
end
end
-------------------------------------------------------------------------------
-------------------------------------------------------------------------------
function AuctionFrameSearch_SavedSearchDropDownItem_OnClick()
local index = this:GetID();
local dropdown = this.owner;
local frame = dropdown:GetParent();
local frameName = frame:GetName();
local text = "";
if (index > 1) then
text = this.value
local searchData = AuctionConfig.SavedSearches[text];
local searchParams = Auctioneer.Util.Split(searchData, "\t");
local searchType = tonumber(searchParams[1])
getglobal(frameName.."SearchDropDown").selectedID = searchType;
getglobal(frameName.."SearchDropDownText"):SetText(AUCTIONEER_SEARCH_TYPES[searchType]);
frame.bidFrame:Hide();
frame.buyoutFrame:Hide();
frame.competeFrame:Hide();
frame.plainFrame:Hide();
if (searchType == 1) then
-- Bid search
MoneyInputFrame_SetCopper(getglobal(frameName.."BidMinProfit"), tonumber(searchParams[2]))
getglobal(frameName.."BidMinPercentLessEdit"):SetText(searchParams[3])
local timeLeft = tonumber(searchParams[4]) or 2
AuctioneerDropDownMenu_Initialize(getglobal(frameName.."BidTimeLeftDropDown"), AuctionFrameSearch_TimeLeftDropDown_Initialize);
AuctioneerDropDownMenu_SetSelectedID(getglobal(frameName.."BidTimeLeftDropDown"), timeLeft);
local catid = tonumber(searchParams[5]) or 1
local catName = ""
if (AuctionConfig.classes[catid-1]) then catName = AuctionConfig.classes[catid-1].name end
AuctioneerDropDownMenu_Initialize(getglobal(frameName.."BidCategoryDropDown"), AuctionFrameSearch_CategoryDropDown_Initialize);
AuctioneerDropDownMenu_SetSelectedID(getglobal(frameName.."BidCategoryDropDown"), catid);
local quality = tonumber(searchParams[6]) or 1
AuctioneerDropDownMenu_Initialize(getglobal(frameName.."BidMinQualityDropDown"), AuctionFrameSearch_MinQualityDropDown_Initialize);
AuctioneerDropDownMenu_SetSelectedID(getglobal(frameName.."BidMinQualityDropDown"), quality);
getglobal(frameName.."BidSearchEdit"):SetText(searchParams[7])
frame.bidFrame:Show();
elseif (searchType == 2) then
-- Buyout search
MoneyInputFrame_SetCopper(getglobal(frameName.."BuyoutMinProfit"), tonumber(searchParams[2]))
getglobal(frameName.."BuyoutMinPercentLessEdit"):SetText(searchParams[3])
local catid = tonumber(searchParams[4]) or 1
local catName = ""
if (AuctionConfig.classes[catid-1]) then catName = AuctionConfig.classes[catid-1].name end
AuctioneerDropDownMenu_Initialize(getglobal(frameName.."BuyoutCategoryDropDown"), AuctionFrameSearch_CategoryDropDown_Initialize);
AuctioneerDropDownMenu_SetSelectedID(getglobal(frameName.."BuyoutCategoryDropDown"), catid);
local quality = tonumber(searchParams[5]) or 1
AuctioneerDropDownMenu_Initialize(getglobal(frameName.."BuyoutMinQualityDropDown"), AuctionFrameSearch_MinQualityDropDown_Initialize);
AuctioneerDropDownMenu_SetSelectedID(getglobal(frameName.."BuyoutMinQualityDropDown"), quality);
getglobal(frameName.."BuyoutSearchEdit"):SetText(searchParams[6])
frame.buyoutFrame:Show();
elseif (searchType == 3) then
-- Compete search
MoneyInputFrame_SetCopper(getglobal(frameName.."CompeteUndercut"), tonumber(searchParams[2]))
frame.competeFrame:Show();
elseif (searchType == 4) then
-- Plain search
MoneyInputFrame_SetCopper(getglobal(frameName.."PlainMaxPrice"), tonumber(searchParams[2]))
local catid = tonumber(searchParams[3]) or 1
local catName = ""
if (AuctionConfig.classes[catid-1]) then catName = AuctionConfig.classes[catid-1].name end
AuctioneerDropDownMenu_Initialize(getglobal(frameName.."PlainCategoryDropDown"), AuctionFrameSearch_CategoryDropDown_Initialize);
AuctioneerDropDownMenu_SetSelectedID(getglobal(frameName.."PlainCategoryDropDown"), catid);
local quality = tonumber(searchParams[4]) or 1
AuctioneerDropDownMenu_Initialize(getglobal(frameName.."PlainMinQualityDropDown"), AuctionFrameSearch_MinQualityDropDown_Initialize);
AuctioneerDropDownMenu_SetSelectedID(getglobal(frameName.."PlainMinQualityDropDown"), quality);
getglobal(frameName.."PlainSearchEdit"):SetText(searchParams[5])
frame.plainFrame:Show();
end
end
getglobal(frameName.."SaveSearchEdit"):SetText(text);
AuctioneerDropDownMenu_SetSelectedID(dropdown, index);
end
-------------------------------------------------------------------------------
-------------------------------------------------------------------------------
function AuctionFrameSearch_SavedSearchDropDown_Initialize()
local dropdown = AuctionFrameSearchSavedSearchDropDown
local frame = dropdown:GetParent()
if (not AuctionConfig.SavedSearches) then
UIDropDownMenu_AddButton({
text = "",
func = AuctionFrameSearch_SavedSearchDropDownItem_OnClick,
owner = dropdown
});
return
end
local savedSearchDropDownElements = {}
for name, search in pairs(AuctionConfig.SavedSearches) do
table.insert(savedSearchDropDownElements, name);
end
table.sort(savedSearchDropDownElements);
UIDropDownMenu_AddButton({
text = "",
func = AuctionFrameSearch_SavedSearchDropDownItem_OnClick,
owner = dropdown
});
for pos, name in pairs(savedSearchDropDownElements) do
UIDropDownMenu_AddButton({
text = name,
func = AuctionFrameSearch_SavedSearchDropDownItem_OnClick,
owner = dropdown
});
end
end
-------------------------------------------------------------------------------
-------------------------------------------------------------------------------
function AuctionFrameSearch_MinQualityDropDownItem_OnClick()
local index = this:GetID();
local dropdown = this.owner;
AuctioneerDropDownMenu_SetSelectedID(dropdown, index);
end
-------------------------------------------------------------------------------
-------------------------------------------------------------------------------
function AuctionFrameSearch_SearchDropDownItem_OnClick()
local index = this:GetID();
local dropdown = this.owner;
AuctionFrameSearch_SearchDropDownItem_SetSelectedID(dropdown, index);
end
-------------------------------------------------------------------------------
-------------------------------------------------------------------------------
function AuctionFrameSearch_SearchDropDownItem_SetSelectedID(dropdown, index)
local frame = dropdown:GetParent();
frame.bidFrame:Hide();
frame.buyoutFrame:Hide();
frame.competeFrame:Hide();
frame.plainFrame:Hide();
if (index == 1) then
frame.bidFrame:Show();
elseif (index == 2) then
frame.buyoutFrame:Show();
elseif (index == 3) then
frame.competeFrame:Show();
elseif (index == 4) then
frame.plainFrame:Show();
end
AuctioneerDropDownMenu_SetSelectedID(dropdown, index);
end
-------------------------------------------------------------------------------
-------------------------------------------------------------------------------
function AuctionFrameSearch_RemoveSearchButton_OnClick(button)
local frame = button:GetParent();
local frameName = frame:GetName();
local searchName = getglobal(frameName.."SaveSearchEdit"):GetText()
if (AuctionConfig.SavedSearches) then
AuctionConfig.SavedSearches[searchName] = nil
end
getglobal(frameName.."SaveSearchEdit"):SetText("")
end
-------------------------------------------------------------------------------
-------------------------------------------------------------------------------
function AuctionFrameSearch_SaveSearchButton_OnClick(button)
local frame = button:GetParent();
local frameName = frame:GetName();
local searchDropdown = getglobal(frameName.."SearchDropDown")
local searchType = UIDropDownMenu_GetSelectedID(searchDropdown);
local searchData = nil
if (searchType == 1) then
-- Bid-based search
searchData = string.format("%d\t%d\t%s\t%d\t%d\t%d\t%s",
searchType,
MoneyInputFrame_GetCopper(getglobal(frameName.."BidMinProfit")),
getglobal(frameName.."BidMinPercentLessEdit"):GetText(),
UIDropDownMenu_GetSelectedID(getglobal(frameName.."BidTimeLeftDropDown")),
UIDropDownMenu_GetSelectedID(getglobal(frameName.."BidCategoryDropDown")),
UIDropDownMenu_GetSelectedID(getglobal(frameName.."BidMinQualityDropDown")),
getglobal(frameName.."BidSearchEdit"):GetText()
);
elseif (searchType == 2) then
-- Buyout-based search
searchData = string.format("%d\t%d\t%s\t%d\t%d\t%s",
searchType,
MoneyInputFrame_GetCopper(getglobal(frameName.."BuyoutMinProfit")),
getglobal(frameName.."BuyoutMinPercentLessEdit"):GetText(),
UIDropDownMenu_GetSelectedID(getglobal(frameName.."BuyoutCategoryDropDown")),
UIDropDownMenu_GetSelectedID(getglobal(frameName.."BuyoutMinQualityDropDown")),
getglobal(frameName.."BuyoutSearchEdit"):GetText()
);
elseif (searchType == 3) then
-- Compete-based search
searchData = string.format("%d\t%d",
searchType,
MoneyInputFrame_GetCopper(getglobal(frameName.."CompeteUndercut"))
);
elseif (searchType == 4) then
-- Plain-based search
searchData = string.format("%d\t%d\t%d\t%d\t%s",
searchType,
MoneyInputFrame_GetCopper(getglobal(frameName.."PlainMaxPrice")),
UIDropDownMenu_GetSelectedID(getglobal(frameName.."PlainCategoryDropDown")),
UIDropDownMenu_GetSelectedID(getglobal(frameName.."PlainMinQualityDropDown")),
getglobal(frameName.."PlainSearchEdit"):GetText()
);
end
if (searchData) then
local searchName = getglobal(frameName.."SaveSearchEdit"):GetText()
if (not AuctionConfig.SavedSearches) then
AuctionConfig.SavedSearches = {}
end
AuctionConfig.SavedSearches[searchName] = searchData
end
end
-------------------------------------------------------------------------------
-- The Bid button has been clicked
-------------------------------------------------------------------------------
function AuctionFrameSearch_BidButton_OnClick(button)
local frame = button:GetParent();
local result = frame.selectedResult;
if (result and result.name and result.count and result.bid) then
result.status = AUCTION_STATUS_BIDDING;
result.pendingBidCount = result.pendingBidCount + 1;
local bidLimit = Auctioneer.Command.GetFilterVal('bid-limit');
local context = { frame = frame, auction = result };
AucBidManager.BidAuction(result.bid, result.signature, bidLimit, AuctionFrameSearch_OnBidResult, context);
AuctionFrameSearch_UpdateButtons(frame);
AuctionFrameSearch_UpdatePendingBidStatus(frame);
ListTemplateScrollFrame_Update(getglobal(frame.resultsList:GetName().."ScrollFrame"));
end
end
-------------------------------------------------------------------------------
-- The Buyout button has been clicked.
-------------------------------------------------------------------------------
function AuctionFrameSearch_BuyoutButton_OnClick(button)
local frame = button:GetParent();
local result = frame.selectedResult;
if (result and result.name and result.count and result.buyout) then
result.status = AUCTION_STATUS_BIDDING;
result.pendingBidCount = result.pendingBidCount + 1;
local bidLimit = Auctioneer.Command.GetFilterVal('bid-limit');
local context = { frame = frame, auction = result };
AucBidManager.BidAuction(result.buyout, result.signature, bidLimit, AuctionFrameSearch_OnBidResult, context);
AuctionFrameSearch_UpdateButtons(frame);
AuctionFrameSearch_UpdatePendingBidStatus(frame);
ListTemplateScrollFrame_Update(getglobal(frame.resultsList:GetName().."ScrollFrame"));
end
end
-------------------------------------------------------------------------------
-- Updates the pending bid status text
-------------------------------------------------------------------------------
function AuctionFrameSearch_UpdatePendingBidStatus(frame)
local count = AucBidManager.GetRequestCount();
if (count == 1) then
frame.pendingBidStatusText:SetText(_AUCT('UiPendingBidInProgress'));
elseif (count > 1) then
local output = string.format(_AUCT('UiPendingBidsInProgress'), count);
frame.pendingBidStatusText:SetText(output);
elseif (frame.pendingBidStatusText:GetText() ~= "") then
frame.pendingBidStatusText:SetText(_AUCT('UiNoPendingBids'));
end
end
-------------------------------------------------------------------------------
-- Returns the item color for the specified result
-------------------------------------------------------------------------------
function AuctionFrameSearch_GetItemColor(result)
_, _, rarity = GetItemInfo(result.item);
if (rarity) then
return ITEM_QUALITY_COLORS[rarity];
end
return { r = 1.0, g = 1.0, b = 1.0 };
end
-------------------------------------------------------------------------------
-- Perform a bid search (aka bidBroker)
-------------------------------------------------------------------------------
function AuctionFrameSearch_SearchBids(frame, minProfit, minPercentLess, maxTimeLeft, category, minQuality, itemName)
-- Create the content from auctioneer.
frame.results = {};
local itemNames = Auctioneer.Util.Split(itemName, "|");
local bidWorthyAuctions = Auctioneer.Filter.QuerySnapshot(Auctioneer.Filter.BidBrokerFilter, minProfit, maxTimeLeft, category, minQuality, itemNames);
if (bidWorthyAuctions) then
local player = UnitName("player");
for pos,a in pairs(bidWorthyAuctions) do
if (a.owner ~= player) then
local id,rprop,enchant,name, count,min,buyout,uniq = Auctioneer.Core.GetItemSignature(a.signature);
local itemKey = id .. ":" .. rprop..":"..enchant;
local hsp, seenCount = Auctioneer.Statistic.GetHSP(itemKey, Auctioneer.Util.GetAuctionKey());
local currentBid = Auctioneer.Statistic.GetCurrentBid(a.signature);
-- rounding down the hsp, to get a better selling price
local hspBuyout = Auctioneer.Statistic.RoundDownTo95(hsp * count);
local percentLess = 100 - math.floor(100 * currentBid / (hspBuyout));
if (percentLess >= minPercentLess) then
local auction = {};
auction.id = id;
auction.item = string.format("item:%s:%s:%s:0", id, enchant, rprop);
auction.link = a.itemLink;
auction.name = name;
auction.count = count;
auction.owner = a.owner;
auction.timeLeft = a.timeLeft;
auction.bid = currentBid;
auction.bidPer = math.floor(auction.bid / count);
auction.buyout = buyout;
auction.buyoutPer = math.floor(auction.buyout / count);
auction.profit = hspBuyout - currentBid;
auction.profitPer = math.floor(auction.profit / count);
auction.percentLess = percentLess;
auction.signature = a.signature;
if (a.highBidder) then
auction.status = AUCTION_STATUS_HIGH_BIDDER;
else
auction.status = AUCTION_STATUS_UNKNOWN;
end
auction.pendingBidCount = 0;
table.insert(frame.results, auction);
end
end
end
end
-- Hand the updated results to the list.
frame.resultsType = "BidSearch";
frame:SelectResultByIndex(nil);
ListTemplate_Initialize(frame.resultsList, frame.bidSearchPhysicalColumns, frame.auctioneerListLogicalColumns);
ListTemplate_SetContent(frame.resultsList, frame.results);
ListTemplate_Sort(frame.resultsList, 2);
ListTemplate_Sort(frame.resultsList, 3);
end
-------------------------------------------------------------------------------
-- Perform a buyout search (aka percentLess)
-------------------------------------------------------------------------------
function AuctionFrameSearch_SearchBuyouts(frame, minProfit, minPercentLess, category, minQuality, itemName)
-- Create the content from auctioneer.
frame.results = {};
local itemNames = Auctioneer.Util.Split(itemName, "|");
local buyoutWorthyAuctions = Auctioneer.Filter.QuerySnapshot(Auctioneer.Filter.PercentLessFilter, minPercentLess, category, minQuality, itemNames);
if (buyoutWorthyAuctions) then
local player = UnitName("player");
for pos,a in pairs(buyoutWorthyAuctions) do
if (a.owner ~= player) then
local id,rprop,enchant,name,count,min,buyout,uniq = Auctioneer.Core.GetItemSignature(a.signature);
local itemKey = id .. ":" .. rprop..":"..enchant;
local hsp, seenCount = Auctioneer.Statistic.GetHSP(itemKey, Auctioneer.Util.GetAuctionKey());
-- rounding down the hsp, to get a better selling price
local hspBuyout = Auctioneer.Statistic.RoundDownTo95(hsp * count);
local profit = hspBuyout - buyout;
if (profit >= minProfit) then
local auction = {};
auction.id = id;
auction.item = string.format("item:%s:%s:%s:0", id, enchant, rprop);
auction.link = a.itemLink;
auction.name = name;
auction.count = count;
auction.owner = a.owner;
auction.timeLeft = a.timeLeft;
auction.buyout = buyout;
auction.buyoutPer = math.floor(auction.buyout / count);
auction.profit = profit;
auction.profitPer = math.floor(auction.profit / count);
auction.percentLess = 100 - math.floor(100 * buyout / hspBuyout);
auction.signature = a.signature;
if (a.highBidder) then
auction.status = AUCTION_STATUS_HIGH_BIDDER;
else
auction.status = AUCTION_STATUS_UNKNOWN;
end
auction.pendingBidCount = 0;
table.insert(frame.results, auction);
end
end
end
end
-- Hand the updated content to the list.
frame.resultsType = "BuyoutSearch";
frame:SelectResultByIndex(nil);
ListTemplate_Initialize(frame.resultsList, frame.buyoutSearchPhysicalColumns, frame.auctioneerListLogicalColumns);
ListTemplate_SetContent(frame.resultsList, frame.results);
ListTemplate_Sort(frame.resultsList, 5);
end
-------------------------------------------------------------------------------
-- Perform a competition search (aka compete)
-------------------------------------------------------------------------------
function AuctionFrameSearch_SearchCompetition(frame, minUndercut)
-- Create the content from auctioneer.
frame.results = {};
-- Get the highest prices for my auctions.
local myAuctions = Auctioneer.Filter.QuerySnapshot(Auctioneer.Filter.AuctionOwnerFilter, UnitName("player"));
local myHighestPrices = {}
local id,rprop,enchant,name,count,min,buyout,uniq,itemKey,competingAuctions,currentBid,buyoutForOne,bidForOne,bidPrice,myBuyout,buyPrice,myPrice,priceLess,lessPrice,output;
if (myAuctions) then
for pos,a in pairs(myAuctions) do
id,rprop,enchant, name, count,min,buyout,uniq = Auctioneer.Core.GetItemSignature(a.signature);
if (count > 1) then buyout = buyout/count; end
itemKey = id .. ":" .. rprop..":"..enchant;
if (not myHighestPrices[itemKey]) or (myHighestPrices[itemKey] < buyout) then
myHighestPrices[itemKey] = buyout;
end
end
end
-- Search for competing auctions less than mine.
competingAuctions = Auctioneer.Filter.QuerySnapshot(Auctioneer.Filter.CompetingFilter, minUndercut, myHighestPrices);
if (competingAuctions) then
table.sort(competingAuctions, Auctioneer.Statistic.ProfitComparisonSort);
for pos,a in pairs(competingAuctions) do
local id,rprop,enchant,name,count,min,buyout,uniq = Auctioneer.Core.GetItemSignature(a.signature);
local itemKey = id .. ":" .. rprop..":"..enchant;
local myBuyout = myHighestPrices[itemKey];
local currentBid = Auctioneer.Statistic.GetCurrentBid(a.signature);
local auction = {};
auction.id = id;
auction.item = string.format("item:%s:%s:%s:0", id, enchant, rprop);
auction.link = a.itemLink;
auction.name = name;
auction.count = count;
auction.owner = a.owner;
auction.timeLeft = a.timeLeft;
auction.bid = currentBid;
auction.bidPer = math.floor(auction.bid / count);
auction.buyout = buyout;
auction.buyoutPer = math.floor(auction.buyout / count);
auction.percentLess = math.floor(((myBuyout - auction.buyoutPer) / myBuyout) * 100);
auction.signature = a.signature;
if (a.highBidder) then
auction.status = AUCTION_STATUS_HIGH_BIDDER;
else
auction.status = AUCTION_STATUS_UNKNOWN;
end
auction.pendingBidCount = 0;
table.insert(frame.results, auction);
end
end
-- Hand the updated content to the list.
frame.resultsType = "CompeteSearch";
frame:SelectResultByIndex(nil);
ListTemplate_Initialize(frame.resultsList, frame.competeSearchPhysicalColumns, frame.auctioneerListLogicalColumns);
ListTemplate_SetContent(frame.resultsList, frame.results);
end
-------------------------------------------------------------------------------
-- Perform a plain search
-------------------------------------------------------------------------------
function AuctionFrameSearch_SearchPlain(frame, maxPrice, category, minQuality, itemName)
-- Create the content from auctioneer.
frame.results = {};
local itemNames = Auctioneer.Util.Split(itemName, "|");
local bidWorthyAuctions = Auctioneer.Filter.QuerySnapshot(Auctioneer.Filter.PlainFilter, maxPrice, category, minQuality, itemNames);
if (bidWorthyAuctions) then
local player = UnitName("player");
for pos,a in pairs(bidWorthyAuctions) do
if (a.owner ~= player) then
local id,rprop,enchant,name, count,min,buyout,uniq = Auctioneer.Core.GetItemSignature(a.signature);
local itemKey = id .. ":" .. rprop..":"..enchant;
local hsp, seenCount = Auctioneer.Statistic.GetHSP(itemKey, Auctioneer.Util.GetAuctionKey());
local currentBid = Auctioneer.Statistic.GetCurrentBid(a.signature);
-- rounding down the hsp, to get a better selling price
local hspBuyout = Auctioneer.Statistic.RoundDownTo95(hsp * count);
local percentLess = 100 - math.floor(100 * currentBid / hspBuyout);
local _,_,_,iLevel = GetItemInfo(id);
local auction = {};
auction.id = id;
auction.item = string.format("item:%s:%s:%s:0", id, enchant, rprop);
auction.link = a.itemLink;
auction.level = iLevel;
auction.name = name;
auction.count = count;
auction.owner = a.owner;
auction.timeLeft = a.timeLeft;
auction.bid = currentBid;
auction.bidPer = math.floor(auction.bid / count);
auction.buyout = buyout;
auction.buyoutPer = math.floor(auction.buyout / count);
auction.profit = hspBuyout - currentBid;
auction.profitPer = math.floor(auction.profit / count);
auction.percentLess = percentLess;
auction.signature = a.signature;
if (a.highBidder) then
auction.status = AUCTION_STATUS_HIGH_BIDDER;
else
auction.status = AUCTION_STATUS_UNKNOWN;
end
auction.pendingBidCount = 0;
table.insert(frame.results, auction);
end
end
end
-- Hand the updated results to the list.
frame.resultsType = "PlainSearch";
frame:SelectResultByIndex(nil);
ListTemplate_Initialize(frame.resultsList, frame.plainSearchPhysicalColumns, frame.auctioneerListLogicalColumns);
ListTemplate_SetContent(frame.resultsList, frame.results);
ListTemplate_Sort(frame.resultsList, 2);
ListTemplate_Sort(frame.resultsList, 3);
end
-------------------------------------------------------------------------------
-- Select a search result by index.
-------------------------------------------------------------------------------
function AuctionFrameSearch_SelectResultByIndex(frame, index)
if (index and index <= table.getn(frame.results) and frame.resultsType) then
-- Select the item
frame.selectedResult = frame.results[index];
ListTemplate_SelectRow(frame.resultsList, index);
else
-- Clear the selection
frame.selectedResult = nil;
ListTemplate_SelectRow(frame.resultsList, nil);
end
AuctionFrameSearch_UpdateButtons(frame);
end
-------------------------------------------------------------------------------
-- Update the enabled/disabled state of the Bid and Buyout buttons
-------------------------------------------------------------------------------
function AuctionFrameSearch_UpdateButtons(frame)
if (frame.selectedResult) then
if (frame.selectedResult.status == AUCTION_STATUS_UNKNOWN) then
if (frame.resultsType == "BidSearch") then
frame.bidButton:Enable();
frame.buyoutButton:Disable();
elseif (frame.resultsType == "BuyoutSearch") then
frame.bidButton:Disable();
frame.buyoutButton:Enable();
elseif (frame.resultsType == "CompeteSearch") then
frame.bidButton:Enable();
frame.buyoutButton:Enable();
elseif (frame.resultsType == "PlainSearch") then
frame.bidButton:Enable();
frame.buyoutButton:Enable();
else
frame.bidButton:Disable();
frame.buyoutButton:Disable();
end
else
frame.bidButton:Disable();
frame.buyoutButton:Disable();
end
else
frame.bidButton:Disable();
frame.buyoutButton:Disable();
end
end
-------------------------------------------------------------------------------
-- An item in the list is moused over.
-------------------------------------------------------------------------------
function AuctionFrameSearch_ListItem_OnEnter(row)
local frame = this:GetParent():GetParent();
local results = frame.results;
if (results and row <= table.getn(results)) then
local result = results[row];
if (result) then
local _, link, rarity = GetItemInfo(result.item);
if (link) then
local name = result.name;
local count = result.count;
GameTooltip:SetOwner(this, "ANCHOR_RIGHT");
GameTooltip:SetHyperlink(link);
GameTooltip:Show();
EnhTooltip.TooltipCall(GameTooltip, name, result.link, rarity, count);
end
end
end
end
-------------------------------------------------------------------------------
-- An item in the list is clicked.
-------------------------------------------------------------------------------
function AuctionFrameSearch_ListItem_OnClick(row)
local frame = this:GetParent():GetParent();
-- Select the item clicked.
frame:SelectResultByIndex(row);
-- Bid or buyout the item if the alt key is down.
if (frame.resultsType and IsAltKeyDown()) then
if (IsShiftKeyDown()) then
-- Bid or buyout the item.
if (frame.resultsType == "BidSearch") then
AuctionFrameSearch_BidButton_OnClick(frame.bidButton);
elseif (frame.resultsType == "BuyoutSearch") then
AuctionFrameSearch_BuyoutButton_OnClick(frame.buyoutButton);
end
else
-- Search for the item and switch to the Browse tab.
BrowseName:SetText(frame.results[row].name)
BrowseMinLevel:SetText("")
BrowseMaxLevel:SetText("")
AuctionFrameBrowse.selectedInvtype = nil
AuctionFrameBrowse.selectedInvtypeIndex = nil
AuctionFrameBrowse.selectedClass = nil
AuctionFrameBrowse.selectedClassIndex = nil
AuctionFrameBrowse.selectedSubclass = nil
AuctionFrameBrowse.selectedSubclassIndex = nil
AuctionFrameFilters_Update()
IsUsableCheckButton:SetChecked(0)
UIDropDownMenu_SetSelectedValue(BrowseDropDown, -1)
AuctionFrameBrowse_Search()
AuctionFrameTab_OnClick(1);
end
--Thanks to Miravlix (from irc://irc.datavertex.com/cosmostesters) for the following codeblocks.
elseif (IsControlKeyDown()) then
DressUpItemLink(frame.results[row].item);
elseif (IsShiftKeyDown() and ChatFrameEditBox:IsVisible()) then
-- Trim leading whitespace
ChatFrameEditBox:Insert(string.gsub(frame.results[row].link, " *(.*)", "%1"));
end
end
-------------------------------------------------------------------------------
-- Initialize the content of a Category dropdown list
-------------------------------------------------------------------------------
function AuctionFrameSearch_CategoryDropDown_Initialize()
local dropdown = this:GetParent();
local frame = dropdown:GetParent();
UIDropDownMenu_AddButton({
text = "",
func = AuctionFrameSearch_CategoryDropDownItem_OnClick,
owner = dropdown
})
if (AuctionConfig.classes) then
for classid, cdata in pairs(AuctionConfig.classes) do
UIDropDownMenu_AddButton({
text = cdata.name,
func = AuctionFrameSearch_CategoryDropDownItem_OnClick,
owner = dropdown
});
end
end
end
-------------------------------------------------------------------------------
-- An item in a CategoryDrownDown has been clicked
-------------------------------------------------------------------------------
function AuctionFrameSearch_CategoryDropDownItem_OnClick()
local index = this:GetID();
local dropdown = this.owner;
AuctioneerDropDownMenu_SetSelectedID(dropdown, index);
end
-------------------------------------------------------------------------------
-- Initialize the content of a TimeLeft dropdown list
-------------------------------------------------------------------------------
function AuctionFrameSearch_TimeLeftDropDown_Initialize()
local dropdown = this:GetParent();
local frame = dropdown:GetParent();
for index, value in pairs(TIME_LEFT_NAMES) do
local info = {};
info.text = value;
info.func = AuctionFrameSearch_TimeLeftDropDownItem_OnClick;
info.owner = dropdown;
UIDropDownMenu_AddButton(info);
end
end
-------------------------------------------------------------------------------
-- An item a TimeLeftDrownDown has been clicked
-------------------------------------------------------------------------------
function AuctionFrameSearch_TimeLeftDropDownItem_OnClick()
local index = this:GetID();
local dropdown = this.owner;
AuctioneerDropDownMenu_SetSelectedID(dropdown, index);
end
-------------------------------------------------------------------------------
-------------------------------------------------------------------------------
function AuctionFrameSearchBid_SearchButton_OnClick(button)
local frame = button:GetParent();
local frameName = frame:GetName();
local profitMoneyFrame = getglobal(frameName.."MinProfit");
local percentLessEdit = getglobal(frameName.."MinPercentLessEdit");
local timeLeftDropDown = getglobal(frameName.."TimeLeftDropDown");
local minProfit = MoneyInputFrame_GetCopper(profitMoneyFrame);
local minPercentLess = percentLessEdit:GetNumber();
local catID = (UIDropDownMenu_GetSelectedID(getglobal(frameName.."CategoryDropDown")) or 1) - 1;
local minQuality = (UIDropDownMenu_GetSelectedID(getglobal(frameName.."MinQualityDropDown")) or 1) - 1;
local itemName = getglobal(frameName.."SearchEdit"):GetText();
if (itemName == "") then itemName = nil end
local timeLeft = Auctioneer.Core.Constants.TimeLeft.Seconds[UIDropDownMenu_GetSelectedID(timeLeftDropDown)];
frame:GetParent():SearchBids(minProfit, minPercentLess, timeLeft, catID, minQuality, itemName);
end
-------------------------------------------------------------------------------
-------------------------------------------------------------------------------
function AuctionFrameSearchBuyout_SearchButton_OnClick(button)
local frame = button:GetParent();
local frameName = frame:GetName();
local profitMoneyFrame = getglobal(frame:GetName().."MinProfit");
local percentLessEdit = getglobal(frame:GetName().."MinPercentLessEdit");
local minProfit = MoneyInputFrame_GetCopper(profitMoneyFrame);
local minPercentLess = percentLessEdit:GetNumber();
local catID = (UIDropDownMenu_GetSelectedID(getglobal(frameName.."CategoryDropDown")) or 1) - 1
local minQuality = (UIDropDownMenu_GetSelectedID(getglobal(frameName.."MinQualityDropDown")) or 1) - 1;
local itemName = getglobal(frameName.."SearchEdit"):GetText();
if (itemName == "") then itemName = nil end
frame:GetParent():SearchBuyouts(minProfit, minPercentLess, catID, minQuality, itemName);
end
-------------------------------------------------------------------------------
-------------------------------------------------------------------------------
function AuctionFrameSearchPlain_SearchButton_OnClick(button)
local frame = button:GetParent();
local frameName = frame:GetName();
local maxPrice = MoneyInputFrame_GetCopper(getglobal(frameName.."MaxPrice")) or 0
local catID = (UIDropDownMenu_GetSelectedID(getglobal(frameName.."CategoryDropDown")) or 1) - 1
local minQuality = (UIDropDownMenu_GetSelectedID(getglobal(frameName.."MinQualityDropDown")) or 1) - 1;
local itemName = getglobal(frameName.."SearchEdit"):GetText();
if (itemName == "") then itemName = nil end
frame:GetParent():SearchPlain(maxPrice, catID, minQuality, itemName);
end
-------------------------------------------------------------------------------
-------------------------------------------------------------------------------
function AuctionFrameSearchCompete_SearchButton_OnClick(button)
local frame = button:GetParent();
local undercutMoneyFrame = getglobal(frame:GetName().."Undercut");
local minUndercut = MoneyInputFrame_GetCopper(undercutMoneyFrame);
frame:GetParent():SearchCompetition(minUndercut);
end
-------------------------------------------------------------------------------
-------------------------------------------------------------------------------
function AuctionFrameSearch_OnBidResult(context, bidRequest)
context.auction.pendingBidCount = context.auction.pendingBidCount - 1;
if (context.auction.pendingBidCount == 0) then
if (table.getn(bidRequest.results) == 0) then
-- No auctions matched.
context.auction.status = AUCTION_STATUS_NOT_FOUND;
else
-- Assume we are now the high bidder on all the matching auctions
-- until proven otherwise.
context.auction.status = AUCTION_STATUS_HIGH_BIDDER;
for _,result in pairs(bidRequest.results) do
if (result ~= BidResultCodes["BidAccepted"] and
result ~= BidResultCodes["AlreadyHighBidder"] and
result ~= BidResultCodes["OwnAuction"]) then
context.auction.status = AUCTION_STATUS_UNKNOWN;
break;
end
end
end
AuctionFrameSearch_UpdateButtons(context.frame);
ListTemplateScrollFrame_Update(getglobal(context.frame.resultsList:GetName().."ScrollFrame"));
end
AuctionFrameSearch_UpdatePendingBidStatus(context.frame);
end
-------------------------------------------------------------------------------
-------------------------------------------------------------------------------
function AuctionFrameSearch_GetAuctionAlpha(auction)
local status = auction.status;
if (status and (status == AUCTION_STATUS_NOT_FOUND or status == AUCTION_STATUS_HIGH_BIDDER)) then
return 0.4;
end
return 1.0;
end