Tercio@23: --- AceEvent-3.0 provides event registration and secure dispatching. Tercio@23: -- All dispatching is done using **CallbackHandler-1.0**. AceEvent is a simple wrapper around Tercio@23: -- CallbackHandler, and dispatches all game events or addon message to the registrees. Tercio@23: -- Tercio@23: -- **AceEvent-3.0** can be embeded into your addon, either explicitly by calling AceEvent:Embed(MyAddon) or by Tercio@23: -- specifying it as an embeded library in your AceAddon. All functions will be available on your addon object Tercio@23: -- and can be accessed directly, without having to explicitly call AceEvent itself.\\ Tercio@23: -- It is recommended to embed AceEvent, otherwise you'll have to specify a custom `self` on all calls you Tercio@23: -- make into AceEvent. Tercio@23: -- @class file Tercio@23: -- @name AceEvent-3.0 Tercio@23: -- @release $Id: AceEvent-3.0.lua 975 2010-10-23 11:26:18Z nevcairiel $ Tercio@23: local MAJOR, MINOR = "AceEvent-3.0", 3 Tercio@23: local AceEvent = LibStub:NewLibrary(MAJOR, MINOR) Tercio@23: Tercio@23: if not AceEvent then return end Tercio@23: Tercio@23: -- Lua APIs Tercio@23: local pairs = pairs Tercio@23: Tercio@23: local CallbackHandler = LibStub:GetLibrary("CallbackHandler-1.0") Tercio@23: Tercio@23: AceEvent.frame = AceEvent.frame or CreateFrame("Frame", "AceEvent30Frame") -- our event frame Tercio@23: AceEvent.embeds = AceEvent.embeds or {} -- what objects embed this lib Tercio@23: Tercio@23: -- APIs and registry for blizzard events, using CallbackHandler lib Tercio@23: if not AceEvent.events then Tercio@23: AceEvent.events = CallbackHandler:New(AceEvent, Tercio@23: "RegisterEvent", "UnregisterEvent", "UnregisterAllEvents") Tercio@23: end Tercio@23: Tercio@23: function AceEvent.events:OnUsed(target, eventname) Tercio@23: AceEvent.frame:RegisterEvent(eventname) Tercio@23: end Tercio@23: Tercio@23: function AceEvent.events:OnUnused(target, eventname) Tercio@23: AceEvent.frame:UnregisterEvent(eventname) Tercio@23: end Tercio@23: Tercio@23: Tercio@23: -- APIs and registry for IPC messages, using CallbackHandler lib Tercio@23: if not AceEvent.messages then Tercio@23: AceEvent.messages = CallbackHandler:New(AceEvent, Tercio@23: "RegisterMessage", "UnregisterMessage", "UnregisterAllMessages" Tercio@23: ) Tercio@23: AceEvent.SendMessage = AceEvent.messages.Fire Tercio@23: end Tercio@23: Tercio@23: --- embedding and embed handling Tercio@23: local mixins = { Tercio@23: "RegisterEvent", "UnregisterEvent", Tercio@23: "RegisterMessage", "UnregisterMessage", Tercio@23: "SendMessage", Tercio@23: "UnregisterAllEvents", "UnregisterAllMessages", Tercio@23: } Tercio@23: Tercio@23: --- Register for a Blizzard Event. Tercio@23: -- 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) Tercio@23: -- Any arguments to the event will be passed on after that. Tercio@23: -- @name AceEvent:RegisterEvent Tercio@23: -- @class function Tercio@23: -- @paramsig event[, callback [, arg]] Tercio@23: -- @param event The event to register for Tercio@23: -- @param callback The callback function to call when the event is triggered (funcref or method, defaults to a method with the event name) Tercio@23: -- @param arg An optional argument to pass to the callback function Tercio@23: Tercio@23: --- Unregister an event. Tercio@23: -- @name AceEvent:UnregisterEvent Tercio@23: -- @class function Tercio@23: -- @paramsig event Tercio@23: -- @param event The event to unregister Tercio@23: Tercio@23: --- Register for a custom AceEvent-internal message. Tercio@23: -- 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) Tercio@23: -- Any arguments to the event will be passed on after that. Tercio@23: -- @name AceEvent:RegisterMessage Tercio@23: -- @class function Tercio@23: -- @paramsig message[, callback [, arg]] Tercio@23: -- @param message The message to register for Tercio@23: -- @param callback The callback function to call when the message is triggered (funcref or method, defaults to a method with the event name) Tercio@23: -- @param arg An optional argument to pass to the callback function Tercio@23: Tercio@23: --- Unregister a message Tercio@23: -- @name AceEvent:UnregisterMessage Tercio@23: -- @class function Tercio@23: -- @paramsig message Tercio@23: -- @param message The message to unregister Tercio@23: Tercio@23: --- Send a message over the AceEvent-3.0 internal message system to other addons registered for this message. Tercio@23: -- @name AceEvent:SendMessage Tercio@23: -- @class function Tercio@23: -- @paramsig message, ... Tercio@23: -- @param message The message to send Tercio@23: -- @param ... Any arguments to the message Tercio@23: Tercio@23: Tercio@23: -- Embeds AceEvent into the target object making the functions from the mixins list available on target:.. Tercio@23: -- @param target target object to embed AceEvent in Tercio@23: function AceEvent:Embed(target) Tercio@23: for k, v in pairs(mixins) do Tercio@23: target[v] = self[v] Tercio@23: end Tercio@23: self.embeds[target] = true Tercio@23: return target Tercio@23: end Tercio@23: Tercio@23: -- AceEvent:OnEmbedDisable( target ) Tercio@23: -- target (object) - target object that is being disabled Tercio@23: -- Tercio@23: -- Unregister all events messages etc when the target disables. Tercio@23: -- this method should be called by the target manually or by an addon framework Tercio@23: function AceEvent:OnEmbedDisable(target) Tercio@23: target:UnregisterAllEvents() Tercio@23: target:UnregisterAllMessages() Tercio@23: end Tercio@23: Tercio@23: -- Script to fire blizzard events into the event listeners Tercio@23: local events = AceEvent.events Tercio@23: AceEvent.frame:SetScript("OnEvent", function(this, event, ...) Tercio@23: events:Fire(event, ...) Tercio@23: end) Tercio@23: Tercio@23: --- Finally: upgrade our old embeds Tercio@23: for target, v in pairs(AceEvent.embeds) do Tercio@23: AceEvent:Embed(target) Tercio@23: end