From 32640edac718a0eaf130719f96450ebf758fc085 Mon Sep 17 00:00:00 2001 From: Silc 'Tokage' Renew <61938263+TokageItLab@users.noreply.github.com> Date: Fri, 23 Jul 2021 17:34:21 +0900 Subject: [PATCH 1/2] Revert "Fix duplicate selection in SceneTree" This reverts commit 7d20d78847b24586b3f25beb23b41d015a25fb0a. # Conflicts: # editor/scene_tree_editor.cpp --- editor/scene_tree_editor.cpp | 31 ++++++++++++++++++++++--------- editor/scene_tree_editor.h | 3 +-- 2 files changed, 23 insertions(+), 11 deletions(-) diff --git a/editor/scene_tree_editor.cpp b/editor/scene_tree_editor.cpp index c6f2c9253e5..24fc45dfd3c 100644 --- a/editor/scene_tree_editor.cpp +++ b/editor/scene_tree_editor.cpp @@ -521,7 +521,7 @@ void SceneTreeEditor::_node_removed(Node *p_node) { if (p_node == selected) { selected = nullptr; - _emit_node_selected(); + emit_signal("node_selected"); } } @@ -615,6 +615,24 @@ void SceneTreeEditor::_tree_changed() { pending_test_update = true; } +void SceneTreeEditor::_selected_changed() { + TreeItem *s = tree->get_selected(); + ERR_FAIL_COND(!s); + NodePath np = s->get_metadata(0); + + Node *n = get_node(np); + + if (n == selected) { + return; + } + + selected = get_node(np); + + blocked++; + emit_signal("node_selected"); + blocked--; +} + void SceneTreeEditor::_deselect_items() { // Clear currently selected items in scene tree dock. if (editor_selection) { @@ -623,12 +641,6 @@ void SceneTreeEditor::_deselect_items() { } } -void SceneTreeEditor::_emit_node_selected() { - blocked++; - emit_signal(SNAME("node_selected")); - blocked--; -} - void SceneTreeEditor::_cell_multi_selected(Object *p_object, int p_cell, bool p_selected) { TreeItem *item = Object::cast_to(p_object); ERR_FAIL_COND(!item); @@ -655,7 +667,7 @@ void SceneTreeEditor::_cell_multi_selected(Object *p_object, int p_cell, bool p_ // Selection changed to be single node, so emit "selected" (for single node) rather than "changed" (for multiple nodes) if (editor_selection->get_selected_nodes().size() == 1) { selected = editor_selection->get_selected_node_list()[0]; - _emit_node_selected(); + emit_signal("node_selected"); } else { emit_signal(SNAME("node_changed")); } @@ -747,7 +759,7 @@ void SceneTreeEditor::set_selected(Node *p_node, bool p_emit_selected) { } if (p_emit_selected) { - _emit_node_selected(); + emit_signal("node_selected"); } } @@ -1197,6 +1209,7 @@ SceneTreeEditor::SceneTreeEditor(bool p_label, bool p_can_rename, bool p_can_ope tree->connect("empty_tree_rmb_selected", callable_mp(this, &SceneTreeEditor::_rmb_select)); } + tree->connect("cell_selected", callable_mp(this, &SceneTreeEditor::_selected_changed)); tree->connect("item_edited", callable_mp(this, &SceneTreeEditor::_renamed), varray(), CONNECT_DEFERRED); tree->connect("multi_selected", callable_mp(this, &SceneTreeEditor::_cell_multi_selected)); tree->connect("button_pressed", callable_mp(this, &SceneTreeEditor::_cell_button_pressed)); diff --git a/editor/scene_tree_editor.h b/editor/scene_tree_editor.h index e833bf93e04..acd49e8d920 100644 --- a/editor/scene_tree_editor.h +++ b/editor/scene_tree_editor.h @@ -81,6 +81,7 @@ class SceneTreeEditor : public Control { TreeItem *_find(TreeItem *p_node, const NodePath &p_path); void _notification(int p_what); + void _selected_changed(); void _deselect_items(); void _rename_node(ObjectID p_node, const String &p_name); @@ -132,8 +133,6 @@ class SceneTreeEditor : public Control { Vector valid_types; - void _emit_node_selected(); - public: void set_filter(const String &p_filter); String get_filter() const; From b7bc60978281c3ab97dbc4de43612c8a5eea2218 Mon Sep 17 00:00:00 2001 From: Silc 'Tokage' Renew <61938263+TokageItLab@users.noreply.github.com> Date: Fri, 23 Jul 2021 17:37:35 +0900 Subject: [PATCH 2/2] Remove extra signal firing in SELECT_MULTI mode --- editor/scene_tree_editor.cpp | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/editor/scene_tree_editor.cpp b/editor/scene_tree_editor.cpp index 24fc45dfd3c..0468fe4ee00 100644 --- a/editor/scene_tree_editor.cpp +++ b/editor/scene_tree_editor.cpp @@ -664,11 +664,8 @@ void SceneTreeEditor::_cell_multi_selected(Object *p_object, int p_cell, bool p_ editor_selection->remove_node(n); } - // Selection changed to be single node, so emit "selected" (for single node) rather than "changed" (for multiple nodes) - if (editor_selection->get_selected_nodes().size() == 1) { - selected = editor_selection->get_selected_node_list()[0]; - emit_signal("node_selected"); - } else { + // Emitted "selected" in _selected_changed() when select single node, so select multiple node emit "changed" + if (editor_selection->get_selected_nodes().size() > 1) { emit_signal(SNAME("node_changed")); } }