aboutsummaryrefslogtreecommitdiff
path: root/mwe/events/include/eventManager.h
diff options
context:
space:
mode:
authorLoek Le Blansch <loek@pipeframe.xyz>2024-10-24 10:53:02 +0200
committerLoek Le Blansch <loek@pipeframe.xyz>2024-10-24 10:53:02 +0200
commita8a7ff90dfd626ea76dd9e9fe00c7854a7b9f31f (patch)
tree2724ddce9d181770e7ca745900af76ed64194451 /mwe/events/include/eventManager.h
parent39054829fa69bcfa2b468015dc3852a2f8deac9f (diff)
parentb5e83d076f356c6d01b7bbc1f033db4850356c0d (diff)
Merge branch 'wouter/events-poc' of github.com:lonkaars/crepe
Diffstat (limited to 'mwe/events/include/eventManager.h')
-rw-r--r--mwe/events/include/eventManager.h57
1 files changed, 57 insertions, 0 deletions
diff --git a/mwe/events/include/eventManager.h b/mwe/events/include/eventManager.h
new file mode 100644
index 0000000..709796a
--- /dev/null
+++ b/mwe/events/include/eventManager.h
@@ -0,0 +1,57 @@
+#pragma once
+#include <unordered_map>
+#include <memory>
+#include "event.h"
+#include "keyCodes.h"
+#include "eventHandler.h"
+#include <vector>
+// using EventType = std::uint32_t;
+// using EventId = std::uint64_t;
+
+class EventManager {
+public:
+ EventManager(const EventManager&) = delete;
+ const EventManager& operator=(const EventManager&) = delete;
+ static EventManager& getInstance() {
+ static EventManager instance;
+ return instance;
+ }
+
+ void shutdown();
+ void subscribe(int eventType, std::unique_ptr<IEventHandlerWrapper>&& handler, int eventId);
+ void unsubscribe(int eventType, const std::string& handlerName, int eventId);
+ void triggerEvent(const Event& event_, int eventId);
+ void queueEvent(std::unique_ptr<Event>&& event_, int eventId);
+ void dispatchEvents();
+
+private:
+ EventManager() = default;
+ std::vector<std::pair<std::unique_ptr<Event>, int>> m_eventsQueue;
+ std::unordered_map<int, std::vector<std::unique_ptr<IEventHandlerWrapper>>> m_subscribers;
+ std::unordered_map<int, std::unordered_map<int, std::vector<std::unique_ptr<IEventHandlerWrapper>>>> m_subscribersByEventId;
+};
+
+
+template<typename EventType>
+inline void subscribe(const EventHandler<EventType>& callback, int eventId = 0, const bool unsubscribeOnSuccess = false)
+{
+ std::unique_ptr<IEventHandlerWrapper> handler = std::make_unique<EventHandlerWrapper<EventType>>(callback, unsubscribeOnSuccess);
+ EventManager::getInstance().subscribe(EventType::getStaticEventType(), std::move(handler), eventId);
+}
+
+template<typename EventType>
+inline void unsubscribe(const EventHandler<EventType>& callback, int eventId = 0)
+{
+ const std::string handlerName = callback.target_type().name();
+ EventManager::getInstance().unsubscribe(EventType::getStaticEventType(), handlerName, eventId);
+}
+
+inline void triggerEvent(const Event& triggeredEvent, int eventId = 0)
+{
+ EventManager::getInstance().triggerEvent(triggeredEvent, eventId);
+}
+
+inline void queueEvent(std::unique_ptr<Event>&& queuedEvent, int eventId = 0)
+{
+ EventManager::getInstance().queueEvent(std::forward<std::unique_ptr<Event>>(queuedEvent), eventId);
+}