mirror of
https://github.com/Bluewhale1337/ElvUIModernized.git
synced 2026-07-27 08:24:44 +00:00
430 lines
13 KiB
Lua
430 lines
13 KiB
Lua
local E, L, V, P, G = unpack(ElvUI); --Import: Engine, Locales, PrivateDB, ProfileDB, GlobalDB
|
|
local S = E:GetModule("Skins");
|
|
|
|
--Cache global variables
|
|
--Lua functions
|
|
local _G = _G
|
|
local select = select
|
|
local getn = table.getn
|
|
--WoW API / Variables
|
|
local CreateFrame = CreateFrame
|
|
local RegisterAsWidget, RegisterAsContainer
|
|
|
|
local function SkinButton(f, strip, noTemplate)
|
|
local name = f:GetName()
|
|
if name then
|
|
local left = _G[name.."Left"]
|
|
local middle = _G[name.."Middle"]
|
|
local right = _G[name.."Right"]
|
|
|
|
if left then E:Kill(left) end
|
|
if middle then E:Kill(middle) end
|
|
if right then E:Kill(right) end
|
|
end
|
|
|
|
if f.Left then E:Kill(f.Left) end
|
|
if f.Middle then E:Kill(f.Middle) end
|
|
if f.Right then E:Kill(f.Right) end
|
|
|
|
if f.SetNormalTexture then f:SetNormalTexture("") end
|
|
if f.SetHighlightTexture then f:SetHighlightTexture("") end
|
|
if f.SetPushedTexture then f:SetPushedTexture("") end
|
|
if f.SetDisabledTexture then f:SetDisabledTexture("") end
|
|
|
|
if strip then E:StripTextures(f) end
|
|
|
|
if not f.template and not noTemplate then
|
|
E:SetTemplate(f, "Default", true)
|
|
end
|
|
|
|
HookScript(f, "OnEnter", S.SetModifiedBackdrop)
|
|
HookScript(f, "OnLeave", S.SetOriginalBackdrop)
|
|
end
|
|
|
|
local function SkinDropdownPullout(self)
|
|
if self and self.obj then
|
|
local pullout = self.obj.pullout
|
|
local dropdown = self.obj.dropdown
|
|
|
|
if pullout and pullout.frame then
|
|
if pullout.frame.template and pullout.slider.template then return end
|
|
|
|
if not pullout.frame.template then
|
|
E:SetTemplate(pullout.frame, "Default", true)
|
|
end
|
|
|
|
if not pullout.slider.template then
|
|
E:SetTemplate(pullout.slider, "Default")
|
|
E:Point(pullout.slider, "TOPRIGHT", pullout.frame, "TOPRIGHT", -10, -10)
|
|
E:Point(pullout.slider, "BOTTOMRIGHT", pullout.frame, "BOTTOMRIGHT", -10, 10)
|
|
if pullout.slider:GetThumbTexture() then
|
|
pullout.slider:SetThumbTexture([[Interface\AddOns\ElvUI\media\textures\melli]])
|
|
pullout.slider:GetThumbTexture():SetVertexColor(1, 0.82, 0, 0.8)
|
|
E:Size(pullout.slider:GetThumbTexture(), 10, 14)
|
|
end
|
|
end
|
|
elseif dropdown then
|
|
E:SetTemplate(dropdown, "Default", true)
|
|
|
|
if dropdown.slider then
|
|
E:SetTemplate(dropdown.slider, "Default")
|
|
E:Point(dropdown.slider, "TOPRIGHT", dropdown, "TOPRIGHT", -10, -10)
|
|
E:Point(dropdown.slider, "BOTTOMRIGHT", dropdown, "BOTTOMRIGHT", -10, 10)
|
|
|
|
if dropdown.slider:GetThumbTexture() then
|
|
dropdown.slider:SetThumbTexture([[Interface\AddOns\ElvUI\media\textures\melli]])
|
|
dropdown.slider:GetThumbTexture():SetVertexColor(1, 0.82, 0, 0.8)
|
|
E:Size(dropdown.slider:GetThumbTexture(), 10, 14)
|
|
end
|
|
end
|
|
|
|
if TYPE == "LSM30_Sound" then
|
|
local frame = self.obj.frame
|
|
local width = frame:GetWidth()
|
|
E:Point(dropdown, "TOPLEFT", frame, "BOTTOMLEFT")
|
|
E:Point(dropdown, "TOPRIGHT", frame, "BOTTOMRIGHT", width < 160 and (160 - width) or 30, 0)
|
|
end
|
|
end
|
|
end
|
|
end
|
|
|
|
function S:SkinAce3()
|
|
local AceGUI = LibStub("AceGUI-3.0", true)
|
|
if not AceGUI then return end
|
|
local oldRegisterAsWidget = AceGUI.RegisterAsWidget
|
|
|
|
RegisterAsWidget = function(self, widget)
|
|
if not E.private.skins.ace3.enable then
|
|
return oldRegisterAsWidget(self, widget)
|
|
end
|
|
local TYPE = widget.type
|
|
if TYPE == "MultiLineEditBox" then
|
|
local frame = widget.frame
|
|
local scrollBG = widget.scrollBG or select(2, frame:GetChildren())
|
|
|
|
if not scrollBG.template then
|
|
E:SetTemplate(scrollBG, "Default")
|
|
end
|
|
|
|
SkinButton(widget.button)
|
|
S:HandleScrollBar(widget.scrollBar)
|
|
E:Point(widget.scrollBar, "RIGHT", frame, "RIGHT", 0 -4)
|
|
|
|
E:Point(scrollBG, "TOPRIGHT", widget.scrollBar, "TOPLEFT", -2, 19)
|
|
E:Point(scrollBG, "BOTTOMLEFT", widget.button, "TOPLEFT")
|
|
E:Point(widget.scrollFrame, "BOTTOMRIGHT", scrollBG, "BOTTOMRIGHT", -4, 8)
|
|
elseif TYPE == "CheckBox" then
|
|
local check = widget.check
|
|
local checkbg = widget.checkbg
|
|
local highlight = widget.highlight
|
|
|
|
E:CreateBackdrop(checkbg, "Default")
|
|
E:SetInside(checkbg.backdrop, checkbg, 4, 4)
|
|
checkbg.backdrop:SetFrameLevel(checkbg.backdrop:GetFrameLevel() + 1)
|
|
checkbg:SetTexture("")
|
|
checkbg.SetTexture = E.noop
|
|
|
|
check:SetTexture([[Interface\AddOns\ElvUI\media\textures\melli]])
|
|
check.SetTexture = E.noop
|
|
check:SetVertexColor(1, 0.82, 0, 0.8)
|
|
E:SetInside(check, checkbg.backdrop)
|
|
check:SetParent(checkbg.backdrop)
|
|
|
|
highlight:SetTexture("")
|
|
highlight.SetTexture = E.noop
|
|
elseif TYPE == "Dropdown" then
|
|
local frame = widget.dropdown
|
|
local button = widget.button
|
|
local button_cover = widget.button_cover
|
|
local text = widget.text
|
|
|
|
E:StripTextures(frame)
|
|
|
|
S:HandleNextPrevButton(button, true)
|
|
|
|
if not frame.backdrop then
|
|
E:CreateBackdrop(frame, "Default")
|
|
end
|
|
|
|
E:Point(frame.backdrop, "TOPLEFT", 17, -2)
|
|
E:Point(frame.backdrop, "BOTTOMRIGHT", -21, 0)
|
|
|
|
widget.label:ClearAllPoints()
|
|
E:Point(widget.label, "BOTTOMLEFT", frame.backdrop, "TOPLEFT", 2, 0)
|
|
|
|
E:Size(button, 20, 20)
|
|
button:ClearAllPoints()
|
|
E:Point(button, "RIGHT", frame.backdrop, "RIGHT", -2, 0)
|
|
button:SetParent(frame.backdrop)
|
|
|
|
text:ClearAllPoints()
|
|
E:Point(text, "RIGHT", frame.backdrop, "RIGHT", -26, 2)
|
|
E:Point(text, "LEFT", frame.backdrop, "LEFT", 2, 0)
|
|
text:SetParent(frame.backdrop)
|
|
|
|
HookScript(button, "OnClick", SkinDropdownPullout)
|
|
|
|
if button_cover then
|
|
HookScript(button_cover, "OnClick", SkinDropdownPullout)
|
|
end
|
|
elseif TYPE == "LSM30_Font" or TYPE == "LSM30_Sound" or TYPE == "LSM30_Border" or TYPE == "LSM30_Background" or TYPE == "LSM30_Statusbar" then
|
|
local frame = widget.frame
|
|
local button = frame.dropButton
|
|
local text = frame.text
|
|
|
|
E:StripTextures(frame)
|
|
|
|
S:HandleNextPrevButton(button, true)
|
|
|
|
if not frame.backdrop then
|
|
E:CreateBackdrop(frame, "Default")
|
|
end
|
|
|
|
frame.label:ClearAllPoints()
|
|
E:Point(frame.label, "BOTTOMLEFT", frame.backdrop, "TOPLEFT", 2, 0)
|
|
|
|
text:ClearAllPoints()
|
|
E:Point(text, "RIGHT", button, "LEFT", -2, 0)
|
|
|
|
E:Size(button, 20, 20)
|
|
button:ClearAllPoints()
|
|
E:Point(button, "RIGHT", frame.backdrop, "RIGHT", -2, 0)
|
|
|
|
E:Point(frame.backdrop, "TOPLEFT", 0, -21)
|
|
E:Point(frame.backdrop, "BOTTOMRIGHT", -4, -1)
|
|
|
|
if TYPE == "LSM30_Sound" then
|
|
widget.soundbutton:SetParent(frame.backdrop)
|
|
widget.soundbutton:ClearAllPoints()
|
|
E:Point(widget.soundbutton, "LEFT", frame.backdrop, "LEFT", 2, 0)
|
|
elseif TYPE == "LSM30_Statusbar" then
|
|
widget.bar:SetParent(frame.backdrop)
|
|
widget.bar:ClearAllPoints()
|
|
E:Point(widget.bar, "TOPLEFT", frame.backdrop, "TOPLEFT", 2, -2)
|
|
E:Point(widget.bar, "BOTTOMRIGHT", button, "BOTTOMLEFT", -1, 0)
|
|
end
|
|
|
|
button:SetParent(frame.backdrop)
|
|
text:SetParent(frame.backdrop)
|
|
|
|
HookScript(button, "OnClick", SkinDropdownPullout)
|
|
elseif TYPE == "EditBox" then
|
|
local frame = widget.editbox
|
|
local button = widget.button
|
|
|
|
E:Kill(_G[frame:GetName().."Left"])
|
|
E:Kill(_G[frame:GetName().."Middle"])
|
|
E:Kill(_G[frame:GetName().."Right"])
|
|
|
|
E:Height(frame, 17)
|
|
E:CreateBackdrop(frame, "Default")
|
|
E:Point(frame.backdrop, "TOPLEFT", 2, -2)
|
|
E:Point(frame.backdrop, "BOTTOMRIGHT", -2, 0)
|
|
frame.backdrop:SetParent(widget.frame)
|
|
frame:SetParent(frame.backdrop)
|
|
frame:SetTextInsets(4, 43, 3, 3)
|
|
frame.SetTextInsets = E.noop
|
|
|
|
SkinButton(button)
|
|
E:Point(button, "RIGHT", frame.backdrop, "RIGHT", -2, 0)
|
|
|
|
hooksecurefunc(frame, "SetPoint", function(self, a, b, c, d, e)
|
|
if d == 7 then
|
|
self:SetPoint(a, b, c, 0, e)
|
|
end
|
|
end)
|
|
elseif TYPE == "Button" or TYPE == "Button-ElvUI" then
|
|
local frame = widget.frame
|
|
|
|
SkinButton(frame, nil, true)
|
|
|
|
E:StripTextures(frame)
|
|
E:CreateBackdrop(frame, "Default", true)
|
|
E:SetInside(frame.backdrop)
|
|
|
|
widget.text:SetParent(frame.backdrop)
|
|
elseif TYPE == "Slider" then
|
|
local frame = widget.slider
|
|
local editbox = widget.editbox
|
|
local lowtext = widget.lowtext
|
|
local hightext = widget.hightext
|
|
local HEIGHT = 12
|
|
|
|
E:StripTextures(frame)
|
|
E:SetTemplate(frame, "Default")
|
|
E:Height(frame, HEIGHT)
|
|
|
|
frame:SetThumbTexture([[Interface\AddOns\ElvUI\media\textures\melli]])
|
|
frame:GetThumbTexture():SetVertexColor(1, 0.82, 0, 0.8)
|
|
E:Size(frame:GetThumbTexture(), HEIGHT - 2, HEIGHT - 2)
|
|
|
|
E:SetTemplate(editbox, "Default")
|
|
E:Height(editbox, 15)
|
|
E:Point(editbox, "TOP", frame, "BOTTOM", 0, -1)
|
|
|
|
E:Point(lowtext, "TOPLEFT", frame, "BOTTOMLEFT", 2, -2)
|
|
E:Point(hightext, "TOPRIGHT", frame, "BOTTOMRIGHT", -2, -2)
|
|
elseif TYPE == "Keybinding" then
|
|
local button = widget.button
|
|
local msgframe = widget.msgframe
|
|
local msg = widget.msgframe.msg
|
|
|
|
SkinButton(button)
|
|
|
|
E:StripTextures(msgframe)
|
|
E:CreateBackdrop(msgframe, "Default", true)
|
|
E:SetInside(msgframe.backdrop)
|
|
msgframe:SetToplevel(true)
|
|
|
|
msg:ClearAllPoints()
|
|
E:Point(msg, "LEFT", 10, 0)
|
|
E:Point(msg, "RIGHT", -10, 0)
|
|
msg:SetJustifyV("MIDDLE")
|
|
E:Width(msg, msg:GetWidth() + 10)
|
|
elseif (TYPE == "ColorPicker" or TYPE == "ColorPicker-ElvUI") then
|
|
local frame = widget.frame
|
|
local colorSwatch = widget.colorSwatch
|
|
|
|
if not frame.backdrop then
|
|
E:CreateBackdrop(frame, "Default")
|
|
end
|
|
|
|
E:Size(frame.backdrop, 16, 16)
|
|
frame.backdrop:ClearAllPoints()
|
|
E:Point(frame.backdrop, "LEFT", frame, "LEFT", 4, 0)
|
|
frame.backdrop:SetBackdropColor(0, 0, 0, 0)
|
|
frame.backdrop.SetBackdropColor = E.noop
|
|
|
|
colorSwatch:SetTexture(E.media.blankTex)
|
|
colorSwatch:ClearAllPoints()
|
|
colorSwatch:SetParent(frame.backdrop)
|
|
E:SetInside(colorSwatch, frame.backdrop)
|
|
|
|
if frame.texture then
|
|
frame.texture:SetTexture(0, 0, 0, 0)
|
|
end
|
|
|
|
if frame.checkers then
|
|
frame.checkers:ClearAllPoints()
|
|
frame.checkers:SetDrawLayer("ARTWORK")
|
|
frame.checkers:SetParent(frame.backdrop)
|
|
E:SetInside(frame.checkers, frame.backdrop)
|
|
end
|
|
end
|
|
|
|
return oldRegisterAsWidget(self, widget)
|
|
end
|
|
AceGUI.RegisterAsWidget = RegisterAsWidget
|
|
|
|
local oldRegisterAsContainer = AceGUI.RegisterAsContainer
|
|
RegisterAsContainer = function(self, widget)
|
|
if not E.private.skins.ace3.enable then
|
|
return oldRegisterAsContainer(self, widget)
|
|
end
|
|
local TYPE = widget.type
|
|
if TYPE == "ScrollFrame" then
|
|
S:HandleScrollBar(widget.scrollbar)
|
|
elseif TYPE == "InlineGroup" or TYPE == "TreeGroup" or TYPE == "TabGroup" or TYPE == "Frame" or TYPE == "DropdownGroup" or TYPE == "Window" then
|
|
local frame = widget.content:GetParent()
|
|
if TYPE == "Frame" then
|
|
E:StripTextures(frame)
|
|
if not E.GUIFrame then
|
|
E.GUIFrame = frame
|
|
end
|
|
for i = 1, frame:GetNumChildren() do
|
|
local child = select(i, frame:GetChildren())
|
|
if child:GetObjectType() == "Button" and child:GetText() then
|
|
SkinButton(child)
|
|
else
|
|
E:StripTextures(child)
|
|
end
|
|
end
|
|
elseif TYPE == "Window" then
|
|
E:StripTextures(frame)
|
|
S:HandleCloseButton(frame.obj.closebutton)
|
|
end
|
|
E:SetTemplate(frame, "Transparent")
|
|
|
|
if widget.treeframe then
|
|
E:SetTemplate(widget.treeframe, "Transparent")
|
|
E:Point(frame, "TOPLEFT", widget.treeframe, "TOPRIGHT", 1, 0)
|
|
|
|
local oldRefreshTree = widget.RefreshTree
|
|
widget.RefreshTree = function(self, scrollToSelection)
|
|
oldRefreshTree(self, scrollToSelection)
|
|
if not self.tree then return end
|
|
local status = self.status or self.localstatus
|
|
local groupstatus = status.groups
|
|
local lines = self.lines
|
|
local buttons = self.buttons
|
|
local offset = status.scrollvalue
|
|
|
|
for i = offset + 1, getn(lines) do
|
|
local button = buttons[i - offset]
|
|
if button then
|
|
button.toggle:SetNormalTexture([[Interface\AddOns\ElvUI\media\textures\PlusMinusButton]])
|
|
button.toggle:SetPushedTexture([[Interface\AddOns\ElvUI\media\textures\PlusMinusButton]])
|
|
button.toggle:SetHighlightTexture("")
|
|
|
|
if groupstatus[lines[i].uniquevalue] then
|
|
button.toggle:GetNormalTexture():SetTexCoord(0.540, 0.965, 0.085, 0.920)
|
|
button.toggle:GetPushedTexture():SetTexCoord(0.540, 0.965, 0.085, 0.920)
|
|
else
|
|
button.toggle:GetNormalTexture():SetTexCoord(0.040, 0.465, 0.085, 0.920)
|
|
button.toggle:GetPushedTexture():SetTexCoord(0.040, 0.465, 0.085, 0.920)
|
|
end
|
|
end
|
|
end
|
|
end
|
|
end
|
|
|
|
if TYPE == "TabGroup" then
|
|
local oldCreateTab = widget.CreateTab
|
|
widget.CreateTab = function(self, id)
|
|
local tab = oldCreateTab(self, id)
|
|
E:StripTextures(tab)
|
|
tab.backdrop = CreateFrame("Frame", nil, tab)
|
|
E:SetTemplate(tab.backdrop, "Transparent")
|
|
E:Point(tab.backdrop, "TOPLEFT", 10, -3)
|
|
E:Point(tab.backdrop, "BOTTOMRIGHT", -10, 0)
|
|
|
|
HookScript(tab, "OnShow", function()
|
|
local tabLevel = this:GetFrameLevel()
|
|
local tabBGLevel = this.backdrop:GetFrameLevel()
|
|
|
|
if tabLevel <= tabBGLevel then
|
|
this.backdrop:SetFrameLevel(tabLevel - 1)
|
|
end
|
|
end)
|
|
|
|
return tab
|
|
end
|
|
end
|
|
|
|
if widget.scrollbar then
|
|
S:HandleScrollBar(widget.scrollbar)
|
|
end
|
|
elseif TYPE == "SimpleGroup" then
|
|
local frame = widget.content:GetParent()
|
|
E:SetTemplate(frame, "Transparent", nil, true) --ignore border updates
|
|
frame:SetBackdropBorderColor(0, 0, 0, 0) --Make border completely transparent
|
|
end
|
|
|
|
return oldRegisterAsContainer(self, widget)
|
|
end
|
|
AceGUI.RegisterAsContainer = RegisterAsContainer
|
|
end
|
|
|
|
local function attemptSkin()
|
|
local AceGUI = LibStub("AceGUI-3.0", true)
|
|
if AceGUI and (AceGUI.RegisterAsContainer ~= RegisterAsContainer or AceGUI.RegisterAsWidget ~= RegisterAsWidget) then
|
|
S:SkinAce3()
|
|
end
|
|
end
|
|
|
|
local f = CreateFrame("Frame")
|
|
f:RegisterEvent("ADDON_LOADED")
|
|
f:SetScript("OnEvent", attemptSkin)
|
|
|
|
S:AddCallback("Ace3", attemptSkin)
|