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.

305 lines
8.7 KiB

local E, L, V, P, G = unpack(ElvUI)
local AB = E:GetModule('ActionBars')
local S = E:GetModule('Skins')
local _G = _G
local pairs = pairs
local select = select
local unpack = unpack
local CreateFrame = CreateFrame
local GetItemInfo = GetItemInfo
local GetItemQualityColor = GetItemQualityColor
local GetContainerItemInfo = GetContainerItemInfo
local GetContainerItemQuestInfo = GetContainerItemQuestInfo
local GetInventoryItemTexture = GetInventoryItemTexture
local GetInventorySlotInfo = GetInventorySlotInfo
local hooksecurefunc = hooksecurefunc
local MAX_WATCHED_TOKENS = MAX_WATCHED_TOKENS
local NUM_CONTAINER_FRAMES = NUM_CONTAINER_FRAMES
local QUESTS_LABEL = QUESTS_LABEL
local BACKPACK_TOOLTIP = BACKPACK_TOOLTIP
local TEXTURE_ITEM_QUEST_BORDER = TEXTURE_ITEM_QUEST_BORDER
local function UpdateBorderColors(button)
if button.type and button.type == QUESTS_LABEL then
button:SetBackdropBorderColor(1, 0.2, 0.2)
elseif button.quality and button.quality > 1 then
local r, g, b = GetItemQualityColor(button.quality)
button:SetBackdropBorderColor(r, g, b)
else
button:SetBackdropBorderColor(unpack(E.media.bordercolor))
end
end
local function BagButtonOnEnter(self)
AB:BindUpdate(self, 'BAG')
end
local function StripBlizzard(button)
for i=1, button:GetNumRegions() do
local region = select(i, button:GetRegions())
if region and region:IsObjectType('Texture') and region ~= button.UpgradeIcon and region ~= button.ItemContextOverlay then
region:SetTexture()
end
end
end
local function SkinButton(button)
if button.template then return end
StripBlizzard(button)
button:SetTemplate()
button:StyleButton()
button.IconBorder:Kill()
button.icon:SetInside()
button.icon:SetTexCoord(unpack(E.TexCoords))
button.searchOverlay:SetColorTexture(0, 0, 0, 0.8)
if button.IconQuestTexture then
button.IconQuestTexture:SetTexCoord(unpack(E.TexCoords))
button.IconQuestTexture:SetInside(button)
end
if button.Cooldown then
E:RegisterCooldown(button.Cooldown)
end
-- bag keybind support from actionbar module
if E.private.actionbar.enable then
button:HookScript('OnEnter', BagButtonOnEnter)
end
end
local function SkinItemButton(button, bagID)
if not button.template then
SkinButton(button)
end
local slotID = button:GetID()
local texture, _, _, rarity, _, _, itemLink, _, _, itemID = GetContainerItemInfo(bagID, slotID)
local isQuestItem, questId = GetContainerItemQuestInfo(bagID, slotID)
button.icon:SetTexture(texture)
button.itemID, button.ilink = itemID, itemLink
if itemLink then
button.name, _, button.quality, _, _, button.type = GetItemInfo(itemLink)
if not button.quality then
button.quality = rarity
end
else
button.name, button.quality, button.type = nil, nil, nil
end
if questId or isQuestItem then
button.type = QUESTS_LABEL
end
UpdateBorderColors(button)
end
local function BagIcon(container, texture)
if not container.PortraitButton then return end
if not container.BagIcon then
container.BagIcon = container.PortraitButton:CreateTexture()
container.BagIcon:SetTexCoord(unpack(E.TexCoords))
container.BagIcon:SetInside()
end
container.BagIcon:SetTexture(texture)
end
local function SkinContainer(container)
local size = container.size
if not size then return end
local name = container:GetName()
local bagID = container:GetID()
for i = 1, size do
local button = _G[name..'Item'..i]
if button then
SkinItemButton(button, bagID)
end
end
end
local function ContainerOnEvent(container, event, bagID)
if event == 'BAG_UPDATE' and container:GetID() == bagID then
SkinContainer(container)
end
end
local function SkinBag(bagID)
local container = _G['ContainerFrame'..bagID]
if container and not container.template then
container:SetFrameStrata('HIGH')
container:StripTextures(true)
container:SetTemplate('Transparent')
container:HookScript('OnEvent', ContainerOnEvent)
container:HookScript('OnShow', SkinContainer)
S:HandleCloseButton(_G[container:GetName()..'CloseButton'])
S:HandleButton(container.PortraitButton)
container.PortraitButton:Size(35)
container.PortraitButton.Highlight:SetAlpha(0)
if bagID == 1 then
_G.BackpackTokenFrame:StripTextures(true)
for j = 1, MAX_WATCHED_TOKENS do
local token = _G['BackpackTokenFrameToken'..j]
token.count:SetPoint('RIGHT', token.icon, 'LEFT', -3, 0)
S:HandleIcon(token.icon, true)
end
end
end
end
local function SkinAllBags()
for bagID = 1, NUM_CONTAINER_FRAMES do
SkinBag(bagID)
end
end
local bagIconCache = {}
local function UpdateContainerButton(frame)
local frameName = frame:GetName()
for i=1, frame.size do
local questTexture = _G[frameName..'Item'..i..'IconQuestTexture']
if questTexture:IsShown() and questTexture:GetTexture() == TEXTURE_ITEM_QUEST_BORDER then
questTexture:Hide()
end
end
local title = _G[frameName..'Name']
if title and title.GetText then
local name = title:GetText()
local icon = bagIconCache[name]
if icon then
BagIcon(frame, icon)
elseif name then
icon = (name ~= BACKPACK_TOOLTIP and select(10, GetItemInfo(name))) or E.Media.Textures.Backpack
BagIcon(frame, icon)
bagIconCache[name] = icon
end
end
_G.BagItemAutoSortButton:ClearAllPoints()
_G.BagItemAutoSortButton:Point('LEFT', _G.BagItemSearchBox, 'RIGHT', 5, 3)
end
local function UpdateBankItem(button)
if not button.teplate then
SkinButton(button)
end
local BankFrame = _G.BankFrame
if not BankFrame.isSkinned then
S:HandleButton(_G.BankFramePurchaseButton, true)
S:HandleCloseButton(_G.BankFrameCloseButton)
_G.BankFrameMoneyFrameInset:Kill()
_G.BankFrameMoneyFrameBorder:Kill()
BankFrame:StripTextures(true)
BankFrame:SetTemplate('Transparent')
BankFrame.backdrop2 = CreateFrame('Frame', nil, _G.BankSlotsFrame)
BankFrame.backdrop2:SetTemplate('Transparent')
BankFrame.backdrop2:Point('TOPLEFT', _G.BankFrameItem1, 'TOPLEFT', -6, 6)
BankFrame.backdrop2:Point('BOTTOMRIGHT', _G.BankFrameItem28, 'BOTTOMRIGHT', 6, -6)
BankFrame.backdrop3 = CreateFrame('Frame', nil, _G.BankSlotsFrame)
BankFrame.backdrop3:SetTemplate('Transparent')
BankFrame.backdrop3:Point('TOPLEFT', _G.BankSlotsFrame.Bag1, 'TOPLEFT', -6, 6)
BankFrame.backdrop3:Point('BOTTOMRIGHT', _G.BankSlotsFrame.Bag7, 'BOTTOMRIGHT', 6, -6)
BankFrame.isSkinned = true
end
local ReagentBankFrame = _G.ReagentBankFrame
if _G.ReagentBankFrameItem1 and not ReagentBankFrame.backdrop2 then
ReagentBankFrame.backdrop2 = CreateFrame('Frame', nil, ReagentBankFrame)
ReagentBankFrame.backdrop2:SetTemplate('Transparent')
ReagentBankFrame.backdrop2:Point('TOPLEFT', _G.ReagentBankFrameItem1, 'TOPLEFT', -6, 6)
ReagentBankFrame.backdrop2:Point('BOTTOMRIGHT', _G.ReagentBankFrameItem98, 'BOTTOMRIGHT', 6, -6)
end
_G.BankItemAutoSortButton:ClearAllPoints()
_G.BankItemAutoSortButton:Point('LEFT', _G.BankItemSearchBox, 'RIGHT', 5, 2)
if not button.levelAdjusted then
button:SetFrameLevel(button:GetFrameLevel() + 1)
button.levelAdjusted = true
end
local slotID = button:GetID()
local inventoryID = button:GetInventorySlot()
local textureName = GetInventoryItemTexture('player', inventoryID)
if textureName then
button.icon:SetTexture(textureName)
elseif button.isBag then
local _, slotTextureName = GetInventorySlotInfo('Bag'..slotID)
button.icon:SetTexture(slotTextureName)
end
if not button.isBag then
local container = button:GetParent():GetID()
local _, _, _, rarity, _, _, itemLink, _, _, itemID = GetContainerItemInfo(container, slotID)
local isQuestItem, questId = GetContainerItemQuestInfo(container, slotID)
button.itemID, button.ilink = itemID, itemLink
if itemLink then
button.name, _, button.quality, _, _, button.type = GetItemInfo(itemLink)
if not button.quality then
button.quality = rarity
end
else
button.name, button.quality, button.type = nil, nil, nil
end
if isQuestItem or questId then
button.type = QUESTS_LABEL
end
UpdateBorderColors(button)
end
end
function S:ContainerFrame()
if E.private.bags.enable or not (E.private.skins.blizzard.enable and E.private.skins.blizzard.bags) then return end
_G.BankSlotsFrame:StripTextures()
S:HandleTab(_G.BankFrameTab1)
S:HandleTab(_G.BankFrameTab2)
S:HandleEditBox(_G.BagItemSearchBox)
S:HandleEditBox(_G.BankItemSearchBox)
S:HandleButton(_G.ReagentBankFrame.DespositButton)
_G.ReagentBankFrame:HookScript('OnShow', _G.ReagentBankFrame.StripTextures)
for _, icon in pairs({_G.BagItemAutoSortButton, _G.BankItemAutoSortButton}) do
icon:StripTextures()
icon:SetTemplate()
icon:StyleButton()
icon.Icon = icon:CreateTexture()
icon.Icon:SetTexture(E.Media.Textures.PetBroom)
icon.Icon:SetTexCoord(unpack(E.TexCoords))
icon.Icon:SetInside()
end
hooksecurefunc('ContainerFrame_Update', UpdateContainerButton)
hooksecurefunc('BankFrameItemButton_Update', UpdateBankItem)
SkinAllBags()
end
S:AddCallback('ContainerFrame')