Bastion aims to serve as a highly performant, simplisitic, and expandable World of Warcraft data visualization framework.
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.
Bastion/src/NotificationsList/NotificationsList.lua

124 lines
3.7 KiB

-- Create a NotificationsList class
local NotificationsList = {
notifications = {}
}
NotificationsList.__index = NotificationsList
-- Constructor
function NotificationsList:New()
local self = setmetatable({}, NotificationsList)
-- Create a frame for the notifications
self.frame = CreateFrame("Frame", "BastionNotificationsList", UIParent)
self.frame:SetSize(300, 100)
self.frame:SetPoint("TOP", UIParent, "TOP", 0, -100)
self.frame:SetFrameStrata("HIGH")
-- Remove notifications after 5 seconds
C_Timer.NewTicker(0.1, function()
for i, notification in ipairs(self.notifications) do
if GetTime() - notification.addedAt > 2 then
notification:Remove()
table.remove(self.notifications, i)
end
end
end)
return self
end
-- Create a notification class for the notifications list (takes icon and text)
local Notification = {
}
Notification.__index = Notification
-- Constructor
function Notification:New(list, icon, text)
local self = setmetatable({}, Notification)
-- Create a frame for the notification
self.frame = CreateFrame("Frame", nil, list.frame)
self.frame:SetSize(300, 100)
self.frame:SetPoint("TOP", list.frame, "TOP", 0, 0)
self.frame:SetFrameStrata("HIGH")
-- Create a texture for the icon
self.icon = self.frame:CreateTexture(nil, "ARTWORK")
self.icon:SetSize(32, 32)
self.icon:SetPoint("LEFT", self.frame, "LEFT", 0, 0)
self.icon:SetTexture(icon)
-- Create a fontstring for the text
self.text = self.frame:CreateFontString(nil, "BACKGROUND", "GameFontNormal")
self.text:SetPoint("CENTER", self.frame, "CENTER", 10, 0)
self.text:SetText(text)
self.text:SetFont("Fonts\\FRIZQT__.TTF", 14)
self.addedAt = GetTime()
self.list = list
return self
end
-- Remove notification
function Notification:Remove()
-- Fade out the notification frame and remove it after the fade
UIFrameFadeOut(self.frame, 0.2, 1, 0)
C_Timer.After(0.5, function()
self.frame:Hide()
self.frame:ClearAllPoints()
self.frame:SetParent(nil)
self.frame = nil
self.list:Update()
end)
end
-- Add a notification to the list
function NotificationsList:AddNotification(icon, text)
-- Create a new notification
local notification = Notification:New(self, icon, text)
-- Add the notification to the list
table.insert(self.notifications, notification)
UIFrameFadeIn(notification.frame, 0.2, 0, 1)
-- Update the notifications
self:Update()
end
-- Update the notifications
function NotificationsList:Update()
-- Loop through the notifications
for i, notification in ipairs(self.notifications) do
-- Set the position of the notification
notification.frame:SetPoint("TOP", self.frame, "TOP", 0, -50 * (i - 1))
end
end
-- Remove a notification from the list
function NotificationsList:RemoveNotification(notification)
-- Loop through the notifications
for i, v in ipairs(self.notifications) do
-- Check if the notification is the one we want to remove
if v == notification then
-- Remove the notification from the list
table.remove(self.notifications, i)
notification:Remove()
break
end
end
end
-- Remove all notifications from the list
function NotificationsList:RemoveAllNotifications()
-- Loop through the notifications
for i, v in ipairs(self.notifications) do
-- Remove the notification from the list
table.remove(self.notifications, i)
self.notifications[i]:Remove()
end
end
-- Remove all notifications
return NotificationsList, Notification