You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

123 lines
4.0 KiB

4 years ago
local TSM = select(2, ...)
local L = LibStub("AceLocale-3.0"):GetLocale("TradeSkillMaster_Shopping") -- loads the localization table
local private = {}
function private.Create(parent)
local frame = CreateFrame("Frame", nil, parent)
frame:Hide()
frame:SetAllPoints()
frame:SetScript("OnShow", private.UpdateSTData)
frame:RegisterEvent("BAG_UPDATE")
frame:SetScript("OnEvent", function() TSMAPI:CreateTimeDelay("quickPostingBagUpdate", 0.1, function() private.UpdateSTData(frame) end) end)
local label = TSMAPI.GUI:CreateLabel(frame, "small")
label:SetPoint("TOPLEFT")
label:SetPoint("TOPRIGHT")
label:SetJustifyH("CENTER")
label:SetJustifyV("TOP")
label:SetText(L["Click to search for an item.\nShift-Click to post at market value."])
TSMAPI.GUI:CreateHorizontalLine(frame, -(label:GetHeight()+5))
local stFrame = CreateFrame("Frame", nil, frame)
stFrame:SetPoint("TOPLEFT", label, "BOTTOMLEFT", 0, -10)
stFrame:SetPoint("BOTTOMRIGHT", 0, 30)
TSMAPI.Design:SetFrameColor(stFrame)
local stHandlers = {
OnClick = function(_, data)
if IsShiftKeyDown() then
if type(data.buyout) ~= "number" or data.buyout <= 0 then return end
local bag, slot
for b, s, itemString in TSMAPI:GetBagIterator() do
if itemString == data.itemString then
bag = b
slot = s
break
end
end
if not bag or not slot then return end
if not AuctionFrameAuctions.duration then
-- Fix in case Blizzard_AuctionUI hasn't set this value yet (which could cause an error)
AuctionFrameAuctions.duration = TSM.db.global.quickPostingDuration
end
PickupContainerItem(bag, slot)
ClickAuctionSellItemButton(AuctionsItemButton, "LeftButton")
StartAuction(data.buyout*TSM.db.global.postBidPercent, data.buyout, TSM.db.global.quickPostingDuration, 1, 1)
TSM:Printf(L["Posted a %s with a buyout of %s."], data.link, TSMAPI:FormatTextMoney(data.buyout))
TSM:RegisterMessage("TSM_AH_EVENTS", function() TSMAPI:FireEvent("SHOPPING:QUICKPOST:POSTEDITEM", data) private.UpdateSTData(frame) end)
TSMAPI:WaitForAuctionEvents("Post")
else
TSM.Search:StartFilterSearch(data.name.."/exact")
end
end,
OnEnter = function(_, data, self)
if not data then return end
GameTooltip:SetOwner(self, "ANCHOR_RIGHT")
TSMAPI:SafeTooltipLink(data.link)
GameTooltip:Show()
end,
OnLeave = function()
GameTooltip:ClearLines()
GameTooltip:Hide()
end
}
local colInfo = {
{name=L["Item"], width=0.56},
{name=L["Num"], width=0.14, align="CENTER"},
{name=L["Price"], width=0.3, align="RIGHT"},
}
frame.st = TSMAPI:CreateScrollingTable(stFrame, colInfo, stHandlers, 12)
frame.st:DisableSelection(true)
frame.st:DisableHighlight(true)
local checkBox = TSMAPI.GUI:CreateCheckBox(frame)
checkBox:SetPoint("BOTTOMLEFT")
checkBox:SetPoint("BOTTOMRIGHT")
checkBox:SetHeight(30)
checkBox:SetLabel(L["Hide Grouped Items"])
checkBox:SetValue(TSM.db.global.quickPostingHideGrouped)
checkBox:SetCallback("OnValueChanged", function(_, _, value)
TSM.db.global.quickPostingHideGrouped = value
private.UpdateSTData(frame)
end)
return frame
end
function private.UpdateSTData(frame)
local items = {}
for bag, slot, itemString, quantity in TSMAPI:GetBagIterator() do
if not TSM.db.global.quickPostingHideGrouped or not TSMAPI:GetGroupPath(itemString) then
items[itemString] = (items[itemString] or 0) + quantity
end
end
local stData = {}
for itemString, quantity in pairs(items) do
local name, link = TSMAPI:GetSafeItemInfo(itemString)
if name then
local buyout = TSM:GetMaxPrice(TSM.db.global.quickPostingPrice, itemString)
local row = {
cols = {
{value=link},
{value=quantity},
{value=TSMAPI:FormatTextMoney(buyout) or "---"},
},
itemString = itemString,
link = link,
name = name,
buyout = buyout,
}
tinsert(stData, row)
end
end
sort(stData, function(a, b) return a.name < b.name end)
frame.st:SetData(stData)
end
do
TSM:AddSidebarFeature(L["Quick Posting"], private.Create)
end