diff options
| author | WBoerenkamps <wrj.boerenkamps@student.avans.nl> | 2024-11-12 12:45:19 +0100 | 
|---|---|---|
| committer | WBoerenkamps <wrj.boerenkamps@student.avans.nl> | 2024-11-12 12:45:19 +0100 | 
| commit | 48fb3f48831b1db187942592343eb4a2dc6662fc (patch) | |
| tree | 8b97854105a6d0081cfb3e5df1d8a47f793bceac /src/crepe/api/EventManager.cpp | |
| parent | 9ee280d8149f84f4240902c3363a6881bf425137 (diff) | |
dispatch and queue working
Diffstat (limited to 'src/crepe/api/EventManager.cpp')
| -rw-r--r-- | src/crepe/api/EventManager.cpp | 96 | 
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; +        } +    }  } +  |