From e85862197fa4713be4604ab75881009084c67231 Mon Sep 17 00:00:00 2001 From: reduz Date: Sat, 5 Jun 2021 11:23:56 -0300 Subject: [PATCH] Add header properly to labels * When designing UIs, headers can often be used as headers to give section names. * This PR makes it possible to do so where relevant. * Labels are also non-bold again by default, only bold when marked as headers. This PR should fix all the problems of bold fonts where they should not be, I have been checking one by one all the usages. --- doc/classes/Label.xml | 23 ++++++++ editor/action_map_editor.cpp | 3 + editor/debugger/script_editor_debugger.cpp | 2 + editor/dependency_editor.cpp | 2 + editor/editor_about.cpp | 1 + editor/editor_file_dialog.cpp | 21 +++++-- editor/editor_fonts.cpp | 8 ++- editor/editor_plugin_settings.cpp | 4 +- editor/export_template_manager.cpp | 5 ++ editor/groups_editor.cpp | 8 +++ editor/localization_editor.cpp | 20 +++++-- editor/plugins/node_3d_editor_plugin.cpp | 3 + editor/plugins/theme_editor_plugin.cpp | 4 +- editor/project_export.cpp | 5 +- editor/scene_tree_dock.cpp | 4 +- editor/scene_tree_editor.cpp | 1 + scene/gui/box_container.cpp | 1 + scene/gui/label.cpp | 59 ++++++++++++++++--- scene/gui/label.h | 15 +++++ .../resources/default_theme/default_theme.cpp | 7 +++ 20 files changed, 174 insertions(+), 22 deletions(-) diff --git a/doc/classes/Label.xml b/doc/classes/Label.xml index 76b968639315..e3b2b202966c 100644 --- a/doc/classes/Label.xml +++ b/doc/classes/Label.xml @@ -81,6 +81,9 @@ If [code]true[/code], the Label only shows the text that fits inside its bounding rectangle. It also lets you scale the node down freely. + + It is possible to use a preset header size for labels, which is useful when designing user interfaces. Check the respective theme properties for which font and size will be used for each. + Language code used for line-breaking and text shaping algorithms, if left empty current locale is used instead. @@ -142,6 +145,14 @@ Align the whole text by spreading the rows. + + + + + + + + @@ -150,6 +161,18 @@ Default text [Color] of the [Label]. + + + + + + + + + + + + The tint of [Font]'s outline. diff --git a/editor/action_map_editor.cpp b/editor/action_map_editor.cpp index d195561a8524..73028f53bcfb 100644 --- a/editor/action_map_editor.cpp +++ b/editor/action_map_editor.cpp @@ -631,6 +631,7 @@ InputEventConfigurationDialog::InputEventConfigurationDialog() { additional_options_container->hide(); Label *opts_label = memnew(Label); + opts_label->set_header_mode(Label::HEADER_SMALL); opts_label->set_text("Additional Options"); additional_options_container->add_child(opts_label); @@ -639,6 +640,7 @@ InputEventConfigurationDialog::InputEventConfigurationDialog() { device_container->set_h_size_flags(Control::SIZE_EXPAND_FILL); Label *device_label = memnew(Label); + device_label->set_header_mode(Label::HEADER_SMALL); device_label->set_text("Device:"); device_container->add_child(device_label); @@ -858,6 +860,7 @@ Variant ActionMapEditor::get_drag_data_fw(const Point2 &p_point, Control *p_from String name = selected->get_text(0); Label *label = memnew(Label(name)); + label->set_header_mode(Label::HEADER_SMALL); label->set_modulate(Color(1, 1, 1, 1.0f)); action_tree->set_drag_preview(label); diff --git a/editor/debugger/script_editor_debugger.cpp b/editor/debugger/script_editor_debugger.cpp index 7493cc2a8d7e..4dc884e47631 100644 --- a/editor/debugger/script_editor_debugger.cpp +++ b/editor/debugger/script_editor_debugger.cpp @@ -1698,6 +1698,8 @@ ScriptEditorDebugger::ScriptEditorDebugger(EditorNode *p_editor) { VBoxContainer *vmem_vb = memnew(VBoxContainer); HBoxContainer *vmem_hb = memnew(HBoxContainer); Label *vmlb = memnew(Label(TTR("List of Video Memory Usage by Resource:") + " ")); + vmlb->set_header_mode(Label::HEADER_SMALL); + vmlb->set_h_size_flags(SIZE_EXPAND_FILL); vmem_hb->add_child(vmlb); vmem_hb->add_child(memnew(Label(TTR("Total:") + " "))); diff --git a/editor/dependency_editor.cpp b/editor/dependency_editor.cpp index c085205f6320..5a4e991b3e29 100644 --- a/editor/dependency_editor.cpp +++ b/editor/dependency_editor.cpp @@ -232,6 +232,8 @@ DependencyEditor::DependencyEditor() { HBoxContainer *hbc = memnew(HBoxContainer); Label *label = memnew(Label(TTR("Dependencies:"))); + label->set_header_mode(Label::HEADER_SMALL); + hbc->add_child(label); hbc->add_spacer(); fixdeps = memnew(Button(TTR("Fix Broken"))); diff --git a/editor/editor_about.cpp b/editor/editor_about.cpp index 7527514dca08..f2cc41acaf3e 100644 --- a/editor/editor_about.cpp +++ b/editor/editor_about.cpp @@ -92,6 +92,7 @@ ScrollContainer *EditorAbout::_populate_list(const String &p_name, const Listset_header_mode(Label::HEADER_SMALL); lbl->set_text(p_sections[i]); vbc->add_child(lbl); diff --git a/editor/editor_file_dialog.cpp b/editor/editor_file_dialog.cpp index 75815fa75078..3381e27bc890 100644 --- a/editor/editor_file_dialog.cpp +++ b/editor/editor_file_dialog.cpp @@ -1507,7 +1507,9 @@ EditorFileDialog::EditorFileDialog() { dir_next->connect("pressed", callable_mp(this, &EditorFileDialog::_go_forward)); dir_up->connect("pressed", callable_mp(this, &EditorFileDialog::_go_up)); - pathhb->add_child(memnew(Label(TTR("Path:")))); + Label *l = memnew(Label(TTR("Path:"))); + l->set_header_mode(Label::HEADER_SMALL); + pathhb->add_child(l); drives_container = memnew(HBoxContainer); pathhb->add_child(drives_container); @@ -1588,7 +1590,11 @@ EditorFileDialog::EditorFileDialog() { fav_vb->set_v_size_flags(Control::SIZE_EXPAND_FILL); HBoxContainer *fav_hb = memnew(HBoxContainer); fav_vb->add_child(fav_hb); - fav_hb->add_child(memnew(Label(TTR("Favorites:")))); + + l = memnew(Label(TTR("Favorites:"))); + l->set_header_mode(Label::HEADER_SMALL); + fav_hb->add_child(l); + fav_hb->add_spacer(); fav_up = memnew(Button); fav_up->set_flat(true); @@ -1623,7 +1629,10 @@ EditorFileDialog::EditorFileDialog() { VBoxContainer *list_vb = memnew(VBoxContainer); list_vb->set_h_size_flags(Control::SIZE_EXPAND_FILL); - list_vb->add_child(memnew(Label(TTR("Directories & Files:")))); + + l = memnew(Label(TTR("Directories & Files:"))); + l->set_header_mode(Label::HEADER_SMALL); + list_vb->add_child(l); preview_hb->add_child(list_vb); // Item (files and folders) list with context menu. @@ -1650,7 +1659,11 @@ EditorFileDialog::EditorFileDialog() { preview_vb->hide(); file_box = memnew(HBoxContainer); - file_box->add_child(memnew(Label(TTR("File:")))); + + l = memnew(Label(TTR("File:"))); + l->set_header_mode(Label::HEADER_SMALL); + file_box->add_child(l); + file = memnew(LineEdit); file->set_structured_text_bidi_override(Control::STRUCTURED_TEXT_FILE); file->set_stretch_ratio(4); diff --git a/editor/editor_fonts.cpp b/editor/editor_fonts.cpp index 8a5142459c8c..44069bb090f2 100644 --- a/editor/editor_fonts.cpp +++ b/editor/editor_fonts.cpp @@ -319,7 +319,13 @@ void editor_register_fonts(Ref p_theme) { p_theme->set_font_size("main_button_font_size", "EditorFonts", default_font_size + 1 * EDSCALE); p_theme->set_font("main_button_font", "EditorFonts", df_bold); - p_theme->set_font("font", "Label", df_bold); + p_theme->set_font("font", "Label", df); + p_theme->set_font("font_header_small", "Label", df_bold); + p_theme->set_font_size("font_header_small_size", "Label", default_font_size); + p_theme->set_font("font_header_medium", "Label", df_bold); + p_theme->set_font_size("font_header_medium_size", "Label", default_font_size + 1 * EDSCALE); + p_theme->set_font("font_header_large", "Label", df_bold); + p_theme->set_font_size("font_header_large_size", "Label", default_font_size + 3 * EDSCALE); // Documentation fonts MAKE_SOURCE_FONT(df_code); diff --git a/editor/editor_plugin_settings.cpp b/editor/editor_plugin_settings.cpp index e5b62513ff01..226a248c75a7 100644 --- a/editor/editor_plugin_settings.cpp +++ b/editor/editor_plugin_settings.cpp @@ -192,7 +192,9 @@ EditorPluginSettings::EditorPluginSettings() { add_child(plugin_config_dialog); HBoxContainer *title_hb = memnew(HBoxContainer); - title_hb->add_child(memnew(Label(TTR("Installed Plugins:")))); + Label *l = memnew(Label(TTR("Installed Plugins:"))); + l->set_header_mode(Label::HEADER_SMALL); + title_hb->add_child(l); title_hb->add_spacer(); create_plugin = memnew(Button(TTR("Create"))); create_plugin->connect("pressed", callable_mp(this, &EditorPluginSettings::_create_clicked)); diff --git a/editor/export_template_manager.cpp b/editor/export_template_manager.cpp index 39d7c7acd42e..ab77c0474da3 100644 --- a/editor/export_template_manager.cpp +++ b/editor/export_template_manager.cpp @@ -814,6 +814,7 @@ ExportTemplateManager::ExportTemplateManager() { main_vb->add_child(current_hb); Label *current_label = memnew(Label); + current_label->set_header_mode(Label::HEADER_SMALL); current_label->set_text(TTR("Current Version:")); current_hb->add_child(current_label); @@ -823,6 +824,8 @@ ExportTemplateManager::ExportTemplateManager() { // Current version statuses. // Status: Current version is missing. current_missing_label = memnew(Label); + current_missing_label->set_header_mode(Label::HEADER_SMALL); + current_missing_label->set_h_size_flags(Control::SIZE_EXPAND_FILL); current_missing_label->set_align(Label::ALIGN_RIGHT); current_missing_label->set_text(TTR("Export templates are missing. Download them or install from a file.")); @@ -830,6 +833,7 @@ ExportTemplateManager::ExportTemplateManager() { // Status: Current version is installed. current_installed_label = memnew(Label); + current_installed_label->set_header_mode(Label::HEADER_SMALL); current_installed_label->set_h_size_flags(Control::SIZE_EXPAND_FILL); current_installed_label->set_align(Label::ALIGN_RIGHT); current_installed_label->set_text(TTR("Export templates are installed and ready to be used.")); @@ -949,6 +953,7 @@ ExportTemplateManager::ExportTemplateManager() { HBoxContainer *installed_versions_hb = memnew(HBoxContainer); main_vb->add_child(installed_versions_hb); Label *installed_label = memnew(Label); + installed_label->set_header_mode(Label::HEADER_SMALL); installed_label->set_text(TTR("Other Installed Versions:")); installed_versions_hb->add_child(installed_label); diff --git a/editor/groups_editor.cpp b/editor/groups_editor.cpp index d8e5a05c5d45..b526b357e0b2 100644 --- a/editor/groups_editor.cpp +++ b/editor/groups_editor.cpp @@ -424,6 +424,8 @@ GroupDialog::GroupDialog() { vbc_left->set_h_size_flags(Control::SIZE_EXPAND_FILL); Label *group_title = memnew(Label); + group_title->set_header_mode(Label::HEADER_SMALL); + group_title->set_text(TTR("Groups")); vbc_left->add_child(group_title); @@ -458,6 +460,8 @@ GroupDialog::GroupDialog() { vbc_add->set_h_size_flags(Control::SIZE_EXPAND_FILL); Label *out_of_group_title = memnew(Label); + out_of_group_title->set_header_mode(Label::HEADER_SMALL); + out_of_group_title->set_text(TTR("Nodes Not in Group")); vbc_add->add_child(out_of_group_title); @@ -506,6 +510,8 @@ GroupDialog::GroupDialog() { vbc_remove->set_h_size_flags(Control::SIZE_EXPAND_FILL); Label *in_group_title = memnew(Label); + in_group_title->set_header_mode(Label::HEADER_SMALL); + in_group_title->set_text(TTR("Nodes in Group")); vbc_remove->add_child(in_group_title); @@ -528,6 +534,8 @@ GroupDialog::GroupDialog() { remove_filter->connect("text_changed", callable_mp(this, &GroupDialog::_remove_filter_changed)); group_empty = memnew(Label()); + group_empty->set_header_mode(Label::HEADER_SMALL); + group_empty->set_text(TTR("Empty groups will be automatically removed.")); group_empty->set_valign(Label::VALIGN_CENTER); group_empty->set_align(Label::ALIGN_CENTER); diff --git a/editor/localization_editor.cpp b/editor/localization_editor.cpp index 161f1dde0d2b..d4afbdb5d8cb 100644 --- a/editor/localization_editor.cpp +++ b/editor/localization_editor.cpp @@ -656,7 +656,9 @@ LocalizationEditor::LocalizationEditor() { translations->add_child(tvb); HBoxContainer *thb = memnew(HBoxContainer); - thb->add_child(memnew(Label(TTR("Translations:")))); + Label *l = memnew(Label(TTR("Translations:"))); + l->set_header_mode(Label::HEADER_SMALL); + thb->add_child(l); thb->add_spacer(); tvb->add_child(thb); @@ -684,7 +686,9 @@ LocalizationEditor::LocalizationEditor() { translations->add_child(tvb); HBoxContainer *thb = memnew(HBoxContainer); - thb->add_child(memnew(Label(TTR("Resources:")))); + Label *l = memnew(Label(TTR("Resources:"))); + l->set_header_mode(Label::HEADER_SMALL); + thb->add_child(l); thb->add_spacer(); tvb->add_child(thb); @@ -708,7 +712,9 @@ LocalizationEditor::LocalizationEditor() { add_child(translation_res_file_open_dialog); thb = memnew(HBoxContainer); - thb->add_child(memnew(Label(TTR("Remaps by Locale:")))); + l = memnew(Label(TTR("Remaps by Locale:"))); + l->set_header_mode(Label::HEADER_SMALL); + thb->add_child(l); thb->add_spacer(); tvb->add_child(thb); @@ -756,7 +762,9 @@ LocalizationEditor::LocalizationEditor() { translation_locale_filter_mode->connect("item_selected", callable_mp(this, &LocalizationEditor::_translation_filter_mode_changed)); tmc->add_margin_child(TTR("Filter mode:"), translation_locale_filter_mode); - tmc->add_child(memnew(Label(TTR("Locales:")))); + Label *l = memnew(Label(TTR("Locales:"))); + l->set_header_mode(Label::HEADER_SMALL); + tmc->add_child(l); translation_filter = memnew(Tree); translation_filter->set_v_size_flags(Control::SIZE_EXPAND_FILL); translation_filter->set_columns(1); @@ -770,7 +778,9 @@ LocalizationEditor::LocalizationEditor() { translations->add_child(tvb); HBoxContainer *thb = memnew(HBoxContainer); - thb->add_child(memnew(Label(TTR("Files with translation strings:")))); + Label *l = memnew(Label(TTR("Files with translation strings:"))); + l->set_header_mode(Label::HEADER_SMALL); + thb->add_child(l); thb->add_spacer(); tvb->add_child(thb); diff --git a/editor/plugins/node_3d_editor_plugin.cpp b/editor/plugins/node_3d_editor_plugin.cpp index dbda02034643..1b9e118589dc 100644 --- a/editor/plugins/node_3d_editor_plugin.cpp +++ b/editor/plugins/node_3d_editor_plugin.cpp @@ -7080,6 +7080,7 @@ Node3DEditor::Node3DEditor(EditorNode *p_editor) { sun_vb->hide(); sun_title = memnew(Label); + sun_title->set_header_mode(Label::HEADER_SMALL); sun_vb->add_child(sun_title); sun_title->set_text(TTR("Preview Sun")); sun_title->set_align(Label::ALIGN_CENTER); @@ -7141,6 +7142,8 @@ Node3DEditor::Node3DEditor(EditorNode *p_editor) { environ_vb->hide(); environ_title = memnew(Label); + environ_title->set_header_mode(Label::HEADER_SMALL); + environ_vb->add_child(environ_title); environ_title->set_text(TTR("Preview Environment")); environ_title->set_align(Label::ALIGN_CENTER); diff --git a/editor/plugins/theme_editor_plugin.cpp b/editor/plugins/theme_editor_plugin.cpp index f1c73f99dc94..189fefac82b4 100644 --- a/editor/plugins/theme_editor_plugin.cpp +++ b/editor/plugins/theme_editor_plugin.cpp @@ -1954,7 +1954,9 @@ ThemeEditor::ThemeEditor() { HBoxContainer *top_menu = memnew(HBoxContainer); add_child(top_menu); - top_menu->add_child(memnew(Label(TTR("Preview:")))); + Label *l = memnew(Label(TTR("Preview:"))); + l->set_header_mode(Label::HEADER_SMALL); + top_menu->add_child(l); top_menu->add_spacer(false); theme_edit_button = memnew(Button); diff --git a/editor/project_export.cpp b/editor/project_export.cpp index 9b9937273566..38a48d16901b 100644 --- a/editor/project_export.cpp +++ b/editor/project_export.cpp @@ -1006,7 +1006,10 @@ ProjectExportDialog::ProjectExportDialog() { hbox->add_child(preset_vb); HBoxContainer *preset_hb = memnew(HBoxContainer); - preset_hb->add_child(memnew(Label(TTR("Presets")))); + Label *l = memnew(Label(TTR("Presets"))); + l->set_header_mode(Label::HEADER_SMALL); + preset_hb->add_child(l); + preset_hb->add_spacer(); preset_vb->add_child(preset_hb); diff --git a/editor/scene_tree_dock.cpp b/editor/scene_tree_dock.cpp index 349e05b47b01..f8c48e16a4f3 100644 --- a/editor/scene_tree_dock.cpp +++ b/editor/scene_tree_dock.cpp @@ -1209,7 +1209,9 @@ void SceneTreeDock::_notification(int p_what) { HBoxContainer *top_row = memnew(HBoxContainer); top_row->set_name("NodeShortcutsTopRow"); top_row->set_h_size_flags(SIZE_EXPAND_FILL); - top_row->add_child(memnew(Label(TTR("Create Root Node:")))); + Label *l = memnew(Label(TTR("Create Root Node:"))); + l->set_header_mode(Label::HEADER_SMALL); + top_row->add_child(l); top_row->add_spacer(); Button *node_shortcuts_toggle = memnew(Button); diff --git a/editor/scene_tree_editor.cpp b/editor/scene_tree_editor.cpp index 6f9b0ae87308..bbf88e43fb64 100644 --- a/editor/scene_tree_editor.cpp +++ b/editor/scene_tree_editor.cpp @@ -1165,6 +1165,7 @@ SceneTreeEditor::SceneTreeEditor(bool p_label, bool p_can_rename, bool p_can_ope if (p_label) { Label *label = memnew(Label); + label->set_header_mode(Label::HEADER_SMALL); label->set_position(Point2(10, 0)); label->set_text(TTR("Scene Tree (Nodes):")); diff --git a/scene/gui/box_container.cpp b/scene/gui/box_container.cpp index 7407ad5b8f0c..9ead13e46a87 100644 --- a/scene/gui/box_container.cpp +++ b/scene/gui/box_container.cpp @@ -349,6 +349,7 @@ void BoxContainer::_bind_methods() { MarginContainer *VBoxContainer::add_margin_child(const String &p_label, Control *p_control, bool p_expand) { Label *l = memnew(Label); + l->set_header_mode(Label::HEADER_SMALL); l->set_text(p_label); add_child(l); MarginContainer *mc = memnew(MarginContainer); diff --git a/scene/gui/label.cpp b/scene/gui/label.cpp index de0ee626b979..842cb38cc714 100644 --- a/scene/gui/label.cpp +++ b/scene/gui/label.cpp @@ -36,6 +36,31 @@ #include "servers/text_server.h" +Ref Label::_get_font() const { + switch (header_mode) { + case HEADER_SMALL: + return get_theme_font("font_header_small"); + case HEADER_MEDIUM: + return get_theme_font("font_header_medium"); + case HEADER_LARGE: + return get_theme_font("font_header_large"); + default: + return get_theme_font("font"); + } +} +int Label::_get_font_size() const { + switch (header_mode) { + case HEADER_SMALL: + return get_theme_font_size("font_header_small_size"); + case HEADER_MEDIUM: + return get_theme_font_size("font_header_medium_size"); + case HEADER_LARGE: + return get_theme_font_size("font_header_large_size"); + default: + return get_theme_font_size("font_size"); + } +} + void Label::set_autowrap(bool p_autowrap) { if (autowrap != p_autowrap) { autowrap = p_autowrap; @@ -64,7 +89,7 @@ bool Label::is_uppercase() const { } int Label::get_line_height(int p_line) const { - Ref font = get_theme_font("font"); + Ref font = _get_font(); if (p_line >= 0 && p_line < lines_rid.size()) { return TS->shaped_text_get_size(lines_rid[p_line]).y + font->get_spacing(Font::SPACING_TOP) + font->get_spacing(Font::SPACING_BOTTOM); } else if (lines_rid.size() > 0) { @@ -74,7 +99,7 @@ int Label::get_line_height(int p_line) const { } return h; } else { - return font->get_height(get_theme_font_size("font_size")); + return font->get_height(_get_font_size()); } } @@ -89,7 +114,7 @@ void Label::_shape() { } else { TS->shaped_text_set_direction(text_rid, (TextServer::Direction)text_direction); } - TS->shaped_text_add_string(text_rid, (uppercase) ? xl_text.to_upper() : xl_text, get_theme_font("font")->get_rids(), get_theme_font_size("font_size"), opentype_features, (language != "") ? language : TranslationServer::get_singleton()->get_tool_locale()); + TS->shaped_text_add_string(text_rid, (uppercase) ? xl_text.to_upper() : xl_text, _get_font()->get_rids(), _get_font_size(), opentype_features, (language != "") ? language : TranslationServer::get_singleton()->get_tool_locale()); TS->shaped_text_set_bidi_override(text_rid, structured_text_parser(st_parser, st_args, xl_text)); dirty = false; lines_dirty = true; @@ -139,7 +164,7 @@ void Label::_shape() { void Label::_update_visible() { int line_spacing = get_theme_constant("line_spacing", "Label"); Ref style = get_theme_stylebox("normal", "Label"); - Ref font = get_theme_font("font"); + Ref font = _get_font(); int lines_visible = lines_rid.size(); if (max_lines_visible >= 0 && lines_visible > max_lines_visible) { @@ -182,7 +207,7 @@ void Label::_notification(int p_what) { Size2 string_size; Size2 size = get_size(); Ref style = get_theme_stylebox("normal"); - Ref font = get_theme_font("font"); + Ref font = _get_font(); Color font_color = get_theme_color("font_color"); Color font_shadow_color = get_theme_color("font_shadow_color"); Point2 shadow_ofs(get_theme_constant("shadow_offset_x"), get_theme_constant("shadow_offset_y")); @@ -365,8 +390,8 @@ Size2 Label::get_minimum_size() const { Size2 min_size = minsize; - Ref font = get_theme_font("font"); - min_size.height = MAX(min_size.height, font->get_height(get_theme_font_size("font_size")) + font->get_spacing(Font::SPACING_TOP) + font->get_spacing(Font::SPACING_BOTTOM)); + Ref font = _get_font(); + min_size.height = MAX(min_size.height, font->get_height(_get_font_size()) + font->get_spacing(Font::SPACING_TOP) + font->get_spacing(Font::SPACING_BOTTOM)); Size2 min_style = get_theme_stylebox("normal")->get_minimum_size(); if (autowrap) { @@ -392,7 +417,7 @@ int Label::get_line_count() const { } int Label::get_visible_line_count() const { - Ref font = get_theme_font("font"); + Ref font = _get_font(); Ref style = get_theme_stylebox("normal"); int line_spacing = get_theme_constant("line_spacing"); int lines_visible = 0; @@ -597,6 +622,16 @@ int Label::get_total_character_count() const { return xl_text.length(); } +void Label::set_header_mode(HeaderMode p_mode) { + header_mode = p_mode; + dirty = true; + update(); +} + +Label::HeaderMode Label::get_header_mode() const { + return header_mode; +} + bool Label::_set(const StringName &p_name, const Variant &p_value) { String str = p_name; if (str.begins_with("opentype_features/")) { @@ -683,6 +718,8 @@ void Label::_bind_methods() { ClassDB::bind_method(D_METHOD("get_structured_text_bidi_override"), &Label::get_structured_text_bidi_override); ClassDB::bind_method(D_METHOD("set_structured_text_bidi_override_options", "args"), &Label::set_structured_text_bidi_override_options); ClassDB::bind_method(D_METHOD("get_structured_text_bidi_override_options"), &Label::get_structured_text_bidi_override_options); + ClassDB::bind_method(D_METHOD("set_header_mode", "mode"), &Label::set_header_mode); + ClassDB::bind_method(D_METHOD("get_header_mode"), &Label::get_header_mode); BIND_ENUM_CONSTANT(ALIGN_LEFT); BIND_ENUM_CONSTANT(ALIGN_CENTER); @@ -694,6 +731,11 @@ void Label::_bind_methods() { BIND_ENUM_CONSTANT(VALIGN_BOTTOM); BIND_ENUM_CONSTANT(VALIGN_FILL); + BIND_ENUM_CONSTANT(HEADER_DISABLED); + BIND_ENUM_CONSTANT(HEADER_SMALL); + BIND_ENUM_CONSTANT(HEADER_MEDIUM); + BIND_ENUM_CONSTANT(HEADER_LARGE); + ADD_PROPERTY(PropertyInfo(Variant::STRING, "text", PROPERTY_HINT_MULTILINE_TEXT, "", PROPERTY_USAGE_DEFAULT_INTL), "set_text", "get_text"); ADD_PROPERTY(PropertyInfo(Variant::INT, "text_direction", PROPERTY_HINT_ENUM, "Auto,Left-to-Right,Right-to-Left,Inherited"), "set_text_direction", "get_text_direction"); ADD_PROPERTY(PropertyInfo(Variant::STRING, "language"), "set_language", "get_language"); @@ -702,6 +744,7 @@ void Label::_bind_methods() { ADD_PROPERTY(PropertyInfo(Variant::BOOL, "autowrap"), "set_autowrap", "has_autowrap"); ADD_PROPERTY(PropertyInfo(Variant::BOOL, "clip_text"), "set_clip_text", "is_clipping_text"); ADD_PROPERTY(PropertyInfo(Variant::BOOL, "uppercase"), "set_uppercase", "is_uppercase"); + ADD_PROPERTY(PropertyInfo(Variant::INT, "header_mode", PROPERTY_HINT_ENUM, "Disabled,Small,Medium,Large"), "set_header_mode", "get_header_mode"); ADD_PROPERTY(PropertyInfo(Variant::INT, "visible_characters", PROPERTY_HINT_RANGE, "-1,128000,1", PROPERTY_USAGE_EDITOR), "set_visible_characters", "get_visible_characters"); ADD_PROPERTY(PropertyInfo(Variant::FLOAT, "percent_visible", PROPERTY_HINT_RANGE, "0,1,0.001"), "set_percent_visible", "get_percent_visible"); ADD_PROPERTY(PropertyInfo(Variant::INT, "lines_skipped", PROPERTY_HINT_RANGE, "0,999,1"), "set_lines_skipped", "get_lines_skipped"); diff --git a/scene/gui/label.h b/scene/gui/label.h index 032b4112e1b4..b42c0d4c7d87 100644 --- a/scene/gui/label.h +++ b/scene/gui/label.h @@ -51,6 +51,13 @@ class Label : public Control { VALIGN_FILL }; + enum HeaderMode { + HEADER_DISABLED, + HEADER_SMALL, + HEADER_MEDIUM, + HEADER_LARGE, + }; + private: Align align = ALIGN_LEFT; VAlign valign = VALIGN_TOP; @@ -60,6 +67,7 @@ class Label : public Control { bool clip = false; Size2 minsize; bool uppercase = false; + HeaderMode header_mode = HEADER_DISABLED; bool lines_dirty = true; bool dirty = true; @@ -81,6 +89,9 @@ class Label : public Control { void _update_visible(); void _shape(); + Ref _get_font() const; + int _get_font_size() const; + protected: void _notification(int p_what); @@ -144,11 +155,15 @@ class Label : public Control { int get_line_count() const; int get_visible_line_count() const; + void set_header_mode(HeaderMode p_mode); + HeaderMode get_header_mode() const; + Label(const String &p_text = String()); ~Label(); }; VARIANT_ENUM_CAST(Label::Align); VARIANT_ENUM_CAST(Label::VAlign); +VARIANT_ENUM_CAST(Label::HeaderMode); #endif diff --git a/scene/resources/default_theme/default_theme.cpp b/scene/resources/default_theme/default_theme.cpp index b91a5c0b7f9e..09811137e056 100644 --- a/scene/resources/default_theme/default_theme.cpp +++ b/scene/resources/default_theme/default_theme.cpp @@ -380,6 +380,13 @@ void fill_default_theme(Ref &theme, const Ref &default_font, const theme->set_font("font", "Label", Ref()); theme->set_font_size("font_size", "Label", -1); + theme->set_font("font_header_small", "Label", Ref()); + theme->set_font_size("font_header_small_size", "Label", -1); + theme->set_font("font_header_medium", "Label", Ref()); + theme->set_font_size("font_header_medium_size", "Label", -1); + theme->set_font("font_header_large", "Label", Ref()); + theme->set_font_size("font_header_large_size", "Label", -1); + theme->set_color("font_color", "Label", Color(1, 1, 1)); theme->set_color("font_shadow_color", "Label", Color(0, 0, 0, 0)); theme->set_color("font_outline_color", "Label", Color(1, 1, 1));