summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorRémi Verschelde <rverschelde@gmail.com>2024-04-05 17:23:03 +0200
committerRémi Verschelde <rverschelde@gmail.com>2024-04-05 17:23:03 +0200
commit655e93d5846b2ef8ebb7d22c8878f51b8f22b312 (patch)
tree510ee1246b36f9b5170d1747e4a07405e458c547
parentc493217947e645c89a095491b7fae87a2ad07710 (diff)
parent6b8daa498e2e31edec4b89e0c5321cef7bb51be8 (diff)
downloadredot-engine-655e93d5846b2ef8ebb7d22c8878f51b8f22b312.tar.gz
Merge pull request #90266 from akien-mga/scenetreeeditor-fix-treeitem-crash
SceneTreeEditor: Fix crash when TreeItem is removed before callback
-rw-r--r--editor/gui/scene_tree_editor.cpp11
-rw-r--r--editor/gui/scene_tree_editor.h1
2 files changed, 11 insertions, 1 deletions
diff --git a/editor/gui/scene_tree_editor.cpp b/editor/gui/scene_tree_editor.cpp
index 0dd75ea033..221061f9f7 100644
--- a/editor/gui/scene_tree_editor.cpp
+++ b/editor/gui/scene_tree_editor.cpp
@@ -897,6 +897,14 @@ void SceneTreeEditor::_cell_multi_selected(Object *p_object, int p_cell, bool p_
}
}
+void SceneTreeEditor::_tree_scroll_to_item(ObjectID p_item_id) {
+ ERR_FAIL_NULL(tree);
+ TreeItem *item = Object::cast_to<TreeItem>(ObjectDB::get_instance(p_item_id));
+ if (item) {
+ tree->scroll_to_item(item, true);
+ }
+}
+
void SceneTreeEditor::_notification(int p_what) {
switch (p_what) {
case NOTIFICATION_ENTER_TREE: {
@@ -942,7 +950,8 @@ void SceneTreeEditor::_notification(int p_what) {
if (item) {
// Must wait until tree is properly sized before scrolling.
- callable_mp(tree, &Tree::scroll_to_item).call_deferred(item, true);
+ ObjectID item_id = item->get_instance_id();
+ callable_mp(this, &SceneTreeEditor::_tree_scroll_to_item).call_deferred(item_id);
}
}
} break;
diff --git a/editor/gui/scene_tree_editor.h b/editor/gui/scene_tree_editor.h
index c1abdcef8b..b4d9644f16 100644
--- a/editor/gui/scene_tree_editor.h
+++ b/editor/gui/scene_tree_editor.h
@@ -123,6 +123,7 @@ class SceneTreeEditor : public Control {
void _set_item_custom_color(TreeItem *p_item, Color p_color);
void _update_node_tooltip(Node *p_node, TreeItem *p_item);
void _queue_update_node_tooltip(Node *p_node, TreeItem *p_item);
+ void _tree_scroll_to_item(ObjectID p_item_id);
void _selection_changed();
Node *get_scene_node() const;