UI elements should explicitly reset parent for their children

This commit is contained in:
Nikita Lisitsa 2021-03-04 13:58:15 +03:00
parent ef34071748
commit ea46e820ab
10 changed files with 37 additions and 0 deletions

View file

@ -30,6 +30,8 @@ namespace psemek::ui
callback_ = std::move(callback);
}
~button() override;
protected:
enum class state_t
{

View file

@ -56,6 +56,9 @@ namespace psemek::ui
virtual void post(std::function<void()> f);
virtual void post_reshape();
protected:
virtual void release_children();
private:
element * parent_ = nullptr;
async::event_loop * loop_ = nullptr;

View file

@ -19,6 +19,8 @@ namespace psemek::ui
virtual std::optional<geom::vector<float, 2>> min_size() const { return min_size_; }
virtual std::optional<geom::vector<float, 2>> max_size() const { return max_size_; }
~frame() override;
private:
std::optional<geom::vector<float, 2>> min_size_;
std::optional<geom::vector<float, 2>> max_size_;

View file

@ -42,6 +42,8 @@ namespace psemek::ui
void draw(painter &) const override {}
~grid_layout() override;
private:
util::array<std::shared_ptr<element>, 2> children_;
std::vector<element *> children_range_;

View file

@ -44,6 +44,8 @@ namespace psemek::ui
void draw(painter &) const override {}
~screen() override;
private:
container_impl container_;
box_shape shape_;

View file

@ -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();

View file

@ -95,4 +95,10 @@ namespace psemek::ui
});
}
void element::release_children()
{
for (auto c : children())
if (c) c->set_parent(nullptr);
}
}

View file

@ -34,4 +34,9 @@ namespace psemek::ui
post_reshape();
}
frame::~frame()
{
release_children();
}
}

View file

@ -281,4 +281,9 @@ namespace psemek::ui
}
}
grid_layout::~grid_layout()
{
release_children();
}
}

View file

@ -113,4 +113,9 @@ namespace psemek::ui
return result;
}
screen::~screen()
{
release_children();
}
}