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

local SLE, T, E, L, V, P, G = unpack(select(2, ...))
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)