add new func for event
This commit is contained in:
@@ -10,6 +10,12 @@ namespace VE
|
|||||||
event_manager::instance().connect(obj, &T::on_event);
|
event_manager::instance().connect(obj, &T::on_event);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
template <typename T>
|
||||||
|
void DISCONNECT(T* obj)
|
||||||
|
{
|
||||||
|
event_manager::instance().disconnect(obj, &T::on_event);
|
||||||
|
}
|
||||||
|
|
||||||
template <typename TYPE, typename DATA>
|
template <typename TYPE, typename DATA>
|
||||||
void EMIT(TYPE t, DATA d, int id = -1)
|
void EMIT(TYPE t, DATA d, int id = -1)
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -1,21 +1,45 @@
|
|||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
|
#include <functional>
|
||||||
|
#include <algorithm>
|
||||||
#include <hack/patterns/singleton.hpp>
|
#include <hack/patterns/singleton.hpp>
|
||||||
#include <hack/logger/logger.hpp>
|
#include <hack/logger/logger.hpp>
|
||||||
|
|
||||||
#include "event.hpp"
|
#include "event.hpp"
|
||||||
#include "utils/using.hpp"
|
|
||||||
|
|
||||||
namespace VE
|
namespace VE
|
||||||
{
|
{
|
||||||
struct event_manager : public hack::patterns::singleton<event_manager>
|
struct event_manager : public hack::patterns::singleton<event_manager>
|
||||||
{
|
{
|
||||||
std::vector<event_fn<event>> m_funcs;
|
struct event_handler
|
||||||
|
{
|
||||||
|
std::function<void(event)> m_func;
|
||||||
|
void* m_obj;
|
||||||
|
void* m_func_ptr;
|
||||||
|
};
|
||||||
|
|
||||||
|
std::vector<event_handler> m_funcs;
|
||||||
|
|
||||||
template<typename T>
|
template<typename T>
|
||||||
void connect(T* obj, void (T::*method)(event))
|
void connect(T* obj, void (T::*method)(event))
|
||||||
{
|
{
|
||||||
m_funcs.push_back(std::bind(method, obj, std::placeholders::_1));
|
event_handler handler;
|
||||||
|
handler.m_func = std::bind(method, obj, std::placeholders::_1);
|
||||||
|
handler.m_obj = obj;
|
||||||
|
handler.m_func_ptr = reinterpret_cast<void*>(&method);
|
||||||
|
m_funcs.push_back(handler);
|
||||||
|
}
|
||||||
|
|
||||||
|
template<typename T>
|
||||||
|
void disconnect(T* obj, void (T::*method)(event))
|
||||||
|
{
|
||||||
|
auto func_ptr = reinterpret_cast<void*>(&method);
|
||||||
|
m_funcs.erase(std::remove_if(m_funcs.begin(), m_funcs.end(),
|
||||||
|
[obj, func_ptr](const event_handler& handler) {
|
||||||
|
return handler.m_obj == obj && handler.m_func_ptr == func_ptr;
|
||||||
|
}),
|
||||||
|
m_funcs.end()
|
||||||
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
void emit(event e)
|
void emit(event e)
|
||||||
@@ -24,7 +48,7 @@ namespace VE
|
|||||||
{
|
{
|
||||||
for (std::size_t i = 0; i < m_funcs.size(); ++i)
|
for (std::size_t i = 0; i < m_funcs.size(); ++i)
|
||||||
{
|
{
|
||||||
m_funcs[i](e);
|
m_funcs[i].m_func(e);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
catch(const std::exception& ex)
|
catch(const std::exception& ex)
|
||||||
|
|||||||
@@ -16,3 +16,7 @@
|
|||||||
|
|
||||||
#define VE_NAME(n) VE::func::name(n).data()
|
#define VE_NAME(n) VE::func::name(n).data()
|
||||||
#define VE_COLOR(c, t) VE::func::color(c, t)
|
#define VE_COLOR(c, t) VE::func::color(c, t)
|
||||||
|
|
||||||
|
#ifndef IMGUI_DEFINE_MATH_OPERATORS
|
||||||
|
#define IMGUI_DEFINE_MATH_OPERATORS
|
||||||
|
#endif
|
||||||
|
|||||||
Reference in New Issue
Block a user