038931fcfb
Match the layout convention used by every other multi-addon-shape fork in Exiles/ (Bagnon/, Kui_Nameplates/, ShadowedUnitFrames/, etc.) — the addon's own files live in a subfolder named after the addon, with only the repo-level README files at the root. All moves are pure git renames (history preserved). Toc references are relative to the toc location so nothing inside the addon changes.
127 lines
4.6 KiB
Lua
127 lines
4.6 KiB
Lua
--- AceEvent-3.0 provides event registration and secure dispatching.
|
|
-- All dispatching is done using **CallbackHandler-1.0**. AceEvent is a simple wrapper around
|
|
-- CallbackHandler, and dispatches all game events or addon message to the registrees.
|
|
--
|
|
-- **AceEvent-3.0** can be embeded into your addon, either explicitly by calling AceEvent:Embed(MyAddon) or by
|
|
-- specifying it as an embeded library in your AceAddon. All functions will be available on your addon object
|
|
-- and can be accessed directly, without having to explicitly call AceEvent itself.\\
|
|
-- It is recommended to embed AceEvent, otherwise you'll have to specify a custom `self` on all calls you
|
|
-- make into AceEvent.
|
|
-- @class file
|
|
-- @name AceEvent-3.0
|
|
-- @release $Id$
|
|
local CallbackHandler = LibStub("CallbackHandler-1.0")
|
|
|
|
local MAJOR, MINOR = "AceEvent-3.0", 4
|
|
local AceEvent = LibStub:NewLibrary(MAJOR, MINOR)
|
|
|
|
if not AceEvent then return end
|
|
|
|
-- Lua APIs
|
|
local pairs = pairs
|
|
|
|
AceEvent.frame = AceEvent.frame or CreateFrame("Frame", "AceEvent30Frame") -- our event frame
|
|
AceEvent.embeds = AceEvent.embeds or {} -- what objects embed this lib
|
|
|
|
-- APIs and registry for blizzard events, using CallbackHandler lib
|
|
if not AceEvent.events then
|
|
AceEvent.events = CallbackHandler:New(AceEvent,
|
|
"RegisterEvent", "UnregisterEvent", "UnregisterAllEvents")
|
|
end
|
|
|
|
function AceEvent.events:OnUsed(target, eventname)
|
|
AceEvent.frame:RegisterEvent(eventname)
|
|
end
|
|
|
|
function AceEvent.events:OnUnused(target, eventname)
|
|
AceEvent.frame:UnregisterEvent(eventname)
|
|
end
|
|
|
|
|
|
-- APIs and registry for IPC messages, using CallbackHandler lib
|
|
if not AceEvent.messages then
|
|
AceEvent.messages = CallbackHandler:New(AceEvent,
|
|
"RegisterMessage", "UnregisterMessage", "UnregisterAllMessages"
|
|
)
|
|
AceEvent.SendMessage = AceEvent.messages.Fire
|
|
end
|
|
|
|
--- embedding and embed handling
|
|
local mixins = {
|
|
"RegisterEvent", "UnregisterEvent",
|
|
"RegisterMessage", "UnregisterMessage",
|
|
"SendMessage",
|
|
"UnregisterAllEvents", "UnregisterAllMessages",
|
|
}
|
|
|
|
--- Register for a Blizzard Event.
|
|
-- The callback will be called with the optional `arg` as the first argument (if supplied), and the event name as the second (or first, if no arg was supplied)
|
|
-- Any arguments to the event will be passed on after that.
|
|
-- @name AceEvent:RegisterEvent
|
|
-- @class function
|
|
-- @paramsig event[, callback [, arg]]
|
|
-- @param event The event to register for
|
|
-- @param callback The callback function to call when the event is triggered (funcref or method, defaults to a method with the event name)
|
|
-- @param arg An optional argument to pass to the callback function
|
|
|
|
--- Unregister an event.
|
|
-- @name AceEvent:UnregisterEvent
|
|
-- @class function
|
|
-- @paramsig event
|
|
-- @param event The event to unregister
|
|
|
|
--- Register for a custom AceEvent-internal message.
|
|
-- The callback will be called with the optional `arg` as the first argument (if supplied), and the event name as the second (or first, if no arg was supplied)
|
|
-- Any arguments to the event will be passed on after that.
|
|
-- @name AceEvent:RegisterMessage
|
|
-- @class function
|
|
-- @paramsig message[, callback [, arg]]
|
|
-- @param message The message to register for
|
|
-- @param callback The callback function to call when the message is triggered (funcref or method, defaults to a method with the event name)
|
|
-- @param arg An optional argument to pass to the callback function
|
|
|
|
--- Unregister a message
|
|
-- @name AceEvent:UnregisterMessage
|
|
-- @class function
|
|
-- @paramsig message
|
|
-- @param message The message to unregister
|
|
|
|
--- Send a message over the AceEvent-3.0 internal message system to other addons registered for this message.
|
|
-- @name AceEvent:SendMessage
|
|
-- @class function
|
|
-- @paramsig message, ...
|
|
-- @param message The message to send
|
|
-- @param ... Any arguments to the message
|
|
|
|
|
|
-- Embeds AceEvent into the target object making the functions from the mixins list available on target:..
|
|
-- @param target target object to embed AceEvent in
|
|
function AceEvent:Embed(target)
|
|
for k, v in pairs(mixins) do
|
|
target[v] = self[v]
|
|
end
|
|
self.embeds[target] = true
|
|
return target
|
|
end
|
|
|
|
-- AceEvent:OnEmbedDisable( target )
|
|
-- target (object) - target object that is being disabled
|
|
--
|
|
-- Unregister all events messages etc when the target disables.
|
|
-- this method should be called by the target manually or by an addon framework
|
|
function AceEvent:OnEmbedDisable(target)
|
|
target:UnregisterAllEvents()
|
|
target:UnregisterAllMessages()
|
|
end
|
|
|
|
-- Script to fire blizzard events into the event listeners
|
|
local events = AceEvent.events
|
|
AceEvent.frame:SetScript("OnEvent", function(this, event, ...)
|
|
events:Fire(event, ...)
|
|
end)
|
|
|
|
--- Finally: upgrade our old embeds
|
|
for target, v in pairs(AceEvent.embeds) do
|
|
AceEvent:Embed(target)
|
|
end
|