aboutsummaryrefslogtreecommitdiff
path: root/src/crepe/api/EventManager.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/crepe/api/EventManager.cpp')
-rw-r--r--src/crepe/api/EventManager.cpp96
1 files changed, 33 insertions, 63 deletions
diff --git a/src/crepe/api/EventManager.cpp b/src/crepe/api/EventManager.cpp
index 7a8be53..869ec74 100644
--- a/src/crepe/api/EventManager.cpp
+++ b/src/crepe/api/EventManager.cpp
@@ -1,69 +1,39 @@
#include "EventManager.h"
-// void EventManager::unsubscribe(std::type_index eventType, const std::string & handlerName,
-// int eventId) {
-// if (eventId) {
-// std::unordered_map<
-// std::type_index, std::unordered_map<
-// int, std::vector<std::unique_ptr<IEventHandlerWrapper>>>>::iterator subscriber_list = subscribers_by_event_id.find(eventType);
-// if (subscriber_list != subscribers_by_event_id.end()) {
-// std::unordered_map<
-// int, std::vector<std::unique_ptr<IEventHandlerWrapper>>> &
-// handlers_map
-// = subscriber_list->second;
-// std::unordered_map<
-// int,
-// std::vector<std::unique_ptr<IEventHandlerWrapper>>>::iterator
-// handlers
-// = handlers_map.find(eventId);
-// if (handlers != handlers_map.end()) {
-// std::vector<std::unique_ptr<IEventHandlerWrapper>> & callbacks
-// = handlers->second;
-// for (std::vector<
-// std::unique_ptr<IEventHandlerWrapper>>::iterator it
-// = callbacks.begin();
-// it != callbacks.end(); ++it) {
-// if (it->get()->get_type() == handlerName) {
-// it = callbacks.erase(it);
-// return;
-// }
-// }
-// }
-// }
-// } else {
-// std::unordered_map<
-// std::type_index, std::vector<std::unique_ptr<IEventHandlerWrapper>>>::iterator
-// handlers_it
-// = subscribers.find(eventType);
-// if (handlers_it != subscribers.end()) {
-// std::vector<std::unique_ptr<IEventHandlerWrapper>> & handlers
-// = handlers_it->second;
-// for (std::vector<std::unique_ptr<IEventHandlerWrapper>>::iterator it
-// = handlers.begin();
-// it != handlers.end(); ++it) {
-// if (it->get()->get_type() == handlerName) {
-// it = handlers.erase(it);
-// return;
-// }
-// }
-// }
-// }
-// }
-void EventManager::queue_event(std::unique_ptr<Event> && event_, int eventId) {
- events_queue.emplace_back(std::move(event_), eventId);
-}
void EventManager::dispatch_events() {
- for (std::vector<std::pair<std::unique_ptr<Event>, int>>::iterator event_it
- = events_queue.begin();
- event_it != events_queue.end();) {
- bool handled = false;
- if (!handled) {
- trigger_event<Event>(*event_it->first.get(), event_it->second);
- event_it = events_queue.erase(event_it);
- } else {
- ++event_it;
- }
- }
+ for (auto event_it = events_queue.begin(); event_it != events_queue.end();) {
+ auto& event = std::get<0>(*event_it);
+ int channel = std::get<1>(*event_it);
+ std::type_index event_type = std::get<2>(*event_it);
+ if (channel) {
+ auto handlers_it = subscribers_by_event_id.find(event_type);
+ if (handlers_it != subscribers_by_event_id.end()) {
+ auto& handlers_map = handlers_it->second;
+ auto handlers = handlers_map.find(channel);
+ if (handlers != handlers_map.end()) {
+ auto& callbacks = handlers->second;
+ for (auto& handler : callbacks) {
+ handler->exec(*event);
+ }
+ }
+ }
+ } else {
+ auto handlers_it = subscribers.find(event_type);
+ if (handlers_it != subscribers.end()) {
+ auto& handlers = handlers_it->second;
+ for (auto& handler : handlers) {
+ handler->exec(*event);
+ }
+ }
+ }
+
+ if (event->handled) {
+ event_it = events_queue.erase(event_it);
+ } else {
+ ++event_it;
+ }
+ }
}
+