From e86750dcaac4618ef7e9d5c4d8f6e0ab8696bbe1 Mon Sep 17 00:00:00 2001 From: kobewi Date: Sat, 11 Nov 2023 19:14:05 +0100 Subject: [PATCH] Fetch theme editor items from ThemeDB --- editor/plugins/theme_editor_plugin.cpp | 25 +++++++++++++++---------- editor/plugins/theme_editor_plugin.h | 2 +- scene/theme/theme_db.cpp | 5 ++++- scene/theme/theme_db.h | 2 +- 4 files changed, 21 insertions(+), 13 deletions(-) diff --git a/editor/plugins/theme_editor_plugin.cpp b/editor/plugins/theme_editor_plugin.cpp index 8c3fe82f36f4..53bdf79d8704 100644 --- a/editor/plugins/theme_editor_plugin.cpp +++ b/editor/plugins/theme_editor_plugin.cpp @@ -2373,18 +2373,23 @@ void ThemeTypeEditor::_update_type_list_debounced() { update_debounce_timer->start(); } -HashMap ThemeTypeEditor::_get_type_items(String p_type_name, void (Theme::*get_list_func)(const StringName &, List *) const, bool include_default) { +HashMap ThemeTypeEditor::_get_type_items(String p_type_name, Theme::DataType p_type, bool p_include_default) { HashMap items; List names; - if (include_default) { + if (p_include_default) { names.clear(); String default_type = p_type_name; if (edited_theme->get_type_variation_base(p_type_name) != StringName()) { default_type = edited_theme->get_type_variation_base(p_type_name); } - (ThemeDB::get_singleton()->get_default_theme().operator->()->*get_list_func)(default_type, &names); + List theme_binds; + ThemeDB::get_singleton()->get_class_items(default_type, &theme_binds, true, p_type); + for (const ThemeDB::ThemeItemBind &E : theme_binds) { + names.push_back(E.item_name); + } + names.sort_custom(); for (const StringName &E : names) { items[E] = false; @@ -2393,7 +2398,7 @@ HashMap ThemeTypeEditor::_get_type_items(String p_type_name, v { names.clear(); - (edited_theme.operator->()->*get_list_func)(p_type_name, &names); + edited_theme->get_theme_item_list(p_type, p_type_name, &names); names.sort_custom(); for (const StringName &E : names) { items[E] = true; @@ -2499,7 +2504,7 @@ void ThemeTypeEditor::_update_type_items() { color_items_list->remove_child(node); } - HashMap color_items = _get_type_items(edited_type, &Theme::get_color_list, show_default); + HashMap color_items = _get_type_items(edited_type, Theme::DATA_TYPE_COLOR, show_default); for (const KeyValue &E : color_items) { HBoxContainer *item_control = _create_property_control(Theme::DATA_TYPE_COLOR, E.key, E.value); ColorPickerButton *item_editor = memnew(ColorPickerButton); @@ -2528,7 +2533,7 @@ void ThemeTypeEditor::_update_type_items() { constant_items_list->remove_child(node); } - HashMap constant_items = _get_type_items(edited_type, &Theme::get_constant_list, show_default); + HashMap constant_items = _get_type_items(edited_type, Theme::DATA_TYPE_CONSTANT, show_default); for (const KeyValue &E : constant_items) { HBoxContainer *item_control = _create_property_control(Theme::DATA_TYPE_CONSTANT, E.key, E.value); SpinBox *item_editor = memnew(SpinBox); @@ -2561,7 +2566,7 @@ void ThemeTypeEditor::_update_type_items() { font_items_list->remove_child(node); } - HashMap font_items = _get_type_items(edited_type, &Theme::get_font_list, show_default); + HashMap font_items = _get_type_items(edited_type, Theme::DATA_TYPE_FONT, show_default); for (const KeyValue &E : font_items) { HBoxContainer *item_control = _create_property_control(Theme::DATA_TYPE_FONT, E.key, E.value); EditorResourcePicker *item_editor = memnew(EditorResourcePicker); @@ -2599,7 +2604,7 @@ void ThemeTypeEditor::_update_type_items() { font_size_items_list->remove_child(node); } - HashMap font_size_items = _get_type_items(edited_type, &Theme::get_font_size_list, show_default); + HashMap font_size_items = _get_type_items(edited_type, Theme::DATA_TYPE_FONT_SIZE, show_default); for (const KeyValue &E : font_size_items) { HBoxContainer *item_control = _create_property_control(Theme::DATA_TYPE_FONT_SIZE, E.key, E.value); SpinBox *item_editor = memnew(SpinBox); @@ -2632,7 +2637,7 @@ void ThemeTypeEditor::_update_type_items() { icon_items_list->remove_child(node); } - HashMap icon_items = _get_type_items(edited_type, &Theme::get_icon_list, show_default); + HashMap icon_items = _get_type_items(edited_type, Theme::DATA_TYPE_ICON, show_default); for (const KeyValue &E : icon_items) { HBoxContainer *item_control = _create_property_control(Theme::DATA_TYPE_ICON, E.key, E.value); EditorResourcePicker *item_editor = memnew(EditorResourcePicker); @@ -2700,7 +2705,7 @@ void ThemeTypeEditor::_update_type_items() { stylebox_items_list->add_child(memnew(HSeparator)); } - HashMap stylebox_items = _get_type_items(edited_type, &Theme::get_stylebox_list, show_default); + HashMap stylebox_items = _get_type_items(edited_type, Theme::DATA_TYPE_STYLEBOX, show_default); for (const KeyValue &E : stylebox_items) { if (leading_stylebox.pinned && leading_stylebox.item_name == E.key) { continue; diff --git a/editor/plugins/theme_editor_plugin.h b/editor/plugins/theme_editor_plugin.h index 8ad262da557f..ba3446807ede 100644 --- a/editor/plugins/theme_editor_plugin.h +++ b/editor/plugins/theme_editor_plugin.h @@ -373,7 +373,7 @@ class ThemeTypeEditor : public MarginContainer { VBoxContainer *_create_item_list(Theme::DataType p_data_type); void _update_type_list(); void _update_type_list_debounced(); - HashMap _get_type_items(String p_type_name, void (Theme::*get_list_func)(const StringName &, List *) const, bool include_default); + HashMap _get_type_items(String p_type_name, Theme::DataType p_type, bool p_include_default); HBoxContainer *_create_property_control(Theme::DataType p_data_type, String p_item_name, bool p_editable); void _add_focusable(Control *p_control); void _update_type_items(); diff --git a/scene/theme/theme_db.cpp b/scene/theme/theme_db.cpp index 711630d09e12..4c82e5ba5faa 100644 --- a/scene/theme/theme_db.cpp +++ b/scene/theme/theme_db.cpp @@ -373,7 +373,7 @@ void ThemeDB::update_class_instance_items(Node *p_instance) { } } -void ThemeDB::get_class_items(const StringName &p_class_name, List *r_list, bool p_include_inherited) { +void ThemeDB::get_class_items(const StringName &p_class_name, List *r_list, bool p_include_inherited, Theme::DataType p_filter_type) { List class_hierarchy; StringName class_name = p_class_name; while (class_name != StringName()) { @@ -386,6 +386,9 @@ void ThemeDB::get_class_items(const StringName &p_class_name, List>::Iterator E = theme_item_binds_list.find(theme_type); if (E) { for (const ThemeItemBind &F : E->value) { + if (p_filter_type != Theme::DATA_TYPE_MAX && F.data_type != p_filter_type) { + continue; + } if (inherited_props.has(F.item_name)) { continue; // Skip inherited properties. } diff --git a/scene/theme/theme_db.h b/scene/theme/theme_db.h index d9428ad213eb..f403c1ef20a7 100644 --- a/scene/theme/theme_db.h +++ b/scene/theme/theme_db.h @@ -171,7 +171,7 @@ class ThemeDB : public Object { void bind_class_external_item(Theme::DataType p_data_type, const StringName &p_class_name, const StringName &p_prop_name, const StringName &p_item_name, const StringName &p_type_name, ThemeItemSetter p_setter); void update_class_instance_items(Node *p_instance); - void get_class_items(const StringName &p_class_name, List *r_list, bool p_include_inherited = false); + void get_class_items(const StringName &p_class_name, List *r_list, bool p_include_inherited = false, Theme::DataType p_filter_type = Theme::DATA_TYPE_MAX); // Memory management, reference, and initialization.