aboutsummaryrefslogtreecommitdiff
path: root/include
diff options
context:
space:
mode:
authorYuqian Yang <crupest@crupest.life>2025-11-20 22:53:11 +0800
committerYuqian Yang <crupest@crupest.life>2025-11-20 22:53:11 +0800
commitc837573b8d42320f61ea282b1ea4e8ebc29a357f (patch)
treebc106ebf22254ac7da3ff18a16c34b3a104d0506 /include
parent478b4cdce5c584c294d38f84a0131f239d9af88f (diff)
downloadcru-c837573b8d42320f61ea282b1ea4e8ebc29a357f.tar.gz
cru-c837573b8d42320f61ea282b1ea4e8ebc29a357f.tar.bz2
cru-c837573b8d42320f61ea282b1ea4e8ebc29a357f.zip
Delete all delete later in UiApplication destructing on win.
Fix a bug in LayoutRenderObject.
Diffstat (limited to 'include')
-rw-r--r--include/cru/ui/render/LayoutRenderObject.h39
1 files changed, 23 insertions, 16 deletions
diff --git a/include/cru/ui/render/LayoutRenderObject.h b/include/cru/ui/render/LayoutRenderObject.h
index c0e4218d..9970c16c 100644
--- a/include/cru/ui/render/LayoutRenderObject.h
+++ b/include/cru/ui/render/LayoutRenderObject.h
@@ -11,9 +11,11 @@ class LayoutRenderObject : public RenderObject {
private:
struct ChildData {
+ /**
+ * May be nullptr.
+ */
RenderObject* render_object;
ChildLayoutData layout_data;
- bool render_object_destroyed;
EventHandlerRevokerListGuard event_guard;
};
@@ -27,32 +29,36 @@ class LayoutRenderObject : public RenderObject {
~LayoutRenderObject() override = default;
Index GetChildCount() const { return static_cast<Index>(children_.size()); }
+
RenderObject* GetChildAt(Index position) {
Expects(position >= 0 && position < GetChildCount());
return children_[position].render_object;
}
+
void AddChild(RenderObject* render_object, Index position) {
if (position < 0) position = 0;
if (position > GetChildCount()) position = GetChildCount();
- children_.insert(children_.begin() + position,
- ChildData{render_object, ChildLayoutData(), false});
+ auto iter = children_.insert(children_.begin() + position,
+ ChildData{render_object, ChildLayoutData()});
render_object->SetParent(this);
- render_object->DestroyEvent()->AddSpyOnlyHandler([this, render_object] {
- auto iter = std::ranges::find_if(
- children_, [render_object](const ChildData& data) {
- return data.render_object == render_object;
- });
- if (iter != children_.cend()) {
- iter->render_object_destroyed = true;
- }
- });
+ iter->event_guard +=
+ render_object->DestroyEvent()->AddSpyOnlyHandler([this, render_object] {
+ auto iter = std::ranges::find_if(
+ children_, [render_object](const ChildData& data) {
+ return data.render_object == render_object;
+ });
+ if (iter != children_.cend()) {
+ iter->render_object = nullptr;
+ }
+ });
InvalidateLayout();
}
void RemoveChild(Index position) {
Expects(position >= 0 && position < GetChildCount());
- if (!children_[position].render_object_destroyed) {
- children_[position].render_object->SetParent(nullptr);
+ auto render_object = children_[position].render_object;
+ if (render_object) {
+ render_object->SetParent(nullptr);
}
children_.erase(children_.begin() + position);
InvalidateLayout();
@@ -60,8 +66,9 @@ class LayoutRenderObject : public RenderObject {
void ClearChildren() {
for (auto child : children_) {
- if (!child.render_object_destroyed) {
- child.render_object->SetParent(nullptr);
+ auto render_object = child.render_object;
+ if (render_object) {
+ render_object->SetParent(nullptr);
}
}
children_.clear();