diff --git a/extra/DefaultTheme.oss b/extra/DefaultTheme.oss index 7c26c5c..ca6b1e2 100644 --- a/extra/DefaultTheme.oss +++ b/extra/DefaultTheme.oss @@ -78,7 +78,7 @@ const $accentColorDark = #6B0A1DFF (scrollbar) { (thumb) { color = rgb(140, 140, 140) - borderRadius = 16.0 + borderRadius = 30.0 borderColor = rgb(150, 150, 150) showBorder = true } diff --git a/src/ogfx/gui/widgets/Button.cpp b/src/ogfx/gui/widgets/Button.cpp index 270e76a..76457dd 100644 --- a/src/ogfx/gui/widgets/Button.cpp +++ b/src/ogfx/gui/widgets/Button.cpp @@ -62,6 +62,14 @@ namespace ogfx m_anim.update(); } + void Button::onMouseReleased(const Event& event) + { + if (!isMouseInside()) + return; + if (event.mouse->button == MouseEventData::eButton::Left && callback_onActionPerformed) + callback_onActionPerformed(event); + } + void Button::setText(const String& text) { m_text = text; diff --git a/src/ogfx/gui/widgets/Button.hpp b/src/ogfx/gui/widgets/Button.hpp index 3a9769d..bf2eac1 100644 --- a/src/ogfx/gui/widgets/Button.hpp +++ b/src/ogfx/gui/widgets/Button.hpp @@ -38,6 +38,7 @@ namespace ogfx Button& create(const String& text); void onDraw(ogfx::BasicRenderer2D& gfx) override; void onUpdate(void) override; + void onMouseReleased(const Event& event) override; void setText(const String& text); void setIcon(const String& filePath); void applyTheme(const ostd::Stylesheet& theme) override; diff --git a/src/ogfx/gui/widgets/Widget.cpp b/src/ogfx/gui/widgets/Widget.cpp index 45b89c8..8ae2065 100644 --- a/src/ogfx/gui/widgets/Widget.cpp +++ b/src/ogfx/gui/widgets/Widget.cpp @@ -235,6 +235,7 @@ namespace ogfx case eCallback::WindowResized: callback_onWindowResized = std::move(callback); break; case eCallback::WindowFocused: callback_onWindowFocused = std::move(callback); break; case eCallback::WindowFocusLost: callback_onWindowFocusLost = std::move(callback); break; + case eCallback::ActionPerformed: callback_onActionPerformed = std::move(callback); break; default: break; } } @@ -272,7 +273,7 @@ namespace ogfx void Widget::__onMousePressed(const Event& event) { - if (event.isHandled()) return; + if (event.isHandled() || !isMousePressedEventEnabled()) return; setThemeQualifier("pressed"); if (hasChildren()) m_widgets.onMousePressed(event); @@ -287,7 +288,7 @@ namespace ogfx void Widget::__onMouseReleased(const Event& event) { - if (event.isHandled()) return; + if (event.isHandled() || !isMouseReleasedEventEnabled()) return; setThemeQualifier("pressed", false); m_pressedButton = ogfx::MouseEventData::eButton::None; if (hasChildren()) @@ -314,7 +315,7 @@ namespace ogfx void Widget::__onMouseMoved(const Event& event) { - if (event.isHandled()) return; + if (event.isHandled() || !isMouseMovedEventEnabled()) return; if (hasChildren()) m_widgets.onMouseMoved(event); if (!event.isHandled()) @@ -329,7 +330,7 @@ namespace ogfx void Widget::__onMouseScrolled(const Event& event) { - if (event.isHandled()) return; + if (event.isHandled() || !isMouseScrolledEventEnabled()) return; if (hasChildren()) m_widgets.onMouseScrolled(event); if (!event.isHandled()) @@ -342,7 +343,7 @@ namespace ogfx void Widget::__onMouseEntered(const Event& event) { - if (event.isHandled()) return; + if (event.isHandled() || !isMouseEnteredEventEnabled()) return; setThemeQualifier("hover"); if (callback_onMouseEntered) callback_onMouseEntered(event); @@ -353,7 +354,7 @@ namespace ogfx void Widget::__onMouseExited(const Event& event) { - if (event.isHandled()) return; + if (event.isHandled() || !isMouseExitedEventEnabled()) return; setThemeQualifier("hover", false); if (callback_onMouseExited) callback_onMouseExited(event); @@ -364,7 +365,7 @@ namespace ogfx void Widget::__onMouseDragged(const Event& event) { - if (event.isHandled()) return; + if (event.isHandled() || !isMouseDraggedEventEnabled()) return; if (hasChildren()) m_widgets.onMouseDragged(event); if (!event.isHandled()) @@ -379,7 +380,7 @@ namespace ogfx void Widget::__onKeyPressed(const Event& event) { - if (event.isHandled()) return; + if (event.isHandled() || !isKeyPressedEventEnabled()) return; if (hasChildren()) m_widgets.onKeyPressed(event); if (!event.isHandled()) @@ -392,7 +393,7 @@ namespace ogfx void Widget::__onKeyReleased(const Event& event) { - if (event.isHandled()) return; + if (event.isHandled() || !isKeyReleasedEventEnabled()) return; m_pressedButton = ogfx::MouseEventData::eButton::None; if (hasChildren()) m_widgets.onKeyReleased(event); @@ -406,7 +407,7 @@ namespace ogfx void Widget::__onTextEntered(const Event& event) { - if (event.isHandled()) return; + if (event.isHandled() || !isTextEnteredEventEnabled()) return; if (hasChildren()) m_widgets.onTextEntered(event); if (!event.isHandled()) diff --git a/src/ogfx/gui/widgets/Widget.hpp b/src/ogfx/gui/widgets/Widget.hpp index ed8c4e8..090ff85 100644 --- a/src/ogfx/gui/widgets/Widget.hpp +++ b/src/ogfx/gui/widgets/Widget.hpp @@ -56,7 +56,8 @@ namespace ogfx WindowClosed, WindowResized, WindowFocused, - WindowFocusLost + WindowFocusLost, + ActionPerformed }; public: using EventCallback = std::function; public: @@ -172,6 +173,21 @@ namespace ogfx OSTD_BOOL_PARAM_GETSET_E(Tooltip, m_enableTooltip); // ========================================================================== + + + // ================================= EVENT ENABLERS ================================= + OSTD_BOOL_PARAM_GETSET_E_NEG(MousePressedEvent, m_disableMousePressed); + OSTD_BOOL_PARAM_GETSET_E_NEG(MouseReleasedEvent, m_disableMouseReleased); + OSTD_BOOL_PARAM_GETSET_E_NEG(MouseMovedEvent, m_disableMouseMoved); + OSTD_BOOL_PARAM_GETSET_E_NEG(MouseScrolledEvent, m_disableMouseScrolled); + OSTD_BOOL_PARAM_GETSET_E_NEG(MouseEnteredEvent, m_disableMouseEntered); + OSTD_BOOL_PARAM_GETSET_E_NEG(MouseExitedEvent, m_disableMouseExited); + OSTD_BOOL_PARAM_GETSET_E_NEG(MouseDraggedEvent, m_disableMouseDragged); + OSTD_BOOL_PARAM_GETSET_E_NEG(KeyPressedEvent, m_disableKeyPressed); + OSTD_BOOL_PARAM_GETSET_E_NEG(KeyReleasedEvent, m_disableKeyReleased); + OSTD_BOOL_PARAM_GETSET_E_NEG(TextEnteredEvent, m_disableTextEntered); + // ================================================================================== + protected: void apply_common_theme_values(const ostd::Stylesheet& theme); inline void disableChildren(void) { m_allowChildren = false; } @@ -214,6 +230,21 @@ namespace ogfx + // ======= Event Enablers ======= + bool m_disableMousePressed { false }; + bool m_disableMouseReleased { false }; + bool m_disableMouseMoved { false }; + bool m_disableMouseScrolled { false }; + bool m_disableMouseEntered { false }; + bool m_disableMouseExited { false }; + bool m_disableMouseDragged { false }; + bool m_disableKeyPressed { false }; + bool m_disableKeyReleased { false }; + bool m_disableTextEntered { false }; + // ============================== + + + // ====== THEMING ===== String m_stylesheetCategoryName { "" }; stdvec m_themeIDList; @@ -271,6 +302,7 @@ namespace ogfx EventCallback callback_onWindowResized { nullptr }; EventCallback callback_onWindowFocused { nullptr }; EventCallback callback_onWindowFocusLost { nullptr }; + EventCallback callback_onActionPerformed { nullptr }; public: // ====================== DUMMIES ====================== diff --git a/src/test/GuiTest.cpp b/src/test/GuiTest.cpp index ff5d6b8..05e401f 100644 --- a/src/test/GuiTest.cpp +++ b/src/test/GuiTest.cpp @@ -73,7 +73,7 @@ class Window : public ogfx::gui::Window }); m_btn1.setText("BUTTON"); - m_btn1.setCallback(ogfx::gui::Widget::eCallback::MousePressed, [&](const ogfx::gui::Event& event) -> void { + m_btn1.setCallback(ogfx::gui::Widget::eCallback::ActionPerformed, [&](const ogfx::gui::Event& event) -> void { std::cout << showOpenFileDialog(filters) << "\n"; }); m_btn1.addThemeOverride("@.button.showIcon", true); @@ -119,7 +119,7 @@ class Window : public ogfx::gui::Window m_list.setSize(200, 300); - for (i32 i = 0; i < 10000; i++) + for (i32 i = 0; i < 500; i++) { m_list.addLine(ostd::Random::getString(ostd::Random::getui8(1, 40))); }