#include "eventManager.h" void EventManager::shutdown() { m_subscribers.clear(); } void EventManager::subscribe(int eventType, std::unique_ptr && handler, int eventId) { if (eventId) { std::unordered_map< int, std::unordered_map< int, std::vector>>>:: iterator subscribers = m_subscribersByEventId.find(eventType); if (subscribers != m_subscribersByEventId.end()) { std::unordered_map< int, std::vector>> & handlersMap = subscribers->second; std::unordered_map< int, std::vector>>::iterator handlers = handlersMap.find(eventId); if (handlers != handlersMap.end()) { handlers->second.emplace_back(std::move(handler)); return; } } m_subscribersByEventId[eventType][eventId].emplace_back( std::move(handler)); } else { std::unordered_map< int, std::vector>>::iterator subscribers = m_subscribers.find(eventType); if (subscribers != m_subscribers.end()) { std::vector> & handlers = subscribers->second; for (std::unique_ptr & it : handlers) { if (it->getType() == handler->getType()) { // log for double register return; } } handlers.emplace_back(std::move(handler)); } else { m_subscribers[eventType].emplace_back(std::move(handler)); } } } void EventManager::unsubscribe(int eventType, const std::string & handlerName, int eventId) { if (eventId) { std::unordered_map< int, std::unordered_map< int, std::vector>>>:: iterator subscribers = m_subscribersByEventId.find(eventType); if (subscribers != m_subscribersByEventId.end()) { std::unordered_map< int, std::vector>> & handlersMap = subscribers->second; std::unordered_map< int, std::vector>>::iterator handlers = handlersMap.find(eventId); if (handlers != handlersMap.end()) { std::vector> & callbacks = handlers->second; for (std::vector< std::unique_ptr>::iterator it = callbacks.begin(); it != callbacks.end(); ++it) { if (it->get()->getType() == handlerName) { it = callbacks.erase(it); return; } } } } } else { std::unordered_map< int, std::vector>>::iterator handlersIt = m_subscribers.find(eventType); if (handlersIt != m_subscribers.end()) { std::vector> & handlers = handlersIt->second; for (std::vector>::iterator it = handlers.begin(); it != handlers.end(); ++it) { if (it->get()->getType() == handlerName) { it = handlers.erase(it); return; } } } } } void EventManager::triggerEvent(const Event & event_, int eventId) { std::vector> & handlers = m_subscribers[event_.getEventType()]; for (std::unique_ptr & handler : handlers) { handler->exec(event_); } std::unordered_map< int, std::vector>> & handlersMap = m_subscribersByEventId[event_.getEventType()]; std::unordered_map< int, std::vector>>::iterator handlersIt = handlersMap.find(eventId); if (handlersIt != handlersMap.end()) { std::vector> & callbacks = handlersIt->second; for (std::vector>::iterator it = callbacks.begin(); it != callbacks.end();) { std::unique_ptr & handler = *it; handler->exec(event_); if (handler->isDestroyOnSuccess()) { it = callbacks.erase(it); } else { ++it; } } } } void EventManager::queueEvent(std::unique_ptr && event_, int eventId) { m_eventsQueue.emplace_back(std::move(event_), eventId); } void EventManager::dispatchEvents() { for (std::vector, int>>::iterator eventIt = m_eventsQueue.begin(); eventIt != m_eventsQueue.end();) { if (!eventIt->first.get()->getHandled()) { triggerEvent(*eventIt->first.get(), eventIt->second); eventIt = m_eventsQueue.erase(eventIt); } else { ++eventIt; } } }