AuctionLite-classic/SellFrame.lua

1020 lignes
30 KiB
Lua

-------------------------------------------------------------------------------
-- SellFrame.lua
--
-- Implements the "Sell" tab.
-------------------------------------------------------------------------------
local _
local L = LibStub("AceLocale-3.0"):GetLocale("AuctionLite", false)
-- Constants for display elements.
local SELL_DISPLAY_SIZE = 16;
-- Pricing methods.
local METHOD_PER_ITEM = 1;
local METHOD_PER_STACK = 2;
-- Durations.
local DURATION_SHORT = 1;
local DURATION_MEDIUM = 2;
local DURATION_LONG = 3;
-- Current sorting state.
local SellSort = {
sort = "BuyoutEach",
flipped = false,
justFlipped = false,
sorted = false,
};
-- Info about data to be shown in scrolling pane.
local SellLink = nil;
local SellData = {};
-- Value of item currently in "Sell" tab.
local ItemValue = nil;
-- User-specified bid and buyout values for current item.
local ItemBid = nil;
local ItemBuyout = nil;
-- Can we undercut the current item value?
local AllowUndercut = nil;
-- Status shown in auction posting frame.
local StatusMessage = "";
local StatusError = false;
-- Number of times the user has edited the size box.
local ChangedSize = 0;
-- Previous prices set by the user.
local SavedPrices = {};
-- Add a money type that updates the deposit correctly.
MoneyTypeInfo["AUCTIONLITE_DEPOSIT"] = {
UpdateFunc = function() return AuctionLite:CalculateDeposit() end,
collapse = 1,
}
-- Determine the correct deposit for a single item.
function AuctionLite:CalculateDeposit()
local time = self:GetDuration();
local stacks = SellStacks:GetNumber();
local size = SellSize:GetNumber();
local startPrice = MoneyInputFrame_GetCopper(SellBidPrice);
local buyoutPrice = MoneyInputFrame_GetCopper(SellBuyoutPrice);
return GetAuctionDeposit(time, startPrice, buyoutPrice, size, stacks);
end
-- Update the deposit field.
function AuctionLite:UpdateDeposit()
MoneyFrame_Update("SellDepositMoneyFrame", self:CalculateDeposit());
end
-- Generate a suggested bid and buyout from the market value. We undercut
-- and round prices according to the user's settings.
function AuctionLite:GeneratePrice(value, allowUndercut)
-- Find out how to round prices.
local granularity = 1;
if self.db.profile.roundPrices > 0 then
granularity = math.pow(10, math.floor(math.log10(value))) *
self.db.profile.roundPrices;
end
-- How much do we undercut?
-- Bid undercut applies all the time; buyout only when allowed.
local bidUndercut = self.db.profile.bidUndercut;
local buyoutUndercut = self.db.profile.buyoutUndercut;
local bidUndercutFixed = self.db.profile.bidUndercutFixed;
local buyoutUndercutFixed = self.db.profile.buyoutUndercutFixed;
if not allowUndercut then
buyoutUndercut = 0;
buyoutUndercutFixed = 0;
end
-- Undercut bid and buyout as specified.
local generate = function(value, undercut, undercutFixed, granularity)
return math.max(1, math.floor((value * (1 - undercut)) / granularity) *
granularity - undercutFixed);
end
local bid =
generate(value, bidUndercut, bidUndercutFixed, granularity);
local buyout =
generate(value, buyoutUndercut, buyoutUndercutFixed, granularity);
return bid, buyout;
end
-- Generate price, and dump some data to the console.
function AuctionLite:ShowPriceData(itemLink, itemValue, stackSize)
local hist = self:GetHistoricalPrice(itemLink);
local stackValue = itemValue * stackSize;
local _, _, count, _, _, vendor = GetAuctionSellItemInfo();
local itemVendor = vendor / count;
self:Print(L["|cff8080ffData for %s x%d|r"]:format(itemLink, stackSize));
self:Print(L["Vendor: %s"]:format(self:PrintMoney(itemVendor * stackSize)));
if hist ~= nil and hist.scans > 0 and hist.price > 0 then
self:Print(L["Historical: %s (%d |4listing:listings;/scan, %d |4item:items;/scan)"]:
format(self:PrintMoney(hist.price * stackSize),
math.floor(0.5 + hist.listings / hist.scans),
math.floor(0.5 + hist.items / hist.scans)));
if itemVendor > 0 then
self:Print(L["Current: %s (%.2fx historical, %.2fx vendor)"]:
format(self:PrintMoney(stackValue),
math.floor(100 * itemValue / hist.price) / 100,
math.floor(100 * itemValue / itemVendor) / 100));
else
self:Print(L["Current: %s (%.2fx historical)"]:
format(self:PrintMoney(stackValue),
math.floor(100 * itemValue / hist.price) / 100));
end
elseif itemVendor > 0 then
self:Print(L["Current: %s (%.2fx vendor)"]:
format(self:PrintMoney(stackValue),
math.floor(100 * itemValue / itemVendor) / 100));
end
return bid, buyout;
end
-- Set the market value for the current item.
function AuctionLite:SetItemValue(value, allowUndercut)
ItemValue = value;
AllowUndercut = allowUndercut;
ItemBid = nil;
ItemBuyout = nil;
end
-- Set the user-specified bid and buyout.
function AuctionLite:SetItemBidBuyout(bid, buyout)
if bid ~= nil then
ItemBid = bid;
end
if buyout ~= nil then
ItemBuyout = buyout;
end
end
-- Set the number of stacks to the maximum value based on the current stack size
function AuctionLite:SellStacksMaxButton_OnClick()
local _, _, _, _, _, _, link = self:GetAuctionSellItemInfoAndLink();
if link ~= nil then
local size = SellSize:GetNumber();
local numItems = self:CountItems(link);
local stacks = (numItems - numItems % size) / size;
SellStacks:SetText(stacks);
AuctionLite:UserChangedSize();
end
end
-- Set the stack size to the maximum value based on the current number of stacks
function AuctionLite:SellSizeMaxButton_OnClick()
local _, _, _, _, _, _, link = self:GetAuctionSellItemInfoAndLink();
if link ~= nil then
local stacks = SellStacks:GetNumber();
local numItems = self:CountItems(link);
local size = (numItems - numItems % stacks) / stacks;
SellSize:SetText(size);
AuctionLite:UserChangedSize();
end
end
-- Indicate that the user has messed with the stack size.
function AuctionLite:UserChangedSize()
ChangedSize = ChangedSize + 1;
self:UpdateDeposit();
self:UpdatePrices();
self:ValidateAuction();
end
-- Update the stack size based on a change in the number of stacks.
function AuctionLite:UserChangedStacks()
-- If the user hasn't already specified a size, adjust the size to
-- fit the number of stacks entered.
if ChangedSize <= 0 then
local _, _, _, _, _, _, link = self:GetAuctionSellItemInfoAndLink();
if link ~= nil then
local size = SellSize:GetNumber();
local stacks = SellStacks:GetNumber();
local numItems = self:CountItems(link);
-- If we don't have enough items to fill the order, then we need to
-- modify the stack size.
if numItems < size * stacks then
-- Get our new stack size.
local newSize = math.floor(numItems / stacks);
-- Make sure the stack is not too large.
local maxSize = self:GetMaxStackSize(link);
if maxSize < newSize then
newSize = maxSize;
end
-- Update the size.
if newSize ~= size then
ChangedSize = ChangedSize - 1;
SellSize:SetText(newSize);
end
end
end
end
self:UpdateDeposit();
self:ValidateAuction();
end
-- Fill in suggested prices based on a query result or a change in the
-- stack size.
function AuctionLite:UpdatePrices()
if ItemValue ~= nil then
local bid, buyout = self:GeneratePrice(ItemValue, AllowUndercut);
if ItemBid ~= nil then
bid = ItemBid;
end
if ItemBuyout ~= nil then
buyout = ItemBuyout;
end
-- If we're pricing by stack, multiply by our stack size.
if self.db.profile.method == METHOD_PER_STACK then
local stackSize = SellSize:GetNumber();
bid = bid * stackSize;
buyout = buyout * stackSize;
end
MoneyInputFrame_SetCopper(SellBidPrice, math.floor(bid + 0.5));
SellBidPrice.expectChanges = SellBidPrice.expectChanges + 1;
MoneyInputFrame_SetCopper(SellBuyoutPrice, math.floor(buyout + 0.5));
SellBuyoutPrice.expectChanges = SellBuyoutPrice.expectChanges + 1;
-- Validate auction and enable create button.
self:ValidateAuction();
end
end
-- Check whether there are any errors in the auction.
function AuctionLite:ValidateAuction()
local name, _, count, _, _, vendor, link =
self:GetAuctionSellItemInfoAndLink();
if name ~= nil and not self:QueryInProgress() then
local bid = MoneyInputFrame_GetCopper(SellBidPrice);
local buyout = MoneyInputFrame_GetCopper(SellBuyoutPrice);
local stacks = SellStacks:GetNumber();
local size = SellSize:GetNumber() or 1;
local numItems = self:CountItems(link);
local maxSize = self:GetMaxStackSize(link);
-- If we're pricing by item, get the full stack price.
if self.db.profile.method == METHOD_PER_ITEM then
bid = bid * size;
buyout = buyout * size;
end
-- Now perform our checks.
if stacks * size <= 0 then
StatusError = true;
SellStatusText:SetText(L["|cffff0000Invalid stack size/count.|r"]);
SellCreateAuctionButton:Disable();
elseif maxSize < size then
StatusError = true;
SellStatusText:SetText(L["|cffff0000Stack size too large.|r"]);
SellCreateAuctionButton:Disable();
elseif numItems < stacks * size then
StatusError = true;
SellStatusText:SetText(L["|cffff0000Not enough items available.|r"]);
SellCreateAuctionButton:Disable();
elseif bid == 0 then
StatusError = true;
SellStatusText:SetText(L["|cffff0000No bid price set.|r"]);
SellCreateAuctionButton:Disable();
elseif 0 < buyout and buyout < bid then
StatusError = true;
SellStatusText:SetText(L["|cffff0000Buyout less than bid.|r"]);
SellCreateAuctionButton:Disable();
elseif GetMoney() < self:CalculateDeposit() then
StatusError = true;
SellStatusText:SetText(L["|cffff0000Not enough cash for deposit.|r"]);
SellCreateAuctionButton:Disable();
elseif 0 < buyout and buyout <= (vendor * size / count) then
StatusError = true;
SellStatusText:SetText(L["|cffff7030Buyout less than vendor price.|r"]);
SellCreateAuctionButton:Enable();
else
StatusError = false;
SellStatusText:SetText(StatusMessage);
SellCreateAuctionButton:Enable();
end
end
end
-- There's been a click on the auction sell item slot.
function AuctionLite:ClickAuctionSellItemButton_Hook()
-- Ignore clicks that we generated ourselves.
if AuctionFrameSell:IsShown() and not self:CreateInProgress() then
-- Clear everything first.
self:ClearSellFrame();
-- If we've got a new item in the auction slot, fill out the fields.
local name, texture, count, _, _, _, link =
self:GetAuctionSellItemInfoAndLink();
if name ~= nil then
local maxSize = self:GetMaxStackSize(link);
SellItemButton:SetNormalTexture(texture);
SellItemButtonName:SetText(name);
if count > 1 then
SellItemButtonCount:SetText(count);
SellItemButtonCount:Show();
else
SellItemButtonCount:Hide();
end
local total = self:CountItems(link);
local prefs = self:GetSavedPrices(link);
local size = count;
if prefs ~= nil and prefs.stackSize ~= nil then
size = prefs.stackSize;
elseif self.db.profile.defaultSize == "a_one" then
size = 1;
elseif self.db.profile.defaultSize == "b_stack" then
size = count;
elseif self.db.profile.defaultSize == "c_full" then
size = maxSize;
if size > total then
size = total;
end
end
local stacks = 1;
if prefs ~= nil and prefs.stackCount ~= nil then
stacks = prefs.stackCount;
elseif self.db.profile.defaultStacks == "a_one" then
stacks = 1;
elseif self.db.profile.defaultStacks == "b_full" then
stacks = math.floor(total / size);
elseif self.db.profile.defaultStacks == "c_excess" then
stacks = math.ceil(total / size);
end
if size ~= SellSize:GetNumber() then
ChangedSize = ChangedSize - 1;
end
SellStacks:SetText(stacks);
SellSize:SetText(size);
SellStacks:SetFocus();
SellStackText:SetText(
L["Number of Items |cff808080(max %d)|r"]:format(total));
self:UpdateDeposit();
if IsControlKeyDown() then
-- Just pretend the scan finished.
self:Print(L["Auction scan skipped (control key is down)"]);
self:SetSellData({}, link);
else
-- Start the scan.
local query = {
link = link,
exact = true,
update = function(pct) AuctionLite:UpdateProgressSell(pct) end,
finish = function(data, link) AuctionLite:SetSellData(data, link) end,
};
self:StartQuery(query);
end
end
end
end
-- Forget all our saved prices.
function AuctionLite:ClearSavedPrices()
SavedPrices = {};
end
-- Clean up the "Sell" tab.
function AuctionLite:ClearSellFrame()
self:CancelQuery();
SellSort = {
sort = "BuyoutEach",
flipped = false,
justFlipped = false,
sorted = false,
};
SellLink = nil;
SellData = {};
ItemValue = nil;
ItemBid = nil;
ItemBuyout = nil;
AllowUndercut = nil;
ChangedSize = 0;
SellItemButton:SetNormalTexture("Interface\\AddOns\\AuctionLite-classic\\Images\\SellFrame-Blank");
SellItemButtonName:SetText("");
SellItemButtonCount:Hide();
SellStackText:SetText(L["Number of Items"]);
SellStacks:SetText("");
SellSize:SetText("");
MoneyInputFrame_ResetMoney(SellBidPrice);
MoneyInputFrame_ResetMoney(SellBuyoutPrice);
SellCreateAuctionButton:Disable();
SellRememberButton:Disable();
StatusError = false;
self:SetStatus("");
self:UpdateDeposit();
FauxScrollFrame_SetOffset(SellScrollFrame, 0);
self:AuctionFrameSell_Update();
end
-- Set the status line.
function AuctionLite:SetStatus(message)
StatusMessage = message;
if not StatusError then
SellStatusText:SetText(message);
end
end
-- Get our query results.
function AuctionLite:SetSellData(results, link)
-- Set the competing auction display.
local result = results[link];
if result ~= nil then
local filtered = {};
local i;
for _, listing in ipairs(result.data) do
if listing.buyout > 0 then
table.insert(filtered, listing);
end
end
SellLink = link;
SellData = filtered;
SellSort = {
sort = "BuyoutEach",
flipped = false,
justFlipped = false,
sorted = false,
};
end
-- Get our recommended item value.
local itemValue = 0;
local allowUndercut = true;
if result ~= nil and result.price > 0 then
itemValue = result.price;
if result.priceIsMine then
allowUndercut = false;
end
if self.db.profile.printPriceData then
self:ShowPriceData(link, itemValue, SellSize:GetNumber());
end
self:SetStatus(L["|cff00ff00Scanned %d listings.|r"]:
format(result.listings));
else
local hist = self:GetHistoricalPrice(link);
if hist ~= nil and hist.price > 0 then
itemValue = hist.price;
self:SetStatus(L["|cffffd000Using historical data.|r"]);
else
local _, _, count, _, _, vendor = GetAuctionSellItemInfo();
local mult = self.db.profile.vendorMultiplier;
itemValue = mult * vendor / count;
self:SetStatus(L["|cffff0000Using %.3gx vendor price.|r"]:
format(mult));
end
allowUndercut = false;
end
self:SetItemValue(itemValue, allowUndercut);
-- Load the user's saved price, if it exists.
local saved = SavedPrices[link];
if saved ~= nil then
self:SetStatus(L["|cff00ff00Using previous price.|r"]);
self:SetItemBidBuyout(saved.bid, saved.buyout);
end
-- Load long-term saved prices.
local prefs = self:GetSavedPrices(link);
if prefs ~= nil then
self:SetItemBidBuyout(prefs.bid, prefs.buyout);
end
-- Active the remember menu.
SellRememberButton:Enable();
-- Update the UI.
self:UpdatePrices();
self:AuctionFrameSell_Update();
end
-- Save the current prices for later use.
function AuctionLite:RecordSellPrices()
if ItemBid ~= nil and ItemBuyout ~= nil then
local _, _, _, _, _, _, link = self:GetAuctionSellItemInfoAndLink();
if link then
SavedPrices[link] = { bid = ItemBid, buyout = ItemBuyout };
end
end
end
-- Static popup warning for clearing data.
StaticPopupDialogs["AL_VENDOR_WARNING"] = {
text = L["VENDOR_WARNING"],
button1 = L["Do it!"],
button2 = L["Cancel"],
OnAccept = function(self)
AuctionLite:RecordSellPrices();
AuctionLite:CreateAuctions();
end,
showAlert = 1,
timeout = 0,
exclusive = 1,
hideOnEscape = 1,
preferredIndex = 3
};
-- We've clicked the "Create" button (or pressed enter).
function AuctionLite:SellCreateAuctionButton_OnClick()
local _, _, count, _, _, vendor = GetAuctionSellItemInfo();
local buyout = MoneyInputFrame_GetCopper(SellBuyoutPrice);
local size = SellSize:GetNumber();
-- If we're pricing by item, get the full stack price.
if self.db.profile.method == METHOD_PER_ITEM then
buyout = buyout * size;
end
-- If we're below vendor price, warn; otherwise, sell.
if 0 < buyout and buyout <= (vendor * size / count) then
StaticPopup_Show("AL_VENDOR_WARNING");
else
self:RecordSellPrices();
self:CreateAuctions();
end
end
-- Handles clicks on buttons in the "Competing Auctions" display.
-- Get the appropriate auction and undercut it!
function AuctionLite:SellButton_OnClick(id)
local offset = FauxScrollFrame_GetOffset(SellScrollFrame);
local item = SellData[offset + id];
if item ~= nil then
if item.owner == UnitName("player") then
self:SetItemBidBuyout(item.bid / item.count, item.buyout / item.count);
else
self:SetItemValue(item.price, true);
end
self:UpdatePrices();
end
end
-- Mouse has entered a row in the scrolling frame.
function AuctionLite:SellButton_OnEnter(widget)
-- Get our index into the current display data.
local offset = FauxScrollFrame_GetOffset(SellScrollFrame);
local id = widget:GetID();
-- If there's an item at this location, create a tooltip for it.
local item = SellData[offset + id];
local _, _, _, _, _, _, link = self:GetAuctionSellItemInfoAndLink();
if item ~= nil and link ~= nil then
local shift = SellButton1Name:GetLeft() - SellButton1Count:GetLeft();
self:SetAuctionLiteTooltip(widget, shift, link, item.count);
end
end
-- Mouse has left a row in the scrolling frame.
function AuctionLite:SellButton_OnLeave(widget)
GameTooltip:Hide();
end
-- Handles clicks on "Remember" button.
function AuctionLite:SellRememberButton_OnClick(widget)
local _, _, _, _, _, _, link = self:GetAuctionSellItemInfoAndLink();
if link ~= nil then
local prefs = self:GetSavedPrices(link);
local menuList = {
{
text = L["Saved Item Settings"],
isTitle = true,
},
};
-- Add items for each of our saved variables, including the
-- current saved value if there is one.
local addMenuItem = function(name, field, isMoney, fn)
local value = prefs[field];
if value ~= nil then
if isMoney then
if self.db.profile.method == METHOD_PER_STACK then
local stackSize = SellSize:GetNumber();
value = value * stackSize;
end
value = self:PrintMoney(value);
end
else
value = "|cffc0c0c0" .. L["(none set)"] .. "|r";
end
local menuItem = {
text = name .. ": " .. value,
func = function()
if prefs[field] ~= nil then
prefs[field] = nil;
else
local newValue = fn();
if isMoney and self.db.profile.method == METHOD_PER_STACK then
local stackSize = SellSize:GetNumber();
newValue = newValue / stackSize;
end
prefs[field] = newValue;
end
self:SetSavedPrices(link, prefs);
end,
};
if prefs[field] ~= nil then
menuItem.checked = true;
end
table.insert(menuList, menuItem);
end
addMenuItem(L["Stack Count"], "stackCount", false, function()
return SellStacks:GetNumber();
end);
addMenuItem(L["Stack Size"], "stackSize", false, function()
return SellSize:GetNumber();
end);
addMenuItem(L["Bid Price"], "bid", true, function()
return MoneyInputFrame_GetCopper(SellBidPrice);
end);
addMenuItem(L["Buyout Price"], "buyout", true, function()
return MoneyInputFrame_GetCopper(SellBuyoutPrice);
end);
-- Add the save/clear all items.
table.insert(menuList, {
text = "",
});
table.insert(menuList, {
text = L["Save All"],
func = function()
local i;
for i = 2, 5 do
local item = menuList[i];
if not item.checked then
item.func();
end
end
end,
});
table.insert(menuList, {
text = L["Clear All"],
func = function()
local i;
for i = 2, 5 do
local item = menuList[i];
if item.checked then
item.func();
end
end
end,
});
-- Now show/hide the menu.
SellRememberDropDown.displayMode = "MENU";
SellRememberDropDown.initialize = EasyMenu_Initialize;
SellRememberDropDown.point = "TOPRIGHT";
SellRememberDropDown.relativeTo = "SellRememberButton";
SellRememberDropDown.relativePoint = "BOTTOMRIGHT";
ToggleDropDownMenu(1, nil, SellRememberDropDown,
"SellRememberButton", 0, 0, menuList);
end
end
-- Get the auction duration.
function AuctionLite:GetDuration()
local time = 0;
if SellShortAuctionButton:GetChecked() then
time = 1;
elseif SellMediumAuctionButton:GetChecked() then
time = 2;
elseif SellLongAuctionButton:GetChecked() then
time = 3;
end
return time;
end
-- Handle updates to the auction duration.
function AuctionLite:ChangeAuctionDuration(value)
self.db.profile.duration = value;
SellShortAuctionButton:SetChecked(nil);
SellMediumAuctionButton:SetChecked(nil);
SellLongAuctionButton:SetChecked(nil);
if value == DURATION_SHORT then
SellShortAuctionButton:SetChecked(true);
elseif value == DURATION_MEDIUM then
SellMediumAuctionButton:SetChecked(true);
elseif value == DURATION_LONG then
SellLongAuctionButton:SetChecked(true);
end
self:UpdateDeposit();
end
-- Handle updates to the pricing method.
function AuctionLite:ChangePricingMethod(value)
local prevValue = self.db.profile.method;
self.db.profile.method = value;
local stackSize = SellSize:GetNumber();
-- Clear everything.
SellPerItemButton:SetChecked(nil);
SellPerStackButton:SetChecked(nil);
-- Now update the UI based on the new value.
if value == METHOD_PER_ITEM then
SellPerItemButton:SetChecked(true);
SellBidStackText:SetText(L["|cff808080(per item)|r"]);
SellBuyoutStackText:SetText(L["|cff808080(per item)|r"]);
elseif value == METHOD_PER_STACK then
SellPerStackButton:SetChecked(true);
SellBidStackText:SetText(L["|cff808080(per stack)|r"]);
SellBuyoutStackText:SetText(L["|cff808080(per stack)|r"]);
end
-- Update the listed prices based on the new pricing method.
self:UpdatePrices();
end
-- User changed the prices manually.
function AuctionLite:UserChangedPrices()
-- Get the user's values.
local bid = MoneyInputFrame_GetCopper(SellBidPrice);
local buyout = MoneyInputFrame_GetCopper(SellBuyoutPrice);
-- If we're pricing by stack, divide by our stack size.
if self.db.profile.method == METHOD_PER_STACK then
local stackSize = SellSize:GetNumber();
bid = bid / stackSize;
buyout = buyout / stackSize;
end
-- Set our new state.
self:SetItemBidBuyout(bid, buyout);
end
-- Update query progress.
function AuctionLite:UpdateProgressSell(pct)
self:SetStatus(L["|cffffff00Scanning: %d%%|r"]:format(pct));
end
-- Apply the current sort.
function AuctionLite:ApplySellSort()
local info = SellSort;
local data = SellData;
local cmp;
if info.sort == "ItemName" then
cmp = function(a, b) return a.count < b.count end;
elseif info.sort == "BuyoutEach" then
cmp = function(a, b) return a.buyout / a.count < b.buyout / b.count end;
elseif info.sort == "BuyoutAll" then
cmp = function(a, b) return a.buyout < b.buyout end;
else
assert(false);
end
self:ApplySort(info, data, cmp);
end
-- Set a new sort type for the "Sell" tab.
function AuctionLite:SellSortButton_OnClick(sort)
assert(sort == "ItemName" or sort == "BuyoutEach" or sort == "BuyoutAll");
self:SortButton_OnClick(SellSort, sort);
self:AuctionFrameSell_Update();
end
-- Paint the scroll frame on the right-hand side with competing auctions.
function AuctionLite:AuctionFrameSell_Update()
if not SellSort.sorted then
self:ApplySellSort();
end
local sort;
for _, sort in ipairs({ "ItemName", "BuyoutEach", "BuyoutAll" }) do
self:UpdateSortArrow("Sell", sort, SellSort.sort, SellSort.flipped);
end
local offset = FauxScrollFrame_GetOffset(SellScrollFrame);
local name, color, enchant, jewel1, jewel2, jewel3, jewel4;
local showPlus;
if SellLink ~= nil then
name, color, _, _, enchant, jewel1, jewel2, jewel3, jewel4 =
self:SplitLink(SellLink);
showPlus = enchant ~= 0 or
jewel1 ~= 0 or jewel2 ~= 0 or
jewel3 ~= 0 or jewel4 ~= 0;
end
local i;
for i = 1, SELL_DISPLAY_SIZE do
local item = SellData[offset + i];
local buttonName = "SellButton" .. i;
local button = _G[buttonName];
if item ~= nil then
local countText = _G[buttonName .. "Count"];
local nameText = _G[buttonName .. "Name"];
local plusText = _G[buttonName .. "Plus"];
local buyoutEachFrame = _G[buttonName .. "BuyoutEachFrame"];
local buyoutFrame = _G[buttonName .. "BuyoutFrame"];
local alpha;
if item.owner ~= UnitName("player") and not item.keep then
alpha = 0.5;
else
alpha = 1.0;
end
local countColor;
local nameColor;
if item.owner == UnitName("player") then
countColor = "ffffff00";
nameColor = "ffffff00";
else
countColor = "ffffffff";
nameColor = color;
end
countText:SetText("|c" .. countColor .. item.count .. "x|r");
countText:SetAlpha(alpha);
nameText:SetText("|c" .. nameColor .. name .. "|r");
nameText:SetAlpha(alpha);
if showPlus then
plusText:SetPoint("LEFT", nameText, "LEFT",
nameText:GetStringWidth(), 0);
plusText:Show();
else
plusText:Hide();
end
MoneyFrame_Update(buyoutEachFrame, math.floor(item.buyout / item.count + 0.5));
buyoutEachFrame:SetAlpha(alpha);
MoneyFrame_Update(buyoutFrame, math.floor(item.buyout + 0.5));
buyoutFrame:SetAlpha(alpha);
button:Show();
else
button:Hide();
end
end
FauxScrollFrame_Update(SellScrollFrame, table.getn(SellData),
SELL_DISPLAY_SIZE, SellButton1:GetHeight());
end
-- Handle clicks on the scroll bar.
function AuctionLite:SellScrollFrame_OnVerticalScroll(offset)
FauxScrollFrame_OnVerticalScroll(
SellScrollFrame, offset, SellButton1:GetHeight(),
function() AuctionLite:AuctionFrameSell_Update() end);
end
-- Handle bag item clicks by dropping the item into the sell tab.
function AuctionLite:BagClickSell(container, slot)
local location = ItemLocation:CreateFromBagAndSlot(container, slot);
if C_Item.GetItemLink(location) ~= nil then
ClearCursor();
ClickAuctionSellItemButton();
ClearCursor();
C_Container.PickupContainerItem(container, slot);
ClickAuctionSellItemButton();
end
end
-- Create the "Sell" tab.
function AuctionLite:CreateSellFrame()
-- Create our tab.
local index = self:CreateTab(L["AuctionLite - Sell"], AuctionFrameSell);
-- Set all localizable strings in the UI.
SellTitle:SetText(L["AuctionLite - Sell"]);
SellStackText:SetText(L["Number of Items"]);
SellStacksOfText:SetText(L["stacks of"]);
SellBuyoutText:SetText(L["Buyout Price"]);
SellMethodText:SetText(L["Pricing Method"]);
SellPerItemButtonText:SetText(L["per item"]);
SellPerStackButtonText:SetText(L["per stack"]);
local version, major, minor = strmatch(GetBuildInfo(), '([%d]*)%.([%d]*)%.([%d]*)')
if version >= "3" then
SellShortAuctionButtonText:SetText(L["%dh"]:format(12));
SellMediumAuctionButtonText:SetText(L["%dh"]:format(24));
SellLongAuctionButtonText:SetText(L["%dh"]:format(48));
else
SellShortAuctionButtonText:SetText(L["%dh"]:format(2));
SellMediumAuctionButtonText:SetText(L["%dh"]:format(8));
SellLongAuctionButtonText:SetText(L["%dh"]:format(24));
end
-- Set button text and adjust arrows.
SellItemNameButton:SetText(L["Competing Auctions"]);
self:UpdateSortButton("Sell", "BuyoutEach", L["Buyout Per Item"]);
self:UpdateSortButton("Sell", "BuyoutAll", L["Buyout Total"]);
-- Set our constants.
SellPerItemButton:SetID(METHOD_PER_ITEM);
SellPerStackButton:SetID(METHOD_PER_STACK);
SellShortAuctionButton:SetID(DURATION_SHORT);
SellMediumAuctionButton:SetID(DURATION_MEDIUM);
SellLongAuctionButton:SetID(DURATION_LONG);
-- Set up tabbing between fields.
MoneyInputFrame_SetNextFocus(SellBidPrice, SellBuyoutPriceGold);
MoneyInputFrame_SetPreviousFocus(SellBidPrice, SellSize);
MoneyInputFrame_SetNextFocus(SellBuyoutPrice, SellStacks);
MoneyInputFrame_SetPreviousFocus(SellBuyoutPrice, SellBidPriceCopper);
-- Miscellaneous additional setup.
MoneyFrame_SetType(SellDepositMoneyFrame, "AUCTIONLITE_DEPOSIT");
-- Make sure it's pristine.
self:ClearSellFrame();
-- Set preferences.
self:ChangeAuctionDuration(self.db.profile.duration);
self:ChangePricingMethod(self.db.profile.method);
return index;
end