diff options
author | Kae <80987908+Novaenia@users.noreply.github.com> | 2023-06-20 14:33:09 +1000 |
---|---|---|
committer | Kae <80987908+Novaenia@users.noreply.github.com> | 2023-06-20 14:33:09 +1000 |
commit | 6352e8e3196f78388b6c771073f9e03eaa612673 (patch) | |
tree | e23772f79a7fbc41bc9108951e9e136857484bf4 /source/windowing/StarButtonGroup.cpp | |
parent | 6741a057e5639280d85d0f88ba26f000baa58f61 (diff) |
everything everywhere
all at once
Diffstat (limited to 'source/windowing/StarButtonGroup.cpp')
-rw-r--r-- | source/windowing/StarButtonGroup.cpp | 90 |
1 files changed, 90 insertions, 0 deletions
diff --git a/source/windowing/StarButtonGroup.cpp b/source/windowing/StarButtonGroup.cpp new file mode 100644 index 0000000..ba261f2 --- /dev/null +++ b/source/windowing/StarButtonGroup.cpp @@ -0,0 +1,90 @@ +#include "StarButtonGroup.hpp" +#include "StarButtonWidget.hpp" + +namespace Star { + +void ButtonGroup::setCallback(WidgetCallbackFunc callback) { + m_callback = callback; +} + +ButtonWidget* ButtonGroup::button(int id) const { + return m_buttons.value(id); +} + +List<ButtonWidget*> ButtonGroup::buttons() const { + return m_buttons.values(); +} + +size_t ButtonGroup::buttonCount() const { + return m_buttons.size(); +} + +int ButtonGroup::addButton(ButtonWidget* button, int id) { + if (!button) + return NoButton; + else if (m_buttonIds.contains(button)) + return m_buttonIds.get(button); + + // If we are auto-generating an id, start at the last id and work forward. + if (id == NoButton && !m_buttons.empty()) + id = (prev(m_buttons.end()))->first; + + while (m_buttons.contains(id)) + ++id; + + m_buttons[id] = button; + m_buttonIds[button] = id; + return id; +} + +void ButtonGroup::removeButton(ButtonWidget* button) { + if (m_buttonIds.contains(button)) { + m_buttons.remove(m_buttonIds.get(button)); + m_buttonIds.remove(button); + } +} + +int ButtonGroup::id(ButtonWidget* button) const { + if (m_buttonIds.contains(button)) + return m_buttonIds.get(button); + else + return NoButton; +} + +ButtonWidget* ButtonGroup::checkedButton() const { + for (auto const& pair : m_buttons) { + if (pair.second->isChecked()) + return pair.second; + } + return {}; +} + +int ButtonGroup::checkedId() const { + return id(checkedButton()); +} + +void ButtonGroup::select(int id) { + auto b = button(id); + if (!b->isChecked()) + b->check(); +} + +void ButtonGroup::wasChecked(ButtonWidget* self) { + for (auto const& pair : m_buttons) { + if (pair.second != self) + pair.second->setChecked(false); + } + + if (m_callback) + m_callback(self); +} + +bool ButtonGroup::toggle() const { + return m_toggle; +} + +void ButtonGroup::setToggle(bool toggleMode) { + m_toggle = toggleMode; +} + +} |