diff options
Diffstat (limited to 'editor/gui/scene_tree_editor.cpp')
-rw-r--r-- | editor/gui/scene_tree_editor.cpp | 52 |
1 files changed, 38 insertions, 14 deletions
diff --git a/editor/gui/scene_tree_editor.cpp b/editor/gui/scene_tree_editor.cpp index 766566bf2b..c74d9fc3d4 100644 --- a/editor/gui/scene_tree_editor.cpp +++ b/editor/gui/scene_tree_editor.cpp @@ -1030,8 +1030,13 @@ void SceneTreeEditor::set_selected(Node *p_node, bool p_emit_selected) { } } -void SceneTreeEditor::_rename_node(Node *p_node, const String &p_name) { - TreeItem *item = _find(tree->get_root(), p_node->get_path()); +void SceneTreeEditor::rename_node(Node *p_node, const String &p_name, TreeItem *p_item) { + TreeItem *item; + if (p_item) { + item = p_item; // During batch rename the paths may change, so using _find() is unreliable. + } else { + item = _find(tree->get_root(), p_node->get_path()); + } ERR_FAIL_NULL(item); String new_name = p_name.validate_node_name(); @@ -1069,7 +1074,7 @@ void SceneTreeEditor::_rename_node(Node *p_node, const String &p_name) { // 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. if (p_node->is_unique_name_in_owner() && get_tree()->get_edited_scene_root()->get_node_or_null("%" + new_name)) { - String text = TTR("Another node already uses this unique name in the scene."); + String text = vformat(TTR("A node with the unique name %s already exists in this scene."), new_name); if (error->is_visible()) { if (!error->get_meta("same_unique_name", false)) { error->set_text(error->get_text() + "\n\n" + text); @@ -1091,7 +1096,7 @@ void SceneTreeEditor::_rename_node(Node *p_node, const String &p_name) { emit_signal(SNAME("node_renamed")); } else { EditorUndoRedoManager *undo_redo = EditorUndoRedoManager::get_singleton(); - undo_redo->create_action("Rename Node", UndoRedo::MERGE_DISABLE, p_node); + undo_redo->create_action(TTR("Rename Node"), UndoRedo::MERGE_DISABLE, p_node); emit_signal(SNAME("node_prerename"), p_node, new_name); @@ -1108,17 +1113,37 @@ void SceneTreeEditor::_rename_node(Node *p_node, const String &p_name) { } } -void SceneTreeEditor::_renamed() { - TreeItem *which = tree->get_edited(); - +void SceneTreeEditor::_edited() { + TreeItem *which = tree->get_next_selected(nullptr); ERR_FAIL_NULL(which); - NodePath np = which->get_metadata(0); - Node *n = get_node(np); - ERR_FAIL_NULL(n); + TreeItem *edited = tree->get_edited(); + ERR_FAIL_NULL(edited); + + if (is_scene_tree_dock && tree->get_next_selected(which)) { + List<Node *> nodes_to_rename; + for (TreeItem *item = which; item; item = tree->get_next_selected(item)) { + Node *n = get_node(item->get_metadata(0)); + ERR_FAIL_NULL(n); + nodes_to_rename.push_back(n); + } + ERR_FAIL_COND(nodes_to_rename.is_empty()); - String new_name = which->get_text(0); + EditorUndoRedoManager *undo_redo = EditorUndoRedoManager::get_singleton(); + undo_redo->create_action(TTR("Rename Nodes"), UndoRedo::MERGE_DISABLE, nodes_to_rename.front()->get(), true); + + TreeItem *item = which; + String new_name = edited->get_text(0); + for (Node *n : nodes_to_rename) { + rename_node(n, new_name, item); + item = tree->get_next_selected(item); + } - _rename_node(n, new_name); + undo_redo->commit_action(); + } else { + Node *n = get_node(which->get_metadata(0)); + ERR_FAIL_NULL(n); + rename_node(n, which->get_text(0)); + } } Node *SceneTreeEditor::get_selected() { @@ -1491,7 +1516,6 @@ void SceneTreeEditor::set_connecting_signal(bool p_enable) { void SceneTreeEditor::_bind_methods() { ClassDB::bind_method(D_METHOD("_update_tree"), &SceneTreeEditor::_update_tree, DEFVAL(false)); // Still used by UndoRedo. - ClassDB::bind_method("_rename_node", &SceneTreeEditor::_rename_node); ClassDB::bind_method(D_METHOD("update_tree"), &SceneTreeEditor::update_tree); @@ -1543,7 +1567,7 @@ SceneTreeEditor::SceneTreeEditor(bool p_label, bool p_can_rename, bool p_can_ope } tree->connect("cell_selected", callable_mp(this, &SceneTreeEditor::_selected_changed)); - tree->connect("item_edited", callable_mp(this, &SceneTreeEditor::_renamed)); + tree->connect("item_edited", callable_mp(this, &SceneTreeEditor::_edited)); tree->connect("multi_selected", callable_mp(this, &SceneTreeEditor::_cell_multi_selected)); tree->connect("button_clicked", callable_mp(this, &SceneTreeEditor::_cell_button_pressed)); tree->connect("nothing_selected", callable_mp(this, &SceneTreeEditor::_deselect_items)); |