Merge pull request #116848 from billuo/bugfix/issue-116788-crash

Fix `reload_scene_from_path` may crash
This commit is contained in:
Thaddeus Crews
2026-03-04 11:20:41 -06:00
4 changed files with 12 additions and 13 deletions
+8 -4
View File
@@ -1331,16 +1331,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();
}
}
+1 -1
View File
@@ -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.
+2 -1
View File
@@ -4480,7 +4480,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;
+1 -7
View File
@@ -1467,11 +1467,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();
@@ -1500,11 +1499,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) {