From 3393740d4297651661585aa3976bfa71cd8cbb77 Mon Sep 17 00:00:00 2001 From: passivestar <60579014+passivestar@users.noreply.github.com> Date: Sun, 28 Dec 2025 15:27:39 +0400 Subject: [PATCH] Improve the look of inner tabs in modern theme --- .../import/dynamic_font_import_settings.cpp | 7 ++- .../scene/2d/tiles/tile_map_layer_editor.cpp | 14 +++--- editor/scene/2d/tiles/tile_map_layer_editor.h | 1 + editor/scene/2d/tiles/tile_set_editor.cpp | 7 ++- editor/scene/gui/theme_editor_plugin.cpp | 6 ++- editor/scene/rename_dialog.cpp | 1 + editor/settings/project_settings_editor.cpp | 1 + ...editor_native_shader_source_visualizer.cpp | 2 + editor/themes/theme_classic.cpp | 7 +++ editor/themes/theme_modern.cpp | 45 ++++++++++++++++++- editor/translations/localization_editor.cpp | 1 + .../editor/objectdb_profiler_panel.cpp | 1 + .../editor/openxr_action_map_editor.cpp | 5 ++- 13 files changed, 88 insertions(+), 10 deletions(-) diff --git a/editor/import/dynamic_font_import_settings.cpp b/editor/import/dynamic_font_import_settings.cpp index 4fa16cf87a..d4cb462c6a 100644 --- a/editor/import/dynamic_font_import_settings.cpp +++ b/editor/import/dynamic_font_import_settings.cpp @@ -39,6 +39,7 @@ #include "editor/file_system/editor_file_system.h" #include "editor/gui/editor_file_dialog.h" #include "editor/inspector/editor_inspector.h" +#include "editor/settings/editor_settings.h" #include "editor/themes/editor_scale.h" #include "editor/translations/editor_locale_dialog.h" #include "scene/gui/split_container.h" @@ -613,6 +614,11 @@ void DynamicFontImportSettingsDialog::_notification(int p_what) { } break; case NOTIFICATION_THEME_CHANGED: { + const String theme_style = EDITOR_GET("interface/theme/style"); + const String type_variation = theme_style == "Classic" ? "TabContainerOdd" : "TabContainerInner"; + main_pages->set_theme_type_variation(type_variation); + preload_pages->set_theme_type_variation(type_variation); + add_var->set_button_icon(get_editor_theme_icon(SNAME("Add"))); label_warn->add_theme_color_override(SceneStringName(font_color), get_theme_color(SNAME("warning_color"), EditorStringName(Editor))); } break; @@ -1014,7 +1020,6 @@ DynamicFontImportSettingsDialog::DynamicFontImportSettingsDialog() { main_pages->set_tab_alignment(TabBar::ALIGNMENT_CENTER); main_pages->set_v_size_flags(Control::SIZE_EXPAND_FILL); main_pages->set_h_size_flags(Control::SIZE_EXPAND_FILL); - main_pages->set_theme_type_variation("TabContainerOdd"); root_vb->add_child(main_pages); label_warn = memnew(Label); diff --git a/editor/scene/2d/tiles/tile_map_layer_editor.cpp b/editor/scene/2d/tiles/tile_map_layer_editor.cpp index 25ee1c5aed..020dec3d5c 100644 --- a/editor/scene/2d/tiles/tile_map_layer_editor.cpp +++ b/editor/scene/2d/tiles/tile_map_layer_editor.cpp @@ -4413,7 +4413,7 @@ void TileMapLayerEditor::set_show_layer_selector(bool p_show_layer_selector) { void TileMapLayerEditor::update_layout(DockLayout p_layout) { bool is_vertical = (p_layout == EditorDock::DockLayout::DOCK_LAYOUT_VERTICAL); - tabs_bar->get_parent()->remove_child(tabs_bar); + tabs_panel->get_parent()->remove_child(tabs_panel); tile_map_toolbar->set_vertical(is_vertical); layer_selector_separator->set_vertical(is_vertical); layer_selection_hbox->set_vertical(is_vertical); @@ -4423,10 +4423,10 @@ void TileMapLayerEditor::update_layout(DockLayout p_layout) { main_box_container->move_child(padding_control, is_vertical ? 0 : 2); if (is_vertical) { - tile_map_wide_toolbar->add_child(tabs_bar); + tile_map_wide_toolbar->add_child(tabs_panel); } else { - tile_map_toolbar->add_child(tabs_bar); - tile_map_toolbar->move_child(tabs_bar, 0); + tile_map_toolbar->add_child(tabs_panel); + tile_map_toolbar->move_child(tabs_panel, 0); } for (TileMapLayerSubEditorPlugin::TabData &tab_data : tabs_data) { @@ -4468,6 +4468,7 @@ TileMapLayerEditor::TileMapLayerEditor() { // TabBar. tabs_bar = memnew(TabBar); + tabs_bar->set_theme_type_variation("TabBarInner"); tabs_bar->set_clip_tabs(false); for (int plugin_index = 0; plugin_index < tile_map_editor_plugins.size(); plugin_index++) { Vector tabs_vector = tile_map_editor_plugins[plugin_index]->get_tabs(); @@ -4491,7 +4492,10 @@ TileMapLayerEditor::TileMapLayerEditor() { main_box_container->add_child(padding_control); // Tabs. - tile_map_toolbar->add_child(tabs_bar); + tabs_panel = memnew(PanelContainer); + tabs_panel->set_theme_type_variation("PanelContainerTabbarInner"); + tabs_panel->add_child(tabs_bar); + tile_map_toolbar->add_child(tabs_panel); // Tabs toolbars. for (TileMapLayerSubEditorPlugin::TabData &tab_data : tabs_data) { diff --git a/editor/scene/2d/tiles/tile_map_layer_editor.h b/editor/scene/2d/tiles/tile_map_layer_editor.h index 3a207a4610..4c8b9b625b 100644 --- a/editor/scene/2d/tiles/tile_map_layer_editor.h +++ b/editor/scene/2d/tiles/tile_map_layer_editor.h @@ -419,6 +419,7 @@ private: // Bottom panel. Label *cant_edit_label = nullptr; TabBar *tabs_bar = nullptr; + PanelContainer *tabs_panel = nullptr; LocalVector tabs_data; LocalVector tabs_plugins; void _update_bottom_panel(); diff --git a/editor/scene/2d/tiles/tile_set_editor.cpp b/editor/scene/2d/tiles/tile_set_editor.cpp index 0b2cc64992..ca8182c7eb 100644 --- a/editor/scene/2d/tiles/tile_set_editor.cpp +++ b/editor/scene/2d/tiles/tile_set_editor.cpp @@ -824,6 +824,7 @@ TileSetEditor::TileSetEditor() { // TabBar. tabs_bar = memnew(TabBar); + tabs_bar->set_theme_type_variation("TabBarInner"); tabs_bar->set_tab_alignment(TabBar::ALIGNMENT_CENTER); tabs_bar->set_clip_tabs(false); tabs_bar->add_tab(TTR("Tile Sources")); @@ -832,7 +833,11 @@ TileSetEditor::TileSetEditor() { tile_set_toolbar = memnew(HBoxContainer); tile_set_toolbar->set_h_size_flags(SIZE_EXPAND_FILL); - tile_set_toolbar->add_child(tabs_bar); + + PanelContainer *tabs_panel = memnew(PanelContainer); + tabs_panel->set_theme_type_variation("PanelContainerTabbarInner"); + tabs_panel->add_child(tabs_bar); + tile_set_toolbar->add_child(tabs_panel); main_vb->add_child(tile_set_toolbar); //// Tiles //// diff --git a/editor/scene/gui/theme_editor_plugin.cpp b/editor/scene/gui/theme_editor_plugin.cpp index fc340ceb3a..7594e2b7e0 100644 --- a/editor/scene/gui/theme_editor_plugin.cpp +++ b/editor/scene/gui/theme_editor_plugin.cpp @@ -44,6 +44,7 @@ #include "editor/gui/progress_dialog.h" #include "editor/inspector/editor_resource_picker.h" #include "editor/settings/editor_command_palette.h" +#include "editor/settings/editor_settings.h" #include "editor/themes/editor_scale.h" #include "scene/gui/check_button.h" #include "scene/gui/color_picker.h" @@ -2129,6 +2130,7 @@ ThemeItemEditorDialog::ThemeItemEditorDialog(ThemeTypeEditor *p_theme_type_edito // Import Items tab. TabContainer *import_tc = memnew(TabContainer); + import_tc->set_theme_type_variation("TabContainerInner"); import_tc->set_tab_alignment(TabBar::ALIGNMENT_CENTER); tc->add_child(import_tc); tc->set_tab_title(1, TTR("Import Items")); @@ -3485,6 +3487,9 @@ void ThemeTypeEditor::_notification(int p_what) { rename_type_button->set_button_icon(get_editor_theme_icon(SNAME("Rename"))); remove_type_button->set_button_icon(get_editor_theme_icon(SNAME("Remove"))); + const String theme_style = EDITOR_GET("interface/theme/style"); + data_type_tabs->set_theme_type_variation(theme_style == "Classic" ? "TabContainerOdd" : "TabContainerInner"); + data_type_tabs->set_tab_icon(0, get_editor_theme_icon(SNAME("Color"))); data_type_tabs->set_tab_icon(1, get_editor_theme_icon(SNAME("MemberConstant"))); data_type_tabs->set_tab_icon(2, get_editor_theme_icon(SNAME("FontItem"))); @@ -3622,7 +3627,6 @@ ThemeTypeEditor::ThemeTypeEditor() { main_vb->add_child(data_type_tabs); data_type_tabs->set_v_size_flags(SIZE_EXPAND_FILL); data_type_tabs->set_use_hidden_tabs_for_min_size(true); - data_type_tabs->set_theme_type_variation("TabContainerOdd"); color_items_list = _create_item_list(Theme::DATA_TYPE_COLOR); constant_items_list = _create_item_list(Theme::DATA_TYPE_CONSTANT); diff --git a/editor/scene/rename_dialog.cpp b/editor/scene/rename_dialog.cpp index b89615f3af..bc10fb2287 100644 --- a/editor/scene/rename_dialog.cpp +++ b/editor/scene/rename_dialog.cpp @@ -119,6 +119,7 @@ RenameDialog::RenameDialog(SceneTreeEditor *p_scene_tree_editor) { vbc->add_child(cbut_collapse_features); tabc_features = memnew(TabContainer); + tabc_features->set_theme_type_variation("TabContainerInner"); tabc_features->set_use_hidden_tabs_for_min_size(true); vbc->add_child(tabc_features); diff --git a/editor/settings/project_settings_editor.cpp b/editor/settings/project_settings_editor.cpp index 1a802d51c7..99e8f61f42 100644 --- a/editor/settings/project_settings_editor.cpp +++ b/editor/settings/project_settings_editor.cpp @@ -813,6 +813,7 @@ ProjectSettingsEditor::ProjectSettingsEditor(EditorData *p_data) { tab_container->add_child(localization_editor); TabContainer *globals_container = memnew(TabContainer); + globals_container->set_theme_type_variation("TabContainerInner"); globals_container->set_name(TTRC("Globals")); tab_container->add_child(globals_container); diff --git a/editor/shader/editor_native_shader_source_visualizer.cpp b/editor/shader/editor_native_shader_source_visualizer.cpp index 9d9dd5af6e..16944a8e13 100644 --- a/editor/shader/editor_native_shader_source_visualizer.cpp +++ b/editor/shader/editor_native_shader_source_visualizer.cpp @@ -82,11 +82,13 @@ void EditorNativeShaderSourceVisualizer::_inspect_shader(RID p_shader) { _load_theme_settings(); versions = memnew(TabContainer); + versions->set_theme_type_variation("TabContainerInner"); versions->set_tab_alignment(TabBar::ALIGNMENT_CENTER); versions->set_v_size_flags(Control::SIZE_EXPAND_FILL); versions->set_h_size_flags(Control::SIZE_EXPAND_FILL); for (int i = 0; i < nsc.versions.size(); i++) { TabContainer *vtab = memnew(TabContainer); + vtab->set_theme_type_variation("TabContainerInner"); vtab->set_name("Version " + itos(i)); vtab->set_tab_alignment(TabBar::ALIGNMENT_CENTER); vtab->set_v_size_flags(Control::SIZE_EXPAND_FILL); diff --git a/editor/themes/theme_classic.cpp b/editor/themes/theme_classic.cpp index 7301d43c8a..e0aceccba6 100644 --- a/editor/themes/theme_classic.cpp +++ b/editor/themes/theme_classic.cpp @@ -2009,6 +2009,13 @@ void ThemeClassic::populate_editor_styles(const Ref &p_theme, Edito p_theme->set_stylebox(SceneStringName(panel), "TabContainerOdd", style_content_panel_odd); } + // PanelContainerTabbarInner. + { + // Used by Modern theme. + p_theme->set_type_variation("PanelContainerTabbarInner", "PanelContainer"); + p_theme->set_stylebox(SceneStringName(panel), "PanelContainerTabbarInner", EditorThemeManager::make_empty_stylebox(0, 0, 0, 0)); + } + // TreeLineEdit. { Ref tree_line_edit_style = p_theme->get_stylebox(CoreStringName(normal), SNAME("LineEdit"))->duplicate(); diff --git a/editor/themes/theme_modern.cpp b/editor/themes/theme_modern.cpp index e4c61de8cf..bb140faa41 100644 --- a/editor/themes/theme_modern.cpp +++ b/editor/themes/theme_modern.cpp @@ -1975,7 +1975,7 @@ void ThemeModern::populate_editor_styles(const Ref &p_theme, Editor // TabContainerOdd variation. { - // Can be used on tabs against the base color background (e.g. nested tabs). + // Used for tabs against the base color background in the classic theme. p_theme->set_type_variation("TabContainerOdd", "TabContainer"); Ref style_tab_selected_odd = p_theme->get_stylebox(SNAME("tab_selected"), SNAME("TabContainer"))->duplicate(); @@ -1989,6 +1989,49 @@ void ThemeModern::populate_editor_styles(const Ref &p_theme, Editor p_theme->set_stylebox("tabbar_background", "TabContainerOdd", p_theme->get_stylebox(SNAME("tabbar_background"), SNAME("TabContainer"))); } + // TabContainerInner, TabBarInner, PanelContainerTabbarInner variations. + { + // Used for tabs against the base color background in the modern theme. + p_theme->set_type_variation("TabContainerInner", "TabContainer"); + p_theme->set_type_variation("TabBarInner", "TabBar"); + p_theme->set_type_variation("PanelContainerTabbarInner", "PanelContainer"); + + Ref style_tab_selected_inner = p_theme->get_stylebox(SNAME("tab_selected"), SNAME("TabContainer"))->duplicate(); + style_tab_selected_inner->set_content_margin_individual(p_config.base_margin * 4 * EDSCALE, p_config.base_margin * 1.5 * EDSCALE, p_config.base_margin * 4 * EDSCALE, p_config.base_margin * 1.5 * EDSCALE); + style_tab_selected_inner->set_corner_radius_all(p_config.corner_radius * EDSCALE); + p_theme->set_stylebox("tab_selected", "TabContainerInner", style_tab_selected_inner); + p_theme->set_stylebox("tab_selected", "TabBarInner", style_tab_selected_inner); + + Color background_color = p_config.surface_lower_color.lerp(p_config.mono_color_inv, 0.15); + + Ref style_tab_unselected_inner = style_tab_selected_inner->duplicate(); + style_tab_unselected_inner->set_bg_color(background_color); + p_theme->set_stylebox("tab_unselected", "TabContainerInner", style_tab_unselected_inner); + p_theme->set_stylebox("tab_unselected", "TabBarInner", style_tab_unselected_inner); + + Ref style_tab_hovered_inner = style_tab_selected_inner->duplicate(); + style_tab_hovered_inner->set_bg_color(background_color.lerp(p_config.mono_color, 0.05)); + p_theme->set_stylebox("tab_hovered", "TabContainerInner", style_tab_hovered_inner); + p_theme->set_stylebox("tab_hovered", "TabBarInner", style_tab_hovered_inner); + + Ref style_tab_disabled_inner = style_tab_selected_inner->duplicate(); + style_tab_disabled_inner->set_bg_color(background_color); + p_theme->set_stylebox("tab_disabled", "TabContainerInner", style_tab_disabled_inner); + p_theme->set_stylebox("tab_disabled", "TabBarInner", style_tab_disabled_inner); + + Ref style_tabbar_background_inner = p_theme->get_stylebox(SNAME("tabbar_background"), SNAME("TabContainer"))->duplicate(); + style_tabbar_background_inner->set_content_margin_all(p_config.base_margin * EDSCALE); + style_tabbar_background_inner->set_corner_radius_all(p_config.corner_radius * EDSCALE + p_config.base_margin * EDSCALE); + style_tabbar_background_inner->set_bg_color(background_color); + + p_theme->set_stylebox("tabbar_background", "TabContainerInner", style_tabbar_background_inner); + + p_theme->set_constant("tab_separation", "TabContainerInner", p_config.separation_margin); + p_theme->set_constant("tab_separation", "TabBarInner", p_config.separation_margin); + + p_theme->set_stylebox(SceneStringName(panel), "PanelContainerTabbarInner", style_tabbar_background_inner); + } + // TreeLineEdit. { Ref tree_line_edit_style = p_theme->get_stylebox(CoreStringName(normal), SNAME("LineEdit"))->duplicate(); diff --git a/editor/translations/localization_editor.cpp b/editor/translations/localization_editor.cpp index 7c9b29cfdb..fdf851dbad 100644 --- a/editor/translations/localization_editor.cpp +++ b/editor/translations/localization_editor.cpp @@ -732,6 +732,7 @@ LocalizationEditor::LocalizationEditor() { localization_changed = "localization_changed"; TabContainer *translations = memnew(TabContainer); + translations->set_theme_type_variation("TabContainerInner"); translations->set_v_size_flags(Control::SIZE_EXPAND_FILL); add_child(translations); diff --git a/modules/objectdb_profiler/editor/objectdb_profiler_panel.cpp b/modules/objectdb_profiler/editor/objectdb_profiler_panel.cpp index 6366a55d8b..20103c3e08 100644 --- a/modules/objectdb_profiler/editor/objectdb_profiler_panel.cpp +++ b/modules/objectdb_profiler/editor/objectdb_profiler_panel.cpp @@ -404,6 +404,7 @@ ObjectDBProfilerPanel::ObjectDBProfilerPanel() { // Tabs of various views right for each snapshot. view_tabs = memnew(TabContainer); + view_tabs->set_theme_type_variation("TabContainerInner"); root_container->add_child(view_tabs); view_tabs->set_custom_minimum_size(Size2(300 * EDSCALE, 0)); view_tabs->set_v_size_flags(SizeFlags::SIZE_EXPAND_FILL); diff --git a/modules/openxr/editor/openxr_action_map_editor.cpp b/modules/openxr/editor/openxr_action_map_editor.cpp index 92d68609b8..5f4de60235 100644 --- a/modules/openxr/editor/openxr_action_map_editor.cpp +++ b/modules/openxr/editor/openxr_action_map_editor.cpp @@ -35,6 +35,7 @@ #include "editor/editor_node.h" #include "editor/gui/editor_file_dialog.h" #include "editor/settings/editor_command_palette.h" +#include "editor/settings/editor_settings.h" #include "editor/themes/editor_scale.h" HashMap OpenXRActionMapEditor::interaction_profile_editors; @@ -59,6 +60,9 @@ void OpenXRActionMapEditor::_bind_methods() { void OpenXRActionMapEditor::_notification(int p_what) { switch (p_what) { case NOTIFICATION_THEME_CHANGED: { + const String theme_style = EDITOR_GET("interface/theme/style"); + tabs->set_theme_type_variation(theme_style == "Classic" ? "TabContainerOdd" : "TabContainerInner"); + for (int i = 0; i < tabs->get_child_count(); i++) { Control *tab = Object::cast_to(tabs->get_child(i)); if (tab) { @@ -481,7 +485,6 @@ OpenXRActionMapEditor::OpenXRActionMapEditor() { tabs = memnew(TabContainer); tabs->set_h_size_flags(SIZE_EXPAND_FILL); tabs->set_v_size_flags(SIZE_EXPAND_FILL); - tabs->set_theme_type_variation("TabContainerOdd"); tabs->connect("tab_changed", callable_mp(this, &OpenXRActionMapEditor::_on_tabs_tab_changed)); tabs->connect("tab_button_pressed", callable_mp(this, &OpenXRActionMapEditor::_on_tab_button_pressed)); main_vb->add_child(tabs);