diff --git a/src/modules/stream/editor_event.cpp b/src/modules/stream/editor_event.cpp new file mode 100644 index 0000000..50e90e4 --- /dev/null +++ b/src/modules/stream/editor_event.cpp @@ -0,0 +1,31 @@ +#undef NDEBUG +#include + +#include "editor_event.h" + +EditorEvent *EditorEvent::singleton = nullptr; + +EditorEvent::EditorEvent() +{ +} + +EditorEvent::~EditorEvent() +{ +} + +EditorEvent *EditorEvent::get_singleton() +{ + if (!singleton) + singleton = memnew(EditorEvent); + return singleton; +} + +void EditorEvent::EventHelper::emit(const String &event, const Array &args) +{ + auto evl = listeners.begin(); + while (evl != listeners.end()) { + const event_listener_ptrs &xev = *evl; + xev.execute(event, args); + evl++; + } +} \ No newline at end of file diff --git a/src/modules/stream/editor_event.h b/src/modules/stream/editor_event.h new file mode 100644 index 0000000..7ab2eb2 --- /dev/null +++ b/src/modules/stream/editor_event.h @@ -0,0 +1,76 @@ +#ifndef EDITOR_EVENT_H +#define EDITOR_EVENT_H +#include +#include +class EditorEvent { +public: + class EventHelper { + class event_listener_ptrs { + public: + class H {}; + H *obj; + void (H::*method)(const String &event, + const Array &args); + void execute(const String &event, + const Array &args) const + { + (obj->*method)(event, args); + } + }; + std::list listeners; + typedef event_listener_ptrs::H *obj_t; + typedef void (event_listener_ptrs::H::*method_t)( + const String &event, const Array &args); + + public: + template + void add_listener(T *obj, void (T::*method)(const String &event, + const Array &args)); + template + void remove_listener(T *obj, + void (T::*method)(const String &event, + const Array &args)); + void emit(const String &event, const Array &args); + }; + EventHelper event; + +private: + static EditorEvent *singleton; + EditorEvent(); + virtual ~EditorEvent(); + +public: + static EditorEvent *get_singleton(); +}; +template +void EditorEvent::EventHelper::remove_listener( + T *obj, void (T::*method)(const String &event, const Array &args)) +{ + listeners.remove_if([obj, method](const event_listener_ptrs &e) { + return e.obj == reinterpret_cast(obj) && + e.method == reinterpret_cast(method); + }); +} +template +void EditorEvent::EventHelper::add_listener( + T *obj, void (T::*method)(const String &event, const Array &args)) +{ + auto evl = listeners.begin(); + bool bad = false; + while (evl != listeners.end()) { + const event_listener_ptrs &xev = *evl; + if (xev.obj == reinterpret_cast(obj) && + xev.method == reinterpret_cast(method)) { + bad = true; + break; + } + evl++; + } + if (bad) + return; + event_listener_ptrs ev; + ev.obj = reinterpret_cast(obj); + ev.method = reinterpret_cast(method); + listeners.push_back(ev); +} +#endif \ No newline at end of file