Merge pull request #88943 from lawnjelly/fix_scenedock_filter_crash

[3.x] Fix SceneTree dock filter crash
This commit is contained in:
Rémi Verschelde 2024-02-28 09:45:28 +01:00 committed by GitHub
commit 60ff43b7ce
No known key found for this signature in database
GPG key ID: B5690EEEBB952194

View file

@ -594,9 +594,16 @@ bool SceneTreeEditor::_update_filter(TreeItem *p_parent, bool p_scroll_to_select
} }
bool keep_for_children = false; bool keep_for_children = false;
// Get the list of children ahead of time, as the list may be invalidated by deleting one of them.
LocalVector<TreeItem *> children;
for (TreeItem *child = p_parent->get_children(); child; child = child->get_next()) { for (TreeItem *child = p_parent->get_children(); child; child = child->get_next()) {
children.push_back(child);
}
for (uint32_t n = 0; n < children.size(); n++) {
// Always keep if at least one of the children are kept. // Always keep if at least one of the children are kept.
keep_for_children = _update_filter(child, p_scroll_to_selected) || keep_for_children; keep_for_children = _update_filter(children[n], p_scroll_to_selected) || keep_for_children;
} }
// Now find other reasons to keep this Node, too. // Now find other reasons to keep this Node, too.
@ -617,8 +624,6 @@ bool SceneTreeEditor::_update_filter(TreeItem *p_parent, bool p_scroll_to_select
} }
} }
} }
} else {
memdelete(p_parent);
} }
if (editor_selection) { if (editor_selection) {
@ -635,6 +640,10 @@ bool SceneTreeEditor::_update_filter(TreeItem *p_parent, bool p_scroll_to_select
} }
} }
if (!(keep || keep_for_children)) {
memdelete(p_parent);
}
return keep || keep_for_children; return keep || keep_for_children;
} }