vanilla-wow-addons – Rev 1
?pathlinks?
--[[
ADDON INFORMATION
Name: AuctionFilterPlus
Purpose: Adds flyout filters and a reset button to the auction house.
Command-line: NONE
Author: Dsanai of The Crimson Knights on Whisperwind
Thank you to the authors of AuctionFilterRL (Joshaze), AH_Reset (AnduinLothar), and AH_Wipe (Neriak), as these mods formed the base for this extension.
I've added a few more filters that I always wished I'd had when shopping (such as only-20-piece stacks, and exact search), changed it to a low-clutter Flyout display, added the ability to clear and save one's filter settings, merged the two mods into one, and added tooltips so users have more information about what each filter does.
FEATURES
-- Adds a Filter button and a Reset button to the AuctionHouse frame.
-- Pressing the Filter button will cause a Flyout menu to appear.
-- The filter checkboxes on the flyout allow you to limit your AH results or change the display of certain information.
-- You can clear your filter settings with a single click.
-- You can clear your Auction House search boxes with a single click.
-- You can save your filter settings as your default setup, which will persist across sessions, characters, and servers.
-- You can clear your settings temporarily and then reload them without relogging.
-- Each of the filter checkboxes has an explanatory tooltip.
-- Ready for localization (please help do so, if you are German- or French-speaking). You will be credited!
-- Compatible with Auctioneer.
NOT DONE YET
-- Fixed Dressing Room bug. Should now show the correct item even if filters are turned on.
-- Fixed Chat Link bug. Should now link the correct item in chat.
VERSION HISTORY
v10900-1
-- Fixed slash command (courtesy Aingnale@WorldOfWar)
-- Added "Grey Out Unbid Items" option. Will grey out the prices for items that have not been bid on yet. (idea courtesy myShowBid by mhsin)
-- Show Best Deals now takes into account Greater Essences (will be valued as 3 items when competing against Lesser Essences)
-- Fixed so that Auctioneer Beta will also be supported (variable name courtesy barryj@Curse)
v1800-6
-- Added AuctionSort functionality (courtesy Abraha)
-- Added Show Best Deals, which will evaluate prices and tell you how an item fares against the average for the search results.
-- Show Best Deals will also take into account how many pieces of cloth were used to create bolts of cloth, when rating its value.
v1800-5
-- DE translation reworked (courtesy dan2507@Curse)
-- Increased the width of the flyout panel, and of the Clear button, so localized strings should fit.
-- Can be set to color known recipes, plans, schematics, etc. (courtesy LeisureLarry@Curse)
-- Added command-line to open flyout panel, if the button is unclickable due to other mods.
v1800-4
-- Really disables itself when KC_Items is scanning. Thanks, Sharky@Curse.
-- Globalized the "Already Known" string, so all clients should now be able to use that filter. Thanks, Olivier@Curse.
v1800-3
-- Disables itself when KC_Items is scanning.
-- German localization completed (courtesy Dan2507 and Naboradd)
-- Localized checkbox description text.
-- Attempt to fix the occasional tooltip error on line 492. Let me know if tooltips show the wrong item.
v1800-2
-- Disables itself when Auctioneer is scanning.
v1800-1
-- Initial release
POTENTIAL FUTURE ADDITIONS (Subject to change)
-- Filter: Don't show auctions listed by people I've Ignored. (Don't fund the idiots.)
-- Filter: Only show items that haven't been bid on yet. (Try to find ones I can snag at a bargain, without a bidding war.)
-- Filter: Only show XX quality items. (Blizzard quality filter shows that level AND higher.) NOTE: Read Blizzard dropdown.
]]
afp_OriginalAuctionFrameBrowse_Update = nil;
afp_BrowseList = {};
local afp_OldSetWidth = nil;
function AuctionFilterPlus_OnLoad()
this:RegisterEvent("AUCTION_ITEM_LIST_UPDATE");
this:RegisterEvent("VARIABLES_LOADED");
this:RegisterEvent("AUCTION_HOUSE_SHOW");
-- Set localization for buttons (NOW DONE INTERNALLY)
-- if (afp_FlyoutButton) then afp_FlyoutButton:SetText(AFP_BUTTON_TEXT_FILTER); end
SlashCmdList["AUCTIONFILTERPLUS"] = afp_SlashHandler;
SLASH_AUCTIONFILTERPLUS1 = "/auctionfilterplus"; -- Fixed by Aingnale@WorldOfWar
SLASH_AUCTIONFILTERPLUS2 = "/afp";
end
function AuctionFilterPlus_OnEvent()
if (event == "AUCTION_ITEM_LIST_UPDATE") then
afp_AuctionFrameBrowse_Update();
elseif event == "VARIABLES_LOADED" then
afp_FlyoutLoad_OnClick();
elseif (event == "AUCTION_HOUSE_SHOW" and IsAddOnLoaded("Blizzard_AuctionUI")) then
if (not afp_OriginalAuctionFrameBrowse_Update) then
afp_OriginalAuctionFrameBrowse_Update = AuctionFrameBrowse_Update;
AuctionFrameBrowse_Update = afp_AuctionFrameBrowse_Update;
afp_OriginalBrowseButton_OnClick = BrowseButton_OnClick;
BrowseButton_OnClick = afp_BrowseButton_OnClick;
afp_OriginalAuctionFrameItem_OnEnter = AuctionFrameItem_OnEnter;
AuctionFrameItem_OnEnter = afp_AuctionFrameItem_OnEnter;
afp_OptionButton_PricePerUnit:SetParent(afp_FlyoutFrame);
afp_OptionButton_HideNoBuyout:SetParent(afp_FlyoutFrame);
afp_OptionButton_HideUnaffordable:SetParent(afp_FlyoutFrame);
afp_OptionButton_HideKnown:SetParent(afp_FlyoutFrame);
afp_OptionButton_StacksOf20:SetParent(afp_FlyoutFrame);
afp_OptionButton_StacksOf10:SetParent(afp_FlyoutFrame);
afp_OptionButton_StacksOf5:SetParent(afp_FlyoutFrame);
afp_OptionButton_ExactName:SetParent(afp_FlyoutFrame);
afp_OptionButton_ColorKnown:SetParent(afp_FlyoutFrame);
afp_OptionButton_ShowBestDeals:SetParent(afp_FlyoutFrame);
afp_OptionButton_GreyUnbid:SetParent(afp_FlyoutFrame);
afp_FlyoutButton:ClearAllPoints()
afp_FlyoutButton:SetParent(AuctionFrameBrowse);
afp_FlyoutButton:SetPoint("TOPRIGHT","AuctionFrameBrowse","TOPRIGHT",-13,-14);
afp_FlyoutButton:Show();
if (AH_ResetButton and AH_ResetButton:IsVisible()) then
AH_ResetButton:Hide();
end
afp_ResetButton:ClearAllPoints()
afp_ResetButton:SetParent(afp_FlyoutButton);
afp_ResetButton:SetPoint("LEFT","afp_FlyoutButton","RIGHT",-1,0);
afp_ResetButton:Show();
end
-- AuctionSort
if (not afp_OldSetWidth and BrowseCurrentBidSort) then
BrowseBuyoutSort:ClearAllPoints();
BrowseBuyoutSort:SetParent(AuctionFrameBrowse);
BrowseBuyoutSort:SetPoint("LEFT","BrowseCurrentBidSort","RIGHT",-2,0);
BrowseBuyoutSort:Show();
BrowseNameSort:ClearAllPoints();
BrowseNameSort:SetParent(AuctionFrameBrowse);
BrowseNameSort:SetPoint("TOPLEFT", "AuctionFrameBrowse", "TOPLEFT", 186, -82);
BrowseNameSort:Show();
BrowseQualitySort:ClearAllPoints();
BrowseQualitySort:SetPoint("LEFT","BrowseNameSort","RIGHT",-2,0);
BrowseQualitySort:Show();
afp_OldSetWidth = BrowseCurrentBidSort.SetWidth;
BrowseCurrentBidSort.SetWidth = afp_SetWidth;
BrowseCurrentBidSort:SetWidth(207);
BrowseQualitySort:SetWidth(BrowseQualitySort:GetWidth() - BrowseNameSort:GetWidth());
end
end
end
function afp_SetWidth(obj, width)
if (width >= 184) then
width = width - BrowseBuyoutSort:GetWidth() + 2;
end
afp_OldSetWidth(obj, width);
end
function SortBuyoutButton_UpdateArrow(button, type, sort)
if ( not IsAuctionSortReversed(type, sort) ) then
getglobal(button:GetName().."Arrow"):SetTexCoord(0, 0.5625, 1.0, 0);
else
getglobal(button:GetName().."Arrow"):SetTexCoord(0, 0.5625, 0, 1.0);
end
end
function afp_FixParents()
afp_OptionText_HideUnaffordable:ClearAllPoints()
afp_OptionText_HideKnown:ClearAllPoints()
afp_OptionText_HideNoBuyout:ClearAllPoints()
afp_OptionText_PricePerUnit:ClearAllPoints()
afp_OptionText_StacksOf20:ClearAllPoints()
afp_OptionText_StacksOf10:ClearAllPoints()
afp_OptionText_StacksOf5:ClearAllPoints()
afp_OptionText_ExactName:ClearAllPoints()
afp_OptionText_ColorKnown:ClearAllPoints()
afp_OptionText_ShowBestDeals:ClearAllPoints()
afp_OptionText_GreyUnbid:ClearAllPoints()
afp_OptionText_HideUnaffordable:SetPoint("LEFT","afp_OptionButton_HideUnaffordable","RIGHT",2,1);
afp_OptionText_HideKnown:SetPoint("LEFT","afp_OptionButton_HideKnown","RIGHT",2,1);
afp_OptionText_HideNoBuyout:SetPoint("LEFT","afp_OptionButton_HideNoBuyout","RIGHT",2,1);
afp_OptionText_PricePerUnit:SetPoint("LEFT","afp_OptionButton_PricePerUnit","RIGHT",2,1);
afp_OptionText_StacksOf20:SetPoint("LEFT","afp_OptionButton_StacksOf20","RIGHT",2,1);
afp_OptionText_StacksOf10:SetPoint("LEFT","afp_OptionButton_StacksOf10","RIGHT",2,1);
afp_OptionText_StacksOf5:SetPoint("LEFT","afp_OptionButton_StacksOf5","RIGHT",2,1);
afp_OptionText_ExactName:SetPoint("LEFT","afp_OptionButton_ExactName","RIGHT",2,1);
afp_OptionText_ColorKnown:SetPoint("LEFT","afp_OptionButton_ColorKnown","RIGHT",2,1);
afp_OptionText_ShowBestDeals:SetPoint("LEFT","afp_OptionButton_ShowBestDeals","RIGHT",2,1);
afp_OptionText_GreyUnbid:SetPoint("LEFT","afp_OptionButton_GreyUnbid","RIGHT",2,1);
end
function afp_Tooltip(arg1,arg2,arg3,arg4,arg5,arg6)
if (not arg3) then arg3 = "ANCHOR_LEFT"; end
if (not arg4) then arg4 = 0; end
if (not arg5) then arg5 = -40; end
if (not arg6) then arg6 = afp_FlyoutFrame; end -- can use the reserved word "this" as arg6 if you want
GameTooltip:SetOwner(arg6, arg3, arg4, arg5);
GameTooltip:SetText(arg1);
GameTooltip:AddLine("\n"..arg2, .75, .75, .75, 1);
GameTooltip:Show();
end
function afp_AuctionFrameBrowse_OnEnter()
local frame = this:GetName();
if (not frame) then return; end
if (frame == "afp_OptionButton_HideUnaffordable") then
afp_Tooltip(AFP_TOOLTIP_TITLE_UNAFFORD, AFP_TOOLTIP_TEXT_UNAFFORD);
elseif (frame == "afp_OptionButton_HideKnown") then
afp_Tooltip(AFP_TOOLTIP_TITLE_HIDEKNOWN, AFP_TOOLTIP_TEXT_HIDEKNOWN);
elseif (frame == "afp_OptionButton_HideNoBuyout") then
afp_Tooltip(AFP_TOOLTIP_TITLE_NOBUYOUT, AFP_TOOLTIP_TEXT_NOBUYOUT);
elseif (frame == "afp_OptionButton_PricePerUnit") then
afp_Tooltip(AFP_TOOLTIP_TITLE_PERUNIT, AFP_TOOLTIP_TEXT_PERUNIT);
elseif (frame == "afp_OptionButton_StacksOf20") then
afp_Tooltip(AFP_TOOLTIP_TITLE_STACK20, AFP_TOOLTIP_TEXT_STACK20);
elseif (frame == "afp_OptionButton_StacksOf10") then
afp_Tooltip(AFP_TOOLTIP_TITLE_STACK10, AFP_TOOLTIP_TEXT_STACK10);
elseif (frame == "afp_OptionButton_StacksOf5") then
afp_Tooltip(AFP_TOOLTIP_TITLE_STACK5, AFP_TOOLTIP_TEXT_STACK5);
elseif (frame == "afp_OptionButton_ExactName") then
afp_Tooltip(AFP_TOOLTIP_TITLE_EXACTNAME, AFP_TOOLTIP_TEXT_EXACTNAME);
elseif (frame == "afp_OptionButton_ColorKnown") then
afp_Tooltip(AFP_TOOLTIP_TITLE_COLORKNOWN, AFP_TOOLTIP_TEXT_COLORKNOWN);
elseif (frame == "afp_OptionButton_ShowBestDeals") then
afp_Tooltip(AFP_TOOLTIP_TITLE_SHOWBESTDEALS, AFP_TOOLTIP_TEXT_SHOWBESTDEALS);
elseif (frame == "afp_OptionButton_GreyUnbid") then
afp_Tooltip(AFP_TOOLTIP_TITLE_GREYUNBID, AFP_TOOLTIP_TEXT_GREYUNBID);
end
end
function afp_Reset_OnClick()
PlaySound("igMainMenuOptionCheckBoxOn")
IsUsableCheckButton:SetChecked()
UIDropDownMenu_SetSelectedValue(BrowseDropDown, -1)
AuctionFrameBrowse.selectedClass = nil
AuctionFrameBrowse.selectedClassIndex = nil
AuctionFrameFilters_Update()
BrowseName:SetText("")
--BrowseName:SetFocus()
BrowseMinLevel:SetText("")
BrowseMaxLevel:SetText("")
AuctionDressUpModel:Dress()
if (false) then
ShowOnPlayerCheckButton:SetChecked()
SHOW_ON_CHAR = "0"
HideUIPanel(AuctionDressUpFrame)
end
afp_Print(AFP_OPTEXT_RESET);
end
function afp_FlyoutClear_OnClick()
afp_OptionButton_PricePerUnit:SetChecked(0);
afp_OptionButton_HideNoBuyout:SetChecked(0);
afp_OptionButton_HideUnaffordable:SetChecked(0);
afp_OptionButton_HideKnown:SetChecked(0);
afp_OptionButton_StacksOf20:SetChecked(0);
afp_OptionButton_StacksOf10:SetChecked(0);
afp_OptionButton_StacksOf5:SetChecked(0);
afp_OptionButton_ExactName:SetChecked(0);
afp_OptionButton_ColorKnown:SetChecked(0);
afp_OptionButton_ShowBestDeals:SetChecked(0);
afp_OptionButton_GreyUnbid:SetChecked(0);
afp_Print(AFP_OPTEXT_CLEARED);
end
function afp_FlyoutSave_OnClick()
afp_SavedSettings = {};
afp_SavedSettings["afp_OptionButton_PricePerUnit"] = afp_OptionButton_PricePerUnit:GetChecked();
afp_SavedSettings["afp_OptionButton_HideNoBuyout"] = afp_OptionButton_HideNoBuyout:GetChecked();
afp_SavedSettings["afp_OptionButton_HideUnaffordable"] = afp_OptionButton_HideUnaffordable:GetChecked();
afp_SavedSettings["afp_OptionButton_HideKnown"] = afp_OptionButton_HideKnown:GetChecked();
afp_SavedSettings["afp_OptionButton_StacksOf20"] = afp_OptionButton_StacksOf20:GetChecked();
afp_SavedSettings["afp_OptionButton_StacksOf10"] = afp_OptionButton_StacksOf10:GetChecked();
afp_SavedSettings["afp_OptionButton_StacksOf5"] = afp_OptionButton_StacksOf5:GetChecked();
afp_SavedSettings["afp_OptionButton_ExactName"] = afp_OptionButton_ExactName:GetChecked();
afp_SavedSettings["afp_OptionButton_ColorKnown"] = afp_OptionButton_ColorKnown:GetChecked();
afp_SavedSettings["afp_OptionButton_ShowBestDeals"] = afp_OptionButton_ShowBestDeals:GetChecked();
afp_SavedSettings["afp_OptionButton_GreyUnbid"] = afp_OptionButton_GreyUnbid:GetChecked();
afp_Print(AFP_OPTEXT_SAVED);
end
function afp_FlyoutLoad_OnClick()
if (afp_SavedSettings) then
if (afp_SavedSettings["afp_OptionButton_PricePerUnit"]) then
afp_OptionButton_PricePerUnit:SetChecked(afp_SavedSettings["afp_OptionButton_PricePerUnit"]);
end
if (afp_SavedSettings["afp_OptionButton_HideNoBuyout"]) then
afp_OptionButton_HideNoBuyout:SetChecked(afp_SavedSettings["afp_OptionButton_HideNoBuyout"]);
end
if (afp_SavedSettings["afp_OptionButton_HideUnaffordable"]) then
afp_OptionButton_HideUnaffordable:SetChecked(afp_SavedSettings["afp_OptionButton_HideUnaffordable"]);
end
if (afp_SavedSettings["afp_OptionButton_HideKnown"]) then
afp_OptionButton_HideKnown:SetChecked(afp_SavedSettings["afp_OptionButton_HideKnown"]);
end
if (afp_SavedSettings["afp_OptionButton_StacksOf20"]) then
afp_OptionButton_StacksOf20:SetChecked(afp_SavedSettings["afp_OptionButton_StacksOf20"]);
end
if (afp_SavedSettings["afp_OptionButton_StacksOf10"]) then
afp_OptionButton_StacksOf10:SetChecked(afp_SavedSettings["afp_OptionButton_StacksOf10"]);
end
if (afp_SavedSettings["afp_OptionButton_StacksOf5"]) then
afp_OptionButton_StacksOf5:SetChecked(afp_SavedSettings["afp_OptionButton_StacksOf5"]);
end
if (afp_SavedSettings["afp_OptionButton_ExactName"]) then
afp_OptionButton_ExactName:SetChecked(afp_SavedSettings["afp_OptionButton_ExactName"]);
end
if (afp_SavedSettings["afp_OptionButton_ColorKnown"]) then
afp_OptionButton_ColorKnown:SetChecked(afp_SavedSettings["afp_OptionButton_ColorKnown"]);
end
if (afp_SavedSettings["afp_OptionButton_ShowBestDeals"]) then
afp_OptionButton_ShowBestDeals:SetChecked(afp_SavedSettings["afp_OptionButton_ShowBestDeals"]);
end
if (afp_SavedSettings["afp_OptionButton_GreyUnbid"]) then
afp_OptionButton_GreyUnbid:SetChecked(afp_SavedSettings["afp_OptionButton_GreyUnbid"]);
end
end
end
function afp_AuctionFrameBrowse_Update()
-- Trap for, and prevent, filters from doing anything while Auctioneer is scanning.
if ((Auctioneer_isScanningRequested and Auctioneer_isScanningRequested==true) or (Auctioneer and Auctioneer.Scanning and Auctioneer.Scanning.IsScanningRequested and Auctioneer.Scanning.IsScanningRequested==true)) then
return;
end
-- Trap for, and prevent, filters from doing anything while KCI is scanning.
if (KC_ItemsAuction and KC_ItemsAuction.scanning) then
return;
end
local numBatchAuctions, totalAuctions = GetNumAuctionItems("list");
local button, buttonName, iconTexture, itemName, color, itemCount, moneyFrame, buyoutMoneyFrame, buyoutText, buttonHighlight;
local offset = FauxScrollFrame_GetOffset(BrowseScrollFrame);
local index;
local isLastSlotEmpty;
local name, texture, count, quality, canUse, minBid, minIncrement, buyoutPrice, duration, bidAmount, highBidder, owner;
BrowseBidButton:Disable();
BrowseBuyoutButton:Disable();
-- Update sort arrows
SortButton_UpdateArrow(BrowseQualitySort, "list", "quality");
SortButton_UpdateArrow(BrowseLevelSort, "list", "level");
SortButton_UpdateArrow(BrowseDurationSort, "list", "duration");
SortButton_UpdateArrow(BrowseHighBidderSort, "list", "status");
SortButton_UpdateArrow(BrowseCurrentBidSort, "list", "bid");
-- Show the no results text if no items found
if ( numBatchAuctions == 0 ) then
BrowseNoResultsText:Show();
else
BrowseNoResultsText:Hide();
end
local baseAve = 0; bestAve = 0; worstAve = 0;
local baseAveTable = {};
-- Get the highest non-outlier value (only when Exact Name is turned on)
if (afp_OptionButton_ShowBestDeals:GetChecked()) then
--if (afp_OptionButton_ExactName:GetChecked() and BrowseName and BrowseName:GetText() ~= "") then
for i=1, NUM_BROWSE_TO_DISPLAY do
--for n=1,NUM_AUCTION_ITEMS_PER_PAGE do
name,_,count,_,_,_,minBid,_,buyoutPrice,bidAmount,_,_ = GetAuctionItemInfo("list", i); -- name, texture, count, quality, canUse, level, minBid, minIncrement, buyoutPrice, bidAmount, highBidder, owner
if (name and BrowseName and string.lower(name) == string.lower(BrowseName:GetText())) or not afp_OptionButton_ExactName:GetChecked() then
-- Account for crafted Bolts of Cloth
if (name==AFP_ITEM_BOLT_LINEN) then
count = count * 2;
elseif (name==AFP_ITEM_BOLT_WOOL) then
count = count * 3;
elseif (name==AFP_ITEM_BOLT_SILK) then
count = count * 4;
elseif (name==AFP_ITEM_BOLT_MAGEWEAVE) then
count = count * 5;
elseif (name==AFP_ITEM_BOLT_RUNECLOTH) then
count = count * 5;
elseif (name==AFP_ITEM_ESSENCE_ETERNAL) then
count = count * 3;
elseif (name==AFP_ITEM_ESSENCE_NETHER) then
count = count * 3;
elseif (name==AFP_ITEM_ESSENCE_MYSTIC) then
count = count * 3;
elseif (name==AFP_ITEM_ESSENCE_ASTRAL) then
count = count * 3;
elseif (name==AFP_ITEM_ESSENCE_MAGIC) then
count = count * 3;
end
if ( buyoutPrice > 0 ) then
table.insert(baseAveTable, buyoutPrice/count);
elseif (not afp_OptionButton_HideNoBuyout:GetChecked()) then
-- Don't use bids if HideNoBuyout is on!
if ( bidAmount == 0 ) then
table.insert(baseAveTable, minBid/count);
else
table.insert(baseAveTable, bidAmount/count);
end
end
end
--end
end
--end
end
if (table.getn(baseAveTable) > 0) then
table.sort(baseAveTable);
baseAve = baseAveTable[math.floor(table.getn(baseAveTable)/2)];
bestAve = baseAveTable[1];
worstAve = baseAveTable[table.getn(baseAveTable)];
--afp_Print("baseAveTable rows="..table.getn(baseAveTable)..", baseAve="..baseAve..", bestAve="..bestAve..", worstAve="..worstAve);
end
if (not baseAve) then baseAve = 0; end
for i=1, NUM_BROWSE_TO_DISPLAY do
if (afp_OptionButton_HideKnown:GetChecked() or afp_OptionButton_HideNoBuyout:GetChecked() or afp_OptionButton_HideUnaffordable:GetChecked() or afp_OptionButton_StacksOf20:GetChecked() or afp_OptionButton_StacksOf10:GetChecked() or afp_OptionButton_StacksOf5:GetChecked() or afp_OptionButton_ExactName:GetChecked() or afp_OptionButton_ColorKnown:GetChecked() or afp_OptionButton_GreyUnbid:GetChecked()) then
local skipItem;
for n=1,NUM_AUCTION_ITEMS_PER_PAGE do
AFHiddenTooltip:ClearLines();
name,_,count,quality,_,_,_,_,buyoutPrice,_,_,owner = GetAuctionItemInfo("list", offset + i); -- name, texture, count, quality, canUse, level, minBid, minIncrement, buyoutPrice, bidAmount, highBidder, owner
AFHiddenTooltip:SetAuctionItem("list", offset + i);
skipItem = 0;
if (afp_OptionButton_HideKnown:GetChecked()) then
if ((AFHiddenTooltipTextLeft3:GetText() == ITEM_SPELL_KNOWN) and (AFHiddenTooltip:NumLines() >= 3)) then
skipItem = 1;
elseif ((AFHiddenTooltipTextLeft4:GetText() == ITEM_SPELL_KNOWN) and (AFHiddenTooltip:NumLines() >= 4)) then
skipItem = 1;
end
end
if ((buyoutPrice == 0) and (afp_OptionButton_HideNoBuyout:GetChecked())) then
skipItem = 1;
end
if ((GetMoney() < buyoutPrice) and (afp_OptionButton_HideUnaffordable:GetChecked())) then
skipItem = 1;
end
if (count ~= 20 and afp_OptionButton_StacksOf20:GetChecked()) then
skipItem = 1;
end
if (count ~= 10 and afp_OptionButton_StacksOf10:GetChecked()) then
skipItem = 1;
end
if (count ~= 5 and afp_OptionButton_StacksOf5:GetChecked()) then
skipItem = 1;
end
if (BrowseName and name and BrowseName:GetText() and string.lower(name) ~= string.lower(BrowseName:GetText()) and afp_OptionButton_ExactName:GetChecked()) then
skipItem = 1;
end
if (skipItem == 1) then
offset = offset + 1;
else
afp_BrowseList[i] = offset;
end
end
else
for n=1,NUM_BROWSE_TO_DISPLAY do
afp_BrowseList[n] = offset;
end
end
index = offset + i + (NUM_AUCTION_ITEMS_PER_PAGE * AuctionFrameBrowse.page);
button = getglobal("BrowseButton"..i);
-- Show or hide auction buttons
if ( index > (numBatchAuctions + (NUM_AUCTION_ITEMS_PER_PAGE * AuctionFrameBrowse.page)) ) then
button:Hide();
--button:SetVertexColor(0,0,0);
-- If the last button is empty then set isLastSlotEmpty var
if ( i == NUM_BROWSE_TO_DISPLAY ) then
isLastSlotEmpty = 1;
end
else -- EMERALD: BlackOut (if skipItem==1 then BlackOut)
button:Show();
buttonName = "BrowseButton"..i;
name, texture, count, quality, canUse, level, minBid, minIncrement, buyoutPrice, bidAmount, highBidder, owner = GetAuctionItemInfo("list", offset + i);
duration = GetAuctionItemTimeLeft("list", offset + i);
-- Resize button if there isn't a scrollbar
buttonHighlight = getglobal("BrowseButton"..i.."Highlight");
if ( numBatchAuctions <= NUM_BROWSE_TO_DISPLAY ) then
button:SetWidth(625);
buttonHighlight:SetWidth(589);
BrowseCurrentBidSort:SetWidth(207);
elseif ( numBatchAuctions == NUM_BROWSE_TO_DISPLAY and totalAuctions <= NUM_BROWSE_TO_DISPLAY ) then
button:SetWidth(625);
buttonHighlight:SetWidth(589);
BrowseCurrentBidSort:SetWidth(207);
else
button:SetWidth(600);
buttonHighlight:SetWidth(562);
BrowseCurrentBidSort:SetWidth(184);
end
-- Set name and quality color
color = ITEM_QUALITY_COLORS[quality];
itemName = getglobal(buttonName.."Name");
local newName;
local thisPrice = 0;
local thisCount = 0;
newName = GetHex(color.r,color.g,color.b)..name..FONT_COLOR_CODE_CLOSE;
if (afp_OptionButton_ShowBestDeals:GetChecked()) then
if (baseAve ~= 0) then
-- Account for crafted Bolts of Cloth
if (name==AFP_ITEM_BOLT_LINEN) then
thisCount = count * 2;
elseif (name==AFP_ITEM_BOLT_WOOL) then
thisCount = count * 3;
elseif (name==AFP_ITEM_BOLT_SILK) then
thisCount = count * 4;
elseif (name==AFP_ITEM_BOLT_MAGEWEAVE) then
thisCount = count * 5;
elseif (name==AFP_ITEM_BOLT_RUNECLOTH) then
thisCount = count * 5;
else
thisCount = count;
end
if ( buyoutPrice > 0 ) then
thisPrice = afp_Round(buyoutPrice/thisCount);
else
if ( bidAmount == 0 ) then
thisPrice = afp_Round(minBid/thisCount);
else
thisPrice = afp_Round(bidAmount/thisCount);
end
end
newName = newName.." ";
--afp_Print("thisPrice="..thisPrice..", best="..(bestAve * 1.2)..", worst="..(worstAve / 1.2)..", base="..baseAve);
--afp_Print("thisPrice="..thisPrice..", base="..baseAve);
--if (thisPrice <= bestAve * 1.05) then -- Best Price
--if (thisPrice <= bestAve) then -- Best Price
if (thisPrice <= (baseAve / 2.2) or thisPrice <= bestAve) then -- Best Price
newName = newName..GetHex(0.6,1,0.6).."(Best)";
--elseif (thisPrice >= worstAve / 1.05) then -- Worst Price
--elseif (thisPrice >= worstAve) then -- Worst Price
elseif (thisPrice) >= (baseAve * 2.5) then -- Worst Price
newName = newName..GetHex(1,0,0).."(Worst)+"..math.floor((thisPrice/baseAve)*100).."%";
elseif (thisPrice) >= (baseAve * 1.8) then -- Bad Price
newName = newName..GetHex(1,0.3,0.3).."(Worse)+"..math.floor((thisPrice/baseAve)*100).."%";
elseif (thisPrice) >= (baseAve * 1.4) then -- Bad Price
newName = newName..GetHex(1,0.6,0.6).."(Bad)+"..math.floor((thisPrice/baseAve)*100).."%";
elseif (thisPrice <= (baseAve / 1.5)) then -- Great Price
newName = newName..GetHex(0.3,1,0.3).."(Great)";
elseif (thisPrice < baseAve) then -- Good Price
newName = newName..GetHex(0,1,0).."(Good)";
else -- Median Price
newName = newName..GetHex(1,1,0).."(Average)";
end
newName = newName..FONT_COLOR_CODE_CLOSE;
end
end
itemName:SetText(newName);
--itemName:SetVertexColor(color.r, color.g, color.b);
--if (skipItem==1) then itemName:SetVertexColor(0,0,0); end
-- Set level
if ( level > UnitLevel("player") ) then
getglobal(buttonName.."Level"):SetText(RED_FONT_COLOR_CODE..level..FONT_COLOR_CODE_CLOSE);
else
getglobal(buttonName.."Level"):SetText(level);
end
--if (skipItem==1) then getglobal(buttonName.."Level"):SetVertexColor(0,0,0); end
-- Set closing time
getglobal(buttonName.."ClosingTimeText"):SetText(AuctionFrame_GetTimeLeftText(duration));
getglobal(buttonName.."ClosingTime").tooltip = AuctionFrame_GetTimeLeftTooltipText(duration);
--if (skipItem==1) then getglobal(buttonName.."ClosingTimeText"):SetVertexColor(0,0,0); end
--if (skipItem==1) then getglobal(buttonName.."ClosingTime"):SetVertexColor(0,0,0); end
-- Set item texture, count, and usability
iconTexture = getglobal(buttonName.."ItemIconTexture");
iconTexture:SetTexture(texture);
if ( not canUse ) then
iconTexture:SetVertexColor(1.0, 0.1, 0.1);
else
iconTexture:SetVertexColor(1.0, 1.0, 1.0);
end
itemCount = getglobal(buttonName.."ItemCount");
if ( count > 1 ) then
itemCount:SetText(count);
itemCount:Show();
else
itemCount:Hide();
end
-- Color known recipe (courtesy LeisureLarry@Curse)
if (afp_OptionButton_ColorKnown:GetChecked() and (AFHiddenTooltip:NumLines() >= 3)) then
if (AFHiddenTooltipTextLeft3:GetText() == ITEM_SPELL_KNOWN) then
-- Set color of icon to blue to make it easy to see that you already know it.
iconTexture = getglobal("BrowseButton"..i.."ItemIconTexture");
iconTexture:SetVertexColor(0, 0, 0.8);
elseif ((AFHiddenTooltip:NumLines() >= 4) and (AFHiddenTooltipTextLeft4:GetText() == ITEM_SPELL_KNOWN)) then
-- Set color of icon to blue to make it easy to see that you already know it.
iconTexture = getglobal("BrowseButton"..i.."ItemIconTexture");
iconTexture:SetVertexColor(0, 0, 0.8);
end
end
--if (skipItem==1) then iconTexture:SetVertexColor(0,0,0); end
-- Set high bid
moneyFrame = getglobal(buttonName.."MoneyFrame");
yourBidText = getglobal(buttonName.."YourBidText");
buyoutMoneyFrame = getglobal(buttonName.."BuyoutMoneyFrame");
buyoutText = getglobal(buttonName.."BuyoutText");
-- If not bidAmount set the bid amount to the min bid
if ( bidAmount == 0 ) then
if (afp_OptionButton_PricePerUnit:GetChecked()) then
MoneyFrame_Update(moneyFrame:GetName(), afp_Round(minBid/count));
else
MoneyFrame_Update(moneyFrame:GetName(), minBid);
end
else
if (afp_OptionButton_PricePerUnit:GetChecked()) then
MoneyFrame_Update(moneyFrame:GetName(), afp_Round(bidAmount/count));
else
MoneyFrame_Update(moneyFrame:GetName(), bidAmount);
end
if (afp_OptionButton_GreyUnbid:GetChecked()) then -- myShowBid functionality
moneyFrame:SetAlpha(0.5);
else
moneyFrame:SetAlpha(1.0);
end
end
--if (skipItem==1) then moneyFrame:Hide(); end
if ( highBidder ) then
yourBidText:Show();
else
yourBidText:Hide();
end
--if (skipItem==1) then yourBidText:Hide(); end
if ( buyoutPrice > 0 ) then
moneyFrame:SetPoint("RIGHT", buttonName, "RIGHT", 10, 10);
if (afp_OptionButton_PricePerUnit:GetChecked()) then
MoneyFrame_Update(buyoutMoneyFrame:GetName(), afp_Round(buyoutPrice/count));
else
MoneyFrame_Update(buyoutMoneyFrame:GetName(), buyoutPrice);
end
buyoutMoneyFrame:Show();
buyoutText:Show();
else
moneyFrame:SetPoint("RIGHT", buttonName, "RIGHT", 10, 3);
buyoutMoneyFrame:Hide();
buyoutText:Hide();
end
--if (skipItem==1) then buyoutMoneyFrame:Hide(); buyoutText:Hide(); end
-- Set high bidder
--if ( not highBidder ) then
-- highBidder = RED_FONT_COLOR_CODE..NO_BIDS..FONT_COLOR_CODE_CLOSE;
--end
getglobal(buttonName.."HighBidder"):SetText(owner);
--if (skipItem==1) then getglobal(buttonName.."HighBidder"):SetVertexColor(0,0,0); end
-- Set highlight
if ( GetSelectedAuctionItem("list") and (offset + i) == GetSelectedAuctionItem("list") ) then
button:LockHighlight();
if ( buyoutPrice > 0 and buyoutPrice >= minBid and GetMoney() >= buyoutPrice ) then
BrowseBuyoutButton:Enable();
AuctionFrame.buyoutPrice = buyoutPrice;
else
AuctionFrame.buyoutPrice = nil;
end
-- Set bid
if ( bidAmount > 0 ) then
bidAmount = bidAmount + minIncrement ;
MoneyInputFrame_SetCopper(BrowseBidPrice, bidAmount);
else
MoneyInputFrame_SetCopper(BrowseBidPrice, minBid);
end
if ( not highBidder and GetMoney() >= MoneyInputFrame_GetCopper(BrowseBidPrice) ) then
BrowseBidButton:Enable();
end
else
button:UnlockHighlight();
end
end
end
-- Update scrollFrame
-- If more than one page of auctions show the next and prev arrows when the scrollframe is scrolled all the way down
if ( totalAuctions > NUM_AUCTION_ITEMS_PER_PAGE ) then
if ( isLastSlotEmpty ) then
BrowsePrevPageButton:Show();
BrowseNextPageButton:Show();
BrowseSearchCountText:Show();
local itemsMin = AuctionFrameBrowse.page * NUM_AUCTION_ITEMS_PER_PAGE + 1;
local itemsMax = itemsMin + numBatchAuctions - 1;
BrowseSearchCountText:SetText(format(NUMBER_OF_RESULTS_TEMPLATE, itemsMin, itemsMax, totalAuctions ));
if ( AuctionFrameBrowse.page == 0 ) then
BrowsePrevPageButton.isEnabled = nil;
else
BrowsePrevPageButton.isEnabled = 1;
end
if ( AuctionFrameBrowse.page == (ceil(totalAuctions/NUM_AUCTION_ITEMS_PER_PAGE) - 1) ) then
BrowseNextPageButton.isEnabled = nil;
else
BrowseNextPageButton.isEnabled = 1;
end
else
BrowsePrevPageButton:Hide();
BrowseNextPageButton:Hide();
BrowseSearchCountText:Hide();
end
-- Artifically inflate the number of results so the scrollbar scrolls one extra row
numBatchAuctions = numBatchAuctions + 1;
else
BrowsePrevPageButton:Hide();
BrowseNextPageButton:Hide();
BrowseSearchCountText:Hide();
end
FauxScrollFrame_Update(BrowseScrollFrame, numBatchAuctions, NUM_BROWSE_TO_DISPLAY, AUCTIONS_BUTTON_HEIGHT);
end
function afp_BrowseButton_OnClick(button)
if ( not button ) then
button = this;
end
--afp_Print("OnClick");
--if ( IsControlKeyDown() ) then -- Dressing Room (THIS DOESN'T WORK, and I don't know why)
--DressUpItemLink(GetAuctionItemLink("list", button:GetID() + afp_BrowseList[button:GetID()]));
--afp_Print("DressUpItemLink");
--elseif ( IsShiftKeyDown() ) then -- Text link
--if ( ChatFrameEditBox:IsVisible() ) then
--ChatFrameEditBox:Insert(GetAuctionItemLink("list", button:GetID() + afp_BrowseList[button:GetID()]));
--afp_Print("ChatFrameEditBox");
--end
--else
SetSelectedAuctionItem("list", button:GetID() + afp_BrowseList[button:GetID()]);
afp_AuctionFrameBrowse_Update();
--afp_Print("Else");
--end
end
function afp_AuctionFrameItem_OnEnter(type, index)
if (this:GetParent():GetID()) then -- EMERALD: Test
index = this:GetParent():GetID();
end
if (afp_BrowseList and afp_BrowseList[this:GetParent():GetID()]) then
index = index + afp_BrowseList[this:GetParent():GetID()];
end
afp_OriginalAuctionFrameItem_OnEnter(type, index)
end
function afp_FlyoutButton_OnClick()
if (afp_FlyoutButton and afp_FlyoutButton:IsVisible()) then
if (afp_FlyoutFrame and afp_FlyoutFrame:IsVisible()) then
afp_FlyoutFrame:Hide();
afp_FlyoutClear:Hide();
afp_FlyoutSave:Hide();
--afp_Print("afDEBUG: Hiding Flyout");
elseif (afp_FlyoutFrame) then
--CHANGE SIZE BASED ON NUMBER OF VISIBLE LINES (height=lines*19)
afp_FlyoutFrame:SetHeight(13*19); -- Currently: 13 Lines
afp_FlyoutFrame:SetParent(AuctionFrameBrowse);
--afp_FlyoutFrame:SetPoint("TOPLEFT","AuctionFrameBrowse","TOPRIGHT",70,40);
afp_FlyoutFrame:SetPoint("TOPLEFT","AuctionFrame","TOPRIGHT",4,-9);
afp_FlyoutFrame:Show();
afp_FlyoutClear:SetParent(afp_FlyoutFrame);
afp_FlyoutClear:SetPoint("TOPLEFT","afp_FlyoutFrame","BOTTOMLEFT",1,0);
afp_FlyoutClear:Show();
afp_FlyoutSave:SetParent(afp_FlyoutFrame);
afp_FlyoutSave:SetPoint("TOPRIGHT","afp_FlyoutFrame","BOTTOMRIGHT",-1,0);
afp_FlyoutSave:Show();
afp_FlyoutLoad:SetParent(afp_FlyoutFrame);
afp_FlyoutLoad:SetPoint("TOPRIGHT","afp_FlyoutSave","BOTTOMRIGHT",0,0);
afp_FlyoutLoad:Show();
--afp_Print("afDEBUG: Showing Flyout");
else
--afp_Print("afDEBUG: ERROR: NO STATE!");
end
end
end
--[[ COMMON FUNCTIONS ]]
function afp_SlashHandler(msg)
if (msg=="show" or msg=="hide") then msg = ""; end
if (not msg or msg=="") then
--Base command
if (afp_FlyoutButton and afp_FlyoutButton:IsVisible()) then
afp_FlyoutButton_OnClick();
else
afp_Print("The Flyout cannot be shown if the Auction window is not on the Browse tab.");
end
end
end
function afp_Print(message) -- Send Message to Chat Frame
DEFAULT_CHAT_FRAME:AddMessage("[AuctionFilterPlus] "..message, 1.0, 1.0, 1.0);
end
function afp_PrintError(message) -- Send Error to Chat Frame
DEFAULT_CHAT_FRAME:AddMessage("[AuctionFilterPlus] ERROR: "..message, 1.0, 0, 0);
end
function afp_Round(x)
if (x - math.floor(x) > 0.5) then
x = x + 0.5;
end
return math.floor(x);
end
--courtesy watchdog:
function GetHex(r,g,b)
if g then
return string.format("|cFF%02X%02X%02X", (255*r), (255*g), (255*b));
elseif r then
return string.format("|cFF%02X%02X%02X", (255*r.r), (255*r.g), (255*r.b));
else
return "";
end
end