diff --git a/example/layers/ui_layer/ui_layer.cpp b/example/layers/ui_layer/ui_layer.cpp index c09fae5..4f8e135 100755 --- a/example/layers/ui_layer/ui_layer.cpp +++ b/example/layers/ui_layer/ui_layer.cpp @@ -6,14 +6,14 @@ namespace example { void ui_layer::on_attach() { - VE::CONNECT(this); + m_key = VE::CONNECT(this); hack::log()("on_attach"); } void ui_layer::on_detach() { - VE::DISCONNECT(this); + VE::DISCONNECT(m_key); hack::log()("on_detach"); } diff --git a/example/layers/ui_layer/ui_layer.hpp b/example/layers/ui_layer/ui_layer.hpp index 0ed18b4..c2b1cc8 100755 --- a/example/layers/ui_layer/ui_layer.hpp +++ b/example/layers/ui_layer/ui_layer.hpp @@ -10,6 +10,7 @@ namespace example ImVec2 m_size = ImVec2{ 400.f, 400.f }; ImVec2 m_pos = ImVec2{ 400.f, 400.f }; + std::string m_key; }; } diff --git a/example/layers/ui_layer_double/ui_layer_double.cpp b/example/layers/ui_layer_double/ui_layer_double.cpp index b38e833..7c06cf7 100755 --- a/example/layers/ui_layer_double/ui_layer_double.cpp +++ b/example/layers/ui_layer_double/ui_layer_double.cpp @@ -6,14 +6,14 @@ namespace example { void ui_layer_double::on_attach() { - VE::CONNECT(this); + m_key = VE::CONNECT(this); hack::log()("on_attach"); } void ui_layer_double::on_detach() { - VE::DISCONNECT(this); + VE::DISCONNECT(m_key); hack::log()("on_detach"); } diff --git a/example/layers/ui_layer_double/ui_layer_double.hpp b/example/layers/ui_layer_double/ui_layer_double.hpp index b0a809c..499e354 100755 --- a/example/layers/ui_layer_double/ui_layer_double.hpp +++ b/example/layers/ui_layer_double/ui_layer_double.hpp @@ -10,6 +10,7 @@ namespace example ImVec2 m_size = ImVec2{ 400.f, 400.f }; ImVec2 m_pos = ImVec2{ 400.f, 400.f }; + std::string m_key; }; } diff --git a/src/event/api.hpp b/src/event/api.hpp index 7354f95..d492094 100755 --- a/src/event/api.hpp +++ b/src/event/api.hpp @@ -5,15 +5,14 @@ namespace VE { template - void CONNECT(T* obj) + std::string CONNECT(T* obj) { - event_manager::instance().connect(obj, &T::on_event); + return event_manager::instance().connect(obj, &T::on_event); } - template - void DISCONNECT(T* obj) + inline void DISCONNECT(std::string key) { - event_manager::instance().disconnect(obj, &T::on_event); + event_manager::instance().disconnect(key); } template diff --git a/src/event/event_manager.hpp b/src/event/event_manager.hpp index 6eebe2d..82db622 100755 --- a/src/event/event_manager.hpp +++ b/src/event/event_manager.hpp @@ -1,53 +1,36 @@ #pragma once -#include -#include #include #include +#include #include "event.hpp" +#include "utils/using.hpp" namespace VE { struct event_manager : public hack::patterns::singleton { - struct event_handler - { - std::function m_func; - void* m_obj; - void* m_func_ptr; - }; - - std::vector m_funcs; + std::map> m_funcs; template - void connect(T* obj, void (T::*method)(event)) + std::string connect(T* obj, void (T::*method)(event)) { - event_handler handler; - handler.m_func = std::bind(method, obj, std::placeholders::_1); - handler.m_obj = obj; - m_funcs.push_back(handler); + std::string key = hack::security::generate_uuid(); + m_funcs[key] = std::bind(method, obj, std::placeholders::_1); + return key; } - - template - void disconnect(T* obj, void (T::*method)(event)) + + void disconnect(std::string key) { - m_funcs.erase(std::remove_if(m_funcs.begin(), m_funcs.end(), - [obj](const event_handler& handler) { - return handler.m_obj == obj; - }), - m_funcs.end() - ); + m_funcs.erase(key); } void emit(event e) { try { - for (std::size_t i = 0; i < m_funcs.size(); ++i) - { - m_funcs[i].m_func(e); - } + for(auto [key, f] : m_funcs) m_funcs[key](e); } catch(const std::exception& ex) {