Add IconIndicator
Similar functionality to a SquareIndicator but uses an icon instead of a solid color.
This commit is contained in:
@@ -17,6 +17,7 @@ types/statusbar.lua
|
|||||||
types/auralist.lua
|
types/auralist.lua
|
||||||
types/indicators/indicator.lua
|
types/indicators/indicator.lua
|
||||||
types/indicators/squareindicator.lua
|
types/indicators/squareindicator.lua
|
||||||
|
types/indicators/iconindicator.lua
|
||||||
types/indicators/borderindicator.lua
|
types/indicators/borderindicator.lua
|
||||||
types/unitgroup.lua
|
types/unitgroup.lua
|
||||||
types/unitframe.lua
|
types/unitframe.lua
|
||||||
|
173
src/types/indicators/iconindicator.lua
Normal file
173
src/types/indicators/iconindicator.lua
Normal file
@@ -0,0 +1,173 @@
|
|||||||
|
-- Copyright 2025 <omicron.me@protonmail.com>
|
||||||
|
--
|
||||||
|
-- This file is part of Omicron Frames
|
||||||
|
--
|
||||||
|
-- Omicron Frames is free software: you can redistribute it and/or modify it
|
||||||
|
-- under the terms of the GNU General Public License as published by the Free
|
||||||
|
-- Software Foundation, either version 3 of the License, or (at your option)
|
||||||
|
-- any later version.
|
||||||
|
--
|
||||||
|
-- Omicron Frames is distributed in the hope that it will be useful, but
|
||||||
|
-- WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
|
||||||
|
-- or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
|
||||||
|
-- more details.
|
||||||
|
--
|
||||||
|
-- You should have received a copy of the GNU General Public License along with
|
||||||
|
-- Omicron Frames. If not, see <https://www.gnu.org/licenses/>.
|
||||||
|
local omi = select(2, ...)
|
||||||
|
local types = omi.GetModule("types")
|
||||||
|
|
||||||
|
local iconPool = CreateFramePool("Frame", nil, "BackdropTemplate")
|
||||||
|
|
||||||
|
---IconIndicator is an indicator that displays an icon with border
|
||||||
|
---@class IconIndicator: Indicator
|
||||||
|
local IconIndicator = types.CreateClass("IconIndicator", Indicator)
|
||||||
|
types.IconIndicator = IconIndicator
|
||||||
|
|
||||||
|
---@return IconIndicator
|
||||||
|
function IconIndicator.new(cls, ...)
|
||||||
|
--- I really dislike duplicating this everywhere but it makes
|
||||||
|
--lua-language-server able to deduce the type of Object:new calls and that
|
||||||
|
--is honestly worth it
|
||||||
|
return types.Object.new(cls, ...)
|
||||||
|
end
|
||||||
|
|
||||||
|
--- Initialize a new IconIndicator
|
||||||
|
-- unitframe Unitframe it is attached to
|
||||||
|
-- size Size of the indicator square
|
||||||
|
-- point Attachment point to the unitframe's overlay frame
|
||||||
|
-- x, y x and y offset for the attachment point
|
||||||
|
-- color Color of the square
|
||||||
|
---@param unitframe UnitFrame
|
||||||
|
---@param size number
|
||||||
|
---@param point string
|
||||||
|
---@param x number
|
||||||
|
---@param y number
|
||||||
|
---@param showStacks boolean
|
||||||
|
---@param doFade nil|number
|
||||||
|
---@param doFlash nil|number
|
||||||
|
function IconIndicator:Init(unitframe, size, point, x, y, showStacks, fadeTime, flashTime)
|
||||||
|
self.unitframe = unitframe
|
||||||
|
self.frameParent = unitframe.overlays
|
||||||
|
self.size = size
|
||||||
|
self.point = point
|
||||||
|
self.x = x
|
||||||
|
self.y = y
|
||||||
|
self.icon = 134400
|
||||||
|
self.showStacks = showStacks
|
||||||
|
self.fadeTime = fadeTime
|
||||||
|
self.flashTime = flashTime
|
||||||
|
end
|
||||||
|
|
||||||
|
--- Show the square indicator
|
||||||
|
---@param data table
|
||||||
|
function IconIndicator:Show(data)
|
||||||
|
local frame, stacks = self:GetFrame()
|
||||||
|
local numStacks = data.stacks or 0
|
||||||
|
self.frame = frame
|
||||||
|
self.stacks = stacks
|
||||||
|
if self.showStacks and numStacks > 0 then
|
||||||
|
stacks:SetText(numStacks)
|
||||||
|
stacks:Show()
|
||||||
|
end
|
||||||
|
if self.flashTime or self.fadeTime then
|
||||||
|
self.frame:SetScript("OnUpdate", function(frame, dt)
|
||||||
|
self:OnUpdate(dt)
|
||||||
|
end)
|
||||||
|
self.expirationTime = data.expirationTime
|
||||||
|
self.updateThrottle = 0
|
||||||
|
end
|
||||||
|
if data.icon then
|
||||||
|
self:SetIcon(data.icon)
|
||||||
|
else
|
||||||
|
self:SetIcon(self.icon)
|
||||||
|
end
|
||||||
|
frame:Show()
|
||||||
|
end
|
||||||
|
|
||||||
|
--- Set the icon of the Icon Indicator
|
||||||
|
function IconIndicator:SetIcon(icon)
|
||||||
|
self.icon = icon
|
||||||
|
local frame = self.frame
|
||||||
|
if frame then
|
||||||
|
frame.iconTexture:SetTexture(icon)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
function IconIndicator:GetFrame()
|
||||||
|
local frame, new = iconPool:Acquire()
|
||||||
|
local stacks
|
||||||
|
if new then
|
||||||
|
local iconTexture = frame:CreateTexture(nil, "BACKGROUND")
|
||||||
|
iconTexture:SetAllPoints()
|
||||||
|
frame.iconTexture = iconTexture
|
||||||
|
|
||||||
|
frame.backdropInfo = {
|
||||||
|
bgFile = nil,
|
||||||
|
edgeFile = "Interface\\Addons\\OmicronFrames\\media\\textures\\pixel_edge",
|
||||||
|
edgeSize = 2,
|
||||||
|
insets = { left = 0, right = 0, top = 0, bottom = 0 },
|
||||||
|
}
|
||||||
|
frame:ApplyBackdrop()
|
||||||
|
|
||||||
|
stacks = frame:CreateFontString(nil, "OVERLAY")
|
||||||
|
frame.stacks = stacks
|
||||||
|
stacks:SetFont("Interface\\AddOns\\OmicronFrames\\media\\fonts\\roboto\\Roboto-Medium.ttf", 12, "OUTLINE")
|
||||||
|
stacks:SetPoint("CENTER")
|
||||||
|
stacks:SetTextColor(1, 1, 1)
|
||||||
|
end
|
||||||
|
|
||||||
|
frame:SetSize(self.size, self.size)
|
||||||
|
frame:SetParent(self.frameParent)
|
||||||
|
frame:SetPoint(self.point, self.x, self.y)
|
||||||
|
frame:SetBackdropBorderColor(0, 0, 0, 1)
|
||||||
|
frame:SetAlpha(1)
|
||||||
|
stacks = frame.stacks
|
||||||
|
return frame, stacks
|
||||||
|
end
|
||||||
|
|
||||||
|
---@param data table
|
||||||
|
function IconIndicator:Update(data)
|
||||||
|
if data.icon then
|
||||||
|
self:SetIcon(data.icon)
|
||||||
|
end
|
||||||
|
local numStacks = data.stacks or 0
|
||||||
|
if numStacks > 0 then
|
||||||
|
self.stacks:SetText(numStacks)
|
||||||
|
self.stacks:Show()
|
||||||
|
end
|
||||||
|
self.expirationTime = data.expirationTime
|
||||||
|
self.frame:SetAlpha(1)
|
||||||
|
end
|
||||||
|
|
||||||
|
function IconIndicator:OnUpdate(dt)
|
||||||
|
dt = self.updateThrottle + dt
|
||||||
|
if dt < 0.04 then
|
||||||
|
self.updateThrottle = dt
|
||||||
|
return
|
||||||
|
else
|
||||||
|
self.updateThrottle = 0
|
||||||
|
end
|
||||||
|
|
||||||
|
local timeLeft = self.expirationTime - GetTime()
|
||||||
|
local fadeTime = self.fadeTime or 0
|
||||||
|
local flashTime = self.flashTime or 0
|
||||||
|
|
||||||
|
if timeLeft < flashTime then
|
||||||
|
local alpha = ((timeLeft * 4) % 1)
|
||||||
|
self.frame:SetAlpha(alpha)
|
||||||
|
elseif timeLeft < fadeTime then
|
||||||
|
local alpha = timeLeft / fadeTime
|
||||||
|
self.frame:SetAlpha(alpha)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
--- Hide the square indicator.
|
||||||
|
function IconIndicator:Hide()
|
||||||
|
local frame = self.frame
|
||||||
|
self.stacks:Hide()
|
||||||
|
self.frame = nil
|
||||||
|
self.stacks = nil
|
||||||
|
frame:SetScript("OnUpdate", nil)
|
||||||
|
iconPool:Release(frame)
|
||||||
|
end
|
@@ -92,7 +92,12 @@ function AuraTrigger:AddAura(aura)
|
|||||||
return
|
return
|
||||||
end
|
end
|
||||||
self.count = self.count + 1
|
self.count = self.count + 1
|
||||||
self:SetData({ stacks = aura.applications, duration = aura.duration, expirationTime = aura.expirationTime })
|
self:SetData({
|
||||||
|
stacks = aura.applications,
|
||||||
|
duration = aura.duration,
|
||||||
|
expirationTime = aura.expirationTime,
|
||||||
|
icon = aura.icon,
|
||||||
|
})
|
||||||
self:SetState(self.count >= self.requiredCount, false)
|
self:SetState(self.count >= self.requiredCount, false)
|
||||||
end
|
end
|
||||||
|
|
||||||
@@ -100,7 +105,12 @@ end
|
|||||||
---@param before UnitAuraInfo
|
---@param before UnitAuraInfo
|
||||||
---@param after UnitAuraInfo
|
---@param after UnitAuraInfo
|
||||||
function AuraTrigger:UpdateAura(before, after)
|
function AuraTrigger:UpdateAura(before, after)
|
||||||
self:SetData({ stacks = after.applications, duration = after.duration, expirationTime = after.expirationTime })
|
self:SetData({
|
||||||
|
stacks = after.applications,
|
||||||
|
duration = after.duration,
|
||||||
|
expirationTime = after.expirationTime,
|
||||||
|
icon = after.icon,
|
||||||
|
})
|
||||||
if self.active then
|
if self.active then
|
||||||
self.indicator:Update(self.data)
|
self.indicator:Update(self.data)
|
||||||
end
|
end
|
||||||
|
@@ -26,6 +26,9 @@ local AuraList = types.AuraList
|
|||||||
---@class SquareIndicator
|
---@class SquareIndicator
|
||||||
local SquareIndicator = types.SquareIndicator
|
local SquareIndicator = types.SquareIndicator
|
||||||
|
|
||||||
|
---@class IconIndicator
|
||||||
|
local IconIndicator = types.IconIndicator
|
||||||
|
|
||||||
---@class SquareIndicator
|
---@class SquareIndicator
|
||||||
local BorderIndicator = types.BorderIndicator
|
local BorderIndicator = types.BorderIndicator
|
||||||
|
|
||||||
@@ -148,12 +151,19 @@ function UnitFrame:CreateIndicator(indicator)
|
|||||||
indicator.fadeTime,
|
indicator.fadeTime,
|
||||||
indicator.flashTime
|
indicator.flashTime
|
||||||
)
|
)
|
||||||
elseif kind == "BorderIndicator" then
|
elseif kind == "IconIndicator" then
|
||||||
return BorderIndicator:new(
|
return IconIndicator:new(
|
||||||
self,
|
self,
|
||||||
indicator.thickness,
|
indicator.size,
|
||||||
indicator.color
|
indicator.point,
|
||||||
|
indicator.x,
|
||||||
|
indicator.y,
|
||||||
|
indicator.showStacks,
|
||||||
|
indicator.fadeTime,
|
||||||
|
indicator.flashTime
|
||||||
)
|
)
|
||||||
|
elseif kind == "BorderIndicator" then
|
||||||
|
return BorderIndicator:new(self, indicator.thickness, indicator.color)
|
||||||
else
|
else
|
||||||
error(string.format("Invalid Indicator kind `%s` requested", indicator.kind))
|
error(string.format("Invalid Indicator kind `%s` requested", indicator.kind))
|
||||||
end
|
end
|
||||||
|
Reference in New Issue
Block a user