diff --git a/libs/ui/include/psemek/ui/button.hpp b/libs/ui/include/psemek/ui/button.hpp index 6f6429d9..52e39de3 100644 --- a/libs/ui/include/psemek/ui/button.hpp +++ b/libs/ui/include/psemek/ui/button.hpp @@ -30,6 +30,8 @@ namespace psemek::ui callback_ = std::move(callback); } + ~button() override; + protected: enum class state_t { diff --git a/libs/ui/include/psemek/ui/element.hpp b/libs/ui/include/psemek/ui/element.hpp index 89c8c36b..5b0fff88 100644 --- a/libs/ui/include/psemek/ui/element.hpp +++ b/libs/ui/include/psemek/ui/element.hpp @@ -56,6 +56,9 @@ namespace psemek::ui virtual void post(std::function f); virtual void post_reshape(); + protected: + virtual void release_children(); + private: element * parent_ = nullptr; async::event_loop * loop_ = nullptr; diff --git a/libs/ui/include/psemek/ui/frame.hpp b/libs/ui/include/psemek/ui/frame.hpp index d18a1996..0012b55a 100644 --- a/libs/ui/include/psemek/ui/frame.hpp +++ b/libs/ui/include/psemek/ui/frame.hpp @@ -19,6 +19,8 @@ namespace psemek::ui virtual std::optional> min_size() const { return min_size_; } virtual std::optional> max_size() const { return max_size_; } + ~frame() override; + private: std::optional> min_size_; std::optional> max_size_; diff --git a/libs/ui/include/psemek/ui/grid_layout.hpp b/libs/ui/include/psemek/ui/grid_layout.hpp index c7dd8f62..d110e6a7 100644 --- a/libs/ui/include/psemek/ui/grid_layout.hpp +++ b/libs/ui/include/psemek/ui/grid_layout.hpp @@ -42,6 +42,8 @@ namespace psemek::ui void draw(painter &) const override {} + ~grid_layout() override; + private: util::array, 2> children_; std::vector children_range_; diff --git a/libs/ui/include/psemek/ui/screen.hpp b/libs/ui/include/psemek/ui/screen.hpp index 15691f8e..6b54ba16 100644 --- a/libs/ui/include/psemek/ui/screen.hpp +++ b/libs/ui/include/psemek/ui/screen.hpp @@ -44,6 +44,8 @@ namespace psemek::ui void draw(painter &) const override {} + ~screen() override; + private: container_impl container_; box_shape shape_; diff --git a/libs/ui/source/button.cpp b/libs/ui/source/button.cpp index cdfacb21..4c4a0864 100644 --- a/libs/ui/source/button.cpp +++ b/libs/ui/source/button.cpp @@ -64,6 +64,11 @@ namespace psemek::ui return false; } + button::~button() + { + release_children(); + } + void button::on_state_changed(state_t old) { auto s = merged_style(); diff --git a/libs/ui/source/element.cpp b/libs/ui/source/element.cpp index 451b9967..49e5c3ef 100644 --- a/libs/ui/source/element.cpp +++ b/libs/ui/source/element.cpp @@ -95,4 +95,10 @@ namespace psemek::ui }); } + void element::release_children() + { + for (auto c : children()) + if (c) c->set_parent(nullptr); + } + } diff --git a/libs/ui/source/frame.cpp b/libs/ui/source/frame.cpp index 1343a324..cfe56a98 100644 --- a/libs/ui/source/frame.cpp +++ b/libs/ui/source/frame.cpp @@ -34,4 +34,9 @@ namespace psemek::ui post_reshape(); } + frame::~frame() + { + release_children(); + } + } diff --git a/libs/ui/source/grid_layout.cpp b/libs/ui/source/grid_layout.cpp index 23fe5f20..46551cbb 100644 --- a/libs/ui/source/grid_layout.cpp +++ b/libs/ui/source/grid_layout.cpp @@ -281,4 +281,9 @@ namespace psemek::ui } } + grid_layout::~grid_layout() + { + release_children(); + } + } diff --git a/libs/ui/source/screen.cpp b/libs/ui/source/screen.cpp index 53a58f44..2f21fb1a 100644 --- a/libs/ui/source/screen.cpp +++ b/libs/ui/source/screen.cpp @@ -113,4 +113,9 @@ namespace psemek::ui return result; } + screen::~screen() + { + release_children(); + } + }