From bba79b3f1b08c60f51447e9ab192d1455817f95f Mon Sep 17 00:00:00 2001 From: ravi688 Date: Sun, 6 Oct 2024 04:37:08 +0530 Subject: [PATCH] [SUTK] Added SUTK::ToggleButtonGroupView --- dependencies/Common | 2 +- sutk/include/sutk/ThemeManager.hpp | 10 ++++- sutk/include/sutk/ToggleButton.hpp | 5 +++ sutk/include/sutk/ToggleButtonGroupView.hpp | 23 +++++++++++ sutk/include/sutk/ToggleButtonListView.hpp | 6 +-- sutk/include/sutk/Types.hpp | 2 +- .../sutk/tests/ToggleButtonGroupTest.hpp | 2 + sutk/source/ToggleButton.cpp | 4 +- sutk/source/ToggleButtonGroupView.cpp | 38 +++++++++++++++++++ sutk/source/tests/ToggleButtonGroupTest.cpp | 17 +++++++++ 10 files changed, 101 insertions(+), 8 deletions(-) create mode 100644 sutk/include/sutk/ToggleButtonGroupView.hpp create mode 100644 sutk/source/ToggleButtonGroupView.cpp diff --git a/dependencies/Common b/dependencies/Common index 72b837e9..d6fd5695 160000 --- a/dependencies/Common +++ b/dependencies/Common @@ -1 +1 @@ -Subproject commit 72b837e920e26a49fe768360e57c9dde0a71351c +Subproject commit d6fd5695dfe4b378449df149340accb0b4cbb7ec diff --git a/sutk/include/sutk/ThemeManager.hpp b/sutk/include/sutk/ThemeManager.hpp index c51f1b0b..2724e033 100644 --- a/sutk/include/sutk/ThemeManager.hpp +++ b/sutk/include/sutk/ThemeManager.hpp @@ -3,7 +3,7 @@ #include #include // for UIDriverObject #include // for _com_assert -#include // for DEBUG_LOG_ERROR +#include // for DEBUG_LOG_ERROR, and debug_log_warning #include // for com::Event<> #include // for std::string_view @@ -47,6 +47,7 @@ namespace SUTK template ValueType& getValue(Type type, const KeyViewType& key) noexcept; void applyTheme(Theme* theme) noexcept; + Theme* getCurrentTheme() noexcept { return m_currentTheme; } // Published after publishing events for every key OnThemeChangeEvent& getOnThemeChangeEvent() noexcept { return m_onThemeChange; } @@ -182,6 +183,11 @@ namespace SUTK template KeyViewType> void ThemeInterface::applyTheme(Theme* theme) noexcept { + if(m_currentTheme == theme) + { + debug_log_warning("You're trying to apply the same theme again, ignored"); + return; + } m_currentTheme = theme; for(auto& keyValuePair : m_defs) keyValuePair.second.second.publish(); @@ -247,6 +253,8 @@ namespace SUTK return { ThemeNameIterator { m_themes.cbegin() }, ThemeNameIterator { m_themes.cend() } }; } + const ThemeMap& getThemeMap() const noexcept { return m_themes; } + ThemeInterfaceType* createThemeInterface(const KeyViewType& key) noexcept { _com_assert(!m_themeInterfaces.contains(key)); diff --git a/sutk/include/sutk/ToggleButton.hpp b/sutk/include/sutk/ToggleButton.hpp index 32a580b3..5e45c2d6 100644 --- a/sutk/include/sutk/ToggleButton.hpp +++ b/sutk/include/sutk/ToggleButton.hpp @@ -15,6 +15,7 @@ namespace SUTK private: OnToggleEvent m_onToggleEvent; ToggleState m_toggleState; + bool m_isOneWayToggle; IToggleButtonGraphic* m_toggleGraphic; void setToggleGraphic(IToggleButtonGraphic* graphic) noexcept; @@ -33,6 +34,10 @@ namespace SUTK OnToggleEvent& getOnToggleEvent() noexcept { return m_onToggleEvent; } + // If called with 'true' then this toggle can't be turned Off, by GUI input, once gets On + // One has to call setToggleState() manually. + void setOneWayToggle(bool isOneWay) noexcept { m_isOneWayToggle = isOneWay; } + void toggle() noexcept; void setToggleState(ToggleState state) noexcept; ToggleState getToggleState() const noexcept { return m_toggleState; } diff --git a/sutk/include/sutk/ToggleButtonGroupView.hpp b/sutk/include/sutk/ToggleButtonGroupView.hpp new file mode 100644 index 00000000..b41075d1 --- /dev/null +++ b/sutk/include/sutk/ToggleButtonGroupView.hpp @@ -0,0 +1,23 @@ +#pragma once + +#include + +namespace SUTK +{ + class SUTK_API ToggleButtonGroupView : public ToggleButtonListView + { + public: + typedef com::Event OnSelectEvent; + private: + OnSelectEvent m_onSelectEvent; + protected: + // Override of ToggleButtonListView::onCreate() + virtual ToggleButton* onCreate() noexcept override; + // Override of ToggleButtonListView::onRecycle() + virtual void onRecycle(ToggleButton* &button) noexcept override; + public: + ToggleButtonGroupView(UIDriver& driver, Container* parent, u32 poolSize = 7, GfxDriverObjectHandleType textGroup = GFX_DRIVER_OBJECT_NULL_HANDLE) noexcept; + + OnSelectEvent& getOnSelectEvent() noexcept { return m_onSelectEvent; } + }; +} \ No newline at end of file diff --git a/sutk/include/sutk/ToggleButtonListView.hpp b/sutk/include/sutk/ToggleButtonListView.hpp index 481d0f28..c523735d 100644 --- a/sutk/include/sutk/ToggleButtonListView.hpp +++ b/sutk/include/sutk/ToggleButtonListView.hpp @@ -13,13 +13,13 @@ namespace SUTK protected: // Invoked when a button is returned to the pool // Typically, this would be used to deactivate the button to make it invisible and do not consume resources - void onReturn(ToggleButton* &button) noexcept; + virtual void onReturn(ToggleButton* &button) noexcept override; // Invoekd when a button is recycled (re-used) from the pool // Typically, this would be used to reactivate the button - void onRecycle(ToggleButton* &button) noexcept; + virtual void onRecycle(ToggleButton* &button) noexcept override; // Invoked when the pool requests a new button instance // Mandatory to be called in the overriding method - virtual ToggleButton* onCreate() noexcept; + virtual ToggleButton* onCreate() noexcept override; public: ToggleButtonListView(UIDriver& driver, Container* parent, u32 poolSize = 7, GfxDriverObjectHandleType textGroup = GFX_DRIVER_OBJECT_NULL_HANDLE) noexcept; diff --git a/sutk/include/sutk/Types.hpp b/sutk/include/sutk/Types.hpp index 3ef4012f..52f9c2c0 100644 --- a/sutk/include/sutk/Types.hpp +++ b/sutk/include/sutk/Types.hpp @@ -2,7 +2,7 @@ namespace SUTK { - enum class ToggleState + enum class ToggleState : u8 { Off, On diff --git a/sutk/include/sutk/tests/ToggleButtonGroupTest.hpp b/sutk/include/sutk/tests/ToggleButtonGroupTest.hpp index 5d67115e..8c6943d0 100644 --- a/sutk/include/sutk/tests/ToggleButtonGroupTest.hpp +++ b/sutk/include/sutk/tests/ToggleButtonGroupTest.hpp @@ -12,6 +12,7 @@ namespace SUTK { class IGfxDriver; class ToggleButtonListView; + class ToggleButtonGroupView; class ToggleButtonGroupTest : public ITest { @@ -20,6 +21,7 @@ namespace SUTK IGfxDriver* m_gfxDriver; IInputDriver* m_inputDriver; ToggleButtonListView* m_toggleListView; + ToggleButtonGroupView* m_toggleGroupView; public: ToggleButtonGroupTest() : m_uiDriver(NULL), m_gfxDriver(NULL) { } diff --git a/sutk/source/ToggleButton.cpp b/sutk/source/ToggleButton.cpp index 59577394..48a3a4ad 100644 --- a/sutk/source/ToggleButton.cpp +++ b/sutk/source/ToggleButton.cpp @@ -3,7 +3,7 @@ namespace SUTK { - ToggleButton::ToggleButton(UIDriver& driver, Container* parent, ToggleState state, bool isCreateDefaultGraphic, GfxDriverObjectHandleType textGroup) noexcept : Button(driver, parent, false), m_toggleState(state), m_toggleGraphic(NULL) + ToggleButton::ToggleButton(UIDriver& driver, Container* parent, ToggleState state, bool isCreateDefaultGraphic, GfxDriverObjectHandleType textGroup) noexcept : Button(driver, parent, false), m_toggleState(state), m_isOneWayToggle(false), m_toggleGraphic(NULL) { if(isCreateDefaultGraphic) setGraphic(driver.createContainer(this, textGroup)); @@ -16,7 +16,7 @@ namespace SUTK if(button != MouseButton::Left) return; - if(action == KeyEvent::Press) + if((action == KeyEvent::Press) && (!m_isOneWayToggle || (getToggleState() != ToggleState::On))) toggle(); } diff --git a/sutk/source/ToggleButtonGroupView.cpp b/sutk/source/ToggleButtonGroupView.cpp new file mode 100644 index 00000000..72b4f0e1 --- /dev/null +++ b/sutk/source/ToggleButtonGroupView.cpp @@ -0,0 +1,38 @@ +#include + +namespace SUTK +{ + ToggleButtonGroupView::ToggleButtonGroupView(UIDriver& driver, Container* parent, u32 poolSize, GfxDriverObjectHandleType textGroup) noexcept : ToggleButtonListView(driver, parent, poolSize, textGroup) + { + + } + + ToggleButton* ToggleButtonGroupView::onCreate() noexcept + { + ToggleButton* button = ToggleButtonListView::onCreate(); + button->setOneWayToggle(true); + return button; + } + + void ToggleButtonGroupView::onRecycle(ToggleButton* &button) noexcept + { + ToggleButtonListView::onRecycle(button); + // NOTE: activeCount() returns one less than the current actives (including this) + // That also means, DynamicPool calls onRecycle before incrementing the activeCount + auto index = getPool().activeCount(); + button->getOnToggleEvent().subscribe([this, index, button](ToggleState state) + { + if(state == ToggleState::On) + { + auto& pool = this->getPool(); + auto buttons = pool.getActives(); + for(auto& otherButton : buttons) + { + if(otherButton != button) + otherButton->setToggleState(ToggleState::Off); + } + this->m_onSelectEvent.publish(index); + } + }); + } +} \ No newline at end of file diff --git a/sutk/source/tests/ToggleButtonGroupTest.cpp b/sutk/source/tests/ToggleButtonGroupTest.cpp index 4b5a75eb..a7bfcce5 100644 --- a/sutk/source/tests/ToggleButtonGroupTest.cpp +++ b/sutk/source/tests/ToggleButtonGroupTest.cpp @@ -5,6 +5,7 @@ #include #include +#include #include namespace SUTK @@ -32,6 +33,22 @@ namespace SUTK m_toggleListView->addButton("Toggle Button 6"); m_toggleListView->fit(); m_toggleListView->getAnchorRect()->setRect({ 0.0f, 0.5f, 1.0f, 0.0f }); + + m_toggleGroupView = m_uiDriver->createContainer(rootContainer); + m_toggleGroupView->setRect({ 5, 11, 3, 5 }); + m_toggleGroupView->addButton("Toggle Button 1"); + m_toggleGroupView->addButton("Toggle Button 2"); + m_toggleGroupView->addButton("Toggle Button 3"); + m_toggleGroupView->addButton("Toggle Button 4"); + m_toggleGroupView->addButton("Toggle Button 5"); + m_toggleGroupView->addButton("Toggle Button 6"); + m_toggleGroupView->fit(); + m_toggleGroupView->getAnchorRect()->setRect({ 0.0f, 0.5f, 1.0f, 0.0f }); + + m_toggleGroupView->getOnSelectEvent().subscribe([](u32 index) + { + std::cout << "Selected: " << index << std::endl; + }); } void ToggleButtonGroupTest::terminate(SGE::Driver& driver)