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.

129 lines
3.8 KiB

--- MSA-Event-1.0
--- Based on AceEvent-3.0
--- - Wrapped API - aggregates all same events into one frame and control them separately
--- - Unwrapped API - same as AceEvent
--- Copyright (c) 2024-2025, Marouan Sabbagh <mar.sabbagh@gmail.com>
--- All Rights Reserved.
local name, version = "MSA-Event-1.0", 1
local lib = LibStub:NewLibrary(name, version)
if not lib then return end
local CallbackHandler = LibStub("CallbackHandler-1.0")
-- Lua API
local pairs = pairs
local strmatch = string.match
local tinsert = table.insert
local tonumber = tonumber
local type = type
-- Registry Blizzard Events
lib.frame = lib.frame or CreateFrame("Frame")
lib.events = lib.events or CallbackHandler:New(lib, "RegisterEvent", "UnregisterEvent", "UnregisterAllEvents")
function lib.events:OnUsed(target, event)
lib.frame:RegisterEvent(event)
end
function lib.events:OnUnused(target, event)
lib.frame:UnregisterEvent(event)
end
lib.frame:SetScript("OnEvent", function(_, event, ...)
lib.events:Fire(event, ...)
end)
-- Registry Event Handlers
lib.eventHandlers = lib.eventHandlers or {}
local function handleEvent(self, event, ...)
local list = lib.eventHandlers[event]
if list then
--print("|cff00ffff"..event, "|r...", ...)
for id, handler in pairs(list) do
local eventID = event.."-"..id
if type(handler) == "function" then
handler(eventID, ...)
else
self[handler](self, eventID, ...)
end
end
end
end
function lib:RegEvent(event, methodOrName)
local list = lib.eventHandlers[event]
if not list then
list = {}
lib.eventHandlers[event] = list
self:RegisterEvent(event, handleEvent, self)
end
tinsert(list, methodOrName)
--print("|cff00ff00REG|r ...", event.."-"..#list)
end
function lib:UnregEvent(eventID)
--print("|cffff0000UNREG|r ...", eventID)
local event, id = strmatch(eventID, "^(%S+)-(%d+)$")
local list = lib.eventHandlers[event]
if list then
id = tonumber(id)
list[id] = nil
if not next(list) then
self:UnregisterEvent(event)
end
end
end
function lib:UnregAllEvents()
--print("|cffff0000UNREG|r ... ALL events")
lib.eventHandlers = {}
self:UnregisterAllEvents()
end
function lib:RegSignal(event, call, object, ...)
local owner = object or self
--print("|cff00ff00Reg Signal|r ...", event, "-", owner, "...", ...)
EventRegistry:RegisterCallback(self.name.."."..event, owner[call or event] or call, owner, ...)
end
function lib:UnregSignal(event, object)
local owner = object or self
--print("|cffff0000Unreg Signal|r ...", event, "-", owner)
EventRegistry:UnregisterCallback(self.name.."."..event, owner)
end
function lib:SendSignal(event, ...)
--print("|cffffff00Send Signal|r ...", event, "...", ...)
EventRegistry:TriggerEvent(self.name.."."..event, ...)
end
------------------------------------------------------------------------------------------------------------------------
-- Embed handling
------------------------------------------------------------------------------------------------------------------------
lib.embeds = lib.embeds or {}
local mixins = {
"RegEvent", "UnregEvent", "UnregAllEvents", -- Wrapped
"RegisterEvent", "UnregisterEvent", "UnregisterAllEvents", -- Unwrapped
"RegSignal", "UnregSignal", "SendSignal"
}
function lib:Embed(target)
for _, v in pairs(mixins) do
target[v] = self[v]
end
self.embeds[target] = true
return target
end
function lib:OnEmbedDisable(target)
target:UnregAllEvents()
end
for target in pairs(lib.embeds) do
lib:Embed(target)
end