summaryrefslogtreecommitdiff
path: root/editor
diff options
context:
space:
mode:
authorRĂ©mi Verschelde <remi@verschelde.fr>2021-07-23 22:14:55 +0200
committerGitHub <noreply@github.com>2021-07-23 22:14:55 +0200
commitaa4babdc065d3e0932a60059718c1001b5d250b3 (patch)
tree203c601e0abbb783e0177f1466d670e0f1e85781 /editor
parent4c3d5850de5f6870ff28fbfb9142e7093f76125d (diff)
parentb7bc60978281c3ab97dbc4de43612c8a5eea2218 (diff)
Merge pull request #50762 from TokageItLab/fix-node-selection-signal
Diffstat (limited to 'editor')
-rw-r--r--editor/scene_tree_editor.cpp36
-rw-r--r--editor/scene_tree_editor.h3
2 files changed, 24 insertions, 15 deletions
diff --git a/editor/scene_tree_editor.cpp b/editor/scene_tree_editor.cpp
index c6f2c9253e..0468fe4ee0 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<TreeItem>(p_object);
ERR_FAIL_COND(!item);
@@ -652,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_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"));
}
}
@@ -747,7 +756,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 +1206,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 e833bf93e0..acd49e8d92 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<StringName> valid_types;
- void _emit_node_selected();
-
public:
void set_filter(const String &p_filter);
String get_filter() const;