@@ -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
@@ -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,74 @@ void SceneTreeEditor::_rename_node(Node *p_node, const String &p_name) {
1108
1113
}
1109
1114
}
1110
1115
1111
- void SceneTreeEditor::_renamed () {
1116
+ void SceneTreeEditor::_edited () {
1112
1117
TreeItem *which = tree->get_edited ();
1113
-
1114
1118
ERR_FAIL_NULL (which);
1115
- NodePath np = which->get_metadata (0 );
1116
- Node *n = get_node (np);
1119
+
1120
+ if (is_scene_tree_dock && tree->get_next_selected (which)) {
1121
+ List<Node *> nodes_to_rename;
1122
+ for (TreeItem *item = which; item; item = tree->get_next_selected (item)) {
1123
+ Node *n = get_node (item->get_metadata (0 ));
1124
+ ERR_FAIL_NULL (n);
1125
+ nodes_to_rename.push_back (n);
1126
+ }
1127
+ ERR_FAIL_COND (nodes_to_rename.is_empty ());
1128
+
1129
+ EditorUndoRedoManager *undo_redo = EditorUndoRedoManager::get_singleton ();
1130
+ undo_redo->create_action (TTR (" Rename Nodes" ), UndoRedo::MERGE_DISABLE, nodes_to_rename.front ()->get (), true );
1131
+
1132
+ TreeItem *item = which;
1133
+ for (Node *n : nodes_to_rename) {
1134
+ _renamed (item, which, n);
1135
+ item = tree->get_next_selected (item);
1136
+ }
1137
+ which->remove_meta (" use_class" );
1138
+ undo_redo->commit_action ();
1139
+ } else {
1140
+ _renamed (which, nullptr );
1141
+ }
1142
+ }
1143
+
1144
+ void SceneTreeEditor::_renamed (TreeItem *p_item, TreeItem *p_batch_item, Node *p_node) {
1145
+ Node *n;
1146
+ if (p_node) {
1147
+ n = p_node; // During batch rename the paths may change, so using metadata is unreliable.
1148
+ } else {
1149
+ n = get_node (p_item->get_metadata (0 ));
1150
+ }
1117
1151
ERR_FAIL_NULL (n);
1118
1152
1119
- String new_name = which->get_text (0 );
1153
+ String new_name;
1154
+ if (p_batch_item) {
1155
+ if (!p_batch_item->get_meta (SNAME (" use_class" ), false )) {
1156
+ new_name = p_batch_item->get_text (0 );
1157
+ }
1158
+ } else {
1159
+ new_name = p_item->get_text (0 );
1160
+ }
1161
+
1162
+ if (new_name.strip_edges ().is_empty ()) {
1163
+ // If name is empty, fallback to class name.
1164
+ if (int (GLOBAL_GET (" editor/naming/node_name_casing" )) != NAME_CASING_PASCAL_CASE) {
1165
+ new_name = Node::adjust_name_casing (n->get_class ());
1166
+ } else {
1167
+ new_name = n->get_class ();
1168
+ }
1169
+
1170
+ // When doing batch rename, rename all nodes to their respective class.
1171
+ if (p_batch_item == p_item) {
1172
+ p_batch_item->set_meta (" use_class" , true );
1173
+ }
1174
+ }
1175
+
1176
+ if (n->is_unique_name_in_owner () && get_tree ()->get_edited_scene_root ()->get_node_or_null (" %" + new_name) != nullptr ) {
1177
+ error->set_text (vformat (TTR (" A node with the unique name %s already exists in this scene." ), new_name));
1178
+ error->popup_centered ();
1179
+ p_item->set_text (0 , n->get_name ());
1180
+ return ;
1181
+ }
1120
1182
1121
- _rename_node (n, new_name);
1183
+ rename_node (n, new_name, p_item );
1122
1184
}
1123
1185
1124
1186
Node *SceneTreeEditor::get_selected () {
@@ -1491,7 +1553,7 @@ void SceneTreeEditor::set_connecting_signal(bool p_enable) {
1491
1553
1492
1554
void SceneTreeEditor::_bind_methods () {
1493
1555
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 );
1556
+ ClassDB::bind_method (" _test_update_tree " , &SceneTreeEditor::_test_update_tree );
1495
1557
1496
1558
ClassDB::bind_method (D_METHOD (" update_tree" ), &SceneTreeEditor::update_tree);
1497
1559
@@ -1543,7 +1605,7 @@ SceneTreeEditor::SceneTreeEditor(bool p_label, bool p_can_rename, bool p_can_ope
1543
1605
}
1544
1606
1545
1607
tree->connect (" cell_selected" , callable_mp (this , &SceneTreeEditor::_selected_changed));
1546
- tree->connect (" item_edited" , callable_mp (this , &SceneTreeEditor::_renamed ));
1608
+ tree->connect (" item_edited" , callable_mp (this , &SceneTreeEditor::_edited ));
1547
1609
tree->connect (" multi_selected" , callable_mp (this , &SceneTreeEditor::_cell_multi_selected));
1548
1610
tree->connect (" button_clicked" , callable_mp (this , &SceneTreeEditor::_cell_button_pressed));
1549
1611
tree->connect (" nothing_selected" , callable_mp (this , &SceneTreeEditor::_deselect_items));
0 commit comments