diff --git a/libs/ui/include/psemek/ui/checkbox.hpp b/libs/ui/include/psemek/ui/checkbox.hpp index 1a56cf71..a829840e 100644 --- a/libs/ui/include/psemek/ui/checkbox.hpp +++ b/libs/ui/include/psemek/ui/checkbox.hpp @@ -1,6 +1,6 @@ #pragma once -#include +#include #include @@ -8,8 +8,12 @@ namespace psemek::ui { struct checkbox - : element + : single_container { + struct label * label() const; + + struct image_view * icon() const; + bool on_event(mouse_move const & e) override; bool on_event(mouse_click const & e) override; diff --git a/libs/ui/include/psemek/ui/element_factory.hpp b/libs/ui/include/psemek/ui/element_factory.hpp index e30a3bc6..25248321 100644 --- a/libs/ui/include/psemek/ui/element_factory.hpp +++ b/libs/ui/include/psemek/ui/element_factory.hpp @@ -17,7 +17,6 @@ namespace psemek::ui struct image_view; struct rich_image_view; struct checkbox; - struct toggle_button; struct slider; struct spinbox; struct scroller; @@ -39,9 +38,9 @@ namespace psemek::ui virtual std::shared_ptr make_image_view(gfx::texture_view_2d image); virtual std::shared_ptr make_rich_image_view(std::shared_ptr image); virtual std::shared_ptr make_checkbox(bool value); - virtual std::shared_ptr make_toggle_button(); - virtual std::shared_ptr make_toggle_button(std::string text); - virtual std::shared_ptr make_toggle_button(gfx::texture_view_2d icon); + virtual std::shared_ptr make_toggle_button(); + virtual std::shared_ptr make_toggle_button(std::string text); + virtual std::shared_ptr make_toggle_button(gfx::texture_view_2d icon); virtual std::shared_ptr make_slider(); virtual std::shared_ptr make_spinbox(); // directions: diff --git a/libs/ui/include/psemek/ui/toggle_button.hpp b/libs/ui/include/psemek/ui/toggle_button.hpp deleted file mode 100644 index 73721626..00000000 --- a/libs/ui/include/psemek/ui/toggle_button.hpp +++ /dev/null @@ -1,33 +0,0 @@ -#pragma once - -#include -#include -#include - -namespace psemek::ui -{ - - struct toggle_button - : checkbox - { - struct label * label() { return label_.get(); } - struct label const * label() const { return label_.get(); } - - struct image_view * icon() { return icon_.get(); } - struct image_view const * icon() const { return icon_.get(); } - - virtual void set_label(std::shared_ptr label); - virtual void set_icon(std::shared_ptr icon); - - children_range children() const override; - - ~toggle_button() override; - - private: - std::shared_ptr label_; - std::shared_ptr icon_; - element * children_[1]{nullptr}; - }; - - -} diff --git a/libs/ui/source/checkbox.cpp b/libs/ui/source/checkbox.cpp index 7874623e..c6c4a9da 100644 --- a/libs/ui/source/checkbox.cpp +++ b/libs/ui/source/checkbox.cpp @@ -1,8 +1,20 @@ #include +#include +#include namespace psemek::ui { + label * checkbox::label() const + { + return dynamic_cast(child().get()); + } + + image_view * checkbox::icon() const + { + return dynamic_cast(child().get()); + } + bool checkbox::on_event(mouse_move const & e) { bool const over = shape().contains(geom::cast(e.position)); diff --git a/libs/ui/source/default_element_factory.cpp b/libs/ui/source/default_element_factory.cpp index e75c5601..c4a3008c 100644 --- a/libs/ui/source/default_element_factory.cpp +++ b/libs/ui/source/default_element_factory.cpp @@ -419,6 +419,11 @@ namespace psemek::ui struct checkbox_impl : checkbox { + std::shared_ptr set_child(std::shared_ptr) override + { + throw std::runtime_error("default checkbox doesn't support children"); + } + struct shape const & shape() const override { return shape_; diff --git a/libs/ui/source/element_factory.cpp b/libs/ui/source/element_factory.cpp index b16ba0f0..e81ff185 100644 --- a/libs/ui/source/element_factory.cpp +++ b/libs/ui/source/element_factory.cpp @@ -2,7 +2,7 @@ #include #include -#include +#include #include #include #include @@ -85,9 +85,9 @@ namespace psemek::ui return nullptr; } - std::shared_ptr element_factory::make_toggle_button() { return nullptr; } + std::shared_ptr element_factory::make_toggle_button() { return nullptr; } - std::shared_ptr element_factory::make_toggle_button(std::string text) + std::shared_ptr element_factory::make_toggle_button(std::string text) { auto b = make_toggle_button(); if (b) @@ -98,13 +98,13 @@ namespace psemek::ui l->set_valign(label::valignment::center); l->set_halign(label::halignment::center); l->set_overflow(label::overflow_mode::ellipsis); - b->set_label(l); + b->set_child(l); } } return b; } - std::shared_ptr element_factory::make_toggle_button(gfx::texture_view_2d icon) + std::shared_ptr element_factory::make_toggle_button(gfx::texture_view_2d icon) { auto b = make_toggle_button(); if (b) @@ -114,7 +114,7 @@ namespace psemek::ui { i->set_downscale(false); i->set_upscale(false); - b->set_icon(i); + b->set_child(i); } } return b; diff --git a/libs/ui/source/toggle_button.cpp b/libs/ui/source/toggle_button.cpp deleted file mode 100644 index 1716c804..00000000 --- a/libs/ui/source/toggle_button.cpp +++ /dev/null @@ -1,44 +0,0 @@ -#include - -namespace psemek::ui -{ - - element::children_range toggle_button::children() const - { - return children_range{children_}; - } - - toggle_button::~toggle_button() - { - release_children(); - } - - void toggle_button::set_label(std::shared_ptr label) - { - if (icon()) - set_icon(nullptr); - - if (label_) label_->set_parent(nullptr); - - label_ = std::move(label); - children_[0] = label_.get(); - if (label_) label_->set_parent(this); - } - - void toggle_button::set_icon(std::shared_ptr icon) - { - if (label()) - set_label(nullptr); - - if (icon_) icon_->set_parent(nullptr); - - icon_ = std::move(icon); - children_[0] = icon_.get(); - if (icon_) - { - icon_->set_parent(this); - icon_->set_downscale(false); - } - } - -}