ElvUI/Modules/Skins/Blizzard/Achievement.lua

504 lines
17 KiB
Lua
Raw Normal View History

2020-11-13 14:27:50 -05:00
local E, L, V, P, G = unpack(select(2, ...)); --Import: Engine, Locales, PrivateDB, ProfileDB, GlobalDB
local S = E:GetModule('Skins')
local _G = _G
local pairs, select, unpack = pairs, select, unpack
local hooksecurefunc = hooksecurefunc
local GetAchievementCriteriaInfo = GetAchievementCriteriaInfo
local GetAchievementNumCriteria = GetAchievementNumCriteria
local GetNumFilteredAchievements = GetNumFilteredAchievements
local IsAddOnLoaded = IsAddOnLoaded
local CreateFrame = CreateFrame
local blueAchievement = { r = 0.1, g = 0.2, b = 0.3 }
local function blueBackdrop(self)
self: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()
Achievement.icon.backdrop:SetAllPoints()
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(self) self.backdrop:SetBackdropBorderColor(1, 1, 0) end)
Achievement:HookScript('OnLeave', function(self) self.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(4/255, 179/255, 30/255)
bar:CreateBackdrop()
E:RegisterStatusBar(bar)
local StatusBarName = bar:GetName()
if _G[StatusBarName..'Title'] then
_G[StatusBarName..'Title']:Point('LEFT', 4, 0)
end
if _G[StatusBarName..'Label'] then
_G[StatusBarName..'Label']:Point('LEFT', 4, 0)
end
if _G[StatusBarName..'Text'] then
_G[StatusBarName..'Text']:Point('RIGHT', -4, 0)
end
end
local function SkinSearchButton(self)
self:StripTextures()
if self.icon then
S:HandleIcon(self.icon)
end
self:CreateBackdrop('Transparent')
self:SetHighlightTexture(E.media.normTex)
local hl = self:GetHighlightTexture()
hl:SetVertexColor(1, 1, 1, 0.3)
hl:Point('TOPLEFT', 1, -1)
hl:Point('BOTTOMRIGHT', -1, 1)
end
local function playerSaturate(self) -- self is Achievement.player
local Achievement = self:GetParent()
local r, g, b = unpack(E.media.bordercolor)
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 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
function S:Blizzard_AchievementUI(event)
if not (E.private.skins.blizzard.enable and E.private.skins.blizzard.achievement) then return end
if event == 'PLAYER_ENTERING_WORLD' then
hooksecurefunc('HybridScrollFrame_CreateButtons', function(frame, template)
if template == 'AchievementCategoryTemplate' then
for _, button in pairs(frame.buttons) do
if button.isSkinned then return; end
button:StripTextures(true)
button:StyleButton()
button.isSkinned = true
end
end
if template == 'AchievementTemplate' then
for _, Achievement in pairs(frame.buttons) do
skinAch(Achievement, true)
end
end
if template == 'ComparisonTemplate' then
for _, Achievement in pairs(frame.buttons) do
if Achievement.isSkinned then return; end
skinAch(Achievement.player)
skinAch(Achievement.friend)
hooksecurefunc(Achievement.player, 'Saturate', playerSaturate)
end
end
if template == 'StatTemplate' then
for _, Stats in pairs(frame.buttons) do
-- Stats:StripTextures(true)
Stats:StyleButton()
end
end
end)
end
if not IsAddOnLoaded('Blizzard_AchievementUI') 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)
_G.AchievementFrameHeaderLeftDDLInset:SetAlpha(0)
select(2, _G.AchievementFrameAchievements:GetChildren()):Hide()
_G.AchievementFrameAchievementsBackground:Hide()
select(3, _G.AchievementFrameAchievements:GetRegions()):Hide()
_G.AchievementFrameStatsBG:Hide()
_G.AchievementFrameSummaryAchievementsHeaderHeader:Hide()
_G.AchievementFrameSummaryCategoriesHeaderTexture:Hide()
select(3, _G.AchievementFrameStats:GetChildren()):Hide()
select(5, _G.AchievementFrameComparison:GetChildren()):Hide()
_G.AchievementFrameComparisonHeaderBG:Hide()
_G.AchievementFrameComparisonHeaderPortrait:Hide()
_G.AchievementFrameComparisonHeaderPortraitBg:Hide()
_G.AchievementFrameComparisonBackground:Hide()
_G.AchievementFrameComparisonDark:SetAlpha(0)
_G.AchievementFrameComparisonSummaryPlayerBackground:Hide()
_G.AchievementFrameComparisonSummaryFriendBackground:Hide()
local summaries = {_G.AchievementFrameComparisonSummaryPlayer, _G.AchievementFrameComparisonSummaryFriend}
for _, frame in pairs(summaries) do
frame:SetBackdrop()
end
_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 noname_frames = {
_G.AchievementFrameStats,
_G.AchievementFrameSummary,
_G.AchievementFrameAchievements,
_G.AchievementFrameComparison
}
for _, frame in pairs(noname_frames) do
if frame and frame.GetNumChildren then
for i=1, frame:GetNumChildren() do
local child = select(i, frame:GetChildren())
if child and not child:GetName() then
child:SetBackdrop()
end
end
end
end
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.AchievementFrameCategoriesBG:SetInside(_G.AchievementFrameCategoriesContainer.backdrop)
_G.AchievementFrameAchievementsContainer:CreateBackdrop('Transparent')
_G.AchievementFrameAchievementsContainer.backdrop:Point('TOPLEFT', -2, 2)
_G.AchievementFrameAchievementsContainer.backdrop:Point('BOTTOMRIGHT', -2, -3)
_G.AchievementFrameGuildEmblemRight:Kill()
_G.AchievementFrameGuildEmblemLeft:Kill()
S:HandleCloseButton(_G.AchievementFrameCloseButton, AchievementFrame.backdrop)
S:HandleDropDownBox(_G.AchievementFrameFilterDropDown)
_G.AchievementFrameFilterDropDown:ClearAllPoints()
_G.AchievementFrameFilterDropDown:Point('TOPLEFT', _G.AchievementFrameAchievements, 'TOPLEFT', -18, 24)
S:HandleEditBox(AchievementFrame.searchBox)
AchievementFrame.searchBox.backdrop:Point('TOPLEFT', AchievementFrame.searchBox, 'TOPLEFT', -3, -3)
AchievementFrame.searchBox.backdrop:Point('BOTTOMRIGHT', AchievementFrame.searchBox, 'BOTTOMRIGHT', 0, 3)
AchievementFrame.searchBox:ClearAllPoints()
AchievementFrame.searchBox:Point('TOPRIGHT', AchievementFrame, 'TOPRIGHT', -50, 8)
AchievementFrame.searchBox:Size(107, 25)
local scrollBars = {
_G.AchievementFrameCategoriesContainerScrollBar,
_G.AchievementFrameAchievementsContainerScrollBar,
_G.AchievementFrameStatsContainerScrollBar,
_G.AchievementFrameComparisonContainerScrollBar,
_G.AchievementFrameComparisonStatsContainerScrollBar,
}
for _, scrollbar in pairs(scrollBars) do
if scrollbar then
S:HandleScrollBar(scrollbar, 5)
end
end
-- Search
AchievementFrame.searchResults:StripTextures()
AchievementFrame.searchResults:CreateBackdrop('Transparent')
AchievementFrame.searchPreviewContainer:StripTextures()
AchievementFrame.searchPreviewContainer:ClearAllPoints()
AchievementFrame.searchPreviewContainer:Point('TOPLEFT', AchievementFrame, 'TOPRIGHT', 2, 6)
for i = 1, 5 do
SkinSearchButton(AchievementFrame.searchPreviewContainer['searchPreview'..i])
end
SkinSearchButton(AchievementFrame.searchPreviewContainer.showAllSearchResults)
hooksecurefunc('AchievementFrame_UpdateFullSearchResults', function()
local numResults = GetNumFilteredAchievements()
local scrollFrame = AchievementFrame.searchResults.scrollFrame
local offset = _G.HybridScrollFrame_GetOffset(scrollFrame)
local results = scrollFrame.buttons
local result, index
for i = 1, #results do
result = results[i]
index = offset + i
if index <= numResults then
if not result.styled then
result:SetNormalTexture('')
result:SetPushedTexture('')
result:GetRegions():Hide()
result.resultType:SetTextColor(1, 1, 1)
result.path:SetTextColor(1, 1, 1)
result.styled = true
end
if result.icon:GetTexCoord() == 0 then
result.icon:SetTexCoord(unpack(E.TexCoords))
end
end
end
end)
hooksecurefunc(AchievementFrame.searchResults.scrollFrame, 'update', function(self)
for i = 1, #self.buttons do
local result = self.buttons[i]
if result.icon:GetTexCoord() == 0 then
result.icon:SetTexCoord(unpack(E.TexCoords))
end
end
end)
S:HandleCloseButton(AchievementFrame.searchResults.closeButton)
S:HandleScrollBar(_G.AchievementFrameScrollFrameScrollBar)
--Tabs
for i = 1, 3 do
S:HandleTab(_G['AchievementFrameTab'..i])
_G['AchievementFrameTab'..i]:SetFrameLevel(_G['AchievementFrameTab'..i]:GetFrameLevel() + 2)
end
SkinStatusBar(_G.AchievementFrameSummaryCategoriesStatusBar)
SkinStatusBar(_G.AchievementFrameComparisonSummaryPlayerStatusBar)
SkinStatusBar(_G.AchievementFrameComparisonSummaryFriendStatusBar)
_G.AchievementFrameComparisonSummaryFriendStatusBar.text:ClearAllPoints()
_G.AchievementFrameComparisonSummaryFriendStatusBar.text:Point('CENTER')
_G.AchievementFrameComparisonHeader:Point('BOTTOMRIGHT', _G.AchievementFrameComparison, 'TOPRIGHT', 45, -20)
for i=1, 12 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)
frame.isSkinned = true
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 then
if not frame.skinned then
frame:StripTextures()
frame:SetStatusBarTexture(E.media.normTex)
E:RegisterStatusBar(frame)
frame:SetStatusBarColor(4/255, 179/255, 30/255)
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
end)
hooksecurefunc('AchievementObjectives_DisplayCriteria', function(objectivesFrame, id)
local numCriteria = GetAchievementNumCriteria(id)
local textStrings, metas = 0, 0
for i = 1, numCriteria do
local _, criteriaType, completed, _, _, _, _, assetID = GetAchievementCriteriaInfo(id, i)
if criteriaType == _G.CRITERIA_TYPE_ACHIEVEMENT and assetID then
metas = metas + 1;
local metaCriteria = _G.AchievementButton_GetMeta(metas);
if objectivesFrame.completed and completed then
metaCriteria.label:SetShadowOffset(0, 0)
metaCriteria.label:SetTextColor(1, 1, 1, 1);
elseif completed then
metaCriteria.label:SetShadowOffset(1, -1)
metaCriteria.label:SetTextColor(0, 1, 0, 1);
else
metaCriteria.label:SetShadowOffset(1, -1)
metaCriteria.label:SetTextColor(.6, .6, .6, 1);
end
elseif criteriaType ~= 1 then
textStrings = textStrings + 1;
local criteria = _G.AchievementButton_GetCriteria(textStrings);
if objectivesFrame.completed and completed then
criteria.name:SetTextColor(1, 1, 1, 1);
criteria.name:SetShadowOffset(0, 0);
elseif completed then
criteria.name:SetTextColor(0, 1, 0, 1);
criteria.name:SetShadowOffset(1, -1);
else
criteria.name:SetTextColor(.6, .6, .6, 1);
criteria.name:SetShadowOffset(1, -1);
end
end
end
end)
--The section below is usually handled in our hook, but another addon may have loaded the AchievementUI before we were ready
--Categories
for i = 1, 20 do
local button = _G['AchievementFrameCategoriesContainerButton'..i]
if not button or (button and button.isSkinned) then return end
button:StripTextures(true)
button:StyleButton()
button.isSkinned = true
end
--Comparison
for i = 1, 10 do
local Achievement = _G['AchievementFrameComparisonContainerButton'..i]
if not Achievement or (Achievement and Achievement.isSkinned) then return end
skinAch(Achievement.player)
skinAch(Achievement.friend)
hooksecurefunc(Achievement.player, 'Saturate', playerSaturate)
Achievement.isSkinned = true
end
end
local f = CreateFrame('Frame')
f:RegisterEvent('PLAYER_ENTERING_WORLD')
f:SetScript('OnEvent', function(self, event)
self:UnregisterEvent(event)
S:Blizzard_AchievementUI(event)
end)
S:AddCallbackForAddon('Blizzard_AchievementUI')