@@ -1030,8 +1030,13 @@ void SceneTreeEditor::set_selected(Node *p_node, bool p_emit_selected) {
1030
1030
}
1031
1031
}
1032
1032
1033
- void SceneTreeEditor::_rename_node (Node *p_node, const String &p_name) {
1034
- TreeItem *item = _find (tree->get_root (), p_node->get_path ());
1033
+ void SceneTreeEditor::rename_node (Node *p_node, const String &p_name, TreeItem *p_item) {
1034
+ TreeItem *item;
1035
+ if (p_item) {
1036
+ item = p_item; // During batch rename the paths may change, so using _find() is unreliable.
1037
+ } else {
1038
+ item = _find (tree->get_root (), p_node->get_path ());
1039
+ }
1035
1040
ERR_FAIL_NULL (item);
1036
1041
String new_name = p_name.validate_node_name ();
1037
1042
@@ -1069,7 +1074,7 @@ void SceneTreeEditor::_rename_node(Node *p_node, const String &p_name) {
1069
1074
1070
1075
// We previously made sure name is not the same as current name so that it won't complain about already used unique name when not changing name.
1071
1076
if (p_node->is_unique_name_in_owner () && get_tree ()->get_edited_scene_root ()->get_node_or_null (" %" + new_name)) {
1072
- String text = TTR (" Another node already uses this unique name in the scene." );
1077
+ String text = vformat ( TTR (" A node with the unique name %s already exists in this scene." ), new_name );
1073
1078
if (error->is_visible ()) {
1074
1079
if (!error->get_meta (" same_unique_name" , false )) {
1075
1080
error->set_text (error->get_text () + " \n\n " + text);
@@ -1091,7 +1096,7 @@ void SceneTreeEditor::_rename_node(Node *p_node, const String &p_name) {
1091
1096
emit_signal (SNAME (" node_renamed" ));
1092
1097
} else {
1093
1098
EditorUndoRedoManager *undo_redo = EditorUndoRedoManager::get_singleton ();
1094
- undo_redo->create_action (" Rename Node" , UndoRedo::MERGE_DISABLE, p_node);
1099
+ undo_redo->create_action (TTR ( " Rename Node" ) , UndoRedo::MERGE_DISABLE, p_node);
1095
1100
1096
1101
emit_signal (SNAME (" node_prerename" ), p_node, new_name);
1097
1102
@@ -1108,17 +1113,37 @@ void SceneTreeEditor::_rename_node(Node *p_node, const String &p_name) {
1108
1113
}
1109
1114
}
1110
1115
1111
- void SceneTreeEditor::_renamed () {
1112
- TreeItem *which = tree->get_edited ();
1113
-
1116
+ void SceneTreeEditor::_edited () {
1117
+ TreeItem *which = tree->get_next_selected (nullptr );
1114
1118
ERR_FAIL_NULL (which);
1115
- NodePath np = which->get_metadata (0 );
1116
- Node *n = get_node (np);
1117
- ERR_FAIL_NULL (n);
1119
+ TreeItem *edited = tree->get_edited ();
1120
+ ERR_FAIL_NULL (edited);
1121
+
1122
+ if (is_scene_tree_dock && tree->get_next_selected (which)) {
1123
+ List<Node *> nodes_to_rename;
1124
+ for (TreeItem *item = which; item; item = tree->get_next_selected (item)) {
1125
+ Node *n = get_node (item->get_metadata (0 ));
1126
+ ERR_FAIL_NULL (n);
1127
+ nodes_to_rename.push_back (n);
1128
+ }
1129
+ ERR_FAIL_COND (nodes_to_rename.is_empty ());
1118
1130
1119
- String new_name = which->get_text (0 );
1131
+ EditorUndoRedoManager *undo_redo = EditorUndoRedoManager::get_singleton ();
1132
+ undo_redo->create_action (TTR (" Rename Nodes" ), UndoRedo::MERGE_DISABLE, nodes_to_rename.front ()->get (), true );
1133
+
1134
+ TreeItem *item = which;
1135
+ String new_name = edited->get_text (0 );
1136
+ for (Node *n : nodes_to_rename) {
1137
+ rename_node (n, new_name, item);
1138
+ item = tree->get_next_selected (item);
1139
+ }
1120
1140
1121
- _rename_node (n, new_name);
1141
+ undo_redo->commit_action ();
1142
+ } else {
1143
+ Node *n = get_node (which->get_metadata (0 ));
1144
+ ERR_FAIL_NULL (n);
1145
+ rename_node (n, which->get_text (0 ));
1146
+ }
1122
1147
}
1123
1148
1124
1149
Node *SceneTreeEditor::get_selected () {
@@ -1491,7 +1516,6 @@ void SceneTreeEditor::set_connecting_signal(bool p_enable) {
1491
1516
1492
1517
void SceneTreeEditor::_bind_methods () {
1493
1518
ClassDB::bind_method (D_METHOD (" _update_tree" ), &SceneTreeEditor::_update_tree, DEFVAL (false )); // Still used by UndoRedo.
1494
- ClassDB::bind_method (" _rename_node" , &SceneTreeEditor::_rename_node);
1495
1519
1496
1520
ClassDB::bind_method (D_METHOD (" update_tree" ), &SceneTreeEditor::update_tree);
1497
1521
@@ -1543,7 +1567,7 @@ SceneTreeEditor::SceneTreeEditor(bool p_label, bool p_can_rename, bool p_can_ope
1543
1567
}
1544
1568
1545
1569
tree->connect (" cell_selected" , callable_mp (this , &SceneTreeEditor::_selected_changed));
1546
- tree->connect (" item_edited" , callable_mp (this , &SceneTreeEditor::_renamed ));
1570
+ tree->connect (" item_edited" , callable_mp (this , &SceneTreeEditor::_edited ));
1547
1571
tree->connect (" multi_selected" , callable_mp (this , &SceneTreeEditor::_cell_multi_selected));
1548
1572
tree->connect (" button_clicked" , callable_mp (this , &SceneTreeEditor::_cell_button_pressed));
1549
1573
tree->connect (" nothing_selected" , callable_mp (this , &SceneTreeEditor::_deselect_items));
0 commit comments