From e630316a059244cf1e8ac139f52a6799eef835ce Mon Sep 17 00:00:00 2001 From: lisyarus Date: Thu, 10 Mar 2022 12:21:17 +0300 Subject: [PATCH] Add ui::single_container for wrapper elements --- .../include/psemek/ui/event_interceptor.hpp | 11 ++-------- libs/ui/include/psemek/ui/frame.hpp | 11 ++-------- libs/ui/include/psemek/ui/scroller.hpp | 11 ++-------- .../ui/include/psemek/ui/single_container.hpp | 21 +++++++++++++++++++ libs/ui/source/event_interceptor.cpp | 12 ----------- libs/ui/source/frame.cpp | 12 ----------- libs/ui/source/scroller.cpp | 12 ----------- libs/ui/source/single_container.cpp | 18 ++++++++++++++++ 8 files changed, 45 insertions(+), 63 deletions(-) create mode 100644 libs/ui/include/psemek/ui/single_container.hpp create mode 100644 libs/ui/source/single_container.cpp diff --git a/libs/ui/include/psemek/ui/event_interceptor.hpp b/libs/ui/include/psemek/ui/event_interceptor.hpp index 00972803..d027a2bc 100644 --- a/libs/ui/include/psemek/ui/event_interceptor.hpp +++ b/libs/ui/include/psemek/ui/event_interceptor.hpp @@ -1,6 +1,6 @@ #pragma once -#include +#include #include @@ -8,12 +8,8 @@ namespace psemek::ui { struct event_interceptor - : element + : single_container { - children_range children() const override { return children_; } - - virtual std::shared_ptr set_child(std::shared_ptr c); - geom::box size_constraints() const override; struct shape const & shape() const override; @@ -32,9 +28,6 @@ namespace psemek::ui void draw(painter &) const override {} private: - std::shared_ptr child_; - element * children_[1]{nullptr}; - bool mouseover_ = false; std::function mouse_move_callback_; diff --git a/libs/ui/include/psemek/ui/frame.hpp b/libs/ui/include/psemek/ui/frame.hpp index 0012b55a..938d12a6 100644 --- a/libs/ui/include/psemek/ui/frame.hpp +++ b/libs/ui/include/psemek/ui/frame.hpp @@ -1,17 +1,13 @@ #pragma once -#include +#include namespace psemek::ui { struct frame - : element + : single_container { - children_range children() const override { return children_; } - - virtual std::shared_ptr set_child(std::shared_ptr c); - virtual void set_min_size(std::optional> const & size); virtual void set_max_size(std::optional> const & size); virtual void set_fixed_size(geom::vector const & size); @@ -24,9 +20,6 @@ namespace psemek::ui private: std::optional> min_size_; std::optional> max_size_; - - std::shared_ptr child_; - element * children_[1]{nullptr}; }; } diff --git a/libs/ui/include/psemek/ui/scroller.hpp b/libs/ui/include/psemek/ui/scroller.hpp index debcc3bb..6192ede7 100644 --- a/libs/ui/include/psemek/ui/scroller.hpp +++ b/libs/ui/include/psemek/ui/scroller.hpp @@ -1,18 +1,14 @@ #pragma once -#include +#include #include namespace psemek::ui { struct scroller - : element + : single_container { - children_range children() const override { return children_; } - - virtual std::shared_ptr set_child(std::shared_ptr c); - enum class direction { horizontal, @@ -77,9 +73,6 @@ namespace psemek::ui geom::vector shift_{0.f, 0.f}; geom::vector shift_tgt_{0.f, 0.f}; - std::shared_ptr child_; - element * children_[1]{nullptr}; - void clamp_shift(); }; diff --git a/libs/ui/include/psemek/ui/single_container.hpp b/libs/ui/include/psemek/ui/single_container.hpp new file mode 100644 index 00000000..62720603 --- /dev/null +++ b/libs/ui/include/psemek/ui/single_container.hpp @@ -0,0 +1,21 @@ +#pragma once + +#include + +namespace psemek::ui +{ + + struct single_container + : element + { + children_range children() const override { return children_; } + + virtual std::shared_ptr set_child(std::shared_ptr c); + virtual std::shared_ptr child() { return child_; } + + protected: + std::shared_ptr child_; + element * children_[1]{nullptr}; + }; + +} diff --git a/libs/ui/source/event_interceptor.cpp b/libs/ui/source/event_interceptor.cpp index 1f36b2e9..9a171375 100644 --- a/libs/ui/source/event_interceptor.cpp +++ b/libs/ui/source/event_interceptor.cpp @@ -4,18 +4,6 @@ namespace psemek::ui { - std::shared_ptr event_interceptor::set_child(std::shared_ptr c) - { - auto old = std::move(child_); - if (old) old->set_parent(nullptr); - - child_ = std::move(c); - if (child_) child_->set_parent(this); - children_[0] = child_.get(); - - return old; - } - geom::box event_interceptor::size_constraints() const { if (child_) diff --git a/libs/ui/source/frame.cpp b/libs/ui/source/frame.cpp index cfe56a98..3b05cd99 100644 --- a/libs/ui/source/frame.cpp +++ b/libs/ui/source/frame.cpp @@ -3,18 +3,6 @@ namespace psemek::ui { - std::shared_ptr frame::set_child(std::shared_ptr c) - { - auto old = std::move(child_); - if (old) old->set_parent(nullptr); - - child_ = std::move(c); - if (child_) child_->set_parent(this); - children_[0] = child_.get(); - - return old; - } - void frame::set_min_size(std::optional> const & size) { min_size_ = size; diff --git a/libs/ui/source/scroller.cpp b/libs/ui/source/scroller.cpp index 6487d4b4..443eb46b 100644 --- a/libs/ui/source/scroller.cpp +++ b/libs/ui/source/scroller.cpp @@ -5,18 +5,6 @@ namespace psemek::ui { - std::shared_ptr scroller::set_child(std::shared_ptr c) - { - auto old = std::move(child_); - if (old) old->set_parent(nullptr); - - child_ = std::move(c); - if (child_) child_->set_parent(this); - children_[0] = child_.get(); - - return old; - } - void scroller::set_preferred_direction(direction d) { preferred_direction_ = d; diff --git a/libs/ui/source/single_container.cpp b/libs/ui/source/single_container.cpp new file mode 100644 index 00000000..8184a6df --- /dev/null +++ b/libs/ui/source/single_container.cpp @@ -0,0 +1,18 @@ +#include + +namespace psemek::ui +{ + + std::shared_ptr single_container::set_child(std::shared_ptr c) + { + auto old = std::move(child_); + if (old) old->set_parent(nullptr); + + child_ = std::move(c); + if (child_) child_->set_parent(this); + children_[0] = child_.get(); + + return old; + } + +}