local _, ns = ...
local oUF = ns.oUF
local Private = oUF.Private
local argcheck = Private.argcheck
local frame_metatable = Private.frame_metatable
local CombatLogGetCurrentEventInfo = _G.CombatLogGetCurrentEventInfo
local event_metatable = {
__call = function(funcs, ...)
for self, func in next, funcs do
if (self:IsVisible()) then
func(self, ...)
end
end
end,
}
local self_metatable = {
__call = function(funcs, self, ...)
for _, func in next, funcs do
func(self, ...)
end
end
}
local listener = CreateFrame('Frame')
listener.activeEvents = 0
local function filter(_, event, ...)
if(listener[event]) then
listener[event](event, ...)
end
end
listener:SetScript('OnEvent', function(self, event)
filter(CombatLogGetCurrentEventInfo())
end)
--[[ CombatEvents: frame:RegisterCombatEvent(event, handler)
Used to register a frame for a combat log event and add an event handler.
* self - frame that will be registered for the given event
* event - name of the combat log event to register (string)
* handler - function which will be executed when the combat log event fires. Multiple handlers can be added for the
same frame and event (function)
--]]
function frame_metatable.__index:RegisterCombatEvent(event, handler)
argcheck(event, 2, 'string')
argcheck(handler, 3, 'function')
if(not listener[event]) then
listener[event] = setmetatable({}, event_metatable)
listener.activeEvents = listener.activeEvents + 1
end
local current = listener[event][self]
if(current) then
for _, func in next, current do
if(func == handler) then return end
end
table.insert(current, handler)
else
-- even with a single handler we want to make sure the frame is visible
listener[event][self] = setmetatable({handler}, self_metatable)
end
if(listener.activeEvents > 0) then
listener:RegisterEvent('COMBAT_LOG_EVENT_UNFILTERED')
end
end
--[[ CombatEvents: frame:UnregisterCombatEvent(event, handler)
Used to remove a function from the event handler list for a combat log event.
* self - the frame registered for the event
* event - name of the registered combat log event (string)
* handler - function to be removed from the list of event handlers
--]]
function frame_metatable.__index:UnregisterCombatEvent(event, handler)
argcheck(event, 2, 'string')
if(not listener[event]) then return end
local cleanUp = false
local current = listener[event][self]
if(current) then
for i, func in next, current do
if(func == handler) then
current[i] = nil
break
end
end
if(not next(current)) then
cleanUp = true
end
end
if(cleanUp) then
listener[event][self] = nil
if(not next(listener[event])) then
listener[event] = nil
listener.activeEvents = listener.activeEvents - 1
if(listener.activeEvents <= 0) then
listener:UnregisterEvent('COMBAT_LOG_EVENT_UNFILTERED')
end
end
end
end