vanilla-wow-addons – Rev 1
?pathlinks?
--[[
Auctioneer Addon for World of Warcraft(tm).
Version: 3.9.0.1000 (Kangaroo)
Revision: $Id: AuctionFramePost.lua 993 2006-09-03 12:59:33Z norganna $
Auctioneer Post 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.
--]]
-------------------------------------------------------------------------------
-------------------------------------------------------------------------------
function AuctionFramePost_OnLoad()
-- Methods
this.CalculateAuctionDeposit = AuctionFramePost_CalculateAuctionDeposit;
this.UpdateDeposit = AuctionFramePost_UpdateDeposit;
this.GetItemID = AuctionFramePost_GetItemID;
this.GetItemSignature = AuctionFramePost_GetItemSignature;
this.GetItemName = AuctionFramePost_GetItemName;
this.SetNoteText = AuctionFramePost_SetNoteText;
this.GetSavePrice = AuctionFramePost_GetSavePrice;
this.GetStartPrice = AuctionFramePost_GetStartPrice;
this.SetStartPrice = AuctionFramePost_SetStartPrice;
this.GetBuyoutPrice = AuctionFramePost_GetBuyoutPrice;
this.SetBuyoutPrice = AuctionFramePost_SetBuyoutPrice;
this.GetStackSize = AuctionFramePost_GetStackSize;
this.SetStackSize = AuctionFramePost_SetStackSize;
this.GetStackCount = AuctionFramePost_GetStackCount;
this.SetStackCount = AuctionFramePost_SetStackCount;
this.GetDuration = AuctionFramePost_GetDuration;
this.SetDuration = AuctionFramePost_SetDuration;
this.GetDeposit = AuctionFramePost_GetDeposit;
this.SetAuctionItem = AuctionFramePost_SetAuctionItem;
this.ValidateAuction = AuctionFramePost_ValidateAuction;
this.UpdateAuctionList = AuctionFramePost_UpdateAuctionList;
this.UpdatePriceModels = AuctionFramePost_UpdatePriceModels;
-- Data Members
this.itemID = nil;
this.itemSignature = nil;
this.itemName = nil;
this.updating = false;
this.prices = {};
-- Controls
this.auctionList = getglobal(this:GetName().."List");
this.bidMoneyInputFrame = getglobal(this:GetName().."StartPrice");
this.buyoutMoneyInputFrame = getglobal(this:GetName().."BuyoutPrice");
this.stackSizeEdit = getglobal(this:GetName().."StackSize");
this.stackSizeCount = getglobal(this:GetName().."StackCount");
this.depositMoneyFrame = getglobal(this:GetName().."DepositMoneyFrame");
this.depositErrorLabel = getglobal(this:GetName().."UnknownDepositText");
-- Setup the tab order for the money input frames.
MoneyInputFrame_SetPreviousFocus(this.bidMoneyInputFrame, this.stackSizeCount);
MoneyInputFrame_SetNextFocus(this.bidMoneyInputFrame, getglobal(this.buyoutMoneyInputFrame:GetName().."Gold"));
MoneyInputFrame_SetPreviousFocus(this.buyoutMoneyInputFrame, getglobal(this.bidMoneyInputFrame:GetName().."Copper"));
MoneyInputFrame_SetNextFocus(this.buyoutMoneyInputFrame, this.stackSizeEdit);
-- Configure the logical columns
this.logicalColumns =
{
Quantity =
{
title = _AUCT("UiQuantityHeader");
dataType = "Number";
valueFunc = (function(record) return record.quantity end);
alphaFunc = AuctionFramePost_GetItemAlpha;
compareAscendingFunc = (function(record1, record2) return record1.quantity < record2.quantity end);
compareDescendingFunc = (function(record1, record2) return record1.quantity > record2.quantity end);
},
Name =
{
title = _AUCT("UiNameHeader");
dataType = "String";
valueFunc = (function(record) return record.name end);
colorFunc = AuctionFramePost_GetItemColor;
alphaFunc = AuctionFramePost_GetItemAlpha;
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 = AuctionFramePost_GetItemAlpha;
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 = AuctionFramePost_GetItemAlpha;
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 = AuctionFramePost_GetItemAlpha;
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 = AuctionFramePost_GetItemAlpha;
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 = AuctionFramePost_GetItemAlpha;
compareAscendingFunc = (function(record1, record2) return record1.buyoutPer < record2.buyoutPer end);
compareDescendingFunc = (function(record1, record2) return record1.buyoutPer > record2.buyoutPer end);
},
};
-- Configure the physical columns
this.physicalColumns =
{
{
width = 50;
logicalColumn = this.logicalColumns.Quantity;
logicalColumns = { this.logicalColumns.Quantity };
sortAscending = true;
},
{
width = 210;
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.Buyout;
logicalColumns =
{
this.logicalColumns.Buyout,
this.logicalColumns.BuyoutPer
};
sortAscending = true;
},
};
this.auctions = {};
ListTemplate_Initialize(this.auctionList, this.physicalColumns, this.logicalColumns);
ListTemplate_SetContent(this.auctionList, this.auctions);
this:ValidateAuction();
end
-------------------------------------------------------------------------------
-------------------------------------------------------------------------------
AuctionFramePost_AdditionalPricingModels = {
}
function AuctionFramePost_UpdatePriceModels(frame)
if (not frame.updating) then
frame.prices = {};
local name = frame:GetItemName();
local count = frame:GetStackSize();
if (name and count) then
local bag, slot, id, rprop, enchant, uniq = EnhTooltip.FindItemInBags(name);
local itemKey = id..":"..rprop..":"..enchant;
local hsp, histCount, market, warn, nexthsp, nextwarn = Auctioneer.Statistic.GetHSP(itemKey, Auctioneer.Util.GetAuctionKey());
-- Get the fixed price
if (Auctioneer.Storage.GetFixedPrice(itemKey)) then
local startPrice, buyPrice = Auctioneer.Storage.GetFixedPrice(itemKey, count);
local fixedPrice = {};
fixedPrice.text = _AUCT('UiPriceModelFixed');
fixedPrice.note = "";
fixedPrice.bid = startPrice;
fixedPrice.buyout = buyPrice;
table.insert(frame.prices, fixedPrice);
end
-- Add any pricing models from external addons
for pos, priceFunc in AuctionFramePost_AdditionalPricingModels do
local priceModel = priceFunc(id, rprop, enchant, name, count)
if (type(priceModel) == "table") then
table.insert(frame.prices, priceModel)
end
end
-- Get the last sale price if BeanCounter is loaded.
if (IsAddOnLoaded("BeanCounter")) then
-- TODO: Support should be added to BeanCounter for looking
-- up itemKey (itemId:suffixId:enchantID) instead of by name.
local lastSale = BeanCounter.Sales.GetLastSaleForItem(name);
if (lastSale and lastSale.bid and lastSale.buyout) then
local lastPrice = {};
lastPrice.text = _AUCT('UiPriceModelLastSold');
lastPrice.note = string.format(_AUCT('FrmtLastSoldOn'), date("%x", lastSale.time));
lastPrice.bid = (lastSale.bid / lastSale.quantity) * count;
lastPrice.buyout = (lastSale.buyout / lastSale.quantity) * count;
table.insert(frame.prices, lastPrice);
end
end
-- Calculate auctioneer's suggested resale price.
if (hsp == 0) then
local auctionPriceItem = Auctioneer.Core.GetAuctionPriceItem(itemKey, Auctioneer.Util.GetAuctionKey());
local aCount,minCount,minPrice,bidCount,bidPrice,buyCount,buyPrice = Auctioneer.Core.GetAuctionPrices(auctionPriceItem.data);
hsp = math.floor(buyPrice / buyCount); -- use mean buyout if median not available
end
local discountBidPercent = tonumber(Auctioneer.Command.GetFilterVal('pct-bidmarkdown'));
local auctioneerPrice = {};
auctioneerPrice.text = _AUCT('UiPriceModelAuctioneer');
auctioneerPrice.note = warn;
auctioneerPrice.buyout = Auctioneer.Statistic.RoundDownTo95(Auctioneer.Util.NullSafe(hsp) * count);
auctioneerPrice.bid = Auctioneer.Statistic.RoundDownTo95(Auctioneer.Statistic.SubtractPercent(auctioneerPrice.buyout, discountBidPercent));
table.insert(frame.prices, auctioneerPrice);
-- Add the fallback custom price
local customPrice = {}
customPrice.text = _AUCT('UiPriceModelCustom');
customPrice.note = "";
customPrice.bid = nil;
customPrice.buyout = nil;
table.insert(frame.prices, customPrice);
-- Update the price model combo.
local dropdown = getglobal(frame:GetName().."PriceModelDropDown");
local index = UIDropDownMenu_GetSelectedID(dropdown);
if (index == nil) then
index = 1;
end
AuctionFramePost_PriceModelDropDownItem_SetSelectedID(dropdown, index);
else
-- Update the price model combo.
local dropdown = getglobal(frame:GetName().."PriceModelDropDown");
AuctionFramePost_PriceModelDropDownItem_SetSelectedID(dropdown, nil);
end
end
end
-------------------------------------------------------------------------------
-- Updates the content of the auction list based on the current auction item.
-------------------------------------------------------------------------------
function AuctionFramePost_UpdateAuctionList(frame)
frame.auctions = {};
local itemSignature = frame:GetItemSignature();
if (itemSignature) then
local auctions = Auctioneer.Filter.QuerySnapshot(AuctionFramePost_ItemSignatureFilter, itemSignature);
if (auctions) then
for _,a in pairs(auctions) do
local id,rprop,enchant,name,count,min,buyout,uniq = Auctioneer.Core.GetItemSignature(a.signature);
local auction = {};
auction.item = string.format("item:%s:%s:%s:0", id, enchant, rprop);
auction.quantity = count;
auction.name = name;
auction.owner = a.owner;
auction.timeLeft = a.timeLeft;
auction.bid = Auctioneer.Statistic.GetCurrentBid(a.signature);
auction.bidPer = math.floor(auction.bid / auction.quantity);
auction.buyout = buyout;
auction.buyoutPer = math.floor(auction.buyout / auction.quantity);
table.insert(frame.auctions, auction);
end
end
end
ListTemplate_SetContent(frame.auctionList, frame.auctions);
ListTemplate_Sort(frame.auctionList, 5);
end
-------------------------------------------------------------------------------
-- Updates the deposit value.
-------------------------------------------------------------------------------
function AuctionFramePost_UpdateDeposit(frame)
if (not frame.updating) then
local itemID = frame:GetItemID();
local duration = frame:GetDuration();
local stackSize = frame:GetStackSize();
local stackCount = frame:GetStackCount();
if (itemID) then
local deposit = AuctionFramePost_CalculateAuctionDeposit(itemID, stackSize, duration);
if (deposit) then
MoneyFrame_Update(frame.depositMoneyFrame:GetName(), deposit * stackCount);
frame.depositMoneyFrame:Show();
frame.depositErrorLabel:Hide();
else
MoneyFrame_Update(frame.depositMoneyFrame:GetName(), 0);
frame.depositMoneyFrame:Hide();
frame.depositErrorLabel:Show();
end
else
MoneyFrame_Update(frame.depositMoneyFrame:GetName(), 0);
frame.depositMoneyFrame:Hide();
frame.depositErrorLabel:Hide();
end
end
end
-------------------------------------------------------------------------------
-- Gets the item ID.
-------------------------------------------------------------------------------
function AuctionFramePost_GetItemID(frame)
return frame.itemID;
end
-------------------------------------------------------------------------------
-- Gets the item signature.
-------------------------------------------------------------------------------
function AuctionFramePost_GetItemSignature(frame)
return frame.itemSignature;
end
-------------------------------------------------------------------------------
-- Gets the item name.
-------------------------------------------------------------------------------
function AuctionFramePost_GetItemName(frame)
return frame.itemName;
end
-------------------------------------------------------------------------------
-- Sets the price model note (i.e. "Undercutting 5%")
-------------------------------------------------------------------------------
function AuctionFramePost_SetNoteText(frame, text, colorize)
getglobal(frame:GetName().."PriceModelNoteText"):SetText(text);
if (colorize) then
local cHex, cRed, cGreen, cBlue = Auctioneer.Util.GetWarnColor(text);
getglobal(frame:GetName().."PriceModelNoteText"):SetTextColor(cRed, cGreen, cBlue);
else
getglobal(frame:GetName().."PriceModelNoteText"):SetTextColor(1.0, 1.0, 1.0);
end
end
-------------------------------------------------------------------------------
-- Gets whether or not to save the current price information as the fixed
-- price.
-------------------------------------------------------------------------------
function AuctionFramePost_GetSavePrice(frame)
local checkbox = getglobal(frame:GetName().."SavePriceCheckBox");
return (checkbox and checkbox:IsVisible() and checkbox:GetChecked());
end
-------------------------------------------------------------------------------
-- Gets the starting price.
-------------------------------------------------------------------------------
function AuctionFramePost_GetStartPrice(frame)
return MoneyInputFrame_GetCopper(getglobal(frame:GetName().."StartPrice"));
end
-------------------------------------------------------------------------------
-- Sets the starting price.
-------------------------------------------------------------------------------
function AuctionFramePost_SetStartPrice(frame, price)
frame.ignoreStartPriceChange = true;
MoneyInputFrame_SetCopper(getglobal(frame:GetName().."StartPrice"), price);
frame:ValidateAuction();
end
-------------------------------------------------------------------------------
-- Gets the buyout price.
-------------------------------------------------------------------------------
function AuctionFramePost_GetBuyoutPrice(frame)
return MoneyInputFrame_GetCopper(getglobal(frame:GetName().."BuyoutPrice"));
end
-------------------------------------------------------------------------------
-- Sets the buyout price.
-------------------------------------------------------------------------------
function AuctionFramePost_SetBuyoutPrice(frame, price)
frame.ignoreBuyoutPriceChange = true;
MoneyInputFrame_SetCopper(getglobal(frame:GetName().."BuyoutPrice"), price);
frame:ValidateAuction();
end
-------------------------------------------------------------------------------
-- Gets the stack size.
-------------------------------------------------------------------------------
function AuctionFramePost_GetStackSize(frame)
return getglobal(frame:GetName().."StackSize"):GetNumber();
end
-------------------------------------------------------------------------------
-- Sets the stack size.
-------------------------------------------------------------------------------
function AuctionFramePost_SetStackSize(frame, size)
-- Update the stack size.
getglobal(frame:GetName().."StackSize"):SetNumber(size);
-- Update the deposit cost.
frame:UpdateDeposit();
frame:UpdatePriceModels();
frame:ValidateAuction();
end
-------------------------------------------------------------------------------
-- Gets the stack count.
-------------------------------------------------------------------------------
function AuctionFramePost_GetStackCount(frame)
return getglobal(frame:GetName().."StackCount"):GetNumber();
end
-------------------------------------------------------------------------------
-- Sets the stack count.
-------------------------------------------------------------------------------
function AuctionFramePost_SetStackCount(frame, count)
-- Update the stack count.
getglobal(frame:GetName().."StackCount"):SetNumber(count);
-- Update the deposit cost.
frame:UpdateDeposit();
frame:ValidateAuction();
end
-------------------------------------------------------------------------------
-- Gets the duration.
-------------------------------------------------------------------------------
function AuctionFramePost_GetDuration(frame)
if (getglobal(frame:GetName().."ShortAuctionRadio"):GetChecked()) then
return 120;
elseif(getglobal(frame:GetName().."MediumAuctionRadio"):GetChecked()) then
return 480;
else
return 1440;
end
end
-------------------------------------------------------------------------------
-- Sets the duration.
-------------------------------------------------------------------------------
function AuctionFramePost_SetDuration(frame, duration)
local shortRadio = getglobal(frame:GetName().."ShortAuctionRadio");
local mediumRadio = getglobal(frame:GetName().."MediumAuctionRadio");
local longRadio = getglobal(frame:GetName().."LongAuctionRadio");
-- Figure out radio to set as checked.
if (duration == 120) then
shortRadio:SetChecked(1);
mediumRadio:SetChecked(nil);
longRadio:SetChecked(nil);
elseif (duration == 480) then
shortRadio:SetChecked(nil);
mediumRadio:SetChecked(1);
longRadio:SetChecked(nil);
else
shortRadio:SetChecked(nil);
mediumRadio:SetChecked(nil);
longRadio:SetChecked(1);
end
-- Update the deposit cost.
frame:UpdateDeposit();
frame:ValidateAuction();
end
-------------------------------------------------------------------------------
-- Gets the deposit amount required to post.
-------------------------------------------------------------------------------
function AuctionFramePost_GetDeposit(frame)
return getglobal(frame:GetName().."DepositMoneyFrame").staticMoney;
end
-------------------------------------------------------------------------------
-- Sets the item to display in the create auction frame.
-------------------------------------------------------------------------------
function AuctionFramePost_SetAuctionItem(frame, bag, item, count)
-- Prevent validation while updating.
frame.updating = true;
-- Update the controls with the item.
local button = getglobal(frame:GetName().."AuctionItem");
if (bag and item) then
-- Get the item's information.
local itemLink = GetContainerItemLink(bag, item);
local itemID, randomProp, enchant, uniqueId, name = EnhTooltip.BreakLink(itemLink);
local itemTexture, itemCount = GetContainerItemInfo(bag, item);
if (count == nil) then
count = itemCount;
end
-- Save the item's information.
frame.itemID = itemID;
frame.itemSignature = AucPostManager.CreateItemSignature(itemID, randomProp, enchant);
frame.itemName = name;
-- Show the item
getglobal(button:GetName().."Name"):SetText(name);
getglobal(button:GetName().."Name"):Show();
getglobal(button:GetName().."IconTexture"):SetTexture(itemTexture);
getglobal(button:GetName().."IconTexture"):Show();
-- Set the defaults.
local duration = Auctioneer.Command.GetFilterVal('auction-duration')
if duration == 1 then
-- 2h
frame:SetDuration(120)
elseif duration == 2 then
-- 8h
frame:SetDuration(480)
elseif duration == 3 then
-- 24h
frame:SetDuration(1440)
else
-- last
frame:SetDuration(Auctioneer.Command.GetFilterVal('last-auction-duration'))
end
frame:SetStackSize(count);
frame:SetStackCount(1);
-- Clear the current pricing model so that the default one gets selected.
local dropdown = getglobal(frame:GetName().."PriceModelDropDown");
AuctionFramePost_PriceModelDropDownItem_SetSelectedID(dropdown, nil);
-- Update the Transactions tab if BeanCounter is loaded.
if (AuctionFrameTransactions) then
AuctionFrameTransactions:SearchTransactions(name, true, nil);
end
else
-- Clear the item's information.
frame.itemID = nil;
frame.itemSignature = nil;
frame.itemName = nil;
-- Hide the item
getglobal(button:GetName().."Name"):Hide();
getglobal(button:GetName().."IconTexture"):Hide();
-- Clear the defaults.
frame:SetStackSize(1);
frame:SetStackCount(1);
end
-- Update the deposit cost and validate the auction.
frame.updating = false;
frame:UpdateDeposit();
frame:UpdatePriceModels();
frame:UpdateAuctionList();
frame:ValidateAuction();
end
-------------------------------------------------------------------------------
-- Validates the current auction.
-------------------------------------------------------------------------------
function AuctionFramePost_ValidateAuction(frame)
-- Only validate if its not turned off.
if (not frame.updating) then
-- Check that we have an item.
local valid = false;
if (frame.itemID) then
valid = (frame.itemID ~= nil);
end
-- Check that there is a starting price.
local startPrice = frame:GetStartPrice();
local startErrorText = getglobal(frame:GetName().."StartPriceInvalidText");
if (startPrice == 0) then
valid = false;
startErrorText:Show();
else
startErrorText:Hide();
end
-- Check that the starting price is less than or equal to the buyout.
local buyoutPrice = frame:GetBuyoutPrice();
local buyoutErrorText = getglobal(frame:GetName().."BuyoutPriceInvalidText");
if (buyoutPrice > 0 and buyoutPrice < startPrice) then
valid = false;
buyoutErrorText:Show();
else
buyoutErrorText:Hide();
end
-- Check that the item stacks to the amount specified and that the player
-- has enough of the item.
local stackSize = frame:GetStackSize();
local stackCount = frame:GetStackCount();
local quantityErrorText = getglobal(frame:GetName().."QuantityInvalidText");
if (frame.itemID and frame.itemSignature) then
local quantity = AucPostManager.GetItemQuantityBySignature(frame.itemSignature);
local maxStackSize = AuctionFramePost_GetMaxStackSize(frame.itemID);
if (stackSize == 0) then
valid = false;
quantityErrorText:SetText(_AUCT('UiStackTooSmallError'));
quantityErrorText:SetTextColor(RED_FONT_COLOR.r, RED_FONT_COLOR.g, RED_FONT_COLOR.b);
quantityErrorText:Show();
elseif (stackSize > 1 and (maxStackSize == nil or stackSize > maxStackSize)) then
valid = false;
quantityErrorText:SetText(_AUCT('UiStackTooBigError'));
quantityErrorText:SetTextColor(RED_FONT_COLOR.r, RED_FONT_COLOR.g, RED_FONT_COLOR.b);
quantityErrorText:Show();
elseif (quantity < (stackSize * stackCount)) then
valid = false;
quantityErrorText:SetText(_AUCT('UiNotEnoughError'));
quantityErrorText:SetTextColor(RED_FONT_COLOR.r, RED_FONT_COLOR.g, RED_FONT_COLOR.b);
quantityErrorText:Show();
else
local msg = string.format(_AUCT('UiMaxError'), quantity);
quantityErrorText:SetText(msg);
quantityErrorText:SetTextColor(GRAY_FONT_COLOR.r, GRAY_FONT_COLOR.g, GRAY_FONT_COLOR.b);
quantityErrorText:Show();
end
else
quantityErrorText:Hide();
end
-- TODO: Check that the player can afford the deposit cost.
local deposit = frame:GetDeposit();
-- Update the state of the Create Auction button.
local button = getglobal(frame:GetName().."CreateAuctionButton");
if (valid) then
button:Enable();
else
button:Disable();
end
-- Update the price model to reflect bid and buyout prices.
local dropdown = getglobal(frame:GetName().."PriceModelDropDown");
local index = UIDropDownMenu_GetSelectedID(dropdown);
if (index and frame.prices and index <= table.getn(frame.prices)) then
-- Check if the current selection matches
local currentPrice = frame.prices[index];
if ((currentPrice.bid and currentPrice.bid ~= startPrice) or
(currentPrice.buyout and currentPrice.buyout ~= buyoutPrice)) then
-- Nope, find one that does.
for index,price in pairs(frame.prices) do
if ((price.bid == nil or price.bid == startPrice) and (price.buyout == nil or price.buyout == buyoutPrice)) then
if (UIDropDownMenu_GetSelectedID(dropdown) ~= index) then
AuctionFramePost_PriceModelDropDownItem_SetSelectedID(dropdown, index);
end
break;
end
end
end
end
end
end
-------------------------------------------------------------------------------
-------------------------------------------------------------------------------
function AuctionFramePost_AuctionItem_OnClick(button)
local frame = button:GetParent();
-- If the cursor has an item, get it and put it back down in its container.
local item = AuctioneerUI_GetCursorContainerItem();
if (item) then
PickupContainerItem(item.bag, item.slot);
end
-- Update the current item displayed
if (item) then
local itemLink = GetContainerItemLink(item.bag, item.slot)
local _, _, _, _, itemName = EnhTooltip.BreakLink(itemLink);
local _, count = GetContainerItemInfo(item.bag, item.slot);
frame:SetAuctionItem(item.bag, item.slot, count);
else
frame:SetAuctionItem(nil, nil, nil);
end
end
-------------------------------------------------------------------------------
-------------------------------------------------------------------------------
function AuctionFramePost_DurationRadioButton_OnClick(button, index)
local frame = button:GetParent();
if (index == 1) then
Auctioneer.Command.SetFilter('last-auction-duration', 120)
frame:SetDuration(120);
elseif (index == 2) then
Auctioneer.Command.SetFilter('last-auction-duration', 480)
frame:SetDuration(480);
else
Auctioneer.Command.SetFilter('last-auction-duration', 1440)
frame:SetDuration(1440);
end
end
-------------------------------------------------------------------------------
-------------------------------------------------------------------------------
function AuctionFramePost_StartPrice_OnChanged()
local frame = this:GetParent():GetParent();
if (not frame.ignoreStartPriceChange and not updating) then
frame:ValidateAuction();
end
frame.ignoreStartPriceChange = false;
end
-------------------------------------------------------------------------------
-------------------------------------------------------------------------------
function AuctionFramePost_BuyoutPrice_OnChanged()
local frame = this:GetParent():GetParent();
if (not frame.ignoreBuyoutPriceChange and not frame.updating) then
local updatePrice = Auctioneer.Command.GetFilter('update-price');
if (updatePrice) then
frame.updating = true;
local discountBidPercent = tonumber(Auctioneer.Command.GetFilterVal('pct-bidmarkdown'));
local bidPrice = Auctioneer.Statistic.SubtractPercent(frame:GetBuyoutPrice(), discountBidPercent);
frame:SetStartPrice(bidPrice);
frame.updating = false;
end
frame:ValidateAuction();
end
frame.ignoreBuyoutPriceChange = false;
end
-------------------------------------------------------------------------------
-------------------------------------------------------------------------------
function AuctionFramePost_StackSize_OnTextChanged()
local frame = this:GetParent();
-- Update the stack size displayed on the graphic.
local itemID = frame:GetItemID();
local stackSize = frame:GetStackSize();
if (itemID and stackSize > 1) then
getglobal(frame:GetName().."AuctionItemCount"):SetText(stackSize);
getglobal(frame:GetName().."AuctionItemCount"):Show();
else
getglobal(frame:GetName().."AuctionItemCount"):Hide();
end
-- Update the deposit and validate the auction.
frame:UpdateDeposit();
frame:UpdatePriceModels();
frame:ValidateAuction();
end
-------------------------------------------------------------------------------
-------------------------------------------------------------------------------
function AuctionFramePost_StackCount_OnTextChanged()
local frame = this:GetParent();
frame:UpdateDeposit();
frame:ValidateAuction();
end
-------------------------------------------------------------------------------
-------------------------------------------------------------------------------
function AuctionFramePost_CreateAuctionButton_OnClick(button)
local frame = button:GetParent();
local itemSignature = frame:GetItemSignature();
local name = frame:GetItemName();
local startPrice = frame:GetStartPrice();
local buyoutPrice = frame:GetBuyoutPrice();
local stackSize = frame:GetStackSize();
local stackCount = frame:GetStackCount();
local duration = frame:GetDuration();
local deposit = frame:GetDeposit();
-- Check if we should save the pricing information.
if (frame:GetSavePrice()) then
local bag, slot, id, rprop, enchant, uniq = EnhTooltip.FindItemInBags(name);
local itemKey = id..":"..rprop..":"..enchant;
Auctioneer.Storage.SetFixedPrice(itemKey, startPrice, buyoutPrice, duration, stackSize, Auctioneer.Util.GetAuctionKey());
end
-- Post the auction.
AucPostManager.PostAuction(itemSignature, stackSize, stackCount, startPrice, buyoutPrice, duration);
-- Clear the current auction item.
frame:SetAuctionItem(nil, nil, nil);
end
-------------------------------------------------------------------------------
-------------------------------------------------------------------------------
function AuctionFramePost_PriceModelDropDown_Initialize()
local dropdown = this:GetParent();
local frame = dropdown:GetParent();
if (frame.prices) then
for index, value in pairs(frame.prices) do
local price = value;
local info = {};
info.text = price.text;
info.func = AuctionFramePost_PriceModelDropDownItem_OnClick;
info.owner = dropdown;
UIDropDownMenu_AddButton(info);
end
end
end
-------------------------------------------------------------------------------
-------------------------------------------------------------------------------
function AuctionFramePost_PriceModelDropDownItem_OnClick()
local index = this:GetID();
local dropdown = this.owner;
local frame = dropdown:GetParent();
if (frame.prices) then
AuctionFramePost_PriceModelDropDownItem_SetSelectedID(dropdown, index);
end
end
-------------------------------------------------------------------------------
-------------------------------------------------------------------------------
function AuctionFramePost_PriceModelDropDownItem_SetSelectedID(dropdown, index)
local frame = dropdown:GetParent();
frame.updating = true;
if (index) then
local price = frame.prices[index]
if (price.note) then
frame:SetNoteText(price.note, (price.text == _AUCT('UiPriceModelAuctioneer')));
end
if (price.buyout) then
frame:SetBuyoutPrice(price.buyout);
end
if (price.bid) then
frame:SetStartPrice(price.bid);
end
if (price.text == _AUCT('UiPriceModelCustom')) then
getglobal(frame:GetName().."SavePriceText"):Show();
getglobal(frame:GetName().."SavePriceCheckBox"):Show();
getglobal(frame:GetName().."PriceModelNoteText"):Hide();
elseif (price.text == _AUCT('UiPriceModelAuctioneer')) then
getglobal(frame:GetName().."SavePriceText"):Hide();
getglobal(frame:GetName().."SavePriceCheckBox"):Hide();
getglobal(frame:GetName().."PriceModelNoteText"):Show();
elseif (price.text == _AUCT('UiPriceModelLastSold')) then
getglobal(frame:GetName().."SavePriceText"):Hide();
getglobal(frame:GetName().."SavePriceCheckBox"):Hide();
getglobal(frame:GetName().."PriceModelNoteText"):Show();
else
getglobal(frame:GetName().."SavePriceText"):Hide();
getglobal(frame:GetName().."SavePriceCheckBox"):Hide();
getglobal(frame:GetName().."PriceModelNoteText"):Hide();
end
AuctioneerDropDownMenu_Initialize(dropdown, AuctionFramePost_PriceModelDropDown_Initialize);
AuctioneerDropDownMenu_SetSelectedID(dropdown, index);
else
frame:SetNoteText("");
frame:SetStartPrice(0);
frame:SetBuyoutPrice(0);
getglobal(frame:GetName().."SavePriceText"):Hide();
getglobal(frame:GetName().."SavePriceCheckBox"):Hide();
getglobal(frame:GetName().."PriceModelNoteText"):Hide();
UIDropDownMenu_ClearAll(dropdown);
end
frame.updating = false;
frame:ValidateAuction();
end
-------------------------------------------------------------------------------
-- Calculate the deposit required for the specified item.
-------------------------------------------------------------------------------
function AuctionFramePost_CalculateAuctionDeposit(itemID, count, duration)
local price = Auctioneer.API.GetVendorSellPrice(itemID);
if (price) then
local base = math.floor(count * price * GetAuctionHouseDepositRate() / 100);
return base * duration / 120;
end
end
-------------------------------------------------------------------------------
-- Calculate the maximum stack size for an item based on the information returned by GetItemInfo()
-------------------------------------------------------------------------------
function AuctionFramePost_GetMaxStackSize(itemID)
local _, _, _, _, _, _, itemStackCount = GetItemInfo(itemID);
return itemStackCount;
end
-------------------------------------------------------------------------------
-- Filter for Auctioneer.Filter.QuerySnapshot that filters on item name.
-------------------------------------------------------------------------------
function AuctionFramePost_ItemSignatureFilter(item, signature)
local id,rprop,enchant,name,count,min,buyout,uniq = Auctioneer.Core.GetItemSignature(signature);
if (item == AucPostManager.CreateItemSignature(id, rprop, enchant)) then
return false;
end
return true;
end
-------------------------------------------------------------------------------
-- Returns 1.0 for player auctions and 0.4 for competing auctions
-------------------------------------------------------------------------------
function AuctionFramePost_GetItemAlpha(record)
if (record.owner ~= UnitName("player")) then
return 0.4;
end
return 1.0;
end
-------------------------------------------------------------------------------
-- Returns the item color for the specified result
-------------------------------------------------------------------------------
function AuctionFramePost_GetItemColor(auction)
_, _, rarity = GetItemInfo(auction.item);
if (rarity) then
return ITEM_QUALITY_COLORS[rarity];
end
return { r = 1.0, g = 1.0, b = 1.0 };
end