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.

414 lines
14 KiB

local E, L, V, P, G = unpack(ElvUI)
local S = E:GetModule('Skins')
local _G = _G
local unpack = unpack
local pairs, select = pairs, select
local hooksecurefunc = hooksecurefunc
local GetAchievementCriteriaInfo = GetAchievementCriteriaInfo
local GetAchievementNumCriteria = GetAchievementNumCriteria
local blueAchievement = { r = 0.1, g = 0.2, b = 0.3 }
local function blueBackdrop(frame)
frame:SetBackdropColor(blueAchievement.r, blueAchievement.g, blueAchievement.b)
end
local function skinAch(Achievement, BiggerIcon)
if Achievement.isSkinned then return end
Achievement:SetFrameLevel(Achievement:GetFrameLevel() + 2)
Achievement:StripTextures(true)
Achievement:CreateBackdrop(nil, true)
Achievement.backdrop:SetInside()
Achievement.icon:CreateBackdrop(nil, nil, nil, nil, nil, nil, nil, true)
Achievement.icon:Size(BiggerIcon and 54 or 36, BiggerIcon and 54 or 36)
Achievement.icon:ClearAllPoints()
Achievement.icon:Point('TOPLEFT', 8, -8)
Achievement.icon.bling:Kill()
Achievement.icon.frame:Kill()
Achievement.icon.texture:SetTexCoord(unpack(E.TexCoords))
Achievement.icon.texture:SetInside()
if Achievement.highlight then
Achievement.highlight:StripTextures()
Achievement:HookScript('OnEnter', function(frame) frame.backdrop:SetBackdropBorderColor(1, 1, 0) end)
Achievement:HookScript('OnLeave', function(frame) frame.backdrop:SetBackdropBorderColor(unpack(E.media.bordercolor)) end)
end
if Achievement.label then
Achievement.label:SetTextColor(1, 1, 1)
end
if Achievement.description then
Achievement.description:SetTextColor(.6, .6, .6)
hooksecurefunc(Achievement.description, 'SetTextColor', function(_, r, g, b)
if r == 0 and g == 0 and b == 0 then
Achievement.description:SetTextColor(.6, .6, .6)
end
end)
end
if Achievement.hiddenDescription then
Achievement.hiddenDescription:SetTextColor(1, 1, 1)
end
if Achievement.tracked then
Achievement.tracked:GetRegions():SetTextColor(1, 1, 1)
S:HandleCheckBox(Achievement.tracked)
Achievement.tracked:Size(18)
Achievement.tracked:ClearAllPoints()
Achievement.tracked:Point('TOPLEFT', Achievement.icon, 'BOTTOMLEFT', 0, -2)
end
Achievement.isSkinned = true
end
local function SkinStatusBar(bar)
bar:StripTextures()
bar:SetStatusBarTexture(E.media.normTex)
bar:SetStatusBarColor(0.02, 0.70, 0.12)
bar:CreateBackdrop()
E:RegisterStatusBar(bar)
local StatusBarName = bar:GetName()
local title = _G[StatusBarName..'Title']
if title then title:Point('LEFT', 4, 0) end
local label = _G[StatusBarName..'Label']
if label then label:Point('LEFT', 4, 0) end
local text = _G[StatusBarName..'Text']
if text then text:Point('RIGHT', -4, 0) end
end
local function playerSaturate(frame) -- frame is Achievement.player
local Achievement = frame:GetParent()
local r, g, b = unpack(E.media.backdropcolor)
Achievement.player.backdrop.callbackBackdropColor = nil
Achievement.friend.backdrop.callbackBackdropColor = nil
if Achievement.player.accountWide then
r, g, b = blueAchievement.r, blueAchievement.g, blueAchievement.b
Achievement.player.backdrop.callbackBackdropColor = blueBackdrop
Achievement.friend.backdrop.callbackBackdropColor = blueBackdrop
end
Achievement.player.backdrop:SetBackdropColor(r, g, b)
Achievement.friend.backdrop:SetBackdropColor(r, g, b)
end
local function skinAchievementButton(button)
if button.isSkinned then return end
skinAch(button.player)
skinAch(button.friend)
hooksecurefunc(button.player, 'Saturate', playerSaturate)
button.isSkinned = true
end
local function setAchievementColor(frame)
if frame and frame.backdrop then
if frame.accountWide then
frame.backdrop.callbackBackdropColor = blueBackdrop
frame.backdrop:SetBackdropColor(blueAchievement.r, blueAchievement.g, blueAchievement.b)
else
frame.backdrop.callbackBackdropColor = nil
frame.backdrop:SetBackdropColor(unpack(E.media.backdropcolor))
end
end
end
local function hookHybridScrollButtons()
if not (E.private.skins.blizzard.enable and E.private.skins.blizzard.achievement) then return end
hooksecurefunc('HybridScrollFrame_CreateButtons', function(frame, template)
if template == 'AchievementCategoryTemplate' then
for _, category in pairs(frame.buttons) do
if not category.isSkinned then
category:StripTextures(true)
category:StyleButton()
category.isSkinned = true
end
end
elseif template == 'StatTemplate' then
for _, stats in pairs(frame.buttons) do
if not stats.isSkinned then
stats:StyleButton()
stats.isSkinned = true
end
end
elseif template == 'AchievementTemplate' then
for _, achievement in pairs(frame.buttons) do
if not achievement.isSkinned then
skinAch(achievement, true)
end
end
elseif template == 'ComparisonTemplate' then
for _, comparison in pairs(frame.buttons) do
if not comparison.isSkinned then
skinAchievementButton(comparison)
end
end
end
end)
-- if AchievementUI was loaded by another addon before us, these buttons won't exist when Blizzard_AchievementUI is called.
-- however, it can also be too late to hook HybridScrollFrame_CreateButtons, so we need to skin them here, weird...
for i = 1, 20 do
local category = _G['AchievementFrameCategoriesContainerButton'..i]
if category and not category.isSkinned then
category:StripTextures(true)
category:StyleButton()
category.isSkinned = true
end
local stats = _G['AchievementFrameStatsContainerButton'..i]
if stats and not stats.isSkinned then
stats:StyleButton()
stats.isSkinned = true
end
if i <= 10 then
local achievement = _G['AchievementFrameAchievementsContainerButton'..i]
if achievement and not achievement.isSkinned then
skinAch(achievement, true)
end
local comparison = _G['AchievementFrameComparisonContainerButton'..i]
if comparison and not comparison.isSkinned then
skinAchievementButton(comparison)
end
end
end
end
function S:Blizzard_AchievementUI()
if not (E.private.skins.blizzard.enable and E.private.skins.blizzard.achievement) then return end
_G.AchievementFrameSummary:StripTextures()
_G.AchievementFrameSummaryBackground:Hide()
_G.AchievementFrameSummary:GetChildren():Hide()
for i = 1, 4 do
select(i, _G.AchievementFrameHeader:GetRegions()):Hide()
end
_G.AchievementFrameHeaderRightDDLInset:SetAlpha(0)
select(2, _G.AchievementFrameAchievements:GetChildren()):Hide()
_G.AchievementFrameAchievementsBackground:Hide()
select(3, _G.AchievementFrameAchievements:GetRegions()):Hide()
_G.AchievementFrameStatsBG:Hide()
_G.AchievementFrameStatsContainer:CreateBackdrop('Transparent')
_G.AchievementFrameSummaryAchievementsHeaderHeader:Hide()
_G.AchievementFrameSummaryCategoriesHeaderTexture:Hide()
select(3, _G.AchievementFrameStats:GetChildren()):Hide()
select(5, _G.AchievementFrameComparison:GetChildren()):Hide()
_G.AchievementFrameComparisonHeader:ClearAllPoints()
_G.AchievementFrameComparisonHeader:Point('BOTTOMRIGHT', _G.AchievementFrameComparison, 'TOPRIGHT', 35, -15)
_G.AchievementFrameComparisonHeaderBG:Hide()
_G.AchievementFrameComparisonHeaderPortrait:Hide()
_G.AchievementFrameComparisonHeaderName:Width(90)
_G.AchievementFrameComparisonBackground:Hide()
_G.AchievementFrameComparisonWatermark:SetAlpha(0)
_G.AchievementFrameComparisonDark:SetAlpha(0)
_G.AchievementFrameComparisonSummaryPlayerBackground:Hide()
_G.AchievementFrameComparisonSummaryFriendBackground:Hide()
_G.AchievementFrameComparisonSummaryPlayer.NineSlice:SetTemplate('Transparent')
_G.AchievementFrameComparisonSummaryFriend.NineSlice:SetTemplate('Transparent')
SkinStatusBar(_G.AchievementFrameComparisonSummaryPlayerStatusBar)
SkinStatusBar(_G.AchievementFrameComparisonSummaryFriendStatusBar)
_G.AchievementFrameComparisonSummaryFriendStatusBar.text:ClearAllPoints()
_G.AchievementFrameComparisonSummaryFriendStatusBar.text:Point('CENTER')
_G.AchievementFrameMetalBorderTopLeft:Hide()
_G.AchievementFrameWoodBorderTopLeft:Hide()
_G.AchievementFrameMetalBorderTopRight:Hide()
_G.AchievementFrameWoodBorderTopRight:Hide()
_G.AchievementFrameMetalBorderBottomRight:Hide()
_G.AchievementFrameWoodBorderBottomRight:Hide()
_G.AchievementFrameMetalBorderBottomLeft:Hide()
_G.AchievementFrameWoodBorderBottomLeft:Hide()
local AchievementFrame = _G.AchievementFrame
AchievementFrame:StripTextures()
AchievementFrame:CreateBackdrop('Transparent')
AchievementFrame.backdrop:Point('TOPLEFT', 0, 7)
AchievementFrame.backdrop:Point('BOTTOMRIGHT')
_G.AchievementFrameHeaderTitle:ClearAllPoints()
_G.AchievementFrameHeaderTitle:Point('TOP', AchievementFrame.backdrop, 'TOP', 0, -8)
_G.AchievementFrameHeaderPoints:ClearAllPoints()
_G.AchievementFrameHeaderPoints:Point('CENTER', _G.AchievementFrameHeaderTitle, 'CENTER', 0, 0)
-- Backdrops
_G.AchievementFrameCategories:StripTextures()
_G.AchievementFrameCategoriesContainerScrollBarBG:SetAlpha(0)
_G.AchievementFrameCategoriesContainer:CreateBackdrop('Transparent')
_G.AchievementFrameCategoriesContainer.backdrop:Point('TOPLEFT', 0, 4)
_G.AchievementFrameCategoriesContainer.backdrop:Point('BOTTOMRIGHT', -2, -3)
_G.AchievementFrameCategoriesBG:SetAlpha(0)
_G.AchievementFrameWaterMark:SetAlpha(0)
_G.AchievementFrameAchievementsContainer:CreateBackdrop('Transparent')
_G.AchievementFrameAchievementsContainer.backdrop:Point('TOPLEFT', -2, 2)
_G.AchievementFrameAchievementsContainer.backdrop:Point('BOTTOMRIGHT', -2, -3)
S:HandleCloseButton(_G.AchievementFrameCloseButton, AchievementFrame.backdrop)
S:HandleDropDownBox(_G.AchievementFrameFilterDropDown)
_G.AchievementFrameFilterDropDown:ClearAllPoints()
_G.AchievementFrameFilterDropDown:Point('TOPLEFT', _G.AchievementFrameAchievements, 'TOPLEFT', -18, 24)
-- ScrollBars
local scrollBars = {
_G.AchievementFrameCategoriesContainerScrollBar,
_G.AchievementFrameAchievementsContainerScrollBar,
_G.AchievementFrameStatsContainerScrollBar,
_G.AchievementFrameComparisonContainerScrollBar,
_G.AchievementFrameComparisonStatsContainerScrollBar,
}
for _, scrollbar in pairs(scrollBars) do
if scrollbar then
S:HandleScrollBar(scrollbar)
end
end
-- Tabs
for i = 1, 2 do
S:HandleTab(_G['AchievementFrameTab'..i])
_G['AchievementFrameTab'..i]:SetFrameLevel(_G['AchievementFrameTab'..i]:GetFrameLevel() + 2)
end
SkinStatusBar(_G.AchievementFrameSummaryCategoriesStatusBar)
for i = 1, 8 do
local frame = _G['AchievementFrameSummaryCategoriesCategory'..i]
local button = _G['AchievementFrameSummaryCategoriesCategory'..i..'Button']
local highlight = _G['AchievementFrameSummaryCategoriesCategory'..i..'ButtonHighlight']
SkinStatusBar(frame)
button:StripTextures()
highlight:StripTextures()
_G[highlight:GetName()..'Middle']:SetColorTexture(1, 1, 1, 0.3)
_G[highlight:GetName()..'Middle']:SetAllPoints(frame)
end
hooksecurefunc('AchievementButton_DisplayAchievement', setAchievementColor)
hooksecurefunc('AchievementFrameSummary_UpdateAchievements', function()
for i = 1, _G.ACHIEVEMENTUI_MAX_SUMMARY_ACHIEVEMENTS do
local frame = _G['AchievementFrameSummaryAchievement'..i]
if not frame.isSkinned then
skinAch(frame)
end
--The backdrop borders tend to overlap so add a little more space between summary achievements
local prevFrame = _G['AchievementFrameSummaryAchievement'..i-1]
if i ~= 1 then
frame:ClearAllPoints()
frame:Point('TOPLEFT', prevFrame, 'BOTTOMLEFT', 0, 1)
frame:Point('TOPRIGHT', prevFrame, 'BOTTOMRIGHT', 0, 1)
end
setAchievementColor(frame)
end
end)
for i = 1, 20 do
local frame = _G['AchievementFrameStatsContainerButton'..i]
frame:StyleButton()
_G['AchievementFrameStatsContainerButton'..i..'BG']:SetColorTexture(1, 1, 1, 0.2)
_G['AchievementFrameStatsContainerButton'..i..'HeaderLeft']:Kill()
_G['AchievementFrameStatsContainerButton'..i..'HeaderRight']:Kill()
_G['AchievementFrameStatsContainerButton'..i..'HeaderMiddle']:Kill()
frame = 'AchievementFrameComparisonStatsContainerButton'..i
_G[frame]:StripTextures()
_G[frame]:StyleButton()
_G[frame..'BG']:SetColorTexture(1, 1, 1, 0.2)
_G[frame..'HeaderLeft']:Kill()
_G[frame..'HeaderRight']:Kill()
_G[frame..'HeaderMiddle']:Kill()
end
hooksecurefunc('AchievementButton_GetProgressBar', function(index)
local frame = _G['AchievementFrameProgressBar'..index]
if frame and not frame.skinned then
frame:StripTextures()
frame:SetStatusBarTexture(E.media.normTex)
E:RegisterStatusBar(frame)
frame:SetStatusBarColor(0.02, 0.70, 0.12)
frame:CreateBackdrop('Transparent')
frame:SetFrameLevel(frame:GetFrameLevel() + 3)
frame:Height(frame:GetHeight() - 2)
frame.text:ClearAllPoints()
frame.text:Point('CENTER', frame, 'CENTER', 0, -1)
frame.text:SetJustifyH('CENTER')
if index > 1 then
frame:ClearAllPoints()
frame:Point('TOP', _G['AchievementFrameProgressBar'..index-1], 'BOTTOM', 0, -5)
frame.SetPoint = E.noop
frame.ClearAllPoints = E.noop
end
frame.skinned = true
end
end)
hooksecurefunc('AchievementObjectives_DisplayCriteria', function(objectivesFrame, id)
local numCriteria = GetAchievementNumCriteria(id)
local textStrings, metas, criteria, object = 0, 0
for i = 1, numCriteria do
local _, criteriaType, completed, _, _, _, _, assetID = GetAchievementCriteriaInfo(id, i)
if assetID and criteriaType == _G.CRITERIA_TYPE_ACHIEVEMENT then
metas = metas + 1
criteria, object = _G.AchievementButton_GetMeta(metas), 'label'
elseif criteriaType ~= 1 then
textStrings = textStrings + 1
criteria, object = _G.AchievementButton_GetCriteria(textStrings), 'name'
end
local text = criteria and criteria[object]
if text then
local r, g, b, x, y
if completed then
if objectivesFrame.completed then
r, g, b, x, y = 1, 1, 1, 0, 0
else
r, g, b, x, y = 0, 1, 0, 1, -1
end
else
r, g, b, x, y = .6, .6, .6, 1, -1
end
text:SetTextColor(r, g, b)
text:SetShadowOffset(x, y)
end
end
end)
end
E:Delay(0.1, hookHybridScrollButtons)
S:AddCallbackForAddon('Blizzard_AchievementUI')