mirror of
https://github.com/Bluewhale1337/ElvUIModernized.git
synced 2026-07-27 08:24:44 +00:00
602 lines
19 KiB
Lua
602 lines
19 KiB
Lua
local E, L, V, P, G = unpack(ElvUI); --Import: Engine, Locales, PrivateDB, ProfileDB, GlobalDB
|
|
local S = E:NewModule("Skins", "AceHook-3.0", "AceEvent-3.0");
|
|
|
|
--Cache global variables
|
|
--Lua functions
|
|
local _G = _G
|
|
local unpack, assert, pairs, ipairs, type, pcall = unpack, assert, pairs, ipairs, type, pcall
|
|
local tinsert, wipe = table.insert, table.wipe
|
|
local find, gfind, lower = string.find, string.gfind, string.lower
|
|
--WoW API / Variables
|
|
local CreateFrame = CreateFrame
|
|
local SetDesaturation = SetDesaturation
|
|
local hooksecurefunc = hooksecurefunc
|
|
local IsAddOnLoaded = IsAddOnLoaded
|
|
local GetCVarBool = GetCVarBool
|
|
|
|
E.Skins = S
|
|
S.addonsToLoad = {}
|
|
S.nonAddonsToLoad = {}
|
|
S.allowBypass = {}
|
|
S.addonCallbacks = {}
|
|
S.nonAddonCallbacks = {["CallPriority"] = {}}
|
|
|
|
S.SQUARE_BUTTON_TEXCOORDS = {
|
|
["UP"] = { 0.45312500, 0.64062500, 0.01562500, 0.20312500};
|
|
["DOWN"] = { 0.45312500, 0.64062500, 0.20312500, 0.01562500};
|
|
["LEFT"] = { 0.23437500, 0.42187500, 0.01562500, 0.20312500};
|
|
["RIGHT"] = { 0.42187500, 0.23437500, 0.01562500, 0.20312500};
|
|
["DELETE"] = { 0.01562500, 0.20312500, 0.01562500, 0.20312500}
|
|
}
|
|
|
|
function S:SquareButton_SetIcon(self, name)
|
|
local coords = S.SQUARE_BUTTON_TEXCOORDS[strupper(name)]
|
|
if coords then
|
|
self.icon:SetTexCoord(coords[1], coords[2], coords[3], coords[4])
|
|
end
|
|
end
|
|
|
|
function S:SetModifiedBackdrop()
|
|
if this.backdrop then this = this.backdrop end
|
|
this:SetBackdropBorderColor(unpack(E["media"].rgbvaluecolor))
|
|
end
|
|
|
|
function S:SetOriginalBackdrop()
|
|
if this.backdrop then this = this.backdrop end
|
|
this:SetBackdropBorderColor(unpack(E["media"].bordercolor))
|
|
end
|
|
|
|
function S:HandleButton(f, strip)
|
|
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
|
|
|
|
E:SetTemplate(f, "Default", true)
|
|
HookScript(f, "OnEnter", S.SetModifiedBackdrop)
|
|
HookScript(f, "OnLeave", S.SetOriginalBackdrop)
|
|
end
|
|
|
|
function S:HandleScrollBar(frame, thumbTrim)
|
|
local name = frame:GetName()
|
|
if _G[name.."BG"] then _G[name.."BG"]:SetTexture(nil) end
|
|
if _G[name.."Track"] then _G[name.."Track"]:SetTexture(nil) end
|
|
if _G[name.."Top"] then _G[name.."Top"]:SetTexture(nil) end
|
|
if _G[name.."Bottom"] then _G[name.."Bottom"]:SetTexture(nil) end
|
|
if _G[name.."Middle"] then _G[name.."Middle"]:SetTexture(nil) end
|
|
|
|
if _G[name.."ScrollUpButton"] and _G[name.."ScrollDownButton"] then
|
|
E:StripTextures(_G[name.."ScrollUpButton"])
|
|
if not _G[name.."ScrollUpButton"].icon then
|
|
S:HandleNextPrevButton(_G[name.."ScrollUpButton"])
|
|
S:SquareButton_SetIcon(_G[name.."ScrollUpButton"], "UP")
|
|
_G[name.."ScrollUpButton"]:SetWidth(_G[name.."ScrollUpButton"]:GetWidth() + 7)
|
|
_G[name.."ScrollUpButton"]:SetHeight(_G[name.."ScrollUpButton"]:GetHeight() + 7)
|
|
end
|
|
|
|
E:StripTextures(_G[name .."ScrollDownButton"])
|
|
if not _G[name.."ScrollDownButton"].icon then
|
|
S:HandleNextPrevButton(_G[name.."ScrollDownButton"])
|
|
S:SquareButton_SetIcon(_G[name.."ScrollDownButton"], "DOWN")
|
|
_G[name.."ScrollDownButton"]:SetWidth(_G[name.."ScrollDownButton"]:GetWidth() + 7)
|
|
_G[name.."ScrollDownButton"]:SetHeight(_G[name.."ScrollDownButton"]:GetHeight() + 7)
|
|
end
|
|
|
|
if not frame.trackbg then
|
|
frame.trackbg = CreateFrame("Frame", nil, frame)
|
|
frame.trackbg:SetPoint("TOPLEFT", _G[name .."ScrollUpButton"], "BOTTOMLEFT", 0, -1)
|
|
frame.trackbg:SetPoint("BOTTOMRIGHT", _G[name .."ScrollDownButton"], "TOPRIGHT", 0, 1)
|
|
E:SetTemplate(frame.trackbg, "Transparent")
|
|
end
|
|
|
|
if frame:GetThumbTexture() then
|
|
if not thumbTrim then thumbTrim = 3 end
|
|
frame:GetThumbTexture():SetTexture(nil)
|
|
if not frame.thumbbg then
|
|
frame.thumbbg = CreateFrame("Frame", nil, frame)
|
|
frame:GetThumbTexture():SetHeight(24)
|
|
frame.thumbbg:SetPoint("TOPLEFT", frame:GetThumbTexture(), "TOPLEFT", 1, -thumbTrim)
|
|
frame.thumbbg:SetPoint("BOTTOMRIGHT", frame:GetThumbTexture(), "BOTTOMRIGHT", -1, thumbTrim)
|
|
E:SetTemplate(frame.thumbbg, "Default", true, true)
|
|
frame.thumbbg:SetBackdropColor(0.6, 0.6, 0.6)
|
|
if frame.trackbg then
|
|
frame.thumbbg:SetFrameLevel(frame.trackbg:GetFrameLevel() + 1)
|
|
end
|
|
end
|
|
end
|
|
end
|
|
end
|
|
|
|
local tabs = {
|
|
"LeftDisabled",
|
|
"MiddleDisabled",
|
|
"RightDisabled",
|
|
"Left",
|
|
"Middle",
|
|
"Right"
|
|
}
|
|
|
|
function S:HandleTab(tab)
|
|
local name = tab:GetName()
|
|
for _, object in pairs(tabs) do
|
|
local tex = _G[name..object]
|
|
if tex then
|
|
tex:SetTexture(nil)
|
|
end
|
|
end
|
|
|
|
if tab.GetHighlightTexture and tab:GetHighlightTexture() then
|
|
tab:GetHighlightTexture():SetTexture(nil)
|
|
else
|
|
E:StripTextures(tab)
|
|
end
|
|
|
|
tab.backdrop = CreateFrame("Frame", nil, tab)
|
|
E:SetTemplate(tab.backdrop, "Default")
|
|
tab.backdrop:SetFrameLevel(tab:GetFrameLevel() - 1)
|
|
tab.backdrop:SetPoint("TOPLEFT", 10, E.PixelMode and -1 or -3)
|
|
tab.backdrop:SetPoint("BOTTOMRIGHT", -10, 3)
|
|
end
|
|
|
|
function S:HandleNextPrevButton(btn, buttonOverride)
|
|
local inverseDirection = btn:GetName() and (find(lower(btn:GetName()), "left") or find(lower(btn:GetName()), "prev") or find(lower(btn:GetName()), "decrement") or find(lower(btn:GetName()), "promote"))
|
|
|
|
E:StripTextures(btn)
|
|
btn:SetNormalTexture(nil)
|
|
btn:SetPushedTexture(nil)
|
|
btn:SetHighlightTexture(nil)
|
|
btn:SetDisabledTexture(nil)
|
|
|
|
if not btn.icon then
|
|
btn.icon = btn:CreateTexture(nil, "ARTWORK")
|
|
btn.icon:SetWidth(13)
|
|
btn.icon:SetHeight(13)
|
|
btn.icon:SetPoint("CENTER", 0, 0)
|
|
btn.icon:SetTexture("Interface\\AddOns\\ElvUI\\Media\\Textures\\SquareButtonTextures.blp")
|
|
btn.icon:SetTexCoord(0.01562500, 0.20312500, 0.01562500, 0.20312500)
|
|
|
|
btn:SetScript("OnMouseDown", function()
|
|
if btn:IsEnabled() == 1 then
|
|
this.icon:SetPoint("CENTER", -1, -1)
|
|
end
|
|
end)
|
|
btn:SetScript("OnMouseUp", function()
|
|
this.icon:SetPoint("CENTER", 0, 0)
|
|
end)
|
|
|
|
hooksecurefunc(btn, "Disable", function(self)
|
|
SetDesaturation(self.icon, true)
|
|
self.icon:SetAlpha(0.5)
|
|
end)
|
|
hooksecurefunc(btn, "Enable", function(self)
|
|
SetDesaturation(self.icon, false)
|
|
self.icon:SetAlpha(1.0)
|
|
end)
|
|
|
|
if btn:IsEnabled() == 0 then
|
|
SetDesaturation(btn.icon, true)
|
|
btn.icon:SetAlpha(0.5)
|
|
end
|
|
end
|
|
|
|
if buttonOverride then
|
|
if inverseDirection then
|
|
S:SquareButton_SetIcon(btn, "UP")
|
|
else
|
|
S:SquareButton_SetIcon(btn, "DOWN")
|
|
end
|
|
else
|
|
if inverseDirection then
|
|
S:SquareButton_SetIcon(btn, "LEFT")
|
|
else
|
|
S:SquareButton_SetIcon(btn, "RIGHT")
|
|
end
|
|
end
|
|
|
|
S:HandleButton(btn)
|
|
btn:SetWidth(btn:GetWidth() - 7)
|
|
btn:SetHeight(btn:GetHeight() - 7)
|
|
end
|
|
|
|
function S:HandleRotateButton(btn)
|
|
E:SetTemplate(btn, "Default")
|
|
btn:SetWidth(btn:GetWidth() - 14)
|
|
btn:SetHeight(btn:GetHeight() - 14)
|
|
|
|
btn:GetNormalTexture():SetTexCoord(0.27, 0.73, 0.27, 0.68)
|
|
btn:GetPushedTexture():SetTexCoord(0.27, 0.73, 0.27, 0.68)
|
|
|
|
btn:GetHighlightTexture():SetTexture(1, 1, 1, 0.3)
|
|
|
|
E:SetInside(btn:GetNormalTexture())
|
|
btn:GetPushedTexture():SetAllPoints(btn:GetNormalTexture())
|
|
btn:GetHighlightTexture():SetAllPoints(btn:GetNormalTexture())
|
|
end
|
|
|
|
function S:HandleEditBox(frame)
|
|
if not frame then return end
|
|
|
|
E:CreateBackdrop(frame, "Default")
|
|
frame.backdrop:SetFrameLevel(frame:GetFrameLevel())
|
|
|
|
if frame:GetName() then
|
|
if _G[frame:GetName() .."Left"] then E:Kill(_G[frame:GetName() .."Left"]) end
|
|
if _G[frame:GetName() .."Middle"] then E:Kill(_G[frame:GetName() .."Middle"]) end
|
|
if _G[frame:GetName() .."Right"] then E:Kill(_G[frame:GetName() .."Right"]) end
|
|
if _G[frame:GetName() .."Mid"] then E:Kill(_G[frame:GetName() .."Mid"]) end
|
|
|
|
if gfind(frame:GetName(), "Silver") or gfind(frame:GetName(), "Copper") then
|
|
frame.backdrop:SetPoint("BOTTOMRIGHT", -12, -2)
|
|
end
|
|
end
|
|
end
|
|
|
|
function S:HandleDropDownBox(frame, width)
|
|
local button = _G[frame:GetName().."Button"]
|
|
if not button then return end
|
|
|
|
if not width then width = 155 end
|
|
|
|
E:StripTextures(frame)
|
|
frame:SetWidth(width)
|
|
|
|
if _G[frame:GetName().."Text"] then
|
|
_G[frame:GetName().."Text"]:ClearAllPoints()
|
|
_G[frame:GetName().."Text"]:SetPoint("RIGHT", button, "LEFT", -2, 0)
|
|
end
|
|
|
|
if button then
|
|
button:ClearAllPoints()
|
|
button:SetPoint("RIGHT", frame, "RIGHT", -10, 3)
|
|
|
|
self:HandleNextPrevButton(button, true)
|
|
end
|
|
E:CreateBackdrop(frame, "Default")
|
|
frame.backdrop:SetPoint("TOPLEFT", 20, -2)
|
|
frame.backdrop:SetPoint("BOTTOMRIGHT", button, "BOTTOMRIGHT", 2, -2)
|
|
frame.backdrop:SetFrameLevel(frame:GetFrameLevel())
|
|
end
|
|
|
|
function S:HandleCheckBox(frame, noBackdrop)
|
|
frame:SetNormalTexture(nil)
|
|
frame:SetPushedTexture(nil)
|
|
frame:SetHighlightTexture(nil)
|
|
frame:SetDisabledTexture(nil)
|
|
|
|
if noBackdrop then
|
|
E:SetTemplate(frame, "Default")
|
|
frame:SetWidth(16)
|
|
frame:SetHeight(16)
|
|
else
|
|
E:CreateBackdrop(frame, "Default")
|
|
E:SetInside(frame.backdrop, nil, 4, 4)
|
|
frame.backdrop:SetFrameLevel(frame:GetFrameLevel())
|
|
end
|
|
end
|
|
|
|
function S:HandleIcon(icon, parent)
|
|
parent = parent or icon:GetParent()
|
|
|
|
icon:SetTexCoord(unpack(E.TexCoords))
|
|
E:CreateBackdrop(parent, "Default")
|
|
icon:SetParent(parent.backdrop)
|
|
E:SetOutside(parent.backdrop, icon)
|
|
end
|
|
|
|
function S:HandleItemButton(b, shrinkIcon)
|
|
if b.isSkinned then return end
|
|
|
|
local icon = b.icon or b.IconTexture or b.iconTexture
|
|
local texture
|
|
if b:GetName() and _G[b:GetName() .."IconTexture"] then
|
|
icon = _G[b:GetName() .."IconTexture"]
|
|
elseif b:GetName() and _G[b:GetName() .."Icon"] then
|
|
icon = _G[b:GetName() .."Icon"]
|
|
end
|
|
|
|
if icon and icon:GetTexture() then
|
|
texture = icon:GetTexture()
|
|
end
|
|
|
|
E:StripTextures(b)
|
|
E:CreateBackdrop(b, "Default", true)
|
|
E:StyleButton(b)
|
|
|
|
if icon then
|
|
icon:SetTexCoord(unpack(E.TexCoords))
|
|
|
|
if shrinkIcon then
|
|
b.backdrop:SetAllPoints()
|
|
E:SetInside(icon, b)
|
|
else
|
|
E:SetOutside(b.backdrop, icon)
|
|
end
|
|
icon:SetParent(b.backdrop)
|
|
|
|
if texture then
|
|
icon:SetTexture(texture)
|
|
end
|
|
end
|
|
b.isSkinned = true
|
|
end
|
|
|
|
function S:HandleCloseButton(f, point, text)
|
|
E:StripTextures(f)
|
|
|
|
if f:GetNormalTexture() then f:SetNormalTexture("") f.SetNormalTexture = E.noop end
|
|
if f:GetPushedTexture() then f:SetPushedTexture("") f.SetPushedTexture = E.noop end
|
|
|
|
if not f.backdrop then
|
|
E:CreateBackdrop(f, "Default", true)
|
|
f.backdrop:SetPoint("TOPLEFT", 7, -8)
|
|
f.backdrop:SetPoint("BOTTOMRIGHT", -8, 8)
|
|
|
|
HookScript(f, "OnEnter", function() S:SetModifiedBackdrop(this) end)
|
|
HookScript(f, "OnLeave", function() S:SetOriginalBackdrop(this) end)
|
|
end
|
|
if not text then text = "x" end
|
|
if not f.text then
|
|
f.text = f:CreateFontString(nil, "OVERLAY")
|
|
f.text:SetFont([[Interface\AddOns\ElvUI\Media\Fonts\PT_Sans_Narrow.ttf]], 16, "OUTLINE")
|
|
f.text:SetText(text)
|
|
f.text:SetJustifyH("CENTER")
|
|
f.text:SetPoint("CENTER", f, "CENTER", -1, 1)
|
|
end
|
|
|
|
if point then
|
|
f:SetPoint("TOPRIGHT", point, "TOPRIGHT", 2, 2)
|
|
end
|
|
end
|
|
|
|
function S:HandleSliderFrame(frame)
|
|
local orientation = frame:GetOrientation()
|
|
local SIZE = 12
|
|
E:StripTextures(frame)
|
|
E:CreateBackdrop(frame, "Default")
|
|
frame.backdrop:SetAllPoints()
|
|
hooksecurefunc(frame, "SetBackdrop", function(_, backdrop)
|
|
if backdrop ~= nil then
|
|
frame:SetBackdrop(nil)
|
|
end
|
|
end)
|
|
frame:SetThumbTexture(E["media"].blankTex)
|
|
frame:GetThumbTexture():SetVertexColor(0.3, 0.3, 0.3)
|
|
frame:GetThumbTexture():SetWidth(SIZE-2)
|
|
frame:GetThumbTexture():SetHeight(SIZE-2)
|
|
if orientation == "VERTICAL" then
|
|
frame:SetWidth(SIZE)
|
|
else
|
|
frame:SetHeight(SIZE)
|
|
|
|
for _, region in ipairs({frame:GetRegions()}) do
|
|
if region and region:GetObjectType() == "FontString" then
|
|
local point, anchor, anchorPoint, x, y = region:GetPoint()
|
|
if find(anchorPoint, "BOTTOM") then
|
|
region:SetPoint(point, anchor, anchorPoint, x, y - 4)
|
|
end
|
|
end
|
|
end
|
|
|
|
--[[for i = 1, frame:GetNumRegions() do
|
|
local region = select(i, frame:GetRegions())
|
|
if region and region:GetObjectType() == "FontString" then
|
|
local point, anchor, anchorPoint, x, y = region:GetPoint()
|
|
if anchorPoint:find("BOTTOM") then
|
|
region:SetPoint(point, anchor, anchorPoint, x, y - 4)
|
|
end
|
|
end
|
|
end]]
|
|
end
|
|
end
|
|
|
|
function S:HandleIconSelectionFrame(frame, numIcons, buttonNameTemplate, frameNameOverride)
|
|
assert(frame, "HandleIconSelectionFrame: frame argument missing")
|
|
assert(numIcons and type(numIcons) == "number", "HandleIconSelectionFrame: numIcons argument missing or not a number")
|
|
assert(buttonNameTemplate and type(buttonNameTemplate) == "string", "HandleIconSelectionFrame: buttonNameTemplate argument missing or not a string")
|
|
|
|
local frameName = frameNameOverride or frame:GetName() --We need override in case Blizzard fucks up the naming (guild bank)
|
|
local scrollFrame = _G[frameName.."ScrollFrame"]
|
|
local editBox = _G[frameName.."EditBox"]
|
|
local okayButton = _G[frameName.."OkayButton"] or _G[frameName.."Okay"]
|
|
local cancelButton = _G[frameName.."CancelButton"] or _G[frameName.."Cancel"]
|
|
|
|
E:StripTextures(frame)
|
|
E:StripTextures(scrollFrame)
|
|
editBox:DisableDrawLayer("BACKGROUND") --Removes textures around it
|
|
|
|
E:CreateBackdrop(frame, "Transparent")
|
|
frame.backdrop:SetPoint("TOPLEFT", frame, "TOPLEFT", 10, -12)
|
|
frame.backdrop:SetPoint("BOTTOMRIGHT", cancelButton, "BOTTOMRIGHT", 5, -5)
|
|
|
|
S:HandleButton(okayButton)
|
|
S:HandleButton(cancelButton)
|
|
S:HandleEditBox(editBox)
|
|
|
|
for i = 1, numIcons do
|
|
local button = _G[buttonNameTemplate..i]
|
|
local icon = _G[button:GetName().."Icon"]
|
|
E:StripTextures(button)
|
|
E:SetTemplate(button, "Default")
|
|
E:StyleButton(button, nil, true)
|
|
E:SetInside(icon)
|
|
icon:SetTexCoord(unpack(E.TexCoords))
|
|
end
|
|
end
|
|
|
|
function S:ADDON_LOADED()
|
|
if self.allowBypass[arg1] then
|
|
if self.addonsToLoad[arg1] then
|
|
--Load addons using the old deprecated register method
|
|
self.addonsToLoad[arg1]()
|
|
self.addonsToLoad[arg1] = nil
|
|
elseif self.addonCallbacks[arg1] then
|
|
--Fire events to the skins that rely on this addon
|
|
for index, event in ipairs(self.addonCallbacks[arg1]["CallPriority"]) do
|
|
self.addonCallbacks[arg1][event] = nil
|
|
self.addonCallbacks[arg1]["CallPriority"][index] = nil
|
|
E.callbacks:Fire(event)
|
|
end
|
|
end
|
|
return
|
|
end
|
|
|
|
if not E.initialized then return end
|
|
|
|
if self.addonsToLoad[arg1] then
|
|
self.addonsToLoad[arg1]()
|
|
self.addonsToLoad[arg1] = nil
|
|
elseif self.addonCallbacks[arg1] then
|
|
for index, event in ipairs(self.addonCallbacks[arg1]["CallPriority"]) do
|
|
self.addonCallbacks[arg1][event] = nil
|
|
self.addonCallbacks[arg1]["CallPriority"][index] = nil
|
|
E.callbacks:Fire(event)
|
|
end
|
|
end
|
|
end
|
|
|
|
--Old deprecated register function. Keep it for the time being for any plugins that may need it.
|
|
function S:RegisterSkin(name, loadFunc, forceLoad, bypass)
|
|
if bypass then
|
|
self.allowBypass[name] = true
|
|
end
|
|
|
|
if forceLoad then
|
|
loadFunc()
|
|
self.addonsToLoad[name] = nil
|
|
elseif name == "ElvUI" then
|
|
tinsert(self.nonAddonsToLoad, loadFunc)
|
|
else
|
|
self.addonsToLoad[name] = loadFunc
|
|
end
|
|
end
|
|
|
|
--Add callback for skin that relies on another addon.
|
|
--These events will be fired when the addon is loaded.
|
|
function S:AddCallbackForAddon(addonName, eventName, loadFunc, forceLoad, bypass)
|
|
if not addonName or type(addonName) ~= "string" then
|
|
E:Print("Invalid argument #1 to S:AddCallbackForAddon (string expected)")
|
|
return
|
|
elseif not eventName or type(eventName) ~= "string" then
|
|
E:Print("Invalid argument #2 to S:AddCallbackForAddon (string expected)")
|
|
return
|
|
elseif not loadFunc or type(loadFunc) ~= "function" then
|
|
E:Print("Invalid argument #3 to S:AddCallbackForAddon (function expected)")
|
|
return
|
|
end
|
|
|
|
if bypass then
|
|
self.allowBypass[addonName] = true
|
|
end
|
|
|
|
--Create an event registry for this addon, so that we can fire multiple events when this addon is loaded
|
|
if not self.addonCallbacks[addonName] then
|
|
self.addonCallbacks[addonName] = {["CallPriority"] = {}}
|
|
end
|
|
|
|
if self.addonCallbacks[addonName][eventName] or E.ModuleCallbacks[eventName] or E.InitialModuleCallbacks[eventName] then
|
|
--Don't allow a registered callback to be overwritten
|
|
E:Print("Invalid argument #2 to S:AddCallbackForAddon (event name:", eventName, "is already registered, please use a unique event name)")
|
|
return
|
|
end
|
|
|
|
--Register loadFunc to be called when event is fired
|
|
E.RegisterCallback(E, eventName, loadFunc)
|
|
|
|
if forceLoad then
|
|
E.callbacks:Fire(eventName)
|
|
else
|
|
--Insert eventName in this addons' registry
|
|
self.addonCallbacks[addonName][eventName] = true
|
|
self.addonCallbacks[addonName]["CallPriority"][getn(self.addonCallbacks[addonName]["CallPriority"]) + 1] = eventName
|
|
end
|
|
end
|
|
|
|
--Add callback for skin that does not rely on a another addon.
|
|
--These events will be fired when the Skins module is initialized.
|
|
function S:AddCallback(eventName, loadFunc)
|
|
if not eventName or type(eventName) ~= "string" then
|
|
E:Print("Invalid argument #1 to S:AddCallback (string expected)")
|
|
return
|
|
elseif not loadFunc or type(loadFunc) ~= "function" then
|
|
E:Print("Invalid argument #2 to S:AddCallback (function expected)")
|
|
return
|
|
end
|
|
|
|
if self.nonAddonCallbacks[eventName] or E.ModuleCallbacks[eventName] or E.InitialModuleCallbacks[eventName] then
|
|
--Don't allow a registered callback to be overwritten
|
|
E:Print("Invalid argument #1 to S:AddCallback (event name:", eventName, "is already registered, please use a unique event name)")
|
|
return
|
|
end
|
|
|
|
--Add event name to registry
|
|
self.nonAddonCallbacks[eventName] = true
|
|
self.nonAddonCallbacks["CallPriority"][getn(self.nonAddonCallbacks["CallPriority"]) + 1] = eventName
|
|
|
|
--Register loadFunc to be called when event is fired
|
|
E.RegisterCallback(E, eventName, loadFunc)
|
|
end
|
|
|
|
function S:Initialize()
|
|
self.db = E.private.skins
|
|
|
|
--Fire events for Blizzard addons that are already loaded
|
|
for addon in pairs(self.addonCallbacks) do
|
|
if IsAddOnLoaded(addon) then
|
|
for index, event in ipairs(self.addonCallbacks[addon]["CallPriority"]) do
|
|
self.addonCallbacks[addon][event] = nil
|
|
self.addonCallbacks[addon]["CallPriority"][index] = nil
|
|
E.callbacks:Fire(event)
|
|
end
|
|
end
|
|
end
|
|
--Fire event for all skins that doesn't rely on a Blizzard addon
|
|
for index, event in ipairs(self.nonAddonCallbacks["CallPriority"]) do
|
|
self.nonAddonCallbacks[event] = nil
|
|
self.nonAddonCallbacks["CallPriority"][index] = nil
|
|
E.callbacks:Fire(event)
|
|
end
|
|
|
|
--Old deprecated load functions. We keep this for the time being in case plugins make use of it.
|
|
for addon, loadFunc in pairs(self.addonsToLoad) do
|
|
if IsAddOnLoaded(addon) then
|
|
self.addonsToLoad[addon] = nil
|
|
local _, catch = pcall(loadFunc)
|
|
if catch and GetCVarBool("ShowErrors") == "1" then
|
|
ScriptErrorsFrame_OnError(catch, false)
|
|
end
|
|
end
|
|
end
|
|
|
|
for _, loadFunc in pairs(self.nonAddonsToLoad) do
|
|
local _, catch = pcall(loadFunc)
|
|
if catch and GetCVarBool("ShowErrors") == "1" then
|
|
ScriptErrorsFrame_OnError(catch, false)
|
|
end
|
|
end
|
|
wipe(self.nonAddonsToLoad)
|
|
end
|
|
|
|
S:RegisterEvent("ADDON_LOADED")
|
|
|
|
local function InitializeCallback()
|
|
S:Initialize()
|
|
end
|
|
|
|
E:RegisterModule(S:GetName(), InitializeCallback) |