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.
755 lines
25 KiB
755 lines
25 KiB
local SLE, T, E, L, V, P, G = unpack(ElvUI_SLE)
|
|
local Sk = SLE.Skins
|
|
local S = E.Skins
|
|
|
|
-- GLOBALS: CreateFrame, hooksecurefunc, ChatFontSmall, UIParent, INVSLOT_FIRST_EQUIPPED, INVSLOT_LAST_EQUIPPED
|
|
-- Rebuilding Merchant Frame as a scrollable list. Based on a code by Nils Ruesch (xMerchant addon)
|
|
local _G = _G
|
|
local strtrim = strtrim
|
|
local GetLocale = GetLocale
|
|
local HandleModifiedItemClick = HandleModifiedItemClick
|
|
local MerchantItemButton_OnClick = MerchantItemButton_OnClick
|
|
local BuyMerchantItem = BuyMerchantItem
|
|
local MerchantFrame_ConfirmExtendedItemCost = MerchantFrame_ConfirmExtendedItemCost
|
|
local FauxScrollFrame_OnVerticalScroll = FauxScrollFrame_OnVerticalScroll
|
|
local GetMerchantItemInfo, GetMerchantItemLink = GetMerchantItemInfo, GetMerchantItemLink
|
|
local GetMoney, GetCoinTextureString = GetMoney, GetCoinTextureString
|
|
local GetMerchantItemCostInfo, GetMerchantItemCostItem = GetMerchantItemCostInfo, GetMerchantItemCostItem
|
|
local FauxScrollFrame_GetOffset, FauxScrollFrame_Update = FauxScrollFrame_GetOffset, FauxScrollFrame_Update
|
|
local GetMerchantNumItems = GetMerchantNumItems
|
|
local IsModifiedClick = IsModifiedClick
|
|
local MerchantItemButton_OnModifiedClick = MerchantItemButton_OnModifiedClick
|
|
local MerchantItemButton_OnEnter = MerchantItemButton_OnEnter
|
|
local ResetCursor, ShowInspectCursor = ResetCursor, ShowInspectCursor
|
|
|
|
local C_CurrencyInfo_GetCurrencyListInfo = C_CurrencyInfo.GetCurrencyListInfo
|
|
local C_CurrencyInfo_GetCurrencyListSize = C_CurrencyInfo.GetCurrencyListSize
|
|
|
|
local C_Container_GetContainerItemInfo = C_Container.GetContainerItemInfo
|
|
local C_Container_GetContainerNumSlots = C_Container.GetContainerNumSlots
|
|
local C_Container_GetContainerItemID = C_Container.GetContainerItemID
|
|
|
|
local HIGHLIGHT_FONT_COLOR = HIGHLIGHT_FONT_COLOR
|
|
local SEARCH = SEARCH
|
|
local MAX_ITEM_COST = MAX_ITEM_COST
|
|
local RETRIEVING_ITEM_INFO = RETRIEVING_ITEM_INFO
|
|
local ITEM_SPELL_KNOWN = ITEM_SPELL_KNOWN
|
|
local NUM_BAG_SLOTS = NUM_BAG_SLOTS
|
|
local MISCELLANEOUS, MOUNT = MISCELLANEOUS, MOUNT
|
|
|
|
local RECIPE = GetItemClassInfo(Enum.ItemClass.Recipe)
|
|
|
|
local currencies = {}
|
|
local buttons = {}
|
|
local searching = ""
|
|
local errors = {}
|
|
local knowns = {}
|
|
local MerchantUpdating = false
|
|
|
|
local locale = {
|
|
enUS = {
|
|
REQUIRES_LEVEL = "Requires Level (%d+)",
|
|
LEVEL = "Level %d",
|
|
REQUIRES_REPUTATION = "Requires .+ %- (.+)",
|
|
REQUIRES_REPUTATION_NAME = "Requires (.+) %- .+",
|
|
REQUIRES_SKILL = "Requires (.+) %((%d+)%)",
|
|
REQUIRES = "Requires (.+)",
|
|
},
|
|
deDE = {
|
|
REQUIRES_LEVEL = "Benötigt Stufe (%d+)",
|
|
LEVEL = "Stufe %d",
|
|
REQUIRES_REPUTATION = "Benötigt .+ %- (.+)",
|
|
REQUIRES_REPUTATION_NAME = "Benötigt (.+) %- .+",
|
|
REQUIRES_SKILL = "Benötigt (.+) %((%d+)%)",
|
|
REQUIRES = "Benötigt (.+)",
|
|
},
|
|
frFR = {
|
|
REQUIRES_LEVEL = "Niveau (%d+) requis",
|
|
LEVEL = "Niveau %d",
|
|
REQUIRES_REPUTATION = "Requiert .+ %- (.+)",
|
|
REQUIRES_REPUTATION_NAME = "Requiert (.+) %- .+",
|
|
REQUIRES_SKILL = "(.+) %((%d+)%) requis",
|
|
REQUIRES = "Requiert (.+)",
|
|
},
|
|
esES = {
|
|
REQUIRES_LEVEL = "Necesitas ser de nivel (%d+)",
|
|
LEVEL = "Nivel %d",
|
|
REQUIRES_REPUTATION = "Requiere .+: (.+)",
|
|
REQUIRES_REPUTATION_NAME = "Requiere (.+): .+",
|
|
REQUIRES_SKILL = "Requiere (.+) %((%d+)%)",
|
|
REQUIRES = "Requiere (.+)",
|
|
},
|
|
esMX = {
|
|
REQUIRES_LEVEL = "Necesitas ser de nivel (%d+)",
|
|
LEVEL = "Nivel %d",
|
|
REQUIRES_REPUTATION = "Requiere .+: (.+)",
|
|
REQUIRES_REPUTATION_NAME = "Requiere (.+): .+",
|
|
REQUIRES_SKILL = "Requiere (.+) %((%d+)%)",
|
|
REQUIRES = "Requiere (.+)",
|
|
},
|
|
koKR = {
|
|
REQUIRES_LEVEL = "최소 레벨 (%d+)",
|
|
LEVEL = "레벨 %d",
|
|
REQUIRES_REPUTATION = "필수 평판 .+ %- (.+)",
|
|
REQUIRES_REPUTATION_NAME = "필수 평판 (.+) %- .+",
|
|
REQUIRES_SKILL = "필수 스킬 (.+) %((%d+)%)",
|
|
REQUIRES = "필수 (.+)",
|
|
},
|
|
ruRU = {
|
|
REQUIRES_LEVEL = "Требуется уровень: (%d+)",
|
|
LEVEL = "Уровень %d",
|
|
REQUIRES_REPUTATION = "Требуется: (.+) со стороны (.+)",
|
|
REQUIRES_SKILL = "Требуется: (.+) %((%d+)%)",
|
|
REQUIRES = "Требуется (.+)",
|
|
},
|
|
zhCN = {
|
|
REQUIRES_LEVEL = "需要等级 (%d+)",
|
|
LEVEL = "等级 %d",
|
|
REQUIRES_REPUTATION = "需要 .+ %- (.+)",
|
|
REQUIRES_REPUTATION_NAME = "需要 (.+) %- .+",
|
|
REQUIRES_SKILL = "需要(.+)%((%d+)%)",
|
|
REQUIRES = "需要(.+)",
|
|
},
|
|
zhTW = {
|
|
REQUIRES_LEVEL = "需要等级 (%d+)",
|
|
LEVEL = "等级 %d",
|
|
REQUIRES_REPUTATION = "需要 .+ %- (.+)",
|
|
REQUIRES_REPUTATION_NAME = "需要 (.+) %- .+",
|
|
REQUIRES_SKILL = "需要(.+)%((%d+)%)",
|
|
REQUIRES = "需要(.+)",
|
|
},
|
|
}
|
|
local REQUIRES_LEVEL = locale[GetLocale()] and locale[GetLocale()].REQUIRES_LEVEL or ""
|
|
local LEVEL = locale[GetLocale()] and locale[GetLocale()].LEVEL or ""
|
|
local REQUIRES_REPUTATION = locale[GetLocale()] and locale[GetLocale()].REQUIRES_REPUTATION or ""
|
|
local REQUIRES_REPUTATION_NAME = locale[GetLocale()] and locale[GetLocale()].REQUIRES_REPUTATION_NAME or ""
|
|
local REQUIRES_SKILL = locale[GetLocale()] and locale[GetLocale()].REQUIRES_SKILL or ""
|
|
local SKILL = "%1$s (%2$d)"
|
|
local REQUIRES = locale[GetLocale()] and locale[GetLocale()].REQUIRES or ""
|
|
|
|
local function Item_OnClick(self)
|
|
HandleModifiedItemClick(self.itemLink)
|
|
end
|
|
|
|
local function Item_OnEnter(self)
|
|
local parent = self:GetParent()
|
|
if ( parent.isShown and not parent.hover ) then
|
|
parent.oldr, parent.oldg, parent.oldb, parent.olda = parent.highlight:GetVertexColor()
|
|
parent.highlight:SetVertexColor(parent.r, parent.g, parent.b, parent.olda)
|
|
parent.hover = 1
|
|
else
|
|
parent.highlight:Show()
|
|
end
|
|
|
|
_G["GameTooltip"]:SetOwner(self, "ANCHOR_RIGHT")
|
|
if self.itemLink then _G["GameTooltip"]:SetHyperlink(self.itemLink) end
|
|
if ( IsModifiedClick("DRESSUP") ) then
|
|
ShowInspectCursor()
|
|
else
|
|
ResetCursor()
|
|
end
|
|
end
|
|
|
|
local function Item_OnLeave(self)
|
|
local parent = self:GetParent()
|
|
if ( parent.isShown ) then
|
|
parent.highlight:SetVertexColor(parent.oldr, parent.oldg, parent.oldb, parent.olda)
|
|
parent.hover = nil
|
|
else
|
|
parent.highlight:Hide()
|
|
end
|
|
_G["GameTooltip"]:Hide()
|
|
ResetCursor()
|
|
end
|
|
|
|
local function ListItem_OnClick(self, button)
|
|
if ( IsModifiedClick() ) then
|
|
MerchantItemButton_OnModifiedClick(self, button)
|
|
else
|
|
MerchantItemButton_OnClick(self, button)
|
|
end
|
|
end
|
|
|
|
local function ListItem_OnEnter(self)
|
|
if ( self.isShown and not self.hover ) then
|
|
self.oldr, self.oldg, self.oldb, self.olda = self.highlight:GetVertexColor()
|
|
self.highlight:SetVertexColor(self.r, self.g, self.b, self.olda)
|
|
self.hover = 1
|
|
else
|
|
self.highlight:Show()
|
|
end
|
|
MerchantItemButton_OnEnter(self)
|
|
end
|
|
|
|
local function ListItem_OnLeave(self)
|
|
if ( self.isShown ) then
|
|
self.highlight:SetVertexColor(self.oldr, self.oldg, self.oldb, self.olda)
|
|
self.hover = nil
|
|
else
|
|
self.highlight:Hide()
|
|
end
|
|
_G["GameTooltip"]:Hide()
|
|
ResetCursor()
|
|
_G["MerchantFrame"].itemHover = nil
|
|
end
|
|
|
|
local function ListItem_OnHide()
|
|
wipe(errors)
|
|
wipe(currencies)
|
|
end
|
|
|
|
local function List_GetError(link, itemType, itemSubType)
|
|
if ( not link ) then
|
|
return false
|
|
end
|
|
|
|
local id = link:match("item:(%d+)")
|
|
|
|
if ( errors[id] ) then
|
|
return errors[id]
|
|
end
|
|
local upperLimit
|
|
local isMount = false
|
|
local isRecipe = false
|
|
if itemType == RECIPE then
|
|
isRecipe = true
|
|
elseif itemType == MISCELLANEOUS and itemSubType == MOUNT then
|
|
isMount = true
|
|
end
|
|
local errormsg = ""
|
|
|
|
_G["SLE_Merchant_HiddenTooltip"]:SetOwner(UIParent, "ANCHOR_NONE")
|
|
_G["SLE_Merchant_HiddenTooltip"]:SetHyperlink(link)
|
|
upperLimit = isRecipe and _G["SLE_Merchant_HiddenTooltip"]:NumLines() or 0
|
|
|
|
for i=2, _G["SLE_Merchant_HiddenTooltip"]:NumLines() do
|
|
if (isRecipe and (i <= 5 or i >= upperLimit - 3)) or isMount or not isRecipe then
|
|
local text = _G["SLE_Merchant_HiddenTooltipTextLeft"..i]
|
|
local r, g, b = text:GetTextColor()
|
|
local gettext = text:GetText()
|
|
if ( gettext and r >= 0.9 and g <= 0.2 and b <= 0.2 and gettext ~= RETRIEVING_ITEM_INFO ) then
|
|
if ( errormsg ~= "" ) then
|
|
errormsg = errormsg..", "
|
|
end
|
|
|
|
local level = gettext:match(REQUIRES_LEVEL)
|
|
if ( level ) then
|
|
errormsg = errormsg..LEVEL:format(level)
|
|
end
|
|
|
|
local reputation, factionName = strmatch(gettext, REQUIRES_REPUTATION)
|
|
if ( reputation ) then
|
|
errormsg = errormsg..reputation
|
|
if not factionName then factionName = gettext:match(REQUIRES_REPUTATION_NAME) end
|
|
if ( factionName ) then
|
|
errormsg = errormsg.." ("..factionName..")"
|
|
end
|
|
end
|
|
|
|
local skill, slevel = gettext:match(REQUIRES_SKILL)
|
|
if ( skill and slevel ) then
|
|
errormsg = errormsg..SKILL:format(skill, slevel)
|
|
end
|
|
|
|
local requires = gettext:match(REQUIRES)
|
|
if ( not level and not reputation and not skill and requires ) then
|
|
errormsg = errormsg..requires
|
|
end
|
|
|
|
local known = gettext == ITEM_SPELL_KNOWN and true or false
|
|
if known then
|
|
errormsg = errormsg..ITEM_SPELL_KNOWN
|
|
end
|
|
|
|
if ( not level and not reputation and not skill and not requires and not known) then
|
|
if ( errormsg ~= "" ) then
|
|
errormsg = gettext..", "..errormsg
|
|
else
|
|
errormsg = errormsg..gettext
|
|
end
|
|
end
|
|
end
|
|
-- TODO: Come back to these later as they are declared 2 times in the same block
|
|
local text = _G["SLE_Merchant_HiddenTooltipTextRight"..i]
|
|
local r, g, b = text:GetTextColor()
|
|
local gettext = text:GetText()
|
|
if ( gettext and r >= 0.9 and g <= 0.2 and b <= 0.2 ) then
|
|
if ( errormsg ~= "" ) then
|
|
errormsg = errormsg..", "
|
|
end
|
|
errormsg = errormsg..gettext
|
|
end
|
|
end
|
|
end
|
|
|
|
if ( errormsg == "" ) then
|
|
return false
|
|
end
|
|
|
|
errors[id] = errormsg
|
|
return errormsg
|
|
end
|
|
|
|
local function List_AltCurrencyFrame_Update(item, texture, cost, canAfford)
|
|
if (canAfford == false) then
|
|
item.count:SetTextColor(1, 0, 0)
|
|
else
|
|
item.count:SetTextColor(1, 1, 1)
|
|
end
|
|
|
|
item.count:SetText(cost)
|
|
item.icon:SetTexture(texture)
|
|
item.count:SetPoint("RIGHT", item.icon, "LEFT", -2, 0)
|
|
-- item.icon:SetTexCoord(0, 1, 0, 1)
|
|
item.icon:SetTexCoord(unpack(E.TexCoords))
|
|
|
|
local iconWidth = 17
|
|
item.icon:SetWidth(iconWidth)
|
|
item.icon:SetHeight(iconWidth)
|
|
item:SetWidth(item.count:GetWidth() + iconWidth + 4)
|
|
item:SetHeight(item.count:GetHeight() + 4)
|
|
end
|
|
|
|
local function List_CurrencyUpdate()
|
|
wipe(currencies)
|
|
|
|
local limit = C_CurrencyInfo_GetCurrencyListSize()
|
|
|
|
for i=1, limit do
|
|
local name, isHeader, _, _, _, count, icon, maximum, hasWeeklyLimit, currentWeeklyAmount, _, itemID = C_CurrencyInfo_GetCurrencyListInfo(i)
|
|
if ( not isHeader and itemID ) then
|
|
currencies[tonumber(itemID)] = count
|
|
if ( not isHeader and itemID and tonumber(itemID) <= 9 ) then
|
|
currencies[name] = count
|
|
end
|
|
elseif ( not isHeader and not itemID ) then
|
|
currencies[name] = count
|
|
end
|
|
end
|
|
|
|
for i=INVSLOT_FIRST_EQUIPPED, INVSLOT_LAST_EQUIPPED, 1 do
|
|
local itemID = GetInventoryItemID("player", i)
|
|
if ( itemID ) then
|
|
currencies[tonumber(itemID)] = 1
|
|
end
|
|
end
|
|
|
|
for bagID=0, NUM_BAG_SLOTS, 1 do
|
|
local numSlots = C_Container_GetContainerNumSlots(bagID)
|
|
for slotID=1, numSlots, 1 do
|
|
local itemID = C_Container_GetContainerItemID(bagID, slotID)
|
|
if ( itemID ) then
|
|
local count = select(2, C_Container_GetContainerItemInfo(bagID, slotID))
|
|
itemID = tonumber(itemID)
|
|
local currency = currencies[itemID]
|
|
if ( currency ) then
|
|
currencies[itemID] = currency+count
|
|
else
|
|
currencies[itemID] = count
|
|
end
|
|
end
|
|
end
|
|
end
|
|
end
|
|
|
|
-- TODO: Think the i is incorrect
|
|
local function List_UpdateAltCurrency(button, index, i, canAfford)
|
|
local currency_frames = {}
|
|
local lastFrame
|
|
local itemCount = GetMerchantItemCostInfo(index)
|
|
|
|
if ( itemCount > 0 ) then
|
|
for i = 1, MAX_ITEM_COST do
|
|
-- for i = 1, 1 do
|
|
local itemTexture, itemValue, itemLink = GetMerchantItemCostItem(index, i)
|
|
local item = button.item[i]
|
|
item.index = index
|
|
item.item = i
|
|
item.itemLink = itemLink
|
|
List_AltCurrencyFrame_Update(item, itemTexture, itemValue, canAfford)
|
|
|
|
if ( not itemTexture ) then
|
|
item:Hide()
|
|
else
|
|
lastFrame = item
|
|
lastFrame._dbg_name = "item"..i
|
|
tinsert(currency_frames, item)
|
|
item:Show()
|
|
end
|
|
end
|
|
else
|
|
for i = 1, MAX_ITEM_COST do
|
|
button.item[i]:Hide()
|
|
end
|
|
end
|
|
|
|
button.money._dbg_name = "money"
|
|
tinsert(currency_frames, button.money)
|
|
|
|
lastFrame = nil
|
|
for i, frame in ipairs(currency_frames) do
|
|
if i == 1 then
|
|
frame:SetPoint("RIGHT", -2, 6)
|
|
else
|
|
if lastFrame then
|
|
frame:SetPoint("RIGHT", lastFrame, "LEFT", -2, 0)
|
|
else
|
|
frame:SetPoint("RIGHT", -2, 0)
|
|
end
|
|
end
|
|
lastFrame = frame
|
|
end
|
|
end
|
|
|
|
local function List_MerchantUpdate()
|
|
local self = _G["SLE_ListMerchantFrame"]
|
|
local numMerchantItems = GetMerchantNumItems()
|
|
|
|
FauxScrollFrame_Update(self.scrollframe, numMerchantItems, 10, 29.4, nil, nil, nil, nil, nil, nil, 1)
|
|
for i=1, 10 do
|
|
local offset = i+FauxScrollFrame_GetOffset(self.scrollframe)
|
|
local button = buttons[i]
|
|
button.hover = nil
|
|
if ( offset <= numMerchantItems ) then
|
|
--API name, texture, price, quantity, numAvailable, isPurchasable, isUsable, extendedCost = GetMerchantItemInfo(index)
|
|
local name, texture, price, quantity, numAvailable, isPurchasable, isUsable, extendedCost = GetMerchantItemInfo(offset)
|
|
local canAfford = CanAffordMerchantItem(offset)
|
|
local link = GetMerchantItemLink(offset)
|
|
local subtext = ""
|
|
local r, g, b = 0.5, 0.5, 0.5
|
|
local _, itemRarity, itemType, itemSubType, equipSlot
|
|
local iLevel
|
|
if ( link ) then
|
|
--API name, link, quality, iLevel, reqLevel, class, subclass, maxStack, equipSlot, texture, vendorPrice = GetItemInfo(itemID) or GetItemInfo("itemName") or GetItemInfo("itemLink")
|
|
_, _, itemRarity, iLevel, _, itemType, itemSubType, _, equipSlot = GetItemInfo(link)
|
|
if itemRarity then
|
|
r, g, b = GetItemQualityColor(itemRarity)
|
|
button.itemname:SetTextColor(r, g, b)
|
|
end
|
|
if itemSubType then
|
|
subtext = itemSubType:gsub("%(OBSOLETE%)", "")
|
|
if equipSlot and equipSlot ~= "" and equipSlot ~= "INVTYPE_TABARD" then
|
|
subtext = _G[equipSlot].." ("..iLevel..")"
|
|
elseif equipSlot and equipSlot == "INVTYPE_TABARD" then
|
|
subtext = _G[equipSlot]
|
|
end
|
|
button.iteminfo:SetText(subtext)
|
|
else
|
|
button.iteminfo:SetText("")
|
|
end
|
|
|
|
local alpha = 0.3
|
|
if ( searching == "" or searching == SEARCH:lower() or name:lower():match(searching)
|
|
or ( itemRarity and ( tostring(itemRarity):lower():match(searching) or _G["ITEM_QUALITY"..tostring(itemRarity).."_DESC"]:lower():match(searching) ) )
|
|
or ( itemType and itemType:lower():match(searching) )
|
|
or ( itemSubType and itemSubType:lower():match(searching) )
|
|
) then
|
|
alpha = 1
|
|
end
|
|
button:SetAlpha(alpha)
|
|
else
|
|
button.iteminfo:SetText(subtext)
|
|
end
|
|
|
|
button.itemname:SetText((numAvailable >= 0 and "|cffffffff["..numAvailable.."]|r " or "")..(quantity > 1 and "|cffffffff"..quantity.."x|r " or "")..(name or "|cffff0000"..RETRIEVING_ITEM_INFO))
|
|
button.icon:SetTexture(texture)
|
|
button.icon:SetTexCoord(unpack(E.TexCoords))
|
|
|
|
List_UpdateAltCurrency(button, offset, i, canAfford)
|
|
if ( extendedCost and price <= 0 ) then
|
|
button.price = nil
|
|
button.extendedCost = true
|
|
button.money:SetText("")
|
|
elseif ( extendedCost and price > 0 ) then
|
|
button.price = price
|
|
button.extendedCost = true
|
|
button.money:SetText(GetCoinTextureString(price))
|
|
else
|
|
button.price = price
|
|
button.extendedCost = nil
|
|
button.money:SetText(GetCoinTextureString(price))
|
|
end
|
|
|
|
if ( GetMoney() > price ) then
|
|
button.money:SetTextColor(1, 1, 1)
|
|
else
|
|
button.money:SetTextColor(1, 0, 0)
|
|
end
|
|
|
|
local merchantItemID = GetMerchantItemID(offset)
|
|
local isHeirloom = merchantItemID and C_Heirloom.IsItemHeirloom(merchantItemID)
|
|
local isKnownHeirloom = isHeirloom and C_Heirloom.PlayerHasHeirloom(merchantItemID)
|
|
local tintRed = not isPurchasable or (not isUsable and not isHeirloom) -- or (canAfford == false)
|
|
|
|
if ( numAvailable == 0 or isKnownHeirloom ) then
|
|
button.highlight:SetVertexColor(0.5, 0.5, 0.5, 0.5)
|
|
button.highlight:Show()
|
|
button.isShown = 1
|
|
elseif tintRed then
|
|
button.highlight:SetVertexColor(1, 0.2, 0.2, 0.5)
|
|
button.highlight:Show()
|
|
button.isShown = 1
|
|
|
|
-- TODO: Check if this works as Darth had local errors but was alread declared
|
|
local errors = List_GetError(link, itemType, itemSubType)
|
|
if ( errors ) then
|
|
button.iteminfo:SetText("|cffd00000"..subtext.." - "..errors.."|r")
|
|
end
|
|
else
|
|
button.highlight:SetVertexColor(r, g, b, 0.5)
|
|
button.highlight:Hide()
|
|
button.isShown = nil
|
|
|
|
-- TODO: Check if this works as Darth had local errors but was alread declared
|
|
local errors = List_GetError(link, itemType, itemSubType)
|
|
if ( errors ) then
|
|
button.highlight:SetVertexColor(1, 0.2, 0.2, 0.5)
|
|
button.highlight:Show()
|
|
button.isShown = 1
|
|
button.iteminfo:SetText("|cffd00000"..subtext.." - "..errors.."|r")
|
|
end
|
|
end
|
|
|
|
button.r = r
|
|
button.g = g
|
|
button.b = b
|
|
button.link = GetMerchantItemLink(offset)
|
|
button.hasItem = true
|
|
button.texture = texture
|
|
button:SetID(offset)
|
|
button:Show()
|
|
else
|
|
button.price = nil
|
|
button.hasItem = nil
|
|
button:Hide()
|
|
end
|
|
if ( button.hasStackSplit == 1 ) then
|
|
_G["StackSplitFrame"]:Hide()
|
|
end
|
|
end
|
|
end
|
|
|
|
local function ListSearch_OnTextChanged(self)
|
|
searching = self:GetText():trim():lower()
|
|
List_MerchantUpdate()
|
|
end
|
|
|
|
local function ListSearch_OnShow(self)
|
|
self:SetText(SEARCH)
|
|
searching = ""
|
|
end
|
|
|
|
local function ListSearch_OnEnterPressed(self)
|
|
self:ClearFocus()
|
|
end
|
|
|
|
local function ListSearch_OnEscapePressed(self)
|
|
self:ClearFocus()
|
|
self:SetText(SEARCH)
|
|
searching = ""
|
|
end
|
|
|
|
local function ListSearch_OnEditFocusLost(self)
|
|
self:HighlightText(0, 0)
|
|
if ( strtrim(self:GetText()) == "" ) then
|
|
self:SetText(SEARCH)
|
|
searching = ""
|
|
end
|
|
end
|
|
|
|
local function ListSearch_OnEditFocusGained(self)
|
|
self:HighlightText()
|
|
if ( self:GetText():trim():lower() == SEARCH:lower() ) then
|
|
self:SetText("")
|
|
end
|
|
end
|
|
|
|
local function ListStyle_Update()
|
|
if ( _G["MerchantFrame"].selectedTab == 1 ) then
|
|
for i=1, 12 do
|
|
_G["MerchantItem"..i]:Hide()
|
|
end
|
|
_G["SLE_ListMerchantFrame"]:Show()
|
|
-- List_CurrencyUpdate()
|
|
List_MerchantUpdate()
|
|
else
|
|
_G["SLE_ListMerchantFrame"]:Hide()
|
|
for i=1, 12 do
|
|
_G["MerchantItem"..i]:Show()
|
|
end
|
|
if ( _G["StackSplitFrame"]:IsShown() ) then
|
|
_G["StackSplitFrame"]:Hide()
|
|
end
|
|
end
|
|
end
|
|
|
|
local function OnVerticalScroll(self, offset)
|
|
FauxScrollFrame_OnVerticalScroll(self, offset, 29.4, List_MerchantUpdate)
|
|
end
|
|
|
|
local function SplitStack(button, split)
|
|
if ( button.extendedCost ) then
|
|
MerchantFrame_ConfirmExtendedItemCost(button, split)
|
|
elseif ( split > 0 ) then
|
|
BuyMerchantItem(button:GetID(), split)
|
|
end
|
|
end
|
|
|
|
local function Create_ListButton(frame, i)
|
|
local button = CreateFrame("Button", "SLE_ListMerchantFrame_Button"..i, frame)
|
|
button:SetWidth(frame:GetWidth())
|
|
button:SetHeight(29.4)
|
|
if ( i == 1 ) then
|
|
button:SetPoint("TOPLEFT", 0, -1)
|
|
else
|
|
button:SetPoint("TOP", buttons[i-1], "BOTTOM")
|
|
end
|
|
button:RegisterForClicks("LeftButtonUp","RightButtonUp")
|
|
button:RegisterForDrag("LeftButton")
|
|
button.UpdateTooltip = ListItem_OnEnter
|
|
button.SplitStack = SplitStack
|
|
button:SetScript("OnClick", ListItem_OnClick)
|
|
button:SetScript("OnDragStart", MerchantItemButton_OnClick)
|
|
button:SetScript("OnEnter", ListItem_OnEnter)
|
|
button:SetScript("OnLeave", ListItem_OnLeave)
|
|
button:SetScript("OnHide", ListItem_OnHide)
|
|
|
|
local highlight = button:CreateTexture("$parentHighlight", "BACKGROUND") -- better highlight
|
|
button.highlight = highlight
|
|
highlight:SetAllPoints()
|
|
highlight:SetBlendMode("ADD")
|
|
highlight:SetTexture("Interface\\Buttons\\UI-Listbox-Highlight2")
|
|
highlight:Hide()
|
|
|
|
local icon = button:CreateTexture("$parentIcon", "BORDER")
|
|
button.icon = icon
|
|
icon:SetWidth(25.4)
|
|
icon:SetHeight(25.4)
|
|
icon:SetPoint("LEFT", 2, 0)
|
|
icon:SetTexture("Interface\\Icons\\temp")
|
|
|
|
local itemname = button:CreateFontString("$parentItemName", "ARTWORK")
|
|
button.itemname = itemname
|
|
itemname:FontTemplate(E.LSM:Fetch('font', E.db.sle.skins.merchant.list.nameFont), E.db.sle.skins.merchant.list.nameSize, E.db.sle.skins.merchant.list.nameOutline)
|
|
itemname:SetPoint("TOPLEFT", icon, "TOPRIGHT", 4, -3)
|
|
itemname:SetJustifyH("LEFT")
|
|
|
|
local iteminfo = button:CreateFontString("$parentItemInfo", "ARTWORK")
|
|
button.iteminfo = iteminfo
|
|
iteminfo:FontTemplate(E.LSM:Fetch('font', E.db.sle.skins.merchant.list.subFont), E.db.sle.skins.merchant.list.subSize, E.db.sle.skins.merchant.list.subOutline)
|
|
iteminfo:SetPoint("BOTTOMLEFT", icon, "BOTTOMRIGHT", 4, -3)
|
|
iteminfo:SetJustifyH("LEFT")
|
|
|
|
local money = button:CreateFontString("$parentMoney", "ARTWORK", "GameFontHighlight")
|
|
button.money = money
|
|
money:SetPoint("RIGHT", -2, 0)
|
|
money:SetJustifyH("RIGHT")
|
|
itemname:SetPoint("BOTTOMRIGHT", money, "LEFT", -2, 0)
|
|
iteminfo:SetPoint("TOPRIGHT", money, "LEFT", -2, 0)
|
|
|
|
button.item = {}
|
|
for j=1, MAX_ITEM_COST do
|
|
local item = CreateFrame("Button", "$parentItem"..j, button)
|
|
button.item[j] = item
|
|
item:SetWidth(17)
|
|
item:SetHeight(17)
|
|
if ( j == 1 ) then
|
|
item:SetPoint("RIGHT", -2, 0)
|
|
else
|
|
item:SetPoint("RIGHT", button.item[j-1], "LEFT", -2, 0)
|
|
end
|
|
item:RegisterForClicks("LeftButtonUp","RightButtonUp")
|
|
item:SetScript("OnClick", Item_OnClick)
|
|
item:SetScript("OnEnter", Item_OnEnter)
|
|
item:SetScript("OnLeave", Item_OnLeave)
|
|
item.hasItem = true
|
|
item.UpdateTooltip = Item_OnEnter
|
|
|
|
local icon = item:CreateTexture("$parentIcon", "BORDER")
|
|
item.icon = icon
|
|
icon:SetWidth(17)
|
|
icon:SetHeight(17)
|
|
icon:SetPoint("RIGHT")
|
|
|
|
local count = item:CreateFontString("$parentCount", "ARTWORK", "GameFontHighlight")
|
|
item.count = count
|
|
count:SetPoint("RIGHT", icon, "LEFT", -2, 0)
|
|
end
|
|
|
|
buttons[i] = button
|
|
end
|
|
|
|
local function MerchantListSkinInit()
|
|
if E.private.skins.blizzard.enable ~= true or E.private.skins.blizzard.merchant ~= true or E.private.sle.skins.merchant.enable ~= true then return end
|
|
if E.private.sle.skins.merchant.style ~= "List" then return end
|
|
local frame = CreateFrame("Frame", "SLE_ListMerchantFrame", _G["MerchantFrame"])
|
|
frame:SetWidth(331)
|
|
frame:SetHeight(294)
|
|
frame:SetPoint("TOPLEFT", 10, -65)
|
|
|
|
frame.scrollframe = CreateFrame("ScrollFrame", "SLE_ListMerchantScrollFrame", frame, "FauxScrollFrameTemplate")
|
|
frame.scrollframe:SetWidth(320)
|
|
frame.scrollframe:SetHeight(298)
|
|
frame.scrollframe:SetPoint("TOPLEFT", _G["MerchantFrame"], 22, -65)
|
|
frame.scrollframe:SetScript("OnVerticalScroll", OnVerticalScroll)
|
|
frame.scrollframe:CreateBackdrop("Transparent")
|
|
S:HandleScrollBar(_G["SLE_ListMerchantScrollFrameScrollBar"])
|
|
|
|
frame.search = CreateFrame("EditBox", "$parentSearch", frame, "InputBoxTemplate")
|
|
frame.search:SetWidth(92)
|
|
frame.search:SetHeight(24)
|
|
frame.search:SetPoint("BOTTOMLEFT", frame, "TOPLEFT", 50, 9)
|
|
frame.search:SetAutoFocus(false)
|
|
frame.search:SetFontObject(ChatFontSmall)
|
|
frame.search:SetScript("OnTextChanged", ListSearch_OnTextChanged)
|
|
frame.search:SetScript("OnShow", ListSearch_OnShow)
|
|
frame.search:SetScript("OnEnterPressed", ListSearch_OnEnterPressed)
|
|
frame.search:SetScript("OnEscapePressed", ListSearch_OnEscapePressed)
|
|
frame.search:SetScript("OnEditFocusLost", ListSearch_OnEditFocusLost)
|
|
frame.search:SetScript("OnEditFocusGained", ListSearch_OnEditFocusGained)
|
|
frame.search:SetText(SEARCH)
|
|
S:HandleEditBox(frame.search)
|
|
|
|
for i = 1, 10 do Create_ListButton(frame.scrollframe, i) end
|
|
_G["MerchantFrame"]:SetWidth(_G["MerchantFrame"]:GetWidth() + 26)
|
|
|
|
hooksecurefunc("MerchantFrame_Update", ListStyle_Update)
|
|
hooksecurefunc("MerchantFrame_OnHide", ListItem_OnHide)
|
|
hooksecurefunc("MerchantFrame_UpdateCurrencies", function()
|
|
for index = 1, 3 do
|
|
local tokenButton = _G["MerchantToken"..index]
|
|
if tokenButton and not tokenButton.SLE_ListMerchantStyled then
|
|
if tokenButton.Icon then
|
|
tokenButton.Icon:SetTexCoord(unpack(E.TexCoords))
|
|
else
|
|
tokenButton.icon:SetTexCoord(unpack(E.TexCoords))
|
|
end
|
|
tokenButton.SLE_ListMerchantStyled = true
|
|
end
|
|
end
|
|
end)
|
|
|
|
_G["MerchantBuyBackItem"]:ClearAllPoints()
|
|
_G["MerchantBuyBackItem"]:SetPoint("TOPRIGHT", frame.scrollframe, "BOTTOMRIGHT", 17, -12)
|
|
local delete = { _G["MerchantNextPageButton"], _G["MerchantPrevPageButton"], _G["MerchantPageText"] }
|
|
for i = 1, #delete do
|
|
delete[i]:Hide()
|
|
delete[i].Show = function() end
|
|
end
|
|
frame:RegisterEvent("BAG_UPDATE")
|
|
frame:SetScript("OnEvent", function(self, event, ...)
|
|
if not self:IsShown() or MerchantUpdating then return end
|
|
MerchantUpdating = true
|
|
E:Delay(0.25, function()
|
|
-- List_CurrencyUpdate()
|
|
List_MerchantUpdate()
|
|
MerchantUpdating = false
|
|
end)
|
|
end)
|
|
if not locale[GetLocale()] then
|
|
SLE:Print("Your language is unavailable for selected merchant style. We would appretiate if you contact us and provide needed translations.", "warning")
|
|
end
|
|
CreateFrame("GameTooltip", "SLE_Merchant_HiddenTooltip", UIParent, "GameTooltipTemplate")
|
|
end
|
|
|
|
hooksecurefunc(S, "Initialize", MerchantListSkinInit)
|
|
|