Skip to content

Commit

Permalink
Merge pull request #59900 from timothyqiu/remove-theme-type
Browse files Browse the repository at this point in the history
[3.x] Add an explicit way to remove a theme type
  • Loading branch information
akien-mga authored Apr 5, 2022
2 parents 781ffb8 + f625172 commit a4bbc87
Show file tree
Hide file tree
Showing 5 changed files with 230 additions and 24 deletions.
15 changes: 15 additions & 0 deletions doc/classes/Theme.xml
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,14 @@
<link>$DOCS_URL/tutorials/ui/gui_skinning.html</link>
</tutorials>
<methods>
<method name="add_type">
<return type="void" />
<argument index="0" name="theme_type" type="String" />
<description>
Adds an empty theme type for every valid data type.
[b]Note:[/b] Empty types are not saved with the theme. This method only exists to perform in-memory changes to the resource. Use available [code]set_*[/code] methods to add theme items.
</description>
</method>
<method name="clear">
<return type="void" />
<description>
Expand Down Expand Up @@ -318,6 +326,13 @@
[b]Note:[/b] This modifies the current theme. If you want to merge two themes together without modifying either one, create a new empty theme and merge the other two into it one after another.
</description>
</method>
<method name="remove_type">
<return type="void" />
<argument index="0" name="theme_type" type="String" />
<description>
Removes the theme type, gracefully discarding defined theme items. If the type is a variation, this information is also erased. If the type is a base for type variations, those variations lose their base.
</description>
</method>
<method name="rename_color">
<return type="void" />
<argument index="0" name="old_name" type="String" />
Expand Down
89 changes: 67 additions & 22 deletions editor/plugins/theme_editor_plugin.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1174,27 +1174,31 @@ void ThemeItemEditorDialog::_update_edit_types() {

bool item_reselected = false;
edit_type_list->clear();
int e_idx = 0;
TreeItem *list_root = edit_type_list->create_item();

for (List<StringName>::Element *E = theme_types.front(); E; E = E->next()) {
Ref<Texture> item_icon;
if (E->get() == "") {
item_icon = get_icon("NodeDisabled", "EditorIcons");
} else {
item_icon = EditorNode::get_singleton()->get_class_icon(E->get(), "NodeDisabled");
}
edit_type_list->add_item(E->get(), item_icon);
TreeItem *list_item = edit_type_list->create_item(list_root);
list_item->set_text(0, E->get());
list_item->set_icon(0, item_icon);
list_item->add_button(0, get_icon("Remove", "EditorIcons"), TYPES_TREE_REMOVE_ITEM, false, TTR("Remove Type"));

if (E->get() == edited_item_type) {
edit_type_list->select(e_idx);
list_item->select(0);
item_reselected = true;
}
e_idx++;
}
if (!item_reselected) {
edited_item_type = "";

if (edit_type_list->get_item_count() > 0) {
edit_type_list->select(0);
TreeItem *ci = list_root->get_children();
if (ci) {
ci->select(0);
}
}

Expand All @@ -1203,9 +1207,9 @@ void ThemeItemEditorDialog::_update_edit_types() {
default_types.sort_custom<StringName::AlphCompare>();

String selected_type = "";
Vector<int> selected_ids = edit_type_list->get_selected_items();
if (selected_ids.size() > 0) {
selected_type = edit_type_list->get_item_text(selected_ids[0]);
TreeItem *selected_item = edit_type_list->get_selected();
if (selected_item) {
selected_type = selected_item->get_text(0);

edit_items_add_color->set_disabled(false);
edit_items_add_constant->set_disabled(false);
Expand Down Expand Up @@ -1236,11 +1240,26 @@ void ThemeItemEditorDialog::_update_edit_types() {
_update_edit_item_tree(selected_type);
}

void ThemeItemEditorDialog::_edited_type_selected(int p_item_idx) {
String selected_type = edit_type_list->get_item_text(p_item_idx);
void ThemeItemEditorDialog::_edited_type_selected() {
TreeItem *selected_item = edit_type_list->get_selected();
String selected_type = selected_item->get_text(0);
_update_edit_item_tree(selected_type);
}

void ThemeItemEditorDialog::_edited_type_button_pressed(Object *p_item, int p_column, int p_id) {
TreeItem *item = Object::cast_to<TreeItem>(p_item);
if (!item) {
return;
}

switch (p_id) {
case TYPES_TREE_REMOVE_ITEM: {
String type_name = item->get_text(0);
_remove_theme_type(type_name);
} break;
}
}

void ThemeItemEditorDialog::_update_edit_item_tree(String p_item_type) {
edited_item_type = p_item_type;

Expand Down Expand Up @@ -1366,8 +1385,8 @@ void ThemeItemEditorDialog::_update_edit_item_tree(String p_item_type) {
}

// If some type is selected, but it doesn't seem to have any items, show a guiding message.
Vector<int> selected_ids = edit_type_list->get_selected_items();
if (selected_ids.size() > 0) {
TreeItem *selected_item = edit_type_list->get_selected();
if (selected_item) {
if (!has_any_items) {
edit_items_message->set_text(TTR("This theme type is empty.\nAdd more items to it manually or by importing from another theme."));
edit_items_message->show();
Expand Down Expand Up @@ -1408,15 +1427,36 @@ void ThemeItemEditorDialog::_add_theme_type(const String &p_new_text) {
const String new_type = edit_add_type_value->get_text().strip_edges();
edit_add_type_value->clear();

edited_theme->add_icon_type(new_type);
edited_theme->add_stylebox_type(new_type);
edited_theme->add_font_type(new_type);
edited_theme->add_color_type(new_type);
edited_theme->add_constant_type(new_type);
_update_edit_types();
UndoRedo *ur = EditorNode::get_singleton()->get_undo_redo();

ur->create_action(TTR("Add Theme Type"));
ur->add_do_method(*edited_theme, "add_type", new_type);
ur->add_undo_method(*edited_theme, "remove_type", new_type);
ur->add_do_method(this, "_update_edit_types");
ur->add_undo_method(this, "_update_edit_types");

ur->commit_action();
}

void ThemeItemEditorDialog::_remove_theme_type(const String &p_theme_type) {
Ref<Theme> old_snapshot = edited_theme->duplicate();
Ref<Theme> new_snapshot = edited_theme->duplicate();

UndoRedo *ur = EditorNode::get_singleton()->get_undo_redo();
ur->create_action(TTR("Remove Theme Type"));

new_snapshot->remove_type(p_theme_type);

ur->add_do_method(*edited_theme, "clear");
ur->add_do_method(*edited_theme, "merge_with", new_snapshot);
// If the type was empty, it cannot be restored with merge, but thankfully we can fake it.
ur->add_undo_method(*edited_theme, "add_type", p_theme_type);
ur->add_undo_method(*edited_theme, "merge_with", old_snapshot);

ur->add_do_method(this, "_update_edit_types");
ur->add_undo_method(this, "_update_edit_types");

// Force emit a change so that other parts of the editor can update.
edited_theme->emit_changed();
ur->commit_action();
}

void ThemeItemEditorDialog::_add_theme_item(Theme::DataType p_data_type, String p_item_name, String p_item_type) {
Expand Down Expand Up @@ -1677,6 +1717,7 @@ void ThemeItemEditorDialog::_notification(int p_what) {
void ThemeItemEditorDialog::_bind_methods() {
// Internal binds.
ClassDB::bind_method("_edited_type_selected", &ThemeItemEditorDialog::_edited_type_selected);
ClassDB::bind_method("_edited_type_button_pressed", &ThemeItemEditorDialog::_edited_type_button_pressed);
ClassDB::bind_method("_add_theme_type", &ThemeItemEditorDialog::_add_theme_type);
ClassDB::bind_method("_open_add_theme_item_dialog", &ThemeItemEditorDialog::_open_add_theme_item_dialog);
ClassDB::bind_method("_remove_class_items", &ThemeItemEditorDialog::_remove_class_items);
Expand Down Expand Up @@ -1718,10 +1759,14 @@ ThemeItemEditorDialog::ThemeItemEditorDialog() {
edit_type_label->set_text(TTR("Types:"));
edit_dialog_side_vb->add_child(edit_type_label);

edit_type_list = memnew(ItemList);
edit_type_list = memnew(Tree);
edit_type_list->set_hide_root(true);
edit_type_list->set_hide_folding(true);
edit_type_list->set_columns(1);
edit_type_list->set_v_size_flags(Control::SIZE_EXPAND_FILL);
edit_dialog_side_vb->add_child(edit_type_list);
edit_type_list->connect("item_selected", this, "_edited_type_selected");
edit_type_list->connect("button_pressed", this, "_edited_type_button_pressed");

Label *edit_add_type_label = memnew(Label);
edit_add_type_label->set_text(TTR("Add Type:"));
Expand Down
10 changes: 8 additions & 2 deletions editor/plugins/theme_editor_plugin.h
Original file line number Diff line number Diff line change
Expand Up @@ -176,7 +176,11 @@ class ThemeItemEditorDialog : public AcceptDialog {

TabContainer *tc;

ItemList *edit_type_list;
enum TypesTreeAction {
TYPES_TREE_REMOVE_ITEM,
};

Tree *edit_type_list;
LineEdit *edit_add_type_value;
String edited_item_type;

Expand Down Expand Up @@ -227,13 +231,15 @@ class ThemeItemEditorDialog : public AcceptDialog {

void _dialog_about_to_show();
void _update_edit_types();
void _edited_type_selected(int p_item_idx);
void _edited_type_selected();
void _edited_type_button_pressed(Object *p_item, int p_column, int p_id);

void _update_edit_item_tree(String p_item_type);
void _item_tree_button_pressed(Object *p_item, int p_column, int p_id);

void _add_theme_type(const String &p_new_text);
void _add_theme_item(Theme::DataType p_data_type, String p_item_name, String p_item_type);
void _remove_theme_type(const String &p_theme_type);
void _remove_data_type_items(Theme::DataType p_data_type, String p_item_type);
void _remove_class_items();
void _remove_custom_items();
Expand Down
Loading

0 comments on commit a4bbc87

Please sign in to comment.