From bf2449ca92269af9930a0deb4e9901b0cfda3309 Mon Sep 17 00:00:00 2001 From: Duroxxigar Date: Mon, 27 Sep 2021 22:57:42 -0400 Subject: [PATCH] Backport ability to copy group name --- editor/groups_editor.cpp | 102 ++++++++++++++++++++++----------------- editor/groups_editor.h | 14 +++++- 2 files changed, 71 insertions(+), 45 deletions(-) diff --git a/editor/groups_editor.cpp b/editor/groups_editor.cpp index aa7e9c0fb190..bdb4ed0547bb 100644 --- a/editor/groups_editor.cpp +++ b/editor/groups_editor.cpp @@ -203,7 +203,8 @@ void GroupDialog::_add_group(String p_name) { TreeItem *new_group = groups->create_item(groups_root); new_group->set_text(0, name); - new_group->add_button(0, get_icon("Remove", "EditorIcons"), 0); + new_group->add_button(0, get_icon("Remove", "EditorIcons"), DELETE_GROUP); + new_group->add_button(0, get_icon("ActionCopy", "EditorIcons"), COPY_GROUP); new_group->set_editable(0, true); new_group->select(0); groups->ensure_cursor_is_visible(); @@ -297,43 +298,50 @@ void GroupDialog::_load_groups(Node *p_current) { } } -void GroupDialog::_delete_group_pressed(Object *p_item, int p_column, int p_id) { +void GroupDialog::_modify_group_pressed(Object *p_item, int p_column, int p_id) { TreeItem *ti = Object::cast_to(p_item); if (!ti) { return; } - String name = ti->get_text(0); + switch (p_id) { + case DELETE_GROUP: { + String name = ti->get_text(0); - undo_redo->create_action(TTR("Delete Group")); + undo_redo->create_action(TTR("Delete Group")); - List nodes; - scene_tree->get_nodes_in_group(name, &nodes); - bool removed_all = true; - for (List::Element *E = nodes.front(); E; E = E->next()) { - if (_can_edit(E->get(), name)) { - undo_redo->add_do_method(E->get(), "remove_from_group", name); - undo_redo->add_undo_method(E->get(), "add_to_group", name, true); - } else { - removed_all = false; - } - } + List nodes; + scene_tree->get_nodes_in_group(name, &nodes); + bool removed_all = true; + for (List::Element *E = nodes.front(); E; E = E->next()) { + if (_can_edit(E->get(), name)) { + undo_redo->add_do_method(E->get(), "remove_from_group", name); + undo_redo->add_undo_method(E->get(), "add_to_group", name, true); + } else { + removed_all = false; + } + } - if (removed_all) { - undo_redo->add_do_method(this, "_delete_group_item", name); - undo_redo->add_undo_method(this, "_add_group", name); - } + if (removed_all) { + undo_redo->add_do_method(this, "_delete_group_item", name); + undo_redo->add_undo_method(this, "_add_group", name); + } - undo_redo->add_do_method(this, "_group_selected"); - undo_redo->add_undo_method(this, "_group_selected"); - undo_redo->add_do_method(this, "emit_signal", "group_edited"); - undo_redo->add_undo_method(this, "emit_signal", "group_edited"); + undo_redo->add_do_method(this, "_group_selected"); + undo_redo->add_undo_method(this, "_group_selected"); + undo_redo->add_do_method(this, "emit_signal", "group_edited"); + undo_redo->add_undo_method(this, "emit_signal", "group_edited"); - // To force redraw of scene tree. - undo_redo->add_do_method(EditorNode::get_singleton()->get_scene_tree_dock()->get_tree_editor(), "update_tree"); - undo_redo->add_undo_method(EditorNode::get_singleton()->get_scene_tree_dock()->get_tree_editor(), "update_tree"); + // To force redraw of scene tree. + undo_redo->add_do_method(EditorNode::get_singleton()->get_scene_tree_dock()->get_tree_editor(), "update_tree"); + undo_redo->add_undo_method(EditorNode::get_singleton()->get_scene_tree_dock()->get_tree_editor(), "update_tree"); - undo_redo->commit_action(); + undo_redo->commit_action(); + } break; + case COPY_GROUP: { + OS::get_singleton()->set_clipboard(ti->get_text(p_column)); + } break; + } } void GroupDialog::_delete_group_item(const String &p_name) { @@ -391,7 +399,7 @@ void GroupDialog::edit() { void GroupDialog::_bind_methods() { ClassDB::bind_method("_add_pressed", &GroupDialog::_add_pressed); ClassDB::bind_method("_removed_pressed", &GroupDialog::_removed_pressed); - ClassDB::bind_method("_delete_group_pressed", &GroupDialog::_delete_group_pressed); + ClassDB::bind_method("_modify_group_pressed", &GroupDialog::_modify_group_pressed); ClassDB::bind_method("_delete_group_item", &GroupDialog::_delete_group_item); ClassDB::bind_method("_group_selected", &GroupDialog::_group_selected); @@ -437,7 +445,7 @@ GroupDialog::GroupDialog() { groups->set_v_size_flags(SIZE_EXPAND_FILL); groups->add_constant_override("draw_guides", 1); groups->connect("item_selected", this, "_group_selected"); - groups->connect("button_pressed", this, "_delete_group_pressed"); + groups->connect("button_pressed", this, "_modify_group_pressed"); groups->connect("item_edited", this, "_group_renamed"); HBoxContainer *chbc = memnew(HBoxContainer); @@ -578,7 +586,7 @@ void GroupsEditor::_add_group(const String &p_group) { group_name->clear(); } -void GroupsEditor::_remove_group(Object *p_item, int p_column, int p_id) { +void GroupsEditor::_modify_group(Object *p_item, int p_column, int p_id) { if (!node) { return; } @@ -588,20 +596,27 @@ void GroupsEditor::_remove_group(Object *p_item, int p_column, int p_id) { return; } - String name = ti->get_text(0); + switch (p_id) { + case DELETE_GROUP: { + String name = ti->get_text(0); - undo_redo->create_action(TTR("Remove from Group")); + undo_redo->create_action(TTR("Remove from Group")); - undo_redo->add_do_method(node, "remove_from_group", name); - undo_redo->add_undo_method(node, "add_to_group", name, true); - undo_redo->add_do_method(this, "update_tree"); - undo_redo->add_undo_method(this, "update_tree"); + undo_redo->add_do_method(node, "remove_from_group", name); + undo_redo->add_undo_method(node, "add_to_group", name, true); + undo_redo->add_do_method(this, "update_tree"); + undo_redo->add_undo_method(this, "update_tree"); - // To force redraw of scene tree. - undo_redo->add_do_method(EditorNode::get_singleton()->get_scene_tree_dock()->get_tree_editor(), "update_tree"); - undo_redo->add_undo_method(EditorNode::get_singleton()->get_scene_tree_dock()->get_tree_editor(), "update_tree"); + // To force redraw of scene tree. + undo_redo->add_do_method(EditorNode::get_singleton()->get_scene_tree_dock()->get_tree_editor(), "update_tree"); + undo_redo->add_undo_method(EditorNode::get_singleton()->get_scene_tree_dock()->get_tree_editor(), "update_tree"); - undo_redo->commit_action(); + undo_redo->commit_action(); + } break; + case COPY_GROUP: { + OS::get_singleton()->set_clipboard(ti->get_text(p_column)); + } break; + } } struct _GroupInfoComparator { @@ -650,7 +665,8 @@ void GroupsEditor::update_tree() { TreeItem *item = tree->create_item(root); item->set_text(0, gi.name); if (can_be_deleted) { - item->add_button(0, get_icon("Remove", "EditorIcons"), 0); + item->add_button(0, get_icon("Remove", "EditorIcons"), DELETE_GROUP); + item->add_button(0, get_icon("ActionCopy", "EditorIcons"), COPY_GROUP); } else { item->set_selectable(0, false); } @@ -669,7 +685,7 @@ void GroupsEditor::_show_group_dialog() { void GroupsEditor::_bind_methods() { ClassDB::bind_method("_add_group", &GroupsEditor::_add_group); - ClassDB::bind_method("_remove_group", &GroupsEditor::_remove_group); + ClassDB::bind_method("_modify_group", &GroupsEditor::_modify_group); ClassDB::bind_method("update_tree", &GroupsEditor::update_tree); ClassDB::bind_method("_show_group_dialog", &GroupsEditor::_show_group_dialog); @@ -707,7 +723,7 @@ GroupsEditor::GroupsEditor() { tree->set_hide_root(true); tree->set_v_size_flags(SIZE_EXPAND_FILL); vbc->add_child(tree); - tree->connect("button_pressed", this, "_remove_group"); + tree->connect("button_pressed", this, "_modify_group"); tree->add_constant_override("draw_guides", 1); add_constant_override("separation", 3 * EDSCALE); } diff --git a/editor/groups_editor.h b/editor/groups_editor.h index 117e6f4a4e7e..cb1996bd14f3 100644 --- a/editor/groups_editor.h +++ b/editor/groups_editor.h @@ -83,7 +83,7 @@ class GroupDialog : public WindowDialog { void _rename_group_item(const String &p_old_name, const String &p_new_name); void _add_group(String p_name); - void _delete_group_pressed(Object *p_item, int p_column, int p_id); + void _modify_group_pressed(Object *p_item, int p_column, int p_id); void _delete_group_item(const String &p_name); bool _can_edit(Node *p_node, String p_group); @@ -96,6 +96,11 @@ class GroupDialog : public WindowDialog { static void _bind_methods(); public: + enum ModifyButton { + DELETE_GROUP, + COPY_GROUP, + }; + void edit(); void set_undo_redo(UndoRedo *p_undoredo) { undo_redo = p_undoredo; } @@ -117,7 +122,7 @@ class GroupsEditor : public VBoxContainer { void update_tree(); void _add_group(const String &p_group = ""); - void _remove_group(Object *p_item, int p_column, int p_id); + void _modify_group(Object *p_item, int p_column, int p_id); void _close(); void _show_group_dialog(); @@ -126,6 +131,11 @@ class GroupsEditor : public VBoxContainer { static void _bind_methods(); public: + enum ModifyButton { + DELETE_GROUP, + COPY_GROUP, + }; + void set_undo_redo(UndoRedo *p_undoredo) { undo_redo = p_undoredo; } void set_current(Node *p_node);