Fix scene reload causing segfaults when non-existent node is currently selected #107067
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
Errors in the way we were handling deselecting nodes were causing segfaults when the currently edited scene was reloaded.
When reloading a scene, the currently selected node may not exist. This is supposed to be handled by EditorSelection::update(), which emits a signal that calls SceneTreeDock::_selection_changed(), which calls SceneTreeDock::_push_item, which calls EditorNode::get_singleton()->push_node_item.
However, the problem is thus:
SceneTreeDock::_push_item
always callspush_node_item
for nullptr objects, but this ends up being useless, becauseEditorNode::push_node_item
was checking to see if the currently edited object in the inspector was a Node; if the inspector object is null, then it won't be a node, so nothing happens, and the NodeDock and associated docks don't get their selection updated.As a result, interacting with any of the NodeDocks besides the SceneTreeDock after a scene reload with a removed node selected can cause a crash. The easiest way to cause this is by interacting with the Node menu and double clicking on one of the signals.
Checking if the currently edited node in the inspector is null and calling
push_item
if so fixes the issue.