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.

533 lines
16 KiB

local E, L, V, P, G = unpack(ElvUI)
local S = E:GetModule('Skins')
local _G = _G
local pairs, format = pairs, format
local unpack, next = unpack, next
local hooksecurefunc = hooksecurefunc
local UnitResistance = UnitResistance
local GetItemQualityColor = GetItemQualityColor
local GetInventoryItemQuality = GetInventoryItemQuality
local GetItemQualityByID = C_Item.GetItemQualityByID
local HasPetUI = HasPetUI
local GetContainerItemID = C_Container.GetContainerItemID
local EquipmentManager_UnpackLocation = EquipmentManager_UnpackLocation
local PAPERDOLLFRAME_TOOLTIP_FORMAT = PAPERDOLLFRAME_TOOLTIP_FORMAT
local HIGHLIGHT_FONT_COLOR_CODE = HIGHLIGHT_FONT_COLOR_CODE
local FONT_COLOR_CODE_CLOSE = FONT_COLOR_CODE_CLOSE
local STAT_FORMAT = STAT_FORMAT
local HONOR_CURRENCY = HONOR_CURRENCY
local spellSchoolIcon = [[Interface\PaperDollInfoFrame\SpellSchoolIcon]]
local FLYOUT_LOCATIONS = {
[0xFFFFFFFF] = 'PLACEINBAGS',
[0xFFFFFFFE] = 'IGNORESLOT',
[0xFFFFFFFD] = 'UNIGNORESLOT'
}
local function EquipmentManagerPane_Update(frame)
for _, child in next, { frame.ScrollTarget:GetChildren() } do
if child.icon and not child.IsSkinned then
child.BgTop:SetTexture(E.ClearTexture)
child.BgMiddle:SetTexture(E.ClearTexture)
child.BgBottom:SetTexture(E.ClearTexture)
S:HandleIcon(child.icon)
child.HighlightBar:SetColorTexture(1, 1, 1, .25)
child.HighlightBar:SetDrawLayer('BACKGROUND')
child.SelectedBar:SetColorTexture(0.8, 0.8, 0.8, .25)
child.SelectedBar:SetDrawLayer('BACKGROUND')
child.IsSkinned = true
end
end
end
local function TitleManagerPane_Update(frame)
for _, child in next, { frame.ScrollTarget:GetChildren() } do
if not child.IsSkinned then
child:DisableDrawLayer('BACKGROUND')
child.IsSkinned = true
end
end
end
local function HandleItemButtonQuality(button, rarity)
if rarity and rarity > 1 then
local r, g, b = GetItemQualityColor(rarity)
button:SetBackdropBorderColor(r, g, b)
else
button:SetBackdropBorderColor(unpack(E.media.bordercolor))
end
end
local function PaperDollItemButtonQuality(button)
if not button.SetBackdropBorderColor then return end
local id = button.id or button:GetID()
local rarity = id and GetInventoryItemQuality('player', id)
HandleItemButtonQuality(button, rarity)
end
local function EquipmentItemButtonQuality(button)
if not button.SetBackdropBorderColor then return end
local location, rarity = button.location
if location then
local _, _, bags, slot, bag = EquipmentManager_UnpackLocation(location)
if bags then
local itemID = GetContainerItemID(bag, slot)
rarity = itemID and GetItemQualityByID(itemID)
else
rarity = GetInventoryItemQuality('player', slot)
end
end
HandleItemButtonQuality(button, rarity)
end
local function PaperDollFrameSetResistance(frame, unit, index)
local _, resistance = UnitResistance(unit, index)
local icon = format('|T%s%d:12:12:0:0:64:64:4:55:4:55|t', spellSchoolIcon, index + 1)
local name = frame:GetName()
_G[name..'Label']:SetFormattedText('%s '..STAT_FORMAT, icon, _G['SPELL_SCHOOL'..index..'_CAP'])
frame.tooltip = format('%s %s'..PAPERDOLLFRAME_TOOLTIP_FORMAT..' %s%s', icon, HIGHLIGHT_FONT_COLOR_CODE, _G['RESISTANCE'..index..'_NAME'], resistance or 0, FONT_COLOR_CODE_CLOSE)
end
local function TabTextureCoords(tex, x1)
if x1 ~= 0.16001 then
tex:SetTexCoord(0.16001, 0.86, 0.16, 0.86)
end
end
local function FixSidebarTabCoords()
local hasDejaCharacterStats = E:IsAddOnEnabled('DejaCharacterStats')
local index = 1
local tab = _G['PaperDollSidebarTab'..index]
while tab do
if not tab.backdrop then
tab:CreateBackdrop()
tab.Icon:SetAllPoints()
tab.Highlight:SetColorTexture(1, 1, 1, 0.3)
tab.Highlight:SetAllPoints()
if hasDejaCharacterStats then
tab.Hider:SetTexture()
else
tab.Hider:SetColorTexture(0, 0, 0, 0.8)
end
tab.Hider:SetAllPoints(tab.backdrop)
tab.TabBg:Kill()
if index == 1 then
for _, region in next, { tab:GetRegions() } do
region:SetTexCoord(0.16, 0.86, 0.16, 0.86)
hooksecurefunc(region, 'SetTexCoord', TabTextureCoords)
end
end
end
index = index + 1
tab = _G['PaperDollSidebarTab'..index]
end
end
local function BackdropDesaturated(background, value)
if value and background.ignoreDesaturated then
background:SetDesaturated(false)
end
end
local function UpdateCurrencySkins()
local TokenFramePopup = _G.TokenFramePopup
if TokenFramePopup then
TokenFramePopup:ClearAllPoints()
TokenFramePopup:Point('TOPLEFT', _G.TokenFrame, 'TOPRIGHT', -33, -12)
TokenFramePopup:StripTextures()
TokenFramePopup:SetTemplate('Transparent')
end
local TokenFrameContainer = _G.TokenFrameContainer
if not TokenFrameContainer.buttons then return end
for _, button in next, TokenFrameContainer.buttons do
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
if button.itemID == HONOR_CURRENCY and E.myfaction then
button.icon:SetTexCoord(0.06325, 0.59375, 0.03125, 0.57375)
else
button.icon:SetTexCoord(unpack(E.TexCoords))
end
button.icon:Size(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:ClearAllPoints()
button.expandIcon:Point('LEFT', 4, 0)
button.expandIcon:Size(15)
end
if button.isHeader then
button.backdrop:Hide()
for _, region in next, { button:GetRegions() } do
if region:IsObjectType('FontString') and region:GetText() then
region:ClearAllPoints()
region:Point('LEFT', 25, 0)
end
end
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
local function HandleTabs()
local lastTab
for index, tab in next, { _G.CharacterFrameTab1, HasPetUI() and _G.CharacterFrameTab2 or nil, _G.CharacterFrameTab3, _G.CharacterFrameTab4, _G.CharacterFrameTab5 } do
tab:ClearAllPoints()
if index == 1 then
tab:Point('TOPLEFT', _G.CharacterFrame, 'BOTTOMLEFT', -10, 0)
else
tab:Point('TOPLEFT', lastTab, 'TOPRIGHT', -19, 0)
end
lastTab = tab
end
end
local function EquipmentDisplayButton(button)
if not button.isHooked then
button:SetNormalTexture(E.ClearTexture)
button:SetPushedTexture(E.ClearTexture)
button:SetTemplate()
button:StyleButton()
button.icon:SetInside()
button.icon:SetTexCoord(unpack(E.TexCoords))
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 next, _G.EquipmentFlyoutFrame.buttons do
EquipmentDisplayButton(button)
end
end
local function EquipmentUpdateNavigation()
local navi = _G.EquipmentFlyoutFrame.NavigationFrame
if not navi then return end
navi:ClearAllPoints()
navi:Point('TOPLEFT', _G.EquipmentFlyoutFrameButtons, 'BOTTOMLEFT', 0, -E.Border - E.Spacing)
navi:Point('TOPRIGHT', _G.EquipmentFlyoutFrameButtons, 'BOTTOMRIGHT', 0, -E.Border - E.Spacing)
navi:StripTextures()
navi:SetTemplate('Transparent')
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)
local slots = {
_G.CharacterHeadSlot,
_G.CharacterNeckSlot,
_G.CharacterShoulderSlot,
_G.CharacterShirtSlot,
_G.CharacterChestSlot,
_G.CharacterWaistSlot,
_G.CharacterLegsSlot,
_G.CharacterFeetSlot,
_G.CharacterWristSlot,
_G.CharacterHandsSlot,
_G.CharacterFinger0Slot,
_G.CharacterFinger1Slot,
_G.CharacterTrinket0Slot,
_G.CharacterTrinket1Slot,
_G.CharacterBackSlot,
_G.CharacterMainHandSlot,
_G.CharacterSecondaryHandSlot,
_G.CharacterRangedSlot,
_G.CharacterTabardSlot,
_G.CharacterAmmoSlot
}
for _, slot in pairs(slots) do
if slot:IsObjectType('Button') then
local icon = _G[slot:GetName()..'IconTexture']
local cooldown = _G[slot:GetName()..'Cooldown']
slot:StripTextures()
slot:SetTemplate(nil, true, true)
slot:StyleButton()
S:HandleIcon(icon)
icon:SetInside()
if cooldown then
E:RegisterCooldown(cooldown)
end
end
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', BackdropDesaturated)
end
end
_G.CharacterLevelText:FontTemplate()
-- Strip Textures
local charframe = {
'CharacterModelScene',
'CharacterStatsPane',
'CharacterFrameInset',
'CharacterFrameInsetRight',
'PaperDollSidebarTabs',
'PetModelFrame',
'PetModelFrameShadowOverlay'
}
-- Icon in upper right corner of character frame
_G.CharacterFramePortrait:Kill()
for _, scrollbar in pairs({ _G.PaperDollFrame.EquipmentManagerPane.ScrollBar, _G.PaperDollFrame.TitleManagerPane.ScrollBar, _G.CharacterStatsPane.ScrollBar }) do
S:HandleTrimScrollBar(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.CharacterModelScene:CreateBackdrop()
_G.CharacterModelScene.backdrop:Point('TOPLEFT', E.PixelMode and -1 or -2, E.PixelMode and 1 or 2)
_G.CharacterModelScene.backdrop:Point('BOTTOMRIGHT', E.PixelMode and 1 or 2, E.PixelMode and -2 or -3)
_G.PetModelFrame:CreateBackdrop()
_G.PetModelFrame.backdrop:Point('TOPLEFT', E.PixelMode and -1 or -2, E.PixelMode and 1 or 2)
_G.PetModelFrame.backdrop:Point('BOTTOMRIGHT', E.PixelMode and 1 or 2, E.PixelMode and -2 or -3)
S:HandleModelSceneControlButtons(_G.CharacterModelScene.ControlFrame)
-- Titles
hooksecurefunc(_G.PaperDollFrame.TitleManagerPane.ScrollBox, 'Update', TitleManagerPane_Update)
-- Equipement Manager
hooksecurefunc(_G.PaperDollFrame.EquipmentManagerPane.ScrollBox, 'Update', EquipmentManagerPane_Update)
S:HandleButton(_G.PaperDollFrameEquipSet)
S:HandleButton(_G.PaperDollFrameSaveSet)
-- Item Quality Borders and Armor Slots
local CharacterMainHandSlot = _G.CharacterMainHandSlot
CharacterMainHandSlot:ClearAllPoints()
CharacterMainHandSlot:Point('BOTTOMLEFT', _G.PaperDollItemsFrame, 'BOTTOMLEFT', 106, 10)
-- Icon selection frame
_G.GearManagerPopupFrame:HookScript('OnShow', function(frame)
if frame.IsSkinned then return end -- set by HandleIconSelectionFrame
S:HandleIconSelectionFrame(frame)
end)
-- Stats
for i = 1, 7 do
local frame = _G['CharacterStatsPaneCategory'..i]
frame:StripTextures()
frame:SetTemplate('Transparent')
frame.Toolbar = _G['CharacterStatsPaneCategory'..i..'Toolbar']
S:HandleButton(frame.Toolbar, nil, nil, true)
local name = _G['CharacterStatsPaneCategory'..i..'NameText']
if name then
name:ClearAllPoints()
name:Point('CENTER', frame.Toolbar)
end
_G['CharacterStatsPaneCategory'..i..'Stat1']:Point('TOPLEFT', frame, 16, -18)
_G['CharacterStatsPaneCategory'..i..'ToolbarSortDownArrow']:Kill()
--_G['CharacterStatsPaneCategory'..i..'ToolbarSortUpArrow']:Kill()
end
do -- Expand Button
local expandButton = _G.CharacterFrameExpandButton
S:HandleNextPrevButton(expandButton, nil, nil, nil, nil, nil, 26) -- Default UI button size is 32
expandButton:ClearAllPoints()
expandButton:Point('BOTTOMRIGHT', _G.CharacterFrameInset, 'BOTTOMRIGHT', -3, 2)
local expandNormal = expandButton:GetNormalTexture()
local expandPushed = expandButton:GetPushedTexture()
local function ExpandToggle()
expandButton:SetNormalTexture(E.Media.Textures.ArrowUp)
expandButton:SetPushedTexture(E.Media.Textures.ArrowUp)
expandButton:SetDisabledTexture(E.Media.Textures.ArrowUp)
local expanded = CharacterFrame.Expanded
expandNormal:SetRotation(expanded and 1.57 or -1.57)
expandPushed:SetRotation(expanded and 1.57 or -1.57)
end
ExpandToggle()
hooksecurefunc(CharacterFrame, 'Collapse', ExpandToggle)
hooksecurefunc(CharacterFrame, 'Expand', ExpandToggle)
end
-- Pet Frame
S:HandleStatusBar(_G.PetPaperDollFrameExpBar)
S:HandleRotateButton(_G.PetModelFrameRotateLeftButton)
S:HandleRotateButton(_G.PetModelFrameRotateRightButton)
-- Reputation Frame
_G.ReputationFrame:StripTextures()
for i = 1, _G.NUM_FACTIONS_DISPLAYED do
local factionBar = _G['ReputationBar'..i]
local factionStatusBar = _G['ReputationBar'..i..'ReputationBar']
local factionBarButton = _G['ReputationBar'..i..'ExpandOrCollapseButton']
local factionName = _G['ReputationBar'..i..'FactionName']
factionBar:StripTextures()
factionStatusBar:StripTextures()
factionStatusBar:CreateBackdrop()
factionStatusBar:SetStatusBarTexture(E.media.normTex)
factionStatusBar:Size(108, 13)
S:HandleCollapseTexture(factionBarButton, nil, true)
E:RegisterStatusBar(factionStatusBar)
factionName:Width(140)
factionName:Point('LEFT', factionBar, 'LEFT', -150, 0)
factionName.SetWidth = E.noop
end
_G.ReputationListScrollFrame:StripTextures()
S:HandleScrollBar(_G.ReputationListScrollFrameScrollBar)
_G.ReputationDetailFrame:StripTextures()
_G.ReputationDetailFrame:SetTemplate('Transparent')
_G.ReputationDetailFrame:Point('TOPLEFT', _G.ReputationFrame, 'TOPRIGHT', -31, -12)
S:HandleCloseButton(_G.ReputationDetailCloseButton)
_G.ReputationDetailCloseButton:Point('TOPRIGHT', 2, 2)
S:HandleCheckBox(_G.ReputationDetailAtWarCheckBox)
S:HandleCheckBox(_G.ReputationDetailInactiveCheckBox)
S:HandleCheckBox(_G.ReputationDetailMainScreenCheckBox)
-- TokenFrame (Currency Tab)
_G.TokenFrame:StripTextures()
-- Try to find the close button
for _, child in next, { _G.TokenFrame:GetChildren() } do
if child.Hide and child:IsShown() and not child:GetName() then
child:Hide()
break
end
end
S:HandleCheckBox(_G.TokenFramePopupInactiveCheckBox)
S:HandleCheckBox(_G.TokenFramePopupBackpackCheckBox)
S:HandleCloseButton(_G.TokenFramePopupCloseButton, _G.TokenFramePopup)
hooksecurefunc(_G.TokenFrameContainer, 'update', UpdateCurrencySkins)
hooksecurefunc('TokenFrame_Update', UpdateCurrencySkins)
hooksecurefunc('PaperDollFrame_UpdateSidebarTabs', FixSidebarTabCoords)
hooksecurefunc('PaperDollFrame_SetResistance', PaperDollFrameSetResistance)
hooksecurefunc('PaperDollItemSlotButton_Update', PaperDollItemButtonQuality)
-- Equipment Flyout
_G.EquipmentFlyoutFrameHighlight:StripTextures()
_G.EquipmentFlyoutFrameButtons.bg1:SetAlpha(0)
_G.EquipmentFlyoutFrameButtons:DisableDrawLayer('ARTWORK')
S:HandleNextPrevButton(_G.EquipmentFlyoutFrame.NavigationFrame.PrevButton)
S:HandleNextPrevButton(_G.EquipmentFlyoutFrame.NavigationFrame.NextButton)
hooksecurefunc('EquipmentFlyout_SetBackgroundTexture', EquipmentUpdateNavigation)
hooksecurefunc('EquipmentFlyout_UpdateItems', EquipmentUpdateItems) -- Swap item flyout frame (shown when holding alt over a slot)
hooksecurefunc('EquipmentFlyout_DisplayButton', EquipmentItemButtonQuality)
-- Tabs
for i = 1, #_G.CHARACTERFRAME_SUBFRAMES do
S:HandleTab(_G['CharacterFrameTab'..i])
end
-- Reposition Tabs
hooksecurefunc('PetPaperDollFrame_UpdateIsAvailable', HandleTabs)
HandleTabs()
end
S:AddCallback('CharacterFrame')