local E, L, V, P, G = unpack(ElvUI) local S = E:GetModule('Skins') local _G = _G local strfind = strfind local next, unpack = next, unpack local ipairs, pairs = ipairs, pairs local CreateFrame = CreateFrame local PlayerHasToy = PlayerHasToy local hooksecurefunc = hooksecurefunc local GetItemQualityColor = GetItemQualityColor local GetItemQualityByID = C_Item.GetItemQualityByID local C_Heirloom_PlayerHasHeirloom = C_Heirloom.PlayerHasHeirloom local QUALITY_7_R, QUALITY_7_G, QUALITY_7_B = GetItemQualityColor(7) local function clearBackdrop(backdrop) backdrop:SetBackdropColor(0, 0, 0, 0) end local function toyTextColor(text, r, g, b) if r == 0.33 and g == 0.27 and b == 0.2 then text:SetTextColor(0.4, 0.4, 0.4) elseif r == 1 and g == 0.82 and b == 0 then text:SetTextColor(0.9, 0.9, 0.9) end end local function petNameColor(iconBorder, r, g, b) local parent = iconBorder:GetParent() if not parent.name then return end if parent.isDead and parent.isDead:IsShown() then parent.name:SetTextColor(0.9, 0.3, 0.3) elseif r and parent.owned then parent.name:SetTextColor(r, g, b) else parent.name:SetTextColor(0.4, 0.4, 0.4) end end local function mountNameColor(object) local button = object:GetParent() local name = button.name if name:GetFontObject() == _G.GameFontDisable then name:SetTextColor(0.4, 0.4, 0.4) else if button.background then local _, g, b = button.background:GetVertexColor() if g == 0 and b == 0 then name:SetTextColor(0.9, 0.3, 0.3) return end end name:SetTextColor(0.9, 0.9, 0.9) end end local function selectedTextureSetShown(texture, shown) -- used sets list local parent = texture:GetParent() local icon = parent.icon or parent.Icon if shown then parent.backdrop:SetBackdropBorderColor(1, .8, .1) icon.backdrop:SetBackdropBorderColor(1, .8, .1) else local r, g, b = unpack(E.media.bordercolor) parent.backdrop:SetBackdropBorderColor(r, g, b) icon.backdrop:SetBackdropBorderColor(r, g, b) end end local function selectedTextureShow(texture) -- used for pets/mounts local parent = texture:GetParent() parent.backdrop:SetBackdropBorderColor(1, .8, .1) parent.icon.backdrop:SetBackdropBorderColor(1, .8, .1) end local function selectedTextureHide(texture) -- used for pets/mounts local parent = texture:GetParent() if not parent.hovered then local r, g, b = unpack(E.media.bordercolor) parent.backdrop:SetBackdropBorderColor(r, g, b) parent.icon.backdrop:SetBackdropBorderColor(r, g, b) end if parent.petList then petNameColor(parent.iconBorder, parent.iconBorder:GetVertexColor()) end end local function buttonOnEnter(button) local r, g, b = unpack(E.media.rgbvaluecolor) local icon = button.icon or button.Icon button.backdrop:SetBackdropBorderColor(r, g, b) icon.backdrop:SetBackdropBorderColor(r, g, b) button.hovered = true end local function buttonOnLeave(button) local icon = button.icon or button.Icon if button.selected or (button.SelectedTexture and button.SelectedTexture:IsShown()) then button.backdrop:SetBackdropBorderColor(1, .8, .1) icon.backdrop:SetBackdropBorderColor(1, .8, .1) else local r, g, b = unpack(E.media.bordercolor) button.backdrop:SetBackdropBorderColor(r, g, b) icon.backdrop:SetBackdropBorderColor(r, g, b) end button.hovered = nil end local function JournalScrollButtons(frame) if not frame then return end for _, bu in next, { frame.ScrollTarget:GetChildren() } do if not bu.IsSkinned then local icon = bu.icon or bu.Icon local savedIconTexture = icon:GetTexture() icon:Size(40) icon:Point('LEFT', -43, 0) icon:SetTexCoord(unpack(E.TexCoords)) icon:CreateBackdrop('Transparent', nil, nil, true) local savedPetTypeTexture = bu.petTypeIcon and bu.petTypeIcon:GetTexture() local savedFactionAtlas = bu.factionIcon and bu.factionIcon:GetAtlas() bu:StripTextures() bu:CreateBackdrop('Transparent', nil, nil, true) bu.backdrop:ClearAllPoints() bu.backdrop:Point('TOPLEFT', bu, 0, -2) bu.backdrop:Point('BOTTOMRIGHT', bu, 0, 2) icon:SetTexture(savedIconTexture) -- restore the texture bu:HookScript('OnEnter', buttonOnEnter) bu:HookScript('OnLeave', buttonOnLeave) if bu.ProgressBar then bu.ProgressBar:SetTexture(E.media.normTex) bu.ProgressBar:SetVertexColor(0.251, 0.753, 0.251, 1) -- 0.0118, 0.247, 0.00392 end local parent = frame:GetParent() if parent == _G.WardrobeCollectionFrame.SetsCollectionFrame then bu.Favorite:SetAtlas('PetJournal-FavoritesIcon', true) bu.Favorite:Point('TOPLEFT', bu.Icon, 'TOPLEFT', -8, 8) hooksecurefunc(bu.SelectedTexture, 'SetShown', selectedTextureSetShown) else bu.selectedTexture:SetTexture() hooksecurefunc(bu.selectedTexture, 'Show', selectedTextureShow) hooksecurefunc(bu.selectedTexture, 'Hide', selectedTextureHide) if parent == _G.PetJournal then bu.petList = true bu.petTypeIcon:SetTexture(savedPetTypeTexture) bu.petTypeIcon:Point('TOPRIGHT', -1, -1) bu.petTypeIcon:Point('BOTTOMRIGHT', -1, 1) bu.dragButton.ActiveTexture:SetTexture(E.Media.Textures.White8x8) bu.dragButton.ActiveTexture:SetVertexColor(0.9, 0.8, 0.1, 0.3) S:HandleIconBorder(bu.iconBorder, nil, petNameColor) elseif parent == _G.MountJournal then bu.mountList = true bu.factionIcon:SetAtlas(savedFactionAtlas) bu.factionIcon:SetDrawLayer('OVERLAY') bu.factionIcon:Point('TOPRIGHT', -1, -1) bu.factionIcon:Point('BOTTOMRIGHT', -1, 1) bu.DragButton.ActiveTexture:SetTexture(E.Media.Textures.White8x8) bu.DragButton.ActiveTexture:SetVertexColor(0.9, 0.8, 0.1, 0.3) bu.favorite:SetTexture([[Interface\COMMON\FavoritesIcon]]) bu.favorite:Point('TOPLEFT', bu.DragButton, 'TOPLEFT' , -8, 8) bu.favorite:Size(32) hooksecurefunc(bu.name, 'SetFontObject', mountNameColor) hooksecurefunc(bu.background, 'SetVertexColor', mountNameColor) end end bu.IsSkinned = true end end end local function ToySpellButtonUpdateButton(button) if button.itemID and PlayerHasToy(button.itemID) then local quality = GetItemQualityByID(button.itemID) if quality then local r, g, b = GetItemQualityColor(quality) button.backdrop:SetBackdropBorderColor(r, g, b) else button.backdrop:SetBackdropBorderColor(0.9, 0.9, 0.9) end else local r, g, b = unpack(E.media.bordercolor) button.backdrop:SetBackdropBorderColor(r, g, b) end end local function HeirloomsJournalUpdateButton(_, button) if not button.IsSkinned then S:HandleItemButton(button, true) button.iconTextureUncollected:SetTexCoord(unpack(E.TexCoords)) button.iconTextureUncollected:SetInside(button) button.iconTexture:SetDrawLayer('ARTWORK') button.hover:SetAllPoints(button.iconTexture) button.slotFrameCollected:SetAlpha(0) button.slotFrameUncollected:SetAlpha(0) button.special:SetJustifyH('RIGHT') button.special:ClearAllPoints() button.cooldown:SetAllPoints(button.iconTexture) E:RegisterCooldown(button.cooldown) button.IsSkinned = true end button.name:Point('LEFT', button, 'RIGHT', 4, 8) if C_Heirloom_PlayerHasHeirloom(button.itemID) then button.name:SetTextColor(0.9, 0.9, 0.9) button.special:SetTextColor(1, .82, 0) button.backdrop:SetBackdropBorderColor(QUALITY_7_R, QUALITY_7_G, QUALITY_7_B) else button.name:SetTextColor(0.4, 0.4, 0.4) button.special:SetTextColor(0.4, 0.4, 0.4) button.backdrop:SetBackdropBorderColor(unpack(E.media.bordercolor)) end end local function HeirloomsJournalLayoutCurrentPage() local headers = _G.HeirloomsJournal.heirloomHeaderFrames if headers and next(headers) then for _, header in next, headers do header:StripTextures() header.text:FontTemplate(nil, 15, 'SHADOW') header.text:SetTextColor(0.9, 0.9, 0.9) end end end local function SkinMountFrame() S:HandleButton(_G.MountJournalFilterButton) _G.MountJournalFilterButton:ClearAllPoints() _G.MountJournalFilterButton:Point('LEFT', _G.MountJournalSearchBox, 'RIGHT', 5, 0) local MountJournal = _G.MountJournal MountJournal:StripTextures() MountJournal.MountDisplay:StripTextures() MountJournal.MountDisplay.ShadowOverlay:StripTextures() MountJournal.MountCount:StripTextures() S:HandleIcon(MountJournal.MountDisplay.InfoButton.Icon, true) S:HandleRotateButton(MountJournal.MountDisplay.ModelScene.RotateLeftButton) S:HandleRotateButton(MountJournal.MountDisplay.ModelScene.RotateRightButton) S:HandleButton(_G.MountJournalMountButton) S:HandleEditBox(_G.MountJournalSearchBox) S:HandleTrimScrollBar(_G.MountJournal.ScrollBar) hooksecurefunc(MountJournal.ScrollBox, 'Update', JournalScrollButtons) end local function SkinPetFrame() _G.PetJournalSummonButton:StripTextures() S:HandleButton(_G.PetJournalSummonButton) _G.PetJournalRightInset:StripTextures() _G.PetJournalLeftInset:StripTextures() local PetJournal = _G.PetJournal PetJournal.PetCount:StripTextures() S:HandleEditBox(_G.PetJournalSearchBox) _G.PetJournalSearchBox:ClearAllPoints() _G.PetJournalSearchBox:Point('TOPLEFT', _G.PetJournalLeftInset, 'TOPLEFT', (E.PixelMode and 13 or 10), -9) S:HandleButton(_G.PetJournalFilterButton) _G.PetJournalFilterButton:Height(E.PixelMode and 22 or 24) _G.PetJournalFilterButton:ClearAllPoints() _G.PetJournalFilterButton:Point('TOPRIGHT', _G.PetJournalLeftInset, 'TOPRIGHT', -5, -(E.PixelMode and 8 or 7)) S:HandleTrimScrollBar(_G.PetJournal.ScrollBar) hooksecurefunc(PetJournal.ScrollBox, 'Update', JournalScrollButtons) _G.PetJournalPetCardPetInfo:CreateBackdrop() _G.PetJournalPetCardPetInfo.favorite:SetParent(_G.PetJournalPetCardPetInfo.backdrop) _G.PetJournalPetCardPetInfo.backdrop:SetOutside(_G.PetJournalPetCardPetInfoIcon) _G.PetJournalPetCardPetInfoIcon:SetParent(_G.PetJournalPetCardPetInfo.backdrop) _G.PetJournalPetCardPetInfoIcon:SetTexCoord(unpack(E.TexCoords)) end local function SkinToyFrame() local ToyBox = _G.ToyBox S:HandleEditBox(ToyBox.searchBox) S:HandleButton(_G.ToyBoxFilterButton) _G.ToyBoxFilterButton:Point('LEFT', ToyBox.searchBox, 'RIGHT', 2, 0) ToyBox.iconsFrame:StripTextures() S:HandleNextPrevButton(ToyBox.PagingFrame.NextPageButton, nil, nil, true) S:HandleNextPrevButton(ToyBox.PagingFrame.PrevPageButton, nil, nil, true) ToyBox.progressBar.border:Hide() ToyBox.progressBar:DisableDrawLayer('BACKGROUND') ToyBox.progressBar:SetStatusBarTexture(E.media.normTex) ToyBox.progressBar:CreateBackdrop() E:RegisterStatusBar(ToyBox.progressBar) for i = 1, 18 do local button = ToyBox.iconsFrame['spellButton'..i] S:HandleItemButton(button, true) button.iconTextureUncollected:SetTexCoord(unpack(E.TexCoords)) button.iconTextureUncollected:SetInside(button) button.hover:SetAllPoints(button.iconTexture) button.checked:SetAllPoints(button.iconTexture) button.pushed:SetAllPoints(button.iconTexture) button.cooldown:SetAllPoints(button.iconTexture) hooksecurefunc(button.name, 'SetTextColor', toyTextColor) hooksecurefunc(button.new, 'SetTextColor', toyTextColor) E:RegisterCooldown(button.cooldown) end hooksecurefunc('ToySpellButton_UpdateButton', ToySpellButtonUpdateButton) end local function SkinHeirloomFrame() local HeirloomsJournal = _G.HeirloomsJournal S:HandleEditBox(HeirloomsJournal.SearchBox) HeirloomsJournal.iconsFrame:StripTextures() S:HandleNextPrevButton(HeirloomsJournal.PagingFrame.NextPageButton, nil, nil, true) S:HandleNextPrevButton(HeirloomsJournal.PagingFrame.PrevPageButton, nil, nil, true) S:HandleDropDownBox(_G.HeirloomsJournalClassDropDown) S:HandleButton(_G.HeirloomsJournal.FilterButton) HeirloomsJournal.progressBar.border:Hide() HeirloomsJournal.progressBar:DisableDrawLayer('BACKGROUND') HeirloomsJournal.progressBar:SetStatusBarTexture(E.media.normTex) HeirloomsJournal.progressBar:CreateBackdrop() E:RegisterStatusBar(HeirloomsJournal.progressBar) hooksecurefunc(HeirloomsJournal, 'UpdateButton', HeirloomsJournalUpdateButton) hooksecurefunc(HeirloomsJournal, 'LayoutCurrentPage', HeirloomsJournalLayoutCurrentPage) end local function SkinTransmogFrames() local WardrobeCollectionFrame = _G.WardrobeCollectionFrame S:HandleTab(WardrobeCollectionFrame.ItemsTab) S:HandleTab(WardrobeCollectionFrame.SetsTab) WardrobeCollectionFrame.progressBar:StripTextures() WardrobeCollectionFrame.progressBar:CreateBackdrop() WardrobeCollectionFrame.progressBar:SetStatusBarTexture(E.media.normTex) E:RegisterStatusBar(WardrobeCollectionFrame.progressBar) S:HandleEditBox(_G.WardrobeCollectionFrameSearchBox) _G.WardrobeCollectionFrameSearchBox:SetFrameLevel(5) S:HandleButton(WardrobeCollectionFrame.FilterButton) WardrobeCollectionFrame.FilterButton:Point('LEFT', WardrobeCollectionFrame.searchBox, 'RIGHT', 2, 0) S:HandleDropDownBox(_G.WardrobeCollectionFrameWeaponDropDown) WardrobeCollectionFrame.ItemsCollectionFrame:StripTextures() for _, Frame in ipairs(WardrobeCollectionFrame.ContentFrames) do if Frame.Models then for _, Model in pairs(Frame.Models) do Model.Border:SetAlpha(0) Model.TransmogStateTexture:SetAlpha(0) local border = CreateFrame('Frame', nil, Model) border:SetTemplate() border:ClearAllPoints() border:Point('TOPLEFT', Model, 'TOPLEFT', 0, 1) -- dont use set inside, left side needs to be 0 border:Point('BOTTOMRIGHT', Model, 'BOTTOMRIGHT', 1, -1) border:SetBackdropColor(0, 0, 0, 0) border.callbackBackdropColor = clearBackdrop if Model.NewGlow then Model.NewGlow:SetParent(border) end if Model.NewString then Model.NewString:SetParent(border) end for _, region in next, { Model:GetRegions() } do if region:IsObjectType('Texture') then -- check for hover glow local texture, regionName = region:GetTexture(), region:GetDebugName() -- find transmogrify.blp (sets:1569530 or items:1116940) if texture == 1569530 or (texture == 1116940 and not strfind(regionName, 'SlotInvalidTexture') and not strfind(regionName, 'DisabledOverlay')) then region:SetColorTexture(1, 1, 1, 0.3) region:SetBlendMode('ADD') region:SetAllPoints(Model) end end end hooksecurefunc(Model.Border, 'SetAtlas', function(_, texture) if texture == 'transmog-wardrobe-border-uncollected' then border:SetBackdropBorderColor(0.9, 0.9, 0.3) elseif texture == 'transmog-wardrobe-border-unusable' then border:SetBackdropBorderColor(0.9, 0.3, 0.3) elseif Model.TransmogStateTexture:IsShown() then border:SetBackdropBorderColor(1, 0.7, 1) else border:SetBackdropBorderColor(unpack(E.media.bordercolor)) end end) end end local pending = Frame.PendingTransmogFrame if pending then local Glowframe = pending.Glowframe Glowframe:SetAtlas(nil) Glowframe:CreateBackdrop(nil, nil, nil, nil, nil, nil, nil, nil, pending:GetFrameLevel()) if Glowframe.backdrop then Glowframe.backdrop:Point('TOPLEFT', pending, 'TOPLEFT', 0, 1) -- dont use set inside, left side needs to be 0 Glowframe.backdrop:Point('BOTTOMRIGHT', pending, 'BOTTOMRIGHT', 1, -1) Glowframe.backdrop:SetBackdropBorderColor(1, 0.7, 1) Glowframe.backdrop:SetBackdropColor(0, 0, 0, 0) end for i = 1, 12 do if i < 5 then Frame.PendingTransmogFrame['Smoke'..i]:Hide() end Frame.PendingTransmogFrame['Wisp'..i]:Hide() end end local paging = Frame.PagingFrame if paging then S:HandleNextPrevButton(paging.PrevPageButton, nil, nil, true) S:HandleNextPrevButton(paging.NextPageButton, nil, nil, true) end end local WardrobeFrame = _G.WardrobeFrame S:HandlePortraitFrame(WardrobeFrame) local WardrobeTransmogFrame = _G.WardrobeTransmogFrame WardrobeTransmogFrame:StripTextures() for i = 1, #WardrobeTransmogFrame.SlotButtons do local slotButton = WardrobeTransmogFrame.SlotButtons[i] slotButton:SetFrameLevel(slotButton:GetFrameLevel() + 2) slotButton:StripTextures() slotButton:CreateBackdrop(nil, nil, nil, nil, nil, nil, nil, true) slotButton.Border:Kill() slotButton.Icon:SetTexCoord(unpack(E.TexCoords)) slotButton.Icon:SetInside(slotButton.backdrop) local undo = slotButton.UndoButton if undo then undo:SetHighlightTexture(E.ClearTexture) end local pending = slotButton.PendingFrame if pending then if slotButton.transmogType == 1 then pending.Glow:Size(48) pending.Ants:Size(30) else pending.Glow:Size(74) pending.Ants:Size(48) end end end S:HandleButton(WardrobeTransmogFrame.ApplyButton) WardrobeCollectionFrame.ItemsCollectionFrame:StripTextures() WardrobeCollectionFrame.ItemsCollectionFrame:SetTemplate('Transparent') end local function HandleTabs() local tab = _G.CollectionsJournalTab1 local index, lastTab = 1, tab while tab do S:HandleTab(tab) tab:ClearAllPoints() if index == 1 then tab:Point('TOPLEFT', _G.CollectionsJournal, 'BOTTOMLEFT', -10, 0) else tab:Point('TOPLEFT', lastTab, 'TOPRIGHT', -19, 0) lastTab = tab end index = index + 1 tab = _G['CollectionsJournalTab'..index] end end local function SkinCollectionsFrames() S:HandlePortraitFrame(_G.CollectionsJournal) HandleTabs() SkinMountFrame() SkinPetFrame() SkinToyFrame() SkinHeirloomFrame() end function S:Blizzard_Collections() if not E.private.skins.blizzard.enable then return end if E.private.skins.blizzard.collections then SkinCollectionsFrames() end if E.private.skins.blizzard.transmogrify then SkinTransmogFrames() end end S:AddCallbackForAddon('Blizzard_Collections')