From 0b4f18be7a88e5c59bc927d9c5aa3bd00bef4cef Mon Sep 17 00:00:00 2001 From: Zhen Luo <461652354@qq.com> Date: Fri, 27 Feb 2026 20:12:54 +0800 Subject: [PATCH] Fix `reload_scene_from_path` may crash --- editor/editor_data.cpp | 12 ++++++++---- editor/editor_data.h | 2 +- editor/editor_node.cpp | 3 ++- editor/scene/scene_tree_editor.cpp | 8 +------- 4 files changed, 12 insertions(+), 13 deletions(-) diff --git a/editor/editor_data.cpp b/editor/editor_data.cpp index e40f8077ff..bb031f4c8a 100644 --- a/editor/editor_data.cpp +++ b/editor/editor_data.cpp @@ -1330,16 +1330,20 @@ void EditorSelection::_update_node_list() { node_list_changed = false; } -void EditorSelection::update() { +void EditorSelection::update(bool p_deferred) { _update_node_list(); if (!changed) { return; } changed = false; - if (!emitted) { - emitted = true; - callable_mp(this, &EditorSelection::_emit_change).call_deferred(); + if (p_deferred) { + if (!emitted) { + emitted = true; + callable_mp(this, &EditorSelection::_emit_change).call_deferred(); + } + } else { + _emit_change(); } } diff --git a/editor/editor_data.h b/editor/editor_data.h index 320ff3c8f6..62acc19572 100644 --- a/editor/editor_data.h +++ b/editor/editor_data.h @@ -318,7 +318,7 @@ public: // Adds an editor plugin which can provide metadata for selected nodes. void add_editor_plugin(Object *p_object); - void update(); + void update(bool p_deferred = true); void clear(); // Returns only the top level selected nodes. diff --git a/editor/editor_node.cpp b/editor/editor_node.cpp index 783fd9f3a1..1e3bcc5660 100644 --- a/editor/editor_node.cpp +++ b/editor/editor_node.cpp @@ -4476,7 +4476,8 @@ bool EditorNode::is_addon_plugin_enabled(const String &p_addon) const { void EditorNode::_remove_edited_scene(bool p_change_tab) { // When scene gets closed no node is edited anymore, so make sure the editors are notified before nodes are freed. hide_unused_editors(SceneTreeDock::get_singleton()); - SceneTreeDock::get_singleton()->clear_previous_node_selection(); + editor_selection->clear(); + editor_selection->update(false); int new_index = editor_data.get_edited_scene(); int old_index = new_index; diff --git a/editor/scene/scene_tree_editor.cpp b/editor/scene/scene_tree_editor.cpp index ce8589251d..13ee3bf2d6 100644 --- a/editor/scene/scene_tree_editor.cpp +++ b/editor/scene/scene_tree_editor.cpp @@ -1465,11 +1465,10 @@ void SceneTreeEditor::set_selected(Node *p_node, bool p_emit_selected) { if (selected == p_node) { return; } + selected = p_node; TreeItem *item = p_node ? _find(tree->get_root(), p_node->get_path()) : nullptr; - if (item) { - selected = p_node; if (auto_expand_selected) { // Make visible when it's collapsed. TreeItem *node = item->get_parent(); @@ -1498,11 +1497,6 @@ void SceneTreeEditor::set_selected(Node *p_node, bool p_emit_selected) { tree->ensure_cursor_is_visible(); } } - } else { - if (!p_node) { - selected = nullptr; - } - selected = p_node; } if (p_emit_selected) {