Fix SceneTree dock filter crash
The filter was crashing for two reasons: 1) Deleting a child invalidated the iteration of children 2) Child was accessed after deletion
This commit is contained in:
parent
50fa1896b8
commit
39e61b76c6
1 changed files with 12 additions and 3 deletions
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue