From 0025ab89c70839da7c15f14a0f30b4682548c08f Mon Sep 17 00:00:00 2001 From: Haoyu Qiu Date: Thu, 27 Oct 2022 21:37:50 +0800 Subject: [PATCH] Fix spatial gizmo still active when node is deselected --- editor/plugins/spatial_editor_plugin.cpp | 25 ++++++++++++++++++++++-- editor/plugins/spatial_editor_plugin.h | 1 + 2 files changed, 24 insertions(+), 2 deletions(-) diff --git a/editor/plugins/spatial_editor_plugin.cpp b/editor/plugins/spatial_editor_plugin.cpp index ccd9fc76ed7..1c147b84815 100644 --- a/editor/plugins/spatial_editor_plugin.cpp +++ b/editor/plugins/spatial_editor_plugin.cpp @@ -6071,6 +6071,20 @@ bool SpatialEditor::is_any_freelook_active() const { return false; } +void SpatialEditor::_selection_changed() { + _refresh_menu_icons(); + + if (selected && editor_selection->get_selected_node_list().size() != 1) { + Ref gizmo = selected->get_gizmo(); + if (gizmo.is_valid()) { + gizmo->set_selected(false); + selected->update_gizmo(); + } + selected = nullptr; + over_gizmo_handle = -1; + } +} + void SpatialEditor::_refresh_menu_icons() { bool all_locked = true; bool all_grouped = true; @@ -6295,7 +6309,7 @@ void SpatialEditor::_notification(int p_what) { get_tree()->connect("node_removed", this, "_node_removed"); EditorNode::get_singleton()->get_scene_tree_dock()->get_tree_editor()->connect("node_changed", this, "_refresh_menu_icons"); - editor_selection->connect("selection_changed", this, "_refresh_menu_icons"); + editor_selection->connect("selection_changed", this, "_selection_changed"); editor->connect("stop_pressed", this, "_update_camera_override_button", make_binds(false)); editor->connect("play_pressed", this, "_update_camera_override_button", make_binds(true)); @@ -6534,6 +6548,7 @@ void SpatialEditor::_bind_methods() { ClassDB::bind_method("_get_editor_data", &SpatialEditor::_get_editor_data); ClassDB::bind_method("_request_gizmo", &SpatialEditor::_request_gizmo); ClassDB::bind_method("_toggle_maximize_view", &SpatialEditor::_toggle_maximize_view); + ClassDB::bind_method("_selection_changed", &SpatialEditor::_selection_changed); ClassDB::bind_method("_refresh_menu_icons", &SpatialEditor::_refresh_menu_icons); ClassDB::bind_method("_update_camera_override_button", &SpatialEditor::_update_camera_override_button); ClassDB::bind_method("_update_camera_override_viewport", &SpatialEditor::_update_camera_override_viewport); @@ -6995,7 +7010,13 @@ void SpatialEditorPlugin::edit(Object *p_object) { } bool SpatialEditorPlugin::handles(Object *p_object) const { - return p_object->is_class("Spatial"); + if (p_object->is_class("Spatial")) { + return true; + } else { + // This ensures that gizmos are cleared when selecting a non-Spatial node. + const_cast(this)->edit((Object *)nullptr); + return false; + } } Dictionary SpatialEditorPlugin::get_state() const { diff --git a/editor/plugins/spatial_editor_plugin.h b/editor/plugins/spatial_editor_plugin.h index bcb6dc80869..95312af9260 100644 --- a/editor/plugins/spatial_editor_plugin.h +++ b/editor/plugins/spatial_editor_plugin.h @@ -752,6 +752,7 @@ private: bool is_any_freelook_active() const; + void _selection_changed(); void _refresh_menu_icons(); protected: