From a139067a3e86f5e7cc35716b22a775ff53326bd0 Mon Sep 17 00:00:00 2001 From: lisyarus Date: Fri, 26 Feb 2021 18:00:56 +0300 Subject: [PATCH] Add ui::container interface, move old container to helper class --- examples/ui.cpp | 2 +- libs/ui/include/psemek/ui/container.hpp | 22 ++----------- libs/ui/include/psemek/ui/container_impl.hpp | 33 +++++++++++++++++++ libs/ui/include/psemek/ui/screen.hpp | 13 ++++++-- .../{container.cpp => container_impl.cpp} | 20 +++++------ libs/ui/source/screen.cpp | 27 +++++++++++---- 6 files changed, 78 insertions(+), 39 deletions(-) create mode 100644 libs/ui/include/psemek/ui/container_impl.hpp rename libs/ui/source/{container.cpp => container_impl.cpp} (56%) diff --git a/examples/ui.cpp b/examples/ui.cpp index fdc70138..59dd0f0d 100644 --- a/examples/ui.cpp +++ b/examples/ui.cpp @@ -57,7 +57,7 @@ struct ui_example text->set_multiline(ui::label::multiline_mode::minimize_lines); auto frame = element_factory.make_frame(); frame->set_child(text); - screen->add(frame, ui::screen::x_policy::center, ui::screen::y_policy::center); + screen->add_child(frame, ui::screen::x_policy::center, ui::screen::y_policy::center); auto updater = util::recursive([this, text, i = 0](auto && self) mutable -> void { text->set_halign(static_cast(i % 3)); diff --git a/libs/ui/include/psemek/ui/container.hpp b/libs/ui/include/psemek/ui/container.hpp index 3acc4c00..98e7e944 100644 --- a/libs/ui/include/psemek/ui/container.hpp +++ b/libs/ui/include/psemek/ui/container.hpp @@ -2,31 +2,15 @@ #include -#include - namespace psemek::ui { struct container : element { - children_range children() const override; - - protected: - std::size_t children_count() const { return children_.size(); } - - std::size_t add(std::shared_ptr c); - void add(std::shared_ptr c, std::size_t index); - - element * get(std::size_t index); - std::optional find(element * c); - - std::shared_ptr remove(element * c); - std::shared_ptr remove(std::size_t index); - - private: - std::vector> children_; - std::vector children_range_; + virtual bool add_child(std::shared_ptr c) = 0; + virtual bool has_child(element * c) const = 0; + virtual std::shared_ptr remove_child(element * c) = 0; }; } diff --git a/libs/ui/include/psemek/ui/container_impl.hpp b/libs/ui/include/psemek/ui/container_impl.hpp new file mode 100644 index 00000000..f97a1b26 --- /dev/null +++ b/libs/ui/include/psemek/ui/container_impl.hpp @@ -0,0 +1,33 @@ +#pragma once + +#include + +#include + +namespace psemek::ui +{ + + struct container_impl + { + container_impl(element * parent) + : parent_{parent} + {} + + element::children_range children() const; + + std::size_t add(std::shared_ptr c); + void add(std::shared_ptr c, std::size_t index); + + element * get(std::size_t index) const; + std::optional find(element * c) const; + + std::shared_ptr remove(element * c); + std::shared_ptr remove(std::size_t index); + + protected: + element * parent_; + std::vector> children_; + std::vector children_range_; + }; + +} diff --git a/libs/ui/include/psemek/ui/screen.hpp b/libs/ui/include/psemek/ui/screen.hpp index 55a04957..592b53ce 100644 --- a/libs/ui/include/psemek/ui/screen.hpp +++ b/libs/ui/include/psemek/ui/screen.hpp @@ -1,6 +1,7 @@ #pragma once #include +#include #include namespace psemek::ui @@ -27,9 +28,14 @@ namespace psemek::ui floating, }; - void add(std::shared_ptr c, x_policy x, y_policy y); - void add(std::shared_ptr c); - std::shared_ptr remove(element * c); + screen(); + + children_range children() const override; + + bool add_child(std::shared_ptr c, x_policy x, y_policy y); + bool add_child(std::shared_ptr c) override; + bool has_child(element *c) const override; + std::shared_ptr remove_child(element * c) override; struct shape const & shape() const override { return shape_; } void reshape(geom::box const & bbox) override; @@ -39,6 +45,7 @@ namespace psemek::ui void draw(painter &) const override {} private: + container_impl container_; box_shape shape_; struct policy diff --git a/libs/ui/source/container.cpp b/libs/ui/source/container_impl.cpp similarity index 56% rename from libs/ui/source/container.cpp rename to libs/ui/source/container_impl.cpp index 35e6a5f6..5866e085 100644 --- a/libs/ui/source/container.cpp +++ b/libs/ui/source/container_impl.cpp @@ -1,14 +1,14 @@ -#include +#include namespace psemek::ui { - element::children_range container::children() const + element::children_range container_impl::children() const { - return children_range{children_range_.data(), children_range_.data() + children_range_.size()}; + return element::children_range{children_range_.data(), children_range_.data() + children_range_.size()}; } - std::size_t container::add(std::shared_ptr c) + std::size_t container_impl::add(std::shared_ptr c) { std::size_t index = 0; while (index < children_.size() && children_[index]) ++index; @@ -16,7 +16,7 @@ namespace psemek::ui return index; } - void container::add(std::shared_ptr c, std::size_t index) + void container_impl::add(std::shared_ptr c, std::size_t index) { if (index >= children_.size()) { @@ -25,18 +25,18 @@ namespace psemek::ui } children_[index] = std::move(c); - if (children_[index]) children_[index]->set_parent(this); + if (children_[index]) children_[index]->set_parent(parent_); children_range_[index] = children_[index].get(); } - element * container::get(std::size_t index) + element * container_impl::get(std::size_t index) const { if (index < children_.size()) return children_[index].get(); return nullptr; } - std::optional container::find(element * c) + std::optional container_impl::find(element * c) const { for (std::size_t i = 0; i < children_.size(); ++i) { @@ -46,14 +46,14 @@ namespace psemek::ui return std::nullopt; } - std::shared_ptr container::remove(element * c) + std::shared_ptr container_impl::remove(element * c) { if (auto i = find(c)) return remove(*i); return nullptr; } - std::shared_ptr container::remove(std::size_t index) + std::shared_ptr container_impl::remove(std::size_t index) { if (index >= children_.size()) return nullptr; diff --git a/libs/ui/source/screen.cpp b/libs/ui/source/screen.cpp index 348e69f8..1a6e6c09 100644 --- a/libs/ui/source/screen.cpp +++ b/libs/ui/source/screen.cpp @@ -3,22 +3,37 @@ namespace psemek::ui { - void screen::add(std::shared_ptr c, x_policy x, y_policy y) + screen::screen() + : container_(this) + {} + + element::children_range screen::children() const { - auto i = container::add(std::move(c)); + return container_.children(); + } + + bool screen::add_child(std::shared_ptr c, x_policy x, y_policy y) + { + auto i = container_.add(std::move(c)); if (i >= policies_.size()) policies_.resize(i + 1); policies_[i] = {x, y}; + return true; } - void screen::add(std::shared_ptr c) + bool screen::add_child(std::shared_ptr c) { - add(std::move(c), x_policy::floating, y_policy::floating); + return add_child(std::move(c), x_policy::floating, y_policy::floating); } - std::shared_ptr screen::remove(element * c) + bool screen::has_child(element *c) const { - return container::remove(c); + return static_cast(container_.find(c)); + } + + std::shared_ptr screen::remove_child(element * c) + { + return container_.remove(c); } void screen::reshape(geom::box const & bbox)