Skip to content

Commit

Permalink
[SUTK] Added SUTK::ToggleButtonGroupView
Browse files Browse the repository at this point in the history
  • Loading branch information
ravi688 committed Oct 5, 2024
1 parent f9e4676 commit bba79b3
Show file tree
Hide file tree
Showing 10 changed files with 101 additions and 8 deletions.
2 changes: 1 addition & 1 deletion dependencies/Common
10 changes: 9 additions & 1 deletion sutk/include/sutk/ThemeManager.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@
#include <sutk/defines.hpp>
#include <sutk/UIDriver.hpp> // for UIDriverObject
#include <common/assert.h> // for _com_assert
#include <common/debug.h> // for DEBUG_LOG_ERROR
#include <common/debug.h> // for DEBUG_LOG_ERROR, and debug_log_warning
#include <common/Event.hpp> // for com::Event<>

#include <string_view> // for std::string_view
Expand Down Expand Up @@ -47,6 +47,7 @@ namespace SUTK
template<typename ValueType>
ValueType& getValue(Type type, const KeyViewType& key) noexcept;
void applyTheme(Theme<KeyType, KeyViewType>* theme) noexcept;
Theme<KeyType, KeyViewType>* getCurrentTheme() noexcept { return m_currentTheme; }

// Published after publishing events for every key
OnThemeChangeEvent& getOnThemeChangeEvent() noexcept { return m_onThemeChange; }
Expand Down Expand Up @@ -182,6 +183,11 @@ namespace SUTK
template<typename KeyType, com::ViewType<KeyType> KeyViewType>
void ThemeInterface<KeyType, KeyViewType>::applyTheme(Theme<KeyType, KeyViewType>* 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();
Expand Down Expand Up @@ -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));
Expand Down
5 changes: 5 additions & 0 deletions sutk/include/sutk/ToggleButton.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@ namespace SUTK
private:
OnToggleEvent m_onToggleEvent;
ToggleState m_toggleState;
bool m_isOneWayToggle;
IToggleButtonGraphic* m_toggleGraphic;

void setToggleGraphic(IToggleButtonGraphic* graphic) noexcept;
Expand All @@ -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; }
Expand Down
23 changes: 23 additions & 0 deletions sutk/include/sutk/ToggleButtonGroupView.hpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
#pragma once

#include <sutk/ToggleButtonListView.hpp>

namespace SUTK
{
class SUTK_API ToggleButtonGroupView : public ToggleButtonListView
{
public:
typedef com::Event<com::no_publish_ptr_t, u32> 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; }
};
}
6 changes: 3 additions & 3 deletions sutk/include/sutk/ToggleButtonListView.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -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;

Expand Down
2 changes: 1 addition & 1 deletion sutk/include/sutk/Types.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@

namespace SUTK
{
enum class ToggleState
enum class ToggleState : u8
{
Off,
On
Expand Down
2 changes: 2 additions & 0 deletions sutk/include/sutk/tests/ToggleButtonGroupTest.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@ namespace SUTK
{
class IGfxDriver;
class ToggleButtonListView;
class ToggleButtonGroupView;

class ToggleButtonGroupTest : public ITest
{
Expand All @@ -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) { }
Expand Down
4 changes: 2 additions & 2 deletions sutk/source/ToggleButton.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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<DefaultToggleButtonGraphic>(this, textGroup));
Expand All @@ -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();
}

Expand Down
38 changes: 38 additions & 0 deletions sutk/source/ToggleButtonGroupView.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
#include <sutk/ToggleButtonGroupView.hpp>

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);
}
});
}
}
17 changes: 17 additions & 0 deletions sutk/source/tests/ToggleButtonGroupTest.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@
#include <sutk/FullWindowContainer.hpp>

#include <sutk/ToggleButtonListView.hpp>
#include <sutk/ToggleButtonGroupView.hpp>
#include <sutk/Label.hpp>

namespace SUTK
Expand Down Expand Up @@ -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<ToggleButtonGroupView>(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)
Expand Down

0 comments on commit bba79b3

Please sign in to comment.