Files
coa-weakauras/WeakAuras/SubRegionTypes/Glow.lua
T
2025-01-27 03:28:33 +01:00

415 lines
9.3 KiB
Lua

if not WeakAuras.IsLibsOK() then return end
local AddonName, Private = ...
local LCG = LibStub("LibCustomGlow-1.0")
local MSQ = LibStub("Masque", true);
local L = WeakAuras.L
local default = function(parentType)
local options = {
glow = false,
useGlowColor = false,
glowColor = {1, 1, 1, 1},
glowType = "buttonOverlay",
glowLines = 8,
glowFrequency = 0.25,
glowLength = 10,
glowThickness = 1,
glowScale = 1,
glowBorder = false,
glowXOffset = 0,
glowYOffset = 0,
}
if parentType == "aurabar" then
options["glowType"] = "Pixel"
options["anchor_area"] = "bar"
end
return options
end
local properties = {
glow = {
display = L["Visibility"],
setter = "SetVisible",
type = "bool",
defaultProperty = true
},
glowType = {
display =L["Type"],
setter = "SetGlowType",
type = "list",
values = Private.glow_types,
},
useGlowColor = {
display = L["Use Custom Color"],
setter = "SetUseGlowColor",
type = "bool"
},
glowColor = {
display = L["Custom Color"],
setter = "SetGlowColor",
type = "color"
},
glowLines = {
display = L["Lines & Particles"],
setter = "SetGlowLines",
type = "number",
min = 1,
softMax = 30,
bigStep = 1,
default = 4
},
glowFrequency = {
display = L["Frequency"],
setter = "SetGlowFrequency",
type = "number",
softMin = -2,
softMax = 2,
bigStep = 0.1,
default = 0.25
},
glowLength = {
display = L["Length"],
setter = "SetGlowLength",
type = "number",
min = 1,
softMax = 20,
bigStep = 1,
default = 10
},
glowThickness = {
display = L["Thickness"],
setter = "SetGlowThickness",
type = "number",
min = 1,
softMax = 20,
bigStep = 1,
default = 1
},
glowScale = {
display = L["Scale"],
setter = "SetGlowScale",
type = "number",
min = 0.05,
softMax = 10,
bigStep = 0.05,
default = 1,
isPercent = true
},
glowBorder = {
display = L["Border"],
setter = "SetGlowBorder",
type = "bool"
},
glowXOffset = {
display = L["X-Offset"],
setter = "SetGlowXOffset",
type = "number",
softMin = -100,
softMax = 100,
bigStep = 1,
default = 0
},
glowYOffset = {
display = L["Y-Offset"],
setter = "SetGlowYOffset",
type = "number",
softMin = -100,
softMax = 100,
bigStep = 1,
default = 0
},
}
local function glowStart(self, frame, color)
if frame:GetWidth() < 1 or frame:GetHeight() < 1 then
self.glowStop(frame)
return
end
if self.glowType == "buttonOverlay" then
self.glowStart(frame, color, self.glowFrequency, 0)
elseif self.glowType == "Pixel" then
self.glowStart(
frame,
color,
self.glowLines,
self.glowFrequency,
self.glowLength,
self.glowThickness,
self.glowXOffset,
self.glowYOffset,
self.glowBorder,
nil,
0
)
elseif self.glowType == "ACShine" then
self.glowStart(
frame,
color,
self.glowLines,
self.glowFrequency,
self.glowScale,
self.glowXOffset,
self.glowYOffset,
nil,
0
)
end
end
local funcs = {
SetVisible = function(self, visible)
local color
self.glow = visible
if self.useGlowColor then
color = self.glowColor
end
if MSQ and self.parentType == "icon" then
if (visible) then
self.__MSQ_Shape = self:GetParent().button.__MSQ_Shape
self:Show()
glowStart(self, self, color)
else
self.glowStop(self)
self:Hide()
end
elseif (visible) then
self:Show()
glowStart(self, self, color)
else
self.glowStop(self)
self:Hide()
end
end,
SetGlowType = function(self, newType)
newType = newType or "buttonOverlay"
if newType == self.glowType then
return
end
local isGlowing = self.glow
if isGlowing then
self:SetVisible(false)
end
if newType == "buttonOverlay" then
self.glowStart = LCG.ButtonGlow_Start
self.glowStop = LCG.ButtonGlow_Stop
if self.parentRegionType ~= "aurabar" then
self.parent:AnchorSubRegion(self, "area", "region")
end
elseif newType == "ACShine" then
self.glowStart = LCG.AutoCastGlow_Start
self.glowStop = LCG.AutoCastGlow_Stop
if self.parentRegionType ~= "aurabar" then
self.parent:AnchorSubRegion(self, "area")
end
elseif newType == "Pixel" then
self.glowStart = LCG.PixelGlow_Start
self.glowStop = LCG.PixelGlow_Stop
if self.parentRegionType ~= "aurabar" then
self.parent:AnchorSubRegion(self, "area")
end
end
self.glowType = newType
if isGlowing then
self:SetVisible(true)
end
end,
SetUseGlowColor = function(self, useGlowColor)
self.useGlowColor = useGlowColor
if self.glow then
self:SetVisible(true)
end
end,
SetGlowColor = function(self, r, g, b, a)
self.glowColor = {r, g, b, a}
if self.glow then
self:SetVisible(true)
end
end,
SetGlowLines = function(self, lines)
self.glowLines = lines
if self.glow then
if self.glowType == "ACShine" then -- workaround ACShine not updating numbers of dots
self:SetVisible(false)
end
self:SetVisible(true)
end
end,
SetGlowFrequency = function(self, frequency)
self.glowFrequency = frequency
if self.glow then
self:SetVisible(true)
end
end,
SetGlowLength = function(self, length)
self.glowLength = length
if self.glow then
self:SetVisible(true)
end
end,
SetGlowThickness = function(self, thickness)
self.glowThickness = thickness
if self.glow then
self:SetVisible(true)
end
end,
SetGlowScale = function(self, scale)
self.glowScale = scale
if self.glow then
self:SetVisible(true)
end
end,
SetGlowBorder = function(self, border)
self.glowBorder = border
if self.glow then
self:SetVisible(true)
end
end,
SetGlowXOffset = function(self, xoffset)
self.glowXOffset = xoffset
if self.glow then
self:SetVisible(true)
end
end,
SetGlowYOffset = function(self, yoffset)
self.glowYOffset = yoffset
if self.glow then
self:SetVisible(true)
end
end,
UpdateSize = function(self, ...)
if self.glow then
self:SetVisible(true)
end
end
}
local function create()
local region = CreateFrame("Frame", nil, UIParent)
for name, func in pairs(funcs) do
region[name] = func
end
return region
end
local function onAcquire(subRegion)
subRegion:Show()
end
local function onRelease(subRegion)
subRegion.glowType = nil
subRegion:Hide()
subRegion:ClearAllPoints()
subRegion:SetParent(UIParent)
end
local function modify(parent, region, parentData, data, first)
region:SetParent(parent)
region.parentRegionType = parentData.regionType
region.parent = parent
region.parentType = parentData.regionType
region.useGlowColor = data.useGlowColor
region.glowColor = data.glowColor
region.glowLines = data.glowLines
region.glowFrequency = data.glowFrequency
region.glowLength = data.glowLength
region.glowThickness = data.glowThickness
region.glowScale = data.glowScale
region.glowBorder = data.glowBorder
region.glowXOffset = data.glowXOffset
region.glowYOffset = data.glowYOffset
region:SetGlowType(data.glowType)
region:SetVisible(data.glow)
region:SetScript("OnSizeChanged", region.UpdateSize)
region.Anchor = function()
if parentData.regionType == "aurabar" then
parent:AnchorSubRegion(region, "area", data.anchor_area)
else
parent:AnchorSubRegion(region, "area", (data.glowType == "buttonOverlay" or data.glowType == "Proc") and "region")
end
end
end
-- This is used by the templates to add glow
function Private.getDefaultGlow(regionType)
if regionType == "aurabar" then
return {
["type"] = "subglow",
glow = false,
useGlowColor = false,
glowColor = {1, 1, 1, 1},
glowType = "Pixel",
glowLines = 8,
glowFrequency = 0.25,
glowLength = 10,
glowThickness = 1,
glowScale = 1,
glowBorder = false,
glowXOffset = 0,
glowYOffset = 0,
anchor_area = "bar"
}
else
return {
["type"] = "subglow",
glow = false,
useGlowColor = false,
glowColor = {1, 1, 1, 1},
glowType = "buttonOverlay",
glowLines = 8,
glowFrequency = 0.25,
glowLength = 10,
glowThickness = 1,
glowScale = 1,
glowBorder = false,
glowXOffset = 0,
glowYOffset = 0,
}
end
end
local supportedRegion = {
icon = true,
aurabar = true,
texture = true,
progresstexture = true,
empty = true,
}
local function supports(regionType)
return supportedRegion[regionType]
end
local function addDefaultsForNewAura(data)
if data.regionType == "icon" then
tinsert(data.subRegions, {
["type"] = "subglow",
glow = false,
useGlowColor = false,
glowColor = {1, 1, 1, 1},
glowType = "buttonOverlay",
glowLines = 8,
glowFrequency = 0.25,
glowLength = 10,
glowThickness = 1,
glowScale = 1,
glowBorder = false,
glowXOffset = 0,
glowYOffset = 0,
})
end
end
WeakAuras.RegisterSubRegionType("subglow", L["Glow"], supports, create, modify, onAcquire, onRelease, default, addDefaultsForNewAura, properties);