From 41abab36aaa08c1034659f555adf7fe7f14861cb Mon Sep 17 00:00:00 2001 From: OmniaX-Dev Date: Sat, 4 Apr 2026 01:38:44 +0200 Subject: [PATCH] Streamlined the Signal System --- other/build.nr | 2 +- src/ogfx/gui/RawTextInput.cpp | 36 ++++----- src/ogfx/gui/RawTextInput.hpp | 6 +- src/ogfx/gui/Window.cpp | 73 +++++++++--------- src/ogfx/gui/Window.hpp | 12 +-- src/ogfx/render/FontUtils.cpp | 6 +- src/ogfx/render/FontUtils.hpp | 2 +- src/ogfx/render/PixelRenderer.cpp | 6 +- src/ogfx/render/PixelRenderer.hpp | 2 +- src/ogfx/utils/SDLInclude.hpp | 2 +- src/ostd/data/BaseObject.cpp | 6 +- src/ostd/data/BaseObject.hpp | 6 +- src/ostd/math/Spline.cpp | 14 ++-- src/ostd/math/Spline.hpp | 4 +- src/ostd/utils/Signals.cpp | 124 ++++-------------------------- src/ostd/utils/Signals.hpp | 66 +++++----------- src/test/GraphicsWindowTest.cpp | 4 +- src/test/GuiTest.cpp | 4 +- 18 files changed, 127 insertions(+), 248 deletions(-) diff --git a/other/build.nr b/other/build.nr index a862943..c05d464 100644 --- a/other/build.nr +++ b/other/build.nr @@ -1 +1 @@ -2040 +2041 diff --git a/src/ogfx/gui/RawTextInput.cpp b/src/ogfx/gui/RawTextInput.cpp index 6b715e1..3fbcc22 100644 --- a/src/ogfx/gui/RawTextInput.cpp +++ b/src/ogfx/gui/RawTextInput.cpp @@ -28,20 +28,20 @@ namespace ogfx { RawTextInput::EventListener::EventListener(RawTextInput& _parent) : parent(_parent) { - connectSignal(ostd::tBuiltinSignals::KeyPressed); - connectSignal(ostd::tBuiltinSignals::KeyReleased); - connectSignal(ostd::tBuiltinSignals::TextEntered); - connectSignal(ostd::tBuiltinSignals::MouseDragged); - connectSignal(ostd::tBuiltinSignals::MouseMoved); - connectSignal(ostd::tBuiltinSignals::MousePressed); - connectSignal(ostd::tBuiltinSignals::MouseReleased); - connectSignal(ostd::tBuiltinSignals::OnGuiEvent); - connectSignal(ostd::tBuiltinSignals::WindowResized); + connectSignal(ostd::BuiltinSignals::KeyPressed); + connectSignal(ostd::BuiltinSignals::KeyReleased); + connectSignal(ostd::BuiltinSignals::TextEntered); + connectSignal(ostd::BuiltinSignals::MouseDragged); + connectSignal(ostd::BuiltinSignals::MouseMoved); + connectSignal(ostd::BuiltinSignals::MousePressed); + connectSignal(ostd::BuiltinSignals::MouseReleased); + connectSignal(ostd::BuiltinSignals::OnGuiEvent); + connectSignal(ostd::BuiltinSignals::WindowResized); } - void RawTextInput::EventListener::handleSignal(ostd::tSignal& signal) + void RawTextInput::EventListener::handleSignal(ostd::Signal& signal) { - if (signal.ID == ostd::tBuiltinSignals::TextEntered) + if (signal.ID == ostd::BuiltinSignals::TextEntered) { if (m_lastEvent != eEventType::TextEntered) { @@ -75,7 +75,7 @@ namespace ogfx parent.m_cursorState = true; } } - else if (signal.ID == ostd::tBuiltinSignals::KeyPressed) + else if (signal.ID == ostd::BuiltinSignals::KeyPressed) { if (m_lastEvent != eEventType::KeyPressed) { @@ -132,17 +132,17 @@ namespace ogfx parent.m_keyRepeatCounter.start(); parent.m_lastKeyCode = data.keyCode; ActionEventData aed(parent, parent.getName(), eActionEventType::Enter, ostd::BaseObject::InvalidRef()); - ostd::SignalHandler::emitSignal(RawTextInput::actionEventSignalID, ostd::tSignalPriority::RealTime, aed); + ostd::SignalHandler::emitSignal(RawTextInput::actionEventSignalID, ostd::Signal::Priority::RealTime, aed); } else if (data.keyCode == SDLK_TAB) { parent.m_keyRepeatCounter.start(); parent.m_lastKeyCode = data.keyCode; ActionEventData aed(parent, parent.getName(), eActionEventType::Tab, ostd::BaseObject::InvalidRef()); - ostd::SignalHandler::emitSignal(RawTextInput::actionEventSignalID, ostd::tSignalPriority::RealTime, aed); + ostd::SignalHandler::emitSignal(RawTextInput::actionEventSignalID, ostd::Signal::Priority::RealTime, aed); } } - else if (signal.ID == ostd::tBuiltinSignals::MouseMoved) + else if (signal.ID == ostd::BuiltinSignals::MouseMoved) { auto& data = (ogfx::MouseEventData&)signal.userData; if (parent.contains((float)data.position_x, (float)data.position_y)) @@ -150,7 +150,7 @@ namespace ogfx else parent.m_mouseInside = false; } - else if (signal.ID == ostd::tBuiltinSignals::MousePressed) + else if (signal.ID == ostd::BuiltinSignals::MousePressed) { auto& data = (ogfx::MouseEventData&)signal.userData; if (data.button == ogfx::MouseEventData::eButton::Left && parent.m_gfx != nullptr && parent.m_mouseInside) @@ -284,9 +284,9 @@ namespace ogfx - void RawTextInputEventListener::onSignalHandled(ostd::tSignal& signal) + void RawTextInputEventListener::onSignalHandled(ostd::Signal& signal) { - if (signal.ID == ostd::tBuiltinSignals::MouseMoved) + if (signal.ID == ostd::BuiltinSignals::MouseMoved) { auto& data = (ogfx::MouseEventData&)signal.userData; if (getParent().isMouseInside()) diff --git a/src/ogfx/gui/RawTextInput.hpp b/src/ogfx/gui/RawTextInput.hpp index 0310201..76074e3 100644 --- a/src/ogfx/gui/RawTextInput.hpp +++ b/src/ogfx/gui/RawTextInput.hpp @@ -34,8 +34,8 @@ namespace ogfx public: enum class eEventType { None = 0, TextEntered, KeyPressed, KeyReleased }; public: EventListener(RawTextInput& _parent); - virtual void handleSignal(ostd::tSignal& signal) override; - inline virtual void onSignalHandled(ostd::tSignal& signal) { } + virtual void handleSignal(ostd::Signal& signal) override; + inline virtual void onSignalHandled(ostd::Signal& signal) { } inline RawTextInput& getParent(void) { return parent; } private: @@ -171,7 +171,7 @@ namespace ogfx { public: inline RawTextInputEventListener(ogfx::gui::RawTextInput& _parent, ogfx::WindowCore& _window) : ogfx::gui::RawTextInput::EventListener::EventListener(_parent), window(_window) { } - void onSignalHandled(ostd::tSignal& signal) override; + void onSignalHandled(ostd::Signal& signal) override; public: ogfx::WindowCore& window; diff --git a/src/ogfx/gui/Window.cpp b/src/ogfx/gui/Window.cpp index 9ff4009..ac01ec1 100644 --- a/src/ogfx/gui/Window.cpp +++ b/src/ogfx/gui/Window.cpp @@ -71,18 +71,18 @@ namespace ogfx validate(); setSize(m_windowWidth, m_windowHeight); - connectSignal(ostd::tBuiltinSignals::KeyPressed); - connectSignal(ostd::tBuiltinSignals::KeyReleased); - connectSignal(ostd::tBuiltinSignals::TextEntered); - connectSignal(ostd::tBuiltinSignals::MousePressed); - connectSignal(ostd::tBuiltinSignals::MouseReleased); - connectSignal(ostd::tBuiltinSignals::MouseMoved); - connectSignal(ostd::tBuiltinSignals::MouseMoved); - connectSignal(ostd::tBuiltinSignals::OnGuiEvent); - connectSignal(ostd::tBuiltinSignals::WindowClosed); - connectSignal(ostd::tBuiltinSignals::WindowResized); - connectSignal(ostd::tBuiltinSignals::WindowFocused); - connectSignal(ostd::tBuiltinSignals::WindowLostFocus); + connectSignal(ostd::BuiltinSignals::KeyPressed); + connectSignal(ostd::BuiltinSignals::KeyReleased); + connectSignal(ostd::BuiltinSignals::TextEntered); + connectSignal(ostd::BuiltinSignals::MousePressed); + connectSignal(ostd::BuiltinSignals::MouseReleased); + connectSignal(ostd::BuiltinSignals::MouseMoved); + connectSignal(ostd::BuiltinSignals::MouseMoved); + connectSignal(ostd::BuiltinSignals::OnGuiEvent); + connectSignal(ostd::BuiltinSignals::WindowClosed); + connectSignal(ostd::BuiltinSignals::WindowResized); + connectSignal(ostd::BuiltinSignals::WindowFocused); + connectSignal(ostd::BuiltinSignals::WindowLostFocus); __on_window_init(width, height, title); } @@ -97,14 +97,14 @@ namespace ogfx { __on_window_close(); m_running = false; - ostd::SignalHandler::emitSignal(ostd::tBuiltinSignals::WindowClosed, ostd::tSignalPriority::Normal, *this); + ostd::SignalHandler::emitSignal(ostd::BuiltinSignals::WindowClosed, ostd::Signal::Priority::Normal, *this); } void WindowCore::setSize(int32_t width, int32_t height) { if (!isInitialized()) return; SDL_SetWindowSize(m_window, width, height); - ostd::SignalHandler::emitSignal(ostd::tBuiltinSignals::WindowResized, ostd::tSignalPriority::RealTime); + ostd::SignalHandler::emitSignal(ostd::BuiltinSignals::WindowResized, ostd::Signal::Priority::RealTime); } void WindowCore::setTitle(const ostd::String& title) @@ -166,7 +166,7 @@ namespace ogfx SDL_PushEvent(&e); } - void WindowCore::handleSignal(ostd::tSignal& signal) + void WindowCore::handleSignal(ostd::Signal& signal) { __on_signal(signal); } @@ -215,6 +215,7 @@ namespace ogfx void WindowCore::after_render(void) { SDL_RenderPresent(m_renderer); + ostd::SignalHandler::handleDelegateSignals(); } void WindowCore::__handle_event(SDL_Event& event) @@ -229,11 +230,11 @@ namespace ogfx } else if (event.type == SDL_EVENT_WINDOW_FOCUS_GAINED) { - ostd::SignalHandler::emitSignal(ostd::tBuiltinSignals::WindowFocused, ostd::tSignalPriority::RealTime, *this); + ostd::SignalHandler::emitSignal(ostd::BuiltinSignals::WindowFocused, ostd::Signal::Priority::RealTime, *this); } else if (event.type == SDL_EVENT_WINDOW_FOCUS_LOST) { - ostd::SignalHandler::emitSignal(ostd::tBuiltinSignals::WindowLostFocus, ostd::tSignalPriority::RealTime, *this); + ostd::SignalHandler::emitSignal(ostd::BuiltinSignals::WindowLostFocus, ostd::Signal::Priority::RealTime, *this); } else if (event.type == SDL_EVENT_WINDOW_RESIZED) { @@ -241,17 +242,17 @@ namespace ogfx SDL_GetWindowSize(m_window, &m_windowWidth, &m_windowHeight); wrd.new_width = m_windowWidth; wrd.new_height = m_windowHeight; - ostd::SignalHandler::emitSignal(ostd::tBuiltinSignals::WindowResized, ostd::tSignalPriority::RealTime, wrd); + ostd::SignalHandler::emitSignal(ostd::BuiltinSignals::WindowResized, ostd::Signal::Priority::RealTime, wrd); } else if (event.type == SDL_EVENT_MOUSE_MOTION) { MouseEventData mmd = get_mouse_state(); - ostd::SignalHandler::emitSignal(ostd::tBuiltinSignals::MouseMoved, ostd::tSignalPriority::RealTime, mmd); + ostd::SignalHandler::emitSignal(ostd::BuiltinSignals::MouseMoved, ostd::Signal::Priority::RealTime, mmd); } else if (event.type == SDL_EVENT_MOUSE_BUTTON_DOWN) { MouseEventData mmd = get_mouse_state(); - ostd::SignalHandler::emitSignal(ostd::tBuiltinSignals::MousePressed, ostd::tSignalPriority::RealTime, mmd); + ostd::SignalHandler::emitSignal(ostd::BuiltinSignals::MousePressed, ostd::Signal::Priority::RealTime, mmd); } else if (event.type == SDL_EVENT_MOUSE_BUTTON_UP) { @@ -263,22 +264,22 @@ namespace ogfx case SDL_BUTTON_MASK(3): mmd.button = MouseEventData::eButton::Right; break; default: mmd.button = MouseEventData::eButton::None; break; } - ostd::SignalHandler::emitSignal(ostd::tBuiltinSignals::MouseReleased, ostd::tSignalPriority::RealTime, mmd); + ostd::SignalHandler::emitSignal(ostd::BuiltinSignals::MouseReleased, ostd::Signal::Priority::RealTime, mmd); } else if (event.type == SDL_EVENT_KEY_DOWN) { KeyEventData ked(*this, (int32_t)event.key.key, 0, KeyEventData::eKeyEvent::Pressed); - ostd::SignalHandler::emitSignal(ostd::tBuiltinSignals::KeyPressed, ostd::tSignalPriority::RealTime, ked); + ostd::SignalHandler::emitSignal(ostd::BuiltinSignals::KeyPressed, ostd::Signal::Priority::RealTime, ked); } else if (event.type == SDL_EVENT_KEY_UP) { KeyEventData ked(*this, (int32_t)event.key.key, 0, KeyEventData::eKeyEvent::Released); - ostd::SignalHandler::emitSignal(ostd::tBuiltinSignals::KeyReleased, ostd::tSignalPriority::RealTime, ked); + ostd::SignalHandler::emitSignal(ostd::BuiltinSignals::KeyReleased, ostd::Signal::Priority::RealTime, ked); } else if (event.type == SDL_EVENT_TEXT_INPUT) { KeyEventData ked(*this, 0, event.text.text[0], KeyEventData::eKeyEvent::Text); - ostd::SignalHandler::emitSignal(ostd::tBuiltinSignals::TextEntered, ostd::tSignalPriority::RealTime, ked); + ostd::SignalHandler::emitSignal(ostd::BuiltinSignals::TextEntered, ostd::Signal::Priority::RealTime, ked); } __on_event(event); } @@ -325,7 +326,7 @@ namespace ogfx m_fpsUpdateTimer.update(); } - void GraphicsWindow::__on_signal(ostd::tSignal& signal) + void GraphicsWindow::__on_signal(ostd::Signal& signal) { onSignal(signal); } @@ -384,54 +385,54 @@ namespace ogfx } } - void Window::__on_signal(ostd::tSignal& signal) + void Window::__on_signal(ostd::Signal& signal) { Event evt(*this); - if (signal.ID == ostd::tBuiltinSignals::WindowClosed) + if (signal.ID == ostd::BuiltinSignals::WindowClosed) { m_rootWidget.__onWindowClosed(evt); } - else if (signal.ID == ostd::tBuiltinSignals::WindowFocused) + else if (signal.ID == ostd::BuiltinSignals::WindowFocused) { m_rootWidget.__onWIndowFocused(evt); } - else if (signal.ID == ostd::tBuiltinSignals::WindowLostFocus) + else if (signal.ID == ostd::BuiltinSignals::WindowLostFocus) { m_rootWidget.__onWindowFocusLost(evt); } - else if (signal.ID == ostd::tBuiltinSignals::WindowResized) + else if (signal.ID == ostd::BuiltinSignals::WindowResized) { evt.windowResized = &(ogfx::WindowResizedData&)signal.userData; m_rootWidget.__onWindowResized(evt); } - else if (signal.ID == ostd::tBuiltinSignals::MouseMoved) + else if (signal.ID == ostd::BuiltinSignals::MouseMoved) { evt.mouse = &(ogfx::MouseEventData&)signal.userData; m_rootWidget.__onMouseMoved(evt); } - else if (signal.ID == ostd::tBuiltinSignals::MousePressed) + else if (signal.ID == ostd::BuiltinSignals::MousePressed) { evt.mouse = &(ogfx::MouseEventData&)signal.userData; m_rootWidget.__onMousePressed(evt); } - else if (signal.ID == ostd::tBuiltinSignals::MouseReleased) + else if (signal.ID == ostd::BuiltinSignals::MouseReleased) { evt.mouse = &(ogfx::MouseEventData&)signal.userData; m_rootWidget.__onMouseReleased(evt); } - else if (signal.ID == ostd::tBuiltinSignals::KeyPressed) + else if (signal.ID == ostd::BuiltinSignals::KeyPressed) { evt.keyboard = &(ogfx::KeyEventData&)signal.userData; m_rootWidget.__onKeyPressed(evt); } - else if (signal.ID == ostd::tBuiltinSignals::KeyReleased) + else if (signal.ID == ostd::BuiltinSignals::KeyReleased) { evt.keyboard = &(ogfx::KeyEventData&)signal.userData; m_rootWidget.__onKeyReleased(evt); if (evt.keyboard->keyCode == SDLK_ESCAPE) close(); } - else if (signal.ID == ostd::tBuiltinSignals::TextEntered) + else if (signal.ID == ostd::BuiltinSignals::TextEntered) { evt.keyboard = &(ogfx::KeyEventData&)signal.userData; m_rootWidget.__onTextEntered(evt); diff --git a/src/ogfx/gui/Window.hpp b/src/ogfx/gui/Window.hpp index 47c1375..eff97f5 100644 --- a/src/ogfx/gui/Window.hpp +++ b/src/ogfx/gui/Window.hpp @@ -49,7 +49,7 @@ namespace ogfx void setIcon(const ostd::String& iconFilePath); void setBlockingEventsRefreshFPS(uint32_t fps); void requestRedraw(void); - void handleSignal(ostd::tSignal& signal) override; + void handleSignal(ostd::Signal& signal) override; inline bool isInitialized(void) const { return m_initialized; } inline bool isRunning(void) const { return m_running; } @@ -77,7 +77,7 @@ namespace ogfx inline virtual void __on_window_init(int32_t width, int32_t height, const ostd::String& title) { } inline virtual void __on_window_destroy(void) { } inline virtual void __on_window_close(void) { } - inline virtual void __on_signal(ostd::tSignal& signal) { } + inline virtual void __on_signal(ostd::Signal& signal) { } inline virtual void __main_loop(void) = 0; private: @@ -126,7 +126,7 @@ namespace ogfx inline virtual void onDestroy(void) { } inline virtual void onClose(void) { } inline virtual void onSDLEvent(SDL_Event& event) { } - inline virtual void onSignal(ostd::tSignal& signal) { } + inline virtual void onSignal(ostd::Signal& signal) { } inline int32_t getFPS(void) const { return m_fps; } @@ -136,7 +136,7 @@ namespace ogfx void __on_window_destroy(void) override; void __on_window_close(void) override; void __main_loop(void) override; - void __on_signal(ostd::tSignal& signal) override; + void __on_signal(ostd::Signal& signal) override; private: int32_t m_fps { 0 }; @@ -161,7 +161,7 @@ namespace ogfx inline virtual void onClose(void) { } inline virtual void onSDLEvent(SDL_Event& event) { } inline virtual void onRedraw(BasicRenderer2D& gfx) { } - inline virtual void onSignal(ostd::tSignal& signal) { } + inline virtual void onSignal(ostd::Signal& signal) { } inline const gui::Theme& theme(void) const { return *m_guiTheme; } void setTheme(const gui::Theme& theme); @@ -173,7 +173,7 @@ namespace ogfx void __on_window_destroy(void) override; void __on_window_close(void) override; void __main_loop(void) override; - void __on_signal(ostd::tSignal& signal) override; + void __on_signal(ostd::Signal& signal) override; private: BasicRenderer2D m_gfx; diff --git a/src/ogfx/render/FontUtils.cpp b/src/ogfx/render/FontUtils.cpp index 3cf3ea2..db6c1d4 100644 --- a/src/ogfx/render/FontUtils.cpp +++ b/src/ogfx/render/FontUtils.cpp @@ -26,14 +26,14 @@ namespace ogfx TTFRenderer::SignalHandler::SignalHandler(TTFRenderer& parent) : m_parent(parent) { enableSignals(); - connectSignal(ostd::tBuiltinSignals::BeforeSDLShutdown); + connectSignal(ostd::BuiltinSignals::BeforeSDLShutdown); setTypeName("ostd::GraphicsWindowOutputHandler::SignalHandler"); validate(); } - void TTFRenderer::SignalHandler::handleSignal(ostd::tSignal& signal) + void TTFRenderer::SignalHandler::handleSignal(ostd::Signal& signal) { - if (signal.ID == ostd::tBuiltinSignals::BeforeSDLShutdown) + if (signal.ID == ostd::BuiltinSignals::BeforeSDLShutdown) { m_parent.closeFont(); } diff --git a/src/ogfx/render/FontUtils.hpp b/src/ogfx/render/FontUtils.hpp index 0207fdb..48b3e9f 100644 --- a/src/ogfx/render/FontUtils.hpp +++ b/src/ogfx/render/FontUtils.hpp @@ -32,7 +32,7 @@ namespace ogfx { public: SignalHandler(TTFRenderer& parent); - void handleSignal(ostd::tSignal& signal) override; + void handleSignal(ostd::Signal& signal) override; private: TTFRenderer& m_parent; diff --git a/src/ogfx/render/PixelRenderer.cpp b/src/ogfx/render/PixelRenderer.cpp index e28a80a..43d518c 100644 --- a/src/ogfx/render/PixelRenderer.cpp +++ b/src/ogfx/render/PixelRenderer.cpp @@ -144,14 +144,14 @@ namespace ogfx m_windowHeight = parent.getWindowHeight(); setTypeName("ogfx::PixelRenderer"); enableSignals(); - connectSignal(ostd::tBuiltinSignals::WindowResized); + connectSignal(ostd::BuiltinSignals::WindowResized); validate(); } - void PixelRenderer::handleSignal(ostd::tSignal& signal) + void PixelRenderer::handleSignal(ostd::Signal& signal) { if (isInvalid()) return; - if (signal.ID == ostd::tBuiltinSignals::WindowResized) + if (signal.ID == ostd::BuiltinSignals::WindowResized) { m_pixels = ostd::Memory::resizeArray(m_pixels, m_parent->getWindowWidth() * m_parent->getWindowHeight()); SDL_DestroyTexture(m_texture); diff --git a/src/ogfx/render/PixelRenderer.hpp b/src/ogfx/render/PixelRenderer.hpp index d0ba46c..700c21b 100644 --- a/src/ogfx/render/PixelRenderer.hpp +++ b/src/ogfx/render/PixelRenderer.hpp @@ -84,7 +84,7 @@ namespace ogfx inline PixelRenderer(void) { invalidate(); } ~PixelRenderer(void); void initialize(WindowCore& parent); - void handleSignal(ostd::tSignal& signal) override; + void handleSignal(ostd::Signal& signal) override; void updateBuffer(void); void displayBuffer(void); inline uint32_t* getScreenPixels(void) { return m_pixels; } diff --git a/src/ogfx/utils/SDLInclude.hpp b/src/ogfx/utils/SDLInclude.hpp index 082e157..766b170 100644 --- a/src/ogfx/utils/SDLInclude.hpp +++ b/src/ogfx/utils/SDLInclude.hpp @@ -69,7 +69,7 @@ namespace ogfx static inline void shutdown_sdl(void) { - ostd::SignalHandler::emitSignal(ostd::tBuiltinSignals::BeforeSDLShutdown, ostd:: tSignalPriority::RealTime); + ostd::SignalHandler::emitSignal(ostd::BuiltinSignals::BeforeSDLShutdown, ostd:: Signal::Priority::RealTime); TTF_Quit(); SDL_Quit(); } diff --git a/src/ostd/data/BaseObject.cpp b/src/ostd/data/BaseObject.cpp index 0644f16..470612b 100755 --- a/src/ostd/data/BaseObject.cpp +++ b/src/ostd/data/BaseObject.cpp @@ -9,7 +9,7 @@ namespace ostd BaseObject::BaseObject(const BaseObject& copy) { m_uid = copy.m_uid; - m_oid = copy.m_oid; + m_oid = BaseObject::s_next_oid++; m_valid = copy.m_valid; m_typeName = copy.m_typeName; m_signalsEnabled = copy.m_signalsEnabled; @@ -18,7 +18,7 @@ namespace ostd BaseObject& BaseObject::operator=(const BaseObject& copy) { m_uid = copy.m_uid; - m_oid = copy.m_oid; + m_oid = BaseObject::s_next_oid++; m_valid = copy.m_valid; m_typeName = copy.m_typeName; m_signalsEnabled = copy.m_signalsEnabled; @@ -52,7 +52,7 @@ namespace ostd SignalHandler::connect(*this, signal_id); } - void BaseObject::__handle_signal(tSignal& signal) + void BaseObject::__handle_signal(Signal& signal) { if (m_signalsEnabled) handleSignal(signal); diff --git a/src/ostd/data/BaseObject.hpp b/src/ostd/data/BaseObject.hpp index 4b8a66a..bdc4237 100755 --- a/src/ostd/data/BaseObject.hpp +++ b/src/ostd/data/BaseObject.hpp @@ -27,7 +27,7 @@ namespace ostd { class OutputHandlerBase; - struct tSignal; + struct Signal; class BaseObject { public: @@ -59,10 +59,10 @@ namespace ostd virtual inline String toString(void) const { return getObjectHeaderString(); }; virtual void print(bool newLine = true, OutputHandlerBase* __destination = nullptr) const; - virtual inline void handleSignal(tSignal& signal) { } + virtual inline void handleSignal(Signal& signal) { } void connectSignal(uint32_t signal_id); - void __handle_signal(tSignal& signal); + void __handle_signal(Signal& signal); friend std::ostream& operator<<(std::ostream& os, const BaseObject& obj); diff --git a/src/ostd/math/Spline.cpp b/src/ostd/math/Spline.cpp index 70dde38..817d0f8 100755 --- a/src/ostd/math/Spline.cpp +++ b/src/ostd/math/Spline.cpp @@ -6,7 +6,7 @@ namespace ostd { } - void Spline::handleSignal(tSignal& signal) + void Spline::handleSignal(Signal& signal) { // if (!isEditable()) return; // if (isUsingCustomEventHandler() && m_eventHandlerCallback) @@ -14,7 +14,7 @@ namespace ostd // m_eventHandlerCallback(signal); // return; // } - // if (signal.ID == tBuiltinSignals::MousePressed) + // if (signal.ID == BuiltinSignals::MousePressed) // { // ogfx::MouseEventData& evt = static_cast(signal.userData); // for (auto& node : m_points) @@ -26,13 +26,13 @@ namespace ostd // } // } // } - // else if (signal.ID == tBuiltinSignals::MouseReleased) + // else if (signal.ID == BuiltinSignals::MouseReleased) // { // if (m_selectedNode != nullptr) // updateTotalLength(); // m_selectedNode = nullptr; // } - // else if (signal.ID == tBuiltinSignals::MouseMoved) + // else if (signal.ID == BuiltinSignals::MouseMoved) // { // ogfx::MouseEventData& evt = static_cast(signal.userData); // if (m_selectedNode != nullptr) @@ -140,9 +140,9 @@ namespace ostd void Spline::connectSignals(void) { if (m_signalsConnected) return; - connectSignal(tBuiltinSignals::MouseMoved); - connectSignal(tBuiltinSignals::MousePressed); - connectSignal(tBuiltinSignals::MouseReleased); + connectSignal(BuiltinSignals::MouseMoved); + connectSignal(BuiltinSignals::MousePressed); + connectSignal(BuiltinSignals::MouseReleased); m_signalsConnected = true; } diff --git a/src/ostd/math/Spline.hpp b/src/ostd/math/Spline.hpp index 0930802..2f380ba 100755 --- a/src/ostd/math/Spline.hpp +++ b/src/ostd/math/Spline.hpp @@ -35,12 +35,12 @@ namespace ostd class Spline : public BaseObject { public: - using EventHandlerCallback = std::function; + using EventHandlerCallback = std::function; using DrawCallback = std::function; public: Spline(void); - void handleSignal(tSignal& signal) override; + void handleSignal(Signal& signal) override; tSplineNode getPoint(float t); tSplineNode getGradient(float t); float updateSegmentLength(int32_t node); diff --git a/src/ostd/utils/Signals.cpp b/src/ostd/utils/Signals.cpp index 76a679c..22def90 100755 --- a/src/ostd/utils/Signals.cpp +++ b/src/ostd/utils/Signals.cpp @@ -1,136 +1,44 @@ #include "Signals.hpp" #include "../data/BaseObject.hpp" -#include "../io/Logger.hpp" namespace ostd { void SignalHandler::init(bool allow_reinit) { if (m_initialized && !allow_reinit) return; - SignalHandler::m_customRecievers.clear(); - SignalHandler::m_customRecievers.reserve(SignalHandler::__SIGNAL_BUFFER_START_SIZE); - SignalHandler::m_mousePressedRecievers.clear(); - SignalHandler::m_mousePressedRecievers.reserve(SignalHandler::__SIGNAL_BUFFER_START_SIZE); - SignalHandler::m_mouseReleasedRecievers.clear(); - SignalHandler::m_mouseReleasedRecievers.reserve(SignalHandler::__SIGNAL_BUFFER_START_SIZE); - SignalHandler::m_keyPressedRecievers.clear(); - SignalHandler::m_keyPressedRecievers.reserve(SignalHandler::__SIGNAL_BUFFER_START_SIZE); - SignalHandler::m_keyReleasedRecievers.clear(); - SignalHandler::m_keyReleasedRecievers.reserve(SignalHandler::__SIGNAL_BUFFER_START_SIZE); - SignalHandler::m_mouseMovedRecievers.clear(); - SignalHandler::m_mouseMovedRecievers.reserve(SignalHandler::__SIGNAL_BUFFER_START_SIZE); - SignalHandler::m_mouseDraggedRecievers.clear(); - SignalHandler::m_mouseDraggedRecievers.reserve(SignalHandler::__SIGNAL_BUFFER_START_SIZE); - SignalHandler::m_textEnteredRecievers.clear(); - SignalHandler::m_textEnteredRecievers.reserve(SignalHandler::__SIGNAL_BUFFER_START_SIZE); - SignalHandler::m_windowResizedRecievers.clear(); - SignalHandler::m_windowResizedRecievers.reserve(SignalHandler::__SIGNAL_BUFFER_START_SIZE); - SignalHandler::m_windowClosedRecievers.clear(); - SignalHandler::m_windowClosedRecievers.reserve(SignalHandler::__SIGNAL_BUFFER_START_SIZE); - SignalHandler::m_windowFocusedRecievers.clear(); - SignalHandler::m_windowFocusedRecievers.reserve(SignalHandler::__SIGNAL_BUFFER_START_SIZE); - SignalHandler::m_windowLostFocusRecievers.clear(); - SignalHandler::m_windowLostFocusRecievers.reserve(SignalHandler::__SIGNAL_BUFFER_START_SIZE); - SignalHandler::m_delegatedSignals.clear(); - SignalHandler::m_delegatedSignals.reserve(SignalHandler::__DELEGATED_SIGNALS_BUFFER_START_SIZE); - SignalHandler::m_onGuiEventRecievers.clear(); - SignalHandler::m_onGuiEventRecievers.reserve(SignalHandler::__SIGNAL_BUFFER_START_SIZE); - SignalHandler::m_beforeSDLShutdownRecievers.clear(); - SignalHandler::m_beforeSDLShutdownRecievers.reserve(SignalHandler::__SIGNAL_BUFFER_START_SIZE); + m_recievers.clear(); + m_recievers.reserve(__SIGNAL_BUFFER_START_SIZE); + m_DelegateRecievers.clear(); + m_DelegateRecievers.reserve(__DELEGATE_SIGNALS_BUFFER_START_SIZE); m_initialized = true; } - void SignalHandler::refresh(void) + void SignalHandler::handleDelegateSignals(void) { - for (auto& ds : SignalHandler::m_delegatedSignals) - SignalHandler::emitSignal(ds.id, tSignalPriority::RealTime, ds.ud); - SignalHandler::m_delegatedSignals.clear(); - //m_delegatedSignals.reserve(__DELEGATED_SIGNALS_BUFFER_START_SIZE); + for (auto& delegate : m_DelegateRecievers) + emitSignal(delegate.id, Signal::Priority::RealTime, delegate.ud); + m_DelegateRecievers.clear(); } void SignalHandler::emitSignal(uint32_t signal_id, uint8_t prio, BaseObject& userData) { - if (prio == tSignalPriority::Normal) + if (prio == Signal::Priority::Normal) { - SignalHandler::m_delegatedSignals.push_back({ signal_id, userData }); + SignalHandler::m_DelegateRecievers.push_back({ signal_id, userData }); return; } - tSignal signal { signal_id, userData, prio }; - std::vector* sig_list = nullptr; - if (signal_id == tBuiltinSignals::MousePressed) - sig_list = &m_mousePressedRecievers; - else if (signal_id == tBuiltinSignals::MouseReleased) - sig_list = &m_mouseReleasedRecievers; - else if (signal_id == tBuiltinSignals::KeyPressed) - sig_list = &m_keyPressedRecievers; - else if (signal_id == tBuiltinSignals::KeyReleased) - sig_list = &m_keyReleasedRecievers; - else if (signal_id == tBuiltinSignals::MouseMoved) - sig_list = &m_mouseMovedRecievers; - else if (signal_id == tBuiltinSignals::MouseDragged) - sig_list = &m_mouseDraggedRecievers; - else if (signal_id == tBuiltinSignals::TextEntered) - sig_list = &m_textEnteredRecievers; - else if (signal_id == tBuiltinSignals::WindowResized) - sig_list = &m_windowResizedRecievers; - else if (signal_id == tBuiltinSignals::WindowClosed) - sig_list = &m_windowClosedRecievers; - else if (signal_id == tBuiltinSignals::WindowLostFocus) - sig_list = &m_windowLostFocusRecievers; - else if (signal_id == tBuiltinSignals::WindowFocused) - sig_list = &m_windowFocusedRecievers; - else if (signal_id == tBuiltinSignals::OnGuiEvent) - sig_list = &m_onGuiEventRecievers; - else if (signal_id == tBuiltinSignals::BeforeSDLShutdown) - sig_list = &m_beforeSDLShutdownRecievers; - else if (signal_id > tBuiltinSignals::CustomSignalBase) - sig_list = &m_customRecievers; - if (sig_list == nullptr) - { - OX_WARN("ox::SignalHandler::emitSignal(...): Unknown signal ID: <%d>", signal_id); + Signal signal { signal_id, userData, prio }; + if (m_recievers.count(signal_id) < 1) return; - } - for (auto& sop : *sig_list) + for (auto& obj : m_recievers[signal_id]) { - if (sop.signal_id == signal_id) - { - sop.object->__handle_signal(signal); - if (signal.handled) return; - } + obj->__handle_signal(signal); + if (signal.handled) return; } } void SignalHandler::connect(BaseObject& object, uint32_t signal_id) { - if (signal_id == tBuiltinSignals::MousePressed) - m_mousePressedRecievers.push_back({ &object, signal_id }); - else if (signal_id == tBuiltinSignals::MouseReleased) - m_mouseReleasedRecievers.push_back({ &object, signal_id }); - else if (signal_id == tBuiltinSignals::KeyPressed) - m_keyPressedRecievers.push_back({ &object, signal_id }); - else if (signal_id == tBuiltinSignals::KeyReleased) - m_keyReleasedRecievers.push_back({ &object, signal_id }); - else if (signal_id == tBuiltinSignals::MouseMoved) - m_mouseMovedRecievers.push_back({ &object, signal_id }); - else if (signal_id == tBuiltinSignals::MouseDragged) - m_mouseDraggedRecievers.push_back({ &object, signal_id }); - else if (signal_id == tBuiltinSignals::TextEntered) - m_textEnteredRecievers.push_back({ &object, signal_id }); - else if (signal_id == tBuiltinSignals::WindowResized) - m_windowResizedRecievers.push_back({ &object, signal_id }); - else if (signal_id == tBuiltinSignals::WindowClosed) - m_windowClosedRecievers.push_back({ &object, signal_id }); - else if (signal_id == tBuiltinSignals::WindowLostFocus) - m_windowLostFocusRecievers.push_back({ &object, signal_id }); - else if (signal_id == tBuiltinSignals::WindowFocused) - m_windowFocusedRecievers.push_back({ &object, signal_id }); - else if (signal_id == tBuiltinSignals::OnGuiEvent) - m_onGuiEventRecievers.push_back({ &object, signal_id }); - else if (signal_id == tBuiltinSignals::BeforeSDLShutdown) - m_beforeSDLShutdownRecievers.push_back({ &object, signal_id }); - else if (signal_id > tBuiltinSignals::CustomSignalBase) - m_customRecievers.push_back({ &object, signal_id }); - else - OX_WARN("ox::SignalHandler::connect(...): Unknown signal ID: <%d>", signal_id); + m_recievers[signal_id].push_back(&object); } } diff --git a/src/ostd/utils/Signals.hpp b/src/ostd/utils/Signals.hpp index 2b37b0f..b640792 100755 --- a/src/ostd/utils/Signals.hpp +++ b/src/ostd/utils/Signals.hpp @@ -22,15 +22,12 @@ #include #include +#include #include namespace ostd { - //INFO: (Note to self) When adding new Builtin signals, the corresponding static list must - // be addeed to the ox::SignalHandler class, and the appropriate branch must be added - // to the ox::SignalHandler::emitSignal and the ox::SignalHandler::connect functions. - // Also, correct initialization in the ox::SignalHandler::init function must be added - struct tBuiltinSignals + struct BuiltinSignals { inline static constexpr uint32_t NoSignal = 0x0000; @@ -56,68 +53,41 @@ namespace ostd inline static constexpr uint32_t CustomSignalBase = 0xFF0000; }; - struct tSignalPriority - { - inline static constexpr uint8_t RealTime = 0; - inline static constexpr uint8_t Normal = 1; - }; - - struct tSignal + struct Signal { + struct Priority + { + inline static constexpr uint8_t RealTime = 0; + inline static constexpr uint8_t Normal = 1; + }; const uint8_t priority; const uint32_t ID; bool handled { false }; BaseObject& userData; - inline tSignal(uint32_t id, BaseObject& _userData = BaseObject::InvalidRef(), uint8_t prio = tSignalPriority::Normal) : priority(prio), ID(id), userData(_userData) { } + inline Signal(uint32_t id, BaseObject& _userData = BaseObject::InvalidRef(), uint8_t prio = Signal::Priority::Normal) : priority(prio), ID(id), userData(_userData) { } }; class SignalHandler { - private: struct tSignalObjPair - { - BaseObject* object { nullptr }; - uint32_t signal_id { tBuiltinSignals::NoSignal }; - }; - private: struct tDelegateSignal + private: struct DelegateSignal { uint32_t id; BaseObject& ud; - - inline tDelegateSignal(uint32_t _id, BaseObject& _ud) : id(_id), ud(_ud) { } + inline DelegateSignal(uint32_t _id, BaseObject& _ud) : id(_id), ud(_ud) { } }; public: static void init(bool allow_reinit = false); - static void refresh(void); - - static void emitSignal(uint32_t signal_id, uint8_t prio = tSignalPriority::Normal, BaseObject& userData = BaseObject::InvalidRef()); + static void handleDelegateSignals(void); + static void emitSignal(uint32_t signal_id, uint8_t prio = Signal::Priority::RealTime, BaseObject& userData = BaseObject::InvalidRef()); static void connect(BaseObject& object, uint32_t signal_id); - - inline static uint32_t newCustomSignal(uint32_t sub_id) { return tBuiltinSignals::CustomSignalBase + sub_id; } + inline static uint32_t newCustomSignal(uint32_t sub_id) { return BuiltinSignals::CustomSignalBase + sub_id; } private: - inline static std::vector m_customRecievers; - inline static std::vector m_delegatedSignals; - - /** Builtin signal recievers lists **/ - inline static std::vector m_mousePressedRecievers; - inline static std::vector m_mouseReleasedRecievers; - inline static std::vector m_keyPressedRecievers; - inline static std::vector m_keyReleasedRecievers; - inline static std::vector m_mouseMovedRecievers; - inline static std::vector m_mouseDraggedRecievers; - inline static std::vector m_textEnteredRecievers; - inline static std::vector m_windowResizedRecievers; - inline static std::vector m_windowClosedRecievers; - inline static std::vector m_windowFocusedRecievers; - inline static std::vector m_windowLostFocusRecievers; - inline static std::vector m_onGuiEventRecievers; - inline static std::vector m_beforeSDLShutdownRecievers; - /************************************/ - - inline static constexpr uint16_t __SIGNAL_BUFFER_START_SIZE { 128 }; - inline static constexpr uint16_t __DELEGATED_SIGNALS_BUFFER_START_SIZE { 128 }; - + inline static std::unordered_map> m_recievers; + inline static std::vector m_DelegateRecievers; + inline static constexpr uint16_t __SIGNAL_BUFFER_START_SIZE { 2048 }; + inline static constexpr uint16_t __DELEGATE_SIGNALS_BUFFER_START_SIZE { 2048 }; inline static bool m_initialized { false }; }; } diff --git a/src/test/GraphicsWindowTest.cpp b/src/test/GraphicsWindowTest.cpp index cd5a453..8299ac3 100644 --- a/src/test/GraphicsWindowTest.cpp +++ b/src/test/GraphicsWindowTest.cpp @@ -41,9 +41,9 @@ class Window : public ogfx::GraphicsWindow m_textInput.getTheme().extraPaddingTop = 3; } - inline void handleSignal(ostd::tSignal& signal) override + inline void handleSignal(ostd::Signal& signal) override { - if (signal.ID == ostd::tBuiltinSignals::KeyReleased) + if (signal.ID == ostd::BuiltinSignals::KeyReleased) { auto& evtData = (ogfx::KeyEventData&)signal.userData; if (evtData.keyCode == SDLK_ESCAPE) diff --git a/src/test/GuiTest.cpp b/src/test/GuiTest.cpp index 1c9f929..1417ce9 100644 --- a/src/test/GuiTest.cpp +++ b/src/test/GuiTest.cpp @@ -66,9 +66,9 @@ class Window : public ogfx::gui::Window setTheme(m_theme); } - inline void onSignal(ostd::tSignal& signal) override + inline void onSignal(ostd::Signal& signal) override { - if (signal.ID == ostd::tBuiltinSignals::KeyReleased) + if (signal.ID == ostd::BuiltinSignals::KeyReleased) { auto& evtData = (ogfx::KeyEventData&)signal.userData; if (evtData.keyCode == SDLK_ESCAPE)