Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[3.x] Backport ability to copy group name #53162

Merged
merged 1 commit into from
Oct 21, 2021
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
102 changes: 59 additions & 43 deletions editor/groups_editor.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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();
Expand Down Expand Up @@ -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<TreeItem>(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<Node *> nodes;
scene_tree->get_nodes_in_group(name, &nodes);
bool removed_all = true;
for (List<Node *>::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<Node *> nodes;
scene_tree->get_nodes_in_group(name, &nodes);
bool removed_all = true;
for (List<Node *>::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) {
Expand Down Expand Up @@ -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);
Expand Down Expand Up @@ -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);
Expand Down Expand Up @@ -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;
}
Expand All @@ -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 {
Expand Down Expand Up @@ -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);
}
Expand All @@ -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);
Expand Down Expand Up @@ -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);
}
Expand Down
14 changes: 12 additions & 2 deletions editor/groups_editor.h
Original file line number Diff line number Diff line change
Expand Up @@ -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);
Expand All @@ -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; }

Expand All @@ -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();
Expand All @@ -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);

Expand Down