You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

217 lines
5.3 KiB

--[[
This file is part of 'Masque', an add-on for World of Warcraft. For bug reports,
suggestions and license information, please visit https://github.com/SFX-WoW/Masque.
* File...: Core\Regions\Frame.lua
* Author.: StormFX
Frame Regions
* See Skins\Default.lua for region defaults.
]]
local _, Core = ...
----------------------------------------
-- Lua API
---
local type = type
----------------------------------------
-- WoW API
---
local hooksecurefunc = hooksecurefunc
----------------------------------------
-- Internal
---
-- @ Skins\Default
local Default = Core.DEFAULT_SKIN.Cooldown
-- @ Core\Utility
local GetColor, GetScale, GetSize = Core.GetColor, Core.GetScale, Core.GetSize
local GetTypeSkin, SetPoints = Core.GetTypeSkin, Core.SetPoints
----------------------------------------
-- Locals
---
local DEF_COLOR = Default.Color
local DEF_PULSE = Default.PulseTexture
local DEF_EDGE = Default.EdgeTexture
local DEF_EDGE_LOC = [[Interface\Cooldown\edge-LoC]]
local MSQ_EDGE = [[Interface\AddOns\Masque\Textures\Cooldown\Edge]]
local MSQ_EDGE_LOC = [[Interface\AddOns\Masque\Textures\Cooldown\Edge-LoC]]
local MSQ_SWIPE = [[Interface\AddOns\Masque\Textures\Cooldown\Swipe]]
local MSQ_SWIPE_CIRCLE = [[Interface\AddOns\Masque\Textures\Cooldown\Swipe-Circle]]
----------------------------------------
-- Frame
---
-- Sets the size and points of a frame.
local function SkinFrame(Region, Button, Skin, xScale, yScale)
Region:SetSize(GetSize(Skin.Width, Skin.Height, xScale, yScale, Button))
SetPoints(Region, Button, Skin, nil, Skin.SetAllPoints)
end
----------------------------------------
-- Hooks
---
-- Counters color changes triggered by LoC events.
local function Hook_SetSwipeColor(Region, r, g, b)
if Region.__SwipeHook or not Region.__MSQ_Color then
return
end
Region.__SwipeHook = true
if r == 0.17 and g == 0 and b == 0 then
Region:SetSwipeColor(0.2, 0, 0, 0.8)
else
Region:SetSwipeColor(GetColor(Region.__MSQ_Color))
end
Region.__SwipeHook = nil
end
-- Counters texture changes triggered by LoC events.
local function Hook_SetEdgeTexture(Region, Texture)
if Region.__EdgeHook or not Region.__MSQ_Color then
return
end
Region.__EdgeHook = true
if Texture == DEF_EDGE_LOC then
Region:SetEdgeTexture(MSQ_EDGE_LOC)
else
Region:SetEdgeTexture(Region.__MSQ_Edge or MSQ_EDGE)
end
Region.__EdgeHook = nil
end
----------------------------------------
-- Cooldown
---
-- Skins the 'Cooldown' or 'ChargeCooldown' frame of a button.
local function SkinCooldown(Region, Button, Skin, Color, xScale, yScale, Pulse)
Skin = GetTypeSkin(Button, Button.__MSQ_bType, Skin)
local IsRound = false
if (Button.__MSQ_Shape == "Circle") or Skin.IsRound then
IsRound = true
end
if Button.__MSQ_Enabled then
-- Cooldown
if Region:GetDrawSwipe() then
Region.__MSQ_Color = Color or Skin.Color or DEF_COLOR
Region.__MSQ_Edge = Skin.EdgeTexture or MSQ_EDGE
Region:SetSwipeTexture(Skin.Texture or (IsRound and MSQ_SWIPE_CIRCLE) or MSQ_SWIPE)
Hook_SetSwipeColor(Region)
Hook_SetEdgeTexture(Region)
if not Region.__MSQ_Hooked then
hooksecurefunc(Region, "SetSwipeColor", Hook_SetSwipeColor)
hooksecurefunc(Region, "SetEdgeTexture", Hook_SetEdgeTexture)
Region.__MSQ_Hooked = true
end
-- ChargeCooldown
else
Region:SetEdgeTexture(Skin.EdgeTexture or MSQ_EDGE)
end
else
Region.__MSQ_Color = nil
if Region:GetDrawSwipe() then
Region:SetSwipeTexture("", 0, 0, 0, 0.8)
end
Region:SetEdgeTexture(DEF_EDGE)
end
Region:SetBlingTexture(Skin.PulseTexture or DEF_PULSE)
Region:SetDrawBling(Pulse)
Region:SetUseCircularEdge(IsRound)
SkinFrame(Region, Button, Skin, xScale, yScale)
end
----------------------------------------
-- ChargeCooldown
---
-- Updates the 'ChargeCooldown' frame of a button.
local function UpdateCharge(Button)
local Region = Button.chargeCooldown
local Skin = Button.__MSQ_ChargeSkin
if not Region or not Skin then
return
end
SkinCooldown(Region, Button, Skin, nil, GetScale(Button))
if not Button.__MSQ_Enabled then
Button.__MSQ_ChargeSkin = nil
end
end
-- @ FrameXML\ActionButton.lua
hooksecurefunc("StartChargeCooldown", UpdateCharge)
----------------------------------------
-- Core
---
-- Sets the color of the 'Cooldown' region.
function Core.SetCooldownColor(Region, Button, Skin, Color)
if Region and Button.__MSQ_Enabled then
Skin = GetTypeSkin(Button, Button.__MSQ_bType, Skin)
Region.__MSQ_Color = Color or Skin.Color or DEF_COLOR
Hook_SetSwipeColor(Region)
end
end
-- Updates the pulse effects on a button's cooldowns.
function Core.SetPulse(Button, Pulse)
local Regions = Button.__Regions
local Cooldown = Regions and Regions.Cooldown
local ChargeCooldown = Regions and Regions.ChargeCooldown
if Cooldown then
Cooldown:SetDrawBling(Pulse)
end
if ChargeCooldown then
ChargeCooldown:SetDrawBling(Pulse)
end
end
Core.SkinFrame = SkinFrame
Core.SkinCooldown = SkinCooldown
----------------------------------------
-- API
---
-- Allows add-ons to update the 'ChargeCooldown' region when not using the native API.
function Core.API:UpdateCharge(Button)
if type(Button) ~= "table" then
return
end
UpdateCharge(Button)
end