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.
87 lines
2.7 KiB
87 lines
2.7 KiB
local _,rematch = ...
|
|
local L = rematch.localization
|
|
local C = rematch.constants
|
|
rematch.events = {}
|
|
|
|
local events = CreateFrame("Frame")
|
|
|
|
-- indexed by event name, ordered list of {module,callback} where module can be a "name" and rematch.name
|
|
-- is used as 'self' (or the given value if rematch[name] doesn't exist)
|
|
local register = {}
|
|
|
|
-- calls any registered callbacks in the order they were registered for the given event
|
|
local function runCallbacks(self,event,...)
|
|
if register[event] then
|
|
for _,info in ipairs(register[event]) do
|
|
if type(info[2])=="function" then
|
|
info[2](rematch[info[1]] or info[1],...)
|
|
end
|
|
end
|
|
end
|
|
end
|
|
events:SetScript("OnEvent",runCallbacks)
|
|
|
|
-- raises an abitrary event for other parts of the addon to handle, such as REMATCH_PET_PICKED_UP
|
|
function rematch.events:Fire(event,...)
|
|
runCallbacks(self,event,...)
|
|
end
|
|
|
|
-- finds the index of a module's callback in the registered event, if it exists
|
|
local function getModuleIndex(module,event)
|
|
if register[event] then
|
|
for index,info in pairs(register[event]) do
|
|
if info[1]==module then
|
|
return index
|
|
end
|
|
end
|
|
end
|
|
end
|
|
|
|
-- any events flagged for removal will wait until all callbacks are handled for an event
|
|
local function cleanup()
|
|
for event,info in pairs(register) do
|
|
for i=#info,1,-1 do
|
|
if info[i][2]=="remove" then
|
|
tremove(info,i)
|
|
end
|
|
end
|
|
if #info==0 then
|
|
if not event:match("^REMATCH_") then
|
|
events:UnregisterEvent(event)
|
|
end
|
|
register[event] = nil
|
|
end
|
|
end
|
|
end
|
|
|
|
-- registers an event for a module with a callback
|
|
function rematch.events:Register(module,event,callback)
|
|
if not register[event] then
|
|
register[event] = {}
|
|
end
|
|
local index = getModuleIndex(module,event)
|
|
if not index then -- newly registered
|
|
tinsert(register[event],{module,callback})
|
|
if not event:match("^REMATCH_") then
|
|
events:RegisterEvent(event)
|
|
end
|
|
elseif callback then -- already registered (or was flagged for remove), changing/restoring callback function
|
|
register[event][index][2] = callback
|
|
end
|
|
end
|
|
|
|
-- unregisters an event for a module
|
|
function rematch.events:Unregister(module,event)
|
|
if register[event] then
|
|
local index = getModuleIndex(module,event)
|
|
if index then
|
|
register[event][index][2] = "remove"
|
|
rematch.timer:Start(0,cleanup)
|
|
end
|
|
end
|
|
end
|
|
|
|
-- for debugging
|
|
function rematch.events:GetRegister()
|
|
return register
|
|
end
|