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.

494 lines
16 KiB

local E, L, V, P, G = unpack(ElvUI)
local S = E:GetModule('Skins')
local _G = _G
local pairs, ipairs = pairs, ipairs
local unpack, select = unpack, select
local hooksecurefunc = hooksecurefunc
local FLYOUT_LOCATIONS = {
[0xFFFFFFFF] = 'PLACEINBAGS',
[0xFFFFFFFE] = 'IGNORESLOT',
[0xFFFFFFFD] = 'UNIGNORESLOT'
}
local showInsetBackdrop = {
ReputationFrame = true,
TokenFrame = true
}
local function UpdateCharacterInset(name)
_G.CharacterFrameInset.backdrop:SetShown(showInsetBackdrop[name])
end
local function UpdateAzeriteItem(self)
if not self.styled then
self.styled = true
self.AzeriteTexture:SetAlpha(0)
self.RankFrame.Texture:SetTexture()
self.RankFrame.Label:FontTemplate(nil, nil, 'OUTLINE')
end
end
local function UpdateAzeriteEmpoweredItem(self)
self.AzeriteTexture:SetAtlas('AzeriteIconFrame')
self.AzeriteTexture:SetInside()
self.AzeriteTexture:SetTexCoord(unpack(E.TexCoords))
self.AzeriteTexture:SetDrawLayer('BORDER', 1)
end
local function ColorizeStatPane(frame)
frame.Background:SetAlpha(0)
local r, g, b = 0.8, 0.8, 0.8
frame.leftGrad = frame:CreateTexture(nil, 'BORDER')
frame.leftGrad:Size(80, frame:GetHeight())
frame.leftGrad:Point('LEFT', frame, 'CENTER')
frame.leftGrad:SetTexture(E.Media.Textures.White8x8)
frame.leftGrad:SetGradientAlpha('Horizontal', r, g, b, 0.25, r, g, b, 0)
frame.rightGrad = frame:CreateTexture(nil, 'BORDER')
frame.rightGrad:Size(80, frame:GetHeight())
frame.rightGrad:Point('RIGHT', frame, 'CENTER')
frame.rightGrad:SetTexture(E.Media.Textures.White8x8)
frame.rightGrad:SetGradientAlpha('Horizontal', r, g, b, 0, r, g, b, 0.25)
end
local function StatsPane(which)
local CharacterStatsPane = _G.CharacterStatsPane
CharacterStatsPane[which]:StripTextures()
CharacterStatsPane[which]:CreateBackdrop('Transparent')
CharacterStatsPane[which].backdrop:ClearAllPoints()
CharacterStatsPane[which].backdrop:Point('CENTER')
CharacterStatsPane[which].backdrop:Size(150, 18)
end
local function EquipmentDisplayButton(button)
if not button.isHooked then
button:SetNormalTexture('')
button:SetPushedTexture('')
button:SetTemplate()
button:StyleButton()
button.icon:SetInside()
button.icon:SetTexCoord(unpack(E.TexCoords))
S:HandleIconBorder(button.IconBorder)
button.isHooked = true
end
if FLYOUT_LOCATIONS[button.location] then -- special slots
button:SetBackdropBorderColor(unpack(E.media.bordercolor))
end
end
local function EquipmentUpdateItems()
local frame = _G.EquipmentFlyoutFrame.buttonFrame
if not frame.template then
frame:StripTextures()
frame:SetTemplate('Transparent')
end
local width, height = frame:GetSize()
frame:Size(width+3, height)
for _, button in ipairs(_G.EquipmentFlyoutFrame.buttons) do
EquipmentDisplayButton(button)
end
end
local function FixSidebarTabCoords()
for i=1, #_G.PAPERDOLL_SIDEBARS do
local tab = _G['PaperDollSidebarTab'..i]
if tab and not tab.backdrop then
tab:CreateBackdrop()
tab.Icon:SetAllPoints()
tab.Highlight:SetColorTexture(1, 1, 1, 0.3)
tab.Highlight:SetAllPoints()
-- Check for DejaCharacterStats. Lets hide the Texture if the AddOn is loaded.
if E:IsAddOnEnabled('DejaCharacterStats') then
tab.Hider:SetTexture()
else
tab.Hider:SetColorTexture(0, 0, 0, 0.8)
end
tab.Hider:SetAllPoints(tab.backdrop)
tab.TabBg:Kill()
if i == 1 then
for x = 1, tab:GetNumRegions() do
local region = select(x, tab:GetRegions())
region:SetTexCoord(0.16, 0.86, 0.16, 0.86)
hooksecurefunc(region, 'SetTexCoord', function(self, x1)
if x1 ~= 0.16001 then
self:SetTexCoord(0.16001, 0.86, 0.16, 0.86)
end
end)
end
end
end
end
end
local function UpdateFactionSkins()
_G.ReputationListScrollFrame:StripTextures()
_G.ReputationFrame:StripTextures(true)
for i = 1, _G.NUM_FACTIONS_DISPLAYED, 1 do
local statusbar = _G['ReputationBar'..i..'ReputationBar']
if statusbar then
statusbar:SetStatusBarTexture(E.media.normTex)
if not statusbar.backdrop then
statusbar:CreateBackdrop()
E:RegisterStatusBar(statusbar)
end
_G['ReputationBar'..i..'Background']:SetTexture()
_G['ReputationBar'..i..'ReputationBarHighlight1']:SetTexture()
_G['ReputationBar'..i..'ReputationBarHighlight2']:SetTexture()
_G['ReputationBar'..i..'ReputationBarAtWarHighlight1']:SetTexture()
_G['ReputationBar'..i..'ReputationBarAtWarHighlight2']:SetTexture()
_G['ReputationBar'..i..'ReputationBarLeftTexture']:SetTexture()
_G['ReputationBar'..i..'ReputationBarRightTexture']:SetTexture()
end
end
local ReputationDetailFrame = _G.ReputationDetailFrame
ReputationDetailFrame:ClearAllPoints()
ReputationDetailFrame:Point('TOPLEFT', _G.ReputationFrame, 'TOPRIGHT', 4, -28)
ReputationDetailFrame:StripTextures()
ReputationDetailFrame:SetTemplate('Transparent')
end
local function UpdateCurrencySkins()
local TokenFramePopup = _G.TokenFramePopup
if TokenFramePopup then
TokenFramePopup:ClearAllPoints()
TokenFramePopup:Point('TOPLEFT', _G.TokenFrame, 'TOPRIGHT', 4, -28)
TokenFramePopup:StripTextures()
TokenFramePopup:SetTemplate('Transparent')
end
local TokenFrameContainer = _G.TokenFrameContainer
if not TokenFrameContainer.buttons then return end
local buttons = TokenFrameContainer.buttons
local numButtons = #buttons
for i=1, numButtons do
local button = buttons[i]
if button then
if button.highlight then button.highlight:Kill() end
if button.categoryLeft then button.categoryLeft:Kill() end
if button.categoryRight then button.categoryRight:Kill() end
if button.categoryMiddle then button.categoryMiddle:Kill() end
if not button.backdrop then
button:CreateBackdrop(nil, nil, nil, true)
end
if button.icon then
button.icon:SetTexCoord(unpack(E.TexCoords))
button.icon:Size(17, 17)
button.backdrop:SetOutside(button.icon, 1, 1)
button.backdrop:Show()
else
button.backdrop:Hide()
end
if button.expandIcon then
if not button.highlightTexture then
button.highlightTexture = button:CreateTexture(button:GetName()..'HighlightTexture', 'HIGHLIGHT')
button.highlightTexture:SetTexture([[Interface\Buttons\UI-PlusButton-Hilight]])
button.highlightTexture:SetBlendMode('ADD')
button.highlightTexture:SetInside(button.expandIcon)
-- these two only need to be called once
-- adding them here will prevent additional calls
button.expandIcon:Point('LEFT', 4, 0)
button.expandIcon:Size(15, 15)
end
if button.isHeader then
button.backdrop:Hide()
if button.isExpanded then
button.expandIcon:SetTexture(E.Media.Textures.MinusButton)
button.expandIcon:SetTexCoord(0,1,0,1)
else
button.expandIcon:SetTexture(E.Media.Textures.PlusButton)
button.expandIcon:SetTexCoord(0,1,0,1)
end
button.highlightTexture:Show()
else
button.highlightTexture:Hide()
end
end
end
end
end
local function PaperDollUpdateStats()
local _, stats = _G.CharacterStatsPane.statsFramePool:EnumerateActive()
if not stats then return end
for frame in pairs(stats) do
if not frame.leftGrad then
ColorizeStatPane(frame)
end
local shown = frame.Background:IsShown()
frame.leftGrad:SetShown(shown)
frame.rightGrad:SetShown(shown)
end
end
local function PaperDollTitlesPaneOnShow()
for _, object in pairs(_G.PaperDollTitlesPane.buttons) do
object.BgTop:SetTexture()
object.BgBottom:SetTexture()
object.BgMiddle:SetTexture()
object.text:FontTemplate()
if not object.text.hooked then
object.text.hooked = true
hooksecurefunc(object.text, 'SetFont', function(txt, font)
if font ~= E.media.normFont then
txt:FontTemplate()
end
end)
end
end
end
function S:CharacterFrame()
if not (E.private.skins.blizzard.enable and E.private.skins.blizzard.character) then return end
-- General
local CharacterFrame = _G.CharacterFrame
S:HandlePortraitFrame(CharacterFrame)
S:HandleScrollBar(_G.ReputationListScrollFrameScrollBar)
_G.ReputationListScrollFrameScrollBar:Point('TOPLEFT', _G.ReputationListScrollFrame, 'TOPRIGHT', 11, -13)
_G.ReputationListScrollFrameScrollBar:Point('BOTTOMLEFT', _G.ReputationListScrollFrame, 'BOTTOMRIGHT', 11, 15)
S:HandleScrollBar(_G.TokenFrameContainerScrollBar)
_G.TokenFrameContainerScrollBar:Point('TOPLEFT', _G.TokenFrameContainer, 'TOPRIGHT', 5, -11)
_G.TokenFrameContainerScrollBar:Point('BOTTOMLEFT', _G.TokenFrameContainer, 'BOTTOMRIGHT', 5, 11)
S:HandleScrollBar(_G.GearManagerDialogPopupScrollFrameScrollBar)
for _, Slot in pairs({_G.PaperDollItemsFrame:GetChildren()}) do
if Slot:IsObjectType('Button') or Slot:IsObjectType('ItemButton') then
S:HandleIcon(Slot.icon)
Slot:StripTextures()
Slot:SetTemplate()
Slot:StyleButton(Slot)
Slot.icon:SetInside()
Slot.ignoreTexture:SetTexture([[Interface\PaperDollInfoFrame\UI-GearManager-LeaveItem-Transparent]])
S:HandleIconBorder(Slot.IconBorder)
if Slot.popoutButton:GetPoint() == 'TOP' then
Slot.popoutButton:Point('TOP', Slot, 'BOTTOM', 0, 2)
else
Slot.popoutButton:Point('LEFT', Slot, 'RIGHT', -2, 0)
end
E:RegisterCooldown(_G[Slot:GetName()..'Cooldown'])
hooksecurefunc(Slot, 'DisplayAsAzeriteItem', UpdateAzeriteItem)
hooksecurefunc(Slot, 'DisplayAsAzeriteEmpoweredItem', UpdateAzeriteEmpoweredItem)
end
end
hooksecurefunc('PaperDollItemSlotButton_Update', function(slot)
local highlight = slot:GetHighlightTexture()
highlight:SetTexture(E.Media.Textures.White8x8)
highlight:SetVertexColor(1, 1, 1, .25)
highlight:SetInside()
end)
--Give character frame model backdrop it's color back
for _, corner in pairs({'TopLeft','TopRight','BotLeft','BotRight'}) do
local bg = _G['CharacterModelFrameBackground'..corner]
if bg then
bg:SetDesaturated(false)
bg.ignoreDesaturated = true -- so plugins can prevent this if they want.
hooksecurefunc(bg, 'SetDesaturated', function(bckgnd, value)
if value and bckgnd.ignoreDesaturated then
bckgnd:SetDesaturated(false)
end
end)
end
end
_G.CharacterLevelText:FontTemplate()
_G.CharacterStatsPane.ItemLevelFrame.Value:FontTemplate(nil, 20)
ColorizeStatPane(_G.CharacterStatsPane.ItemLevelFrame)
if not E:IsAddOnEnabled('DejaCharacterStats') then
hooksecurefunc('PaperDollFrame_UpdateStats', PaperDollUpdateStats)
StatsPane('EnhancementsCategory')
StatsPane('ItemLevelCategory')
StatsPane('AttributesCategory')
end
--Strip Textures
local charframe = {
'CharacterModelFrame',
'CharacterStatsPane',
'CharacterFrameInset',
'CharacterFrameInsetRight',
'PaperDollSidebarTabs',
'PaperDollEquipmentManagerPane',
}
S:HandleCloseButton(_G.ReputationDetailCloseButton)
S:HandleCloseButton(_G.TokenFramePopupCloseButton)
S:HandleCheckBox(_G.ReputationDetailAtWarCheckBox)
S:HandleCheckBox(_G.ReputationDetailMainScreenCheckBox)
S:HandleCheckBox(_G.ReputationDetailInactiveCheckBox)
--S:HandleCheckBox(_G.ReputationDetailLFGBonusReputationCheckBox)
S:HandleCheckBox(_G.TokenFramePopupInactiveCheckBox)
S:HandleCheckBox(_G.TokenFramePopupBackpackCheckBox)
_G.EquipmentFlyoutFrameHighlight:StripTextures()
_G.EquipmentFlyoutFrameButtons.bg1:SetAlpha(0)
_G.EquipmentFlyoutFrameButtons:DisableDrawLayer('ARTWORK')
_G.EquipmentFlyoutFrame.NavigationFrame:StripTextures()
_G.EquipmentFlyoutFrame.NavigationFrame:SetTemplate('Transparent')
_G.EquipmentFlyoutFrame.NavigationFrame:Point('TOPLEFT', _G.EquipmentFlyoutFrameButtons, 'BOTTOMLEFT', 0, -E.Border - E.Spacing)
_G.EquipmentFlyoutFrame.NavigationFrame:Point('TOPRIGHT', _G.EquipmentFlyoutFrameButtons, 'BOTTOMRIGHT', 0, -E.Border - E.Spacing)
S:HandleNextPrevButton(_G.EquipmentFlyoutFrame.NavigationFrame.PrevButton)
S:HandleNextPrevButton(_G.EquipmentFlyoutFrame.NavigationFrame.NextButton)
--Swap item flyout frame (shown when holding alt over a slot)
hooksecurefunc('EquipmentFlyout_UpdateItems', EquipmentUpdateItems)
--Icon in upper right corner of character frame
_G.CharacterFramePortrait:Kill()
for _, scrollbar in pairs({ _G.PaperDollTitlesPaneScrollBar, _G.PaperDollEquipmentManagerPaneScrollBar }) do
S:HandleScrollBar(scrollbar)
end
for _, object in pairs(charframe) do
_G[object]:StripTextures()
end
--Re-add the overlay texture which was removed right above via StripTextures
_G.CharacterModelFrameBackgroundOverlay:SetColorTexture(0, 0, 0)
_G.CharacterModelFrame:CreateBackdrop()
_G.CharacterModelFrame.backdrop:Point('TOPLEFT', E.PixelMode and -1 or -2, E.PixelMode and 1 or 2)
_G.CharacterModelFrame.backdrop:Point('BOTTOMRIGHT', E.PixelMode and 1 or 2, E.PixelMode and -2 or -3)
local controlButtons = {
'CharacterModelFrameControlFrameZoomInButton',
'CharacterModelFrameControlFrameZoomOutButton',
'CharacterModelFrameControlFrameRotateLeftButton',
'CharacterModelFrameControlFrameRotateRightButton',
'CharacterModelFrameControlFrameRotateResetButton',
}
_G.CharacterModelFrameControlFrame:StripTextures()
_G.CharacterFrameInset:CreateBackdrop('Transparent', nil, nil, nil, nil, nil, nil, nil, true)
for _, button in pairs(controlButtons) do
S:HandleButton(_G[button])
end
--Titles
_G.PaperDollTitlesPane:HookScript('OnShow', PaperDollTitlesPaneOnShow)
--Equipement Manager
S:HandleButton(_G.PaperDollEquipmentManagerPaneEquipSet)
S:HandleButton(_G.PaperDollEquipmentManagerPaneSaveSet)
_G.PaperDollEquipmentManagerPaneEquipSet:Width(_G.PaperDollEquipmentManagerPaneEquipSet:GetWidth() - 8)
_G.PaperDollEquipmentManagerPaneSaveSet:Width(_G.PaperDollEquipmentManagerPaneSaveSet:GetWidth() - 8)
_G.PaperDollEquipmentManagerPaneEquipSet:Point('TOPLEFT', _G.PaperDollEquipmentManagerPane, 'TOPLEFT', 8, 0)
_G.PaperDollEquipmentManagerPaneSaveSet:Point('LEFT', _G.PaperDollEquipmentManagerPaneEquipSet, 'RIGHT', 4, 0)
--Itemset buttons
for _, object in pairs(_G.PaperDollEquipmentManagerPane.buttons) do
object.BgTop:SetTexture()
object.BgBottom:SetTexture()
object.BgMiddle:SetTexture()
object.HighlightBar:Kill()
object.Stripe:Kill()
object:StyleButton(nil, true)
object:CreateBackdrop('Transparent')
object.backdrop:SetInside(object, 2, 1)
object.hover:SetInside(object.backdrop)
object.SelectedBar:SetInside(object.backdrop)
object.SelectedBar:SetTexture(E.media.normTex)
object.SelectedBar:SetVertexColor(1, 1, 1, 0.20)
object.icon:Point('LEFT', object, 6, 0)
object.icon:SetTexCoord(unpack(E.TexCoords))
object.icon:CreateBackdrop(nil, nil, nil, true)
hooksecurefunc(object.icon, 'SetPoint', function(icn, _, _, _, _, _, forced)
if forced ~= true then
icn:Point('LEFT', object, 'LEFT', 6, 0, true)
end
end)
hooksecurefunc(object.icon, 'SetSize', function(icn, width, height)
if width == 36 or height == 36 then -- items
icn:Size(32, 32)
elseif width == 30 or height == 30 then -- new set
icn:Size(32, 32)
end
end)
end
--Icon selection frame
S:HandleIconSelectionFrame(_G.GearManagerDialogPopup, _G.NUM_GEARSET_ICONS_SHOWN, 'GearManagerDialogPopupButton')
S:HandleButton(_G.GearManagerDialogPopupOkay)
S:HandleButton(_G.GearManagerDialogPopupCancel)
S:HandleEditBox(_G.GearManagerDialogPopupEditBox)
for i = 1, _G.NUM_FACTIONS_DISPLAYED do
local bu = _G['ReputationBar'..i..'ExpandOrCollapseButton']
if bu then S:HandleCollapseTexture(bu) end
end
do --Handle Tabs at bottom of character frame
local i = 1
local tab = _G['CharacterFrameTab'..i]
while tab do
S:HandleTab(tab)
i = i + 1
tab = _G['CharacterFrameTab'..i]
end
end
hooksecurefunc('ExpandFactionHeader', UpdateFactionSkins)
hooksecurefunc('CollapseFactionHeader', UpdateFactionSkins)
hooksecurefunc('ReputationFrame_Update', UpdateFactionSkins)
--Buttons used to toggle between equipment manager, titles, and character stats
hooksecurefunc('PaperDollFrame_UpdateSidebarTabs', FixSidebarTabCoords)
--Currency
hooksecurefunc('TokenFrame_Update', UpdateCurrencySkins)
hooksecurefunc(_G.TokenFrameContainer, 'update', UpdateCurrencySkins)
hooksecurefunc('CharacterFrame_ShowSubFrame', UpdateCharacterInset)
end
S:AddCallback('CharacterFrame')