From 487688c145732d8b902742b6bddb449f4b36b093 Mon Sep 17 00:00:00 2001 From: Voyager Date: Wed, 19 Aug 2026 00:07:24 -0400 Subject: [PATCH] fix: polish logbook details --- tests/logbook_validation.gd | 103 ++++++++++++-- ui/logbook_page.gd | 270 ++++++++++++++++++++++++++++-------- 2 files changed, 305 insertions(+), 68 deletions(-) diff --git a/tests/logbook_validation.gd b/tests/logbook_validation.gd index 036fad2..ff5b771 100644 --- a/tests/logbook_validation.gd +++ b/tests/logbook_validation.gd @@ -5,6 +5,7 @@ const FishInventoryType = preload("res://inventory/fish_inventory.gd") const FishPoolType = preload("res://fish/fish_pool.gd") const CollectionLogType = preload("res://collection/collection_log.gd") const FishDataType = preload("res://fish/fish_data.gd") +const FishQualityType = preload("res://fish/fish_quality.gd") const LogbookPortraitType = preload( "res://ui/components/logbook_portrait.gd" ) @@ -74,6 +75,8 @@ func _validate_page() -> void: root.add_child(inventory) var page := LogbookPageScene.instantiate() as LogbookPage root.add_child(page) + page.set_anchors_and_offsets_preset(Control.PRESET_TOP_LEFT) + page.size = Vector2(1280.0, 720.0) await process_frame page.setup(collection, inventory, CatalogResource) page.activate() @@ -233,6 +236,10 @@ func _validate_page() -> void: .get(bluegill_unknown) != null ) collection.mark_discovered(&"bluegill") + collection.mark_quality_discovered( + &"bluegill", + FishQualityType.Tier.BORING, + ) await process_frame var entries: Dictionary = page.get("_entry_buttons") var known := entries.get(&"bluegill") as Button @@ -263,7 +270,7 @@ func _validate_page() -> void: inventory.add_catch(fish_catch) page.call("_select_entry", &"bluegill", &"bluegill") await process_frame - assert(_detail_text(page).contains("number owned\n1")) + assert(not _detail_text(page).contains("number owned")) assert(_detail_text(page).contains("number caught\nunknown")) assert(_detail_text(page).contains("body of water\nfresh water")) assert( @@ -275,6 +282,7 @@ func _validate_page() -> void: assert(_detail_text(page).contains(LogbookCatalog.facts_for(bluegill))) _validate_detail_field_fonts(page) _validate_handwritten_numeric_scale(page) + _validate_detail_content_bounds(page) var detail_buttons: Array = page.get("_detail_buttons") as Array assert(detail_buttons.size() == 4) var portrait_detail := detail_buttons[0] as Button @@ -316,9 +324,15 @@ func _validate_page() -> void: ) assert(overlay_artwork.source_texture == bluegill.display_texture) assert( - overlay_artwork.custom_minimum_size.x <= 860.0 - and overlay_artwork.custom_minimum_size.y <= 480.0 + overlay_artwork.custom_minimum_size.x + <= LogbookPage.PORTRAIT_VIEW_MAX_SIZE.x + and overlay_artwork.custom_minimum_size.y + <= LogbookPage.PORTRAIT_VIEW_MAX_SIZE.y ) + var overlay_card := _find_overlay_card(portrait_overlay) + assert(overlay_card != null) + assert(overlay_card.size == LogbookPage.DETAIL_OVERLAY_CARD_SIZE) + assert(is_equal_approx(overlay_card.size.aspect(), 4.0 / 3.0)) (page.get("_portrait_overlay_backdrop") as Button).pressed.emit() await process_frame assert(not portrait_overlay.visible) @@ -338,20 +352,40 @@ func _validate_page() -> void: == HORIZONTAL_ALIGNMENT_LEFT ) assert( - portrait_overlay.size.x - - overlay_text.size.x - <= float( - (LogbookPage.DETAIL_OVERLAY_EDGE_MARGIN - + LogbookPage.DETAIL_OVERLAY_CONTENT_MARGIN) * 2 - + 8 - ) + overlay_text.get_theme_font("font") + == UtilityPageStyle.TuffyFont ) (page.get("_portrait_overlay_backdrop") as Button).pressed.emit() await process_frame + quality_detail.pressed.emit() + await process_frame + var quality_view := page.get("_portrait_overlay_quality_view") as Control + assert(quality_view.visible) + var quality_text: String = _descendant_label_text(quality_view) + for quality: int in FishQualityType.TIER_COUNT: + assert(quality_text.contains(FishQualityType.display_name(quality))) + assert(quality_text.contains("●")) + assert(quality_text.contains("○")) + _validate_overlay_fonts(quality_view) + (page.get("_portrait_overlay_backdrop") as Button).pressed.emit() + await process_frame + + stats_detail.pressed.emit() + await process_frame + var stats_view := page.get("_portrait_overlay_stats_view") as Control + assert(stats_view.visible) + var stats_text: String = _descendant_label_text(stats_view) + assert(stats_text.contains("catalog number")) + assert(stats_text.contains("seasons")) + assert(not stats_text.contains("number owned")) + _validate_overlay_fonts(stats_view) + (page.get("_portrait_overlay_backdrop") as Button).pressed.emit() + await process_frame + inventory.remove_catch_by_id(fish_catch.catch_id) await process_frame - assert(_detail_text(page).contains("number owned\n0")) + assert(not _detail_text(page).contains("number owned")) page.queue_free() collection.queue_free() inventory.queue_free() @@ -365,6 +399,49 @@ func _detail_text(page: LogbookPage) -> String: return "\n".join(values) +func _descendant_label_text(parent: Node) -> String: + var values: PackedStringArray = [] + for node: Node in parent.find_children("*", "Label", true, false): + values.append((node as Label).text) + return "\n".join(values) + + +func _validate_overlay_fonts(parent: Node) -> void: + for node: Node in parent.find_children("*", "Label", true, false): + assert( + (node as Label).get_theme_font("font") + == UtilityPageStyle.TuffyFont + ) + + +func _validate_detail_content_bounds(page: LogbookPage) -> void: + var detail_body := page.get("_detail_body") as VBoxContainer + var page_rect: Rect2 = (detail_body.get_parent() as Control).get_global_rect() + for node: Node in detail_body.find_children("*", "Label", true, false): + var label := node as Label + var label_rect: Rect2 = label.get_global_rect() + assert( + label_rect.position.y >= page_rect.position.y - 0.5, + "Label starts above logbook page: %s %s vs %s" + % [label.text, label_rect, page_rect], + ) + assert( + label_rect.end.y <= page_rect.end.y + 0.5, + "Label ends below logbook page: %s %s vs %s" + % [label.text, label_rect, page_rect], + ) + + +func _find_overlay_card(parent: Node) -> PanelContainer: + for node: Node in parent.find_children( + "*", "PanelContainer", true, false + ): + var panel := node as PanelContainer + if panel.custom_minimum_size == LogbookPage.DETAIL_OVERLAY_CARD_SIZE: + return panel + return null + + func _find_portrait(entry: Button) -> LogbookPortraitType: var pending: Array[Node] = [entry] while not pending.is_empty(): @@ -401,10 +478,10 @@ func _validate_handwritten_logbook_font(page: LogbookPage) -> void: "rarity", "body of water", "time of day", + "seasons", "weight range", "value range", "number caught", - "number owned", ]: continue assert( @@ -421,10 +498,10 @@ func _validate_detail_field_fonts(page: LogbookPage) -> void: "rarity", "body of water", "time of day", + "seasons", "weight range", "value range", "number caught", - "number owned", ] for node: Node in detail_body.find_children("*", "Label", true, false): var label := node as Label diff --git a/ui/logbook_page.gd b/ui/logbook_page.gd index ed95e2d..a703b95 100644 --- a/ui/logbook_page.gd +++ b/ui/logbook_page.gd @@ -23,11 +23,13 @@ const CurrencyPresentationType = preload( const DETAIL_FADE_DURATION: float = 0.12 const CATEGORY_FADE_DURATION: float = UIMotion.UTILITY_EXIT_DURATION const HANDWRITTEN_NUMERIC_SCALE: float = 0.8 -const PORTRAIT_VIEW_MAX_SIZE := Vector2(860.0, 480.0) -const DETAIL_OVERLAY_EDGE_MARGIN: int = 22 +const PORTRAIT_VIEW_MAX_SIZE := Vector2(680.0, 420.0) +const DETAIL_OVERLAY_CARD_SIZE := Vector2(800.0, 600.0) const DETAIL_OVERLAY_CONTENT_MARGIN: int = 34 -const DETAIL_OVERLAY_TITLE_FONT_SIZE: int = 40 -const DETAIL_OVERLAY_TEXT_FONT_SIZE: int = 36 +const DETAIL_OVERLAY_TITLE_FONT_SIZE: int = 36 +const DETAIL_OVERLAY_TEXT_FONT_SIZE: int = 28 +const DETAIL_OVERLAY_FIELD_FONT_SIZE: int = 22 +const DETAIL_OVERLAY_VALUE_FONT_SIZE: int = 26 const INK := Color("251b10") const MUTED_INK := Color("6d5b45") const LOGBOOK_ARTWORK: Texture2D = preload( @@ -52,7 +54,9 @@ const CATALOG_ENTRY_SIZE := Vector2(92.0, 92.0) const CATALOG_ROW_STEP: float = 98.0 const CATALOG_SNAP_DELAY: float = 0.12 const DETAIL_PORTRAIT_SIZE := Vector2(160.0, 88.0) -const DETAIL_BOTTOM_INSET: float = 35.0 +const DETAIL_SECTION_SEPARATION: int = 10 +const DETAIL_QUALITY_SECTION_HEIGHT: float = 104.0 +const DETAIL_STATS_ROW_SEPARATION: int = 8 enum ControllerZone { TABS, @@ -93,8 +97,13 @@ var _detail_buttons: Array[Button] = [] var _portrait_overlay: Control var _portrait_overlay_backdrop: Button var _portrait_overlay_artwork: LogbookPortraitType +var _portrait_overlay_artwork_view: Control var _portrait_overlay_title: Label var _portrait_overlay_text: Label +var _portrait_overlay_quality_view: Control +var _portrait_overlay_quality: VBoxContainer +var _portrait_overlay_stats_view: Control +var _portrait_overlay_stats: GridContainer var _overlay_return_focus: Control var _controller_zone: ControllerZone = ControllerZone.TABS @@ -393,7 +402,9 @@ func _build_interface() -> void: _detail_body.set_anchors_and_offsets_preset(Control.PRESET_FULL_RECT) _detail_body.size_flags_horizontal = Control.SIZE_EXPAND_FILL _detail_body.size_flags_vertical = Control.SIZE_EXPAND_FILL - _detail_body.add_theme_constant_override("separation", 16) + _detail_body.add_theme_constant_override( + "separation", DETAIL_SECTION_SEPARATION + ) right_page.add_child(_detail_body) _apply_page_content_scale(_detail_body) _show_no_selection() @@ -827,8 +838,13 @@ func _build_known_details(fish: FishDataType) -> void: artwork_center.add_child(artwork) var facts_text: String = LogbookCatalog.facts_for(fish) + var facts_section_title: String = ( + "shellfish facts" + if fish.logbook_section == FishDataType.LogbookSection.SHELLFISH + else "fish facts" + ) var facts_button := _make_detail_section_button( - "fish facts", + facts_section_title, facts_text, ) facts_button.custom_minimum_size = Vector2(190.0, 132.0) @@ -841,9 +857,7 @@ func _build_known_details(fish: FishDataType) -> void: facts_column.add_theme_constant_override("separation", 6) facts_button.add_child(facts_column) var facts_heading := _field_label( - "shellfish facts" - if fish.logbook_section == FishDataType.LogbookSection.SHELLFISH - else "fish facts", + facts_section_title, 16, ) facts_column.add_child(facts_heading) @@ -855,7 +869,7 @@ func _build_known_details(fish: FishDataType) -> void: "quality collection", _quality_overlay_text(fish.id), ) - quality_button.custom_minimum_size.y = 132.0 + quality_button.custom_minimum_size.y = DETAIL_QUALITY_SECTION_HEIGHT quality_button.size_flags_horizontal = Control.SIZE_EXPAND_FILL _detail_body.add_child(quality_button) var quality_progress := _build_quality_progress(fish.id) @@ -876,7 +890,7 @@ func _build_known_details(fish: FishDataType) -> void: stats_anchor.mouse_filter = Control.MOUSE_FILTER_IGNORE stats_anchor.size_flags_horizontal = Control.SIZE_EXPAND_FILL stats_anchor.size_flags_vertical = Control.SIZE_EXPAND_FILL - stats_anchor.alignment = BoxContainer.ALIGNMENT_END + stats_anchor.alignment = BoxContainer.ALIGNMENT_BEGIN stats_button.add_child(stats_anchor) var stats_columns := HBoxContainer.new() stats_columns.size_flags_horizontal = Control.SIZE_EXPAND_FILL @@ -924,15 +938,6 @@ func _build_known_details(fish: FishDataType) -> void: FishQualityType.Tier.SHINY, ), ) - _add_detail_row( - right_stats, - "number owned", - str(_inventory.get_count(fish.id) if _inventory != null else 0), - ) - var bottom_inset := Control.new() - bottom_inset.custom_minimum_size.y = DETAIL_BOTTOM_INSET - bottom_inset.mouse_filter = Control.MOUSE_FILTER_IGNORE - stats_anchor.add_child(bottom_inset) _configure_detail_focus( _detail_portrait_button, facts_button, @@ -1095,9 +1100,6 @@ func _stats_overlay_text(fish: FishDataType, catalog_number: int) -> String: FishQualityType.Tier.SHINY, ), ], - "number owned: %d" % ( - _inventory.get_count(fish.id) if _inventory != null else 0 - ), ]) @@ -1169,7 +1171,9 @@ func _make_stats_column() -> VBoxContainer: var column := VBoxContainer.new() column.size_flags_horizontal = Control.SIZE_EXPAND_FILL column.size_flags_stretch_ratio = 1.0 - column.add_theme_constant_override("separation", 12) + column.add_theme_constant_override( + "separation", DETAIL_STATS_ROW_SEPARATION + ) return column @@ -1333,12 +1337,12 @@ func _build_portrait_overlay() -> void: _portrait_overlay_backdrop.focus_neighbor_right = NodePath(".") _portrait_overlay_backdrop.focus_next = NodePath(".") _portrait_overlay_backdrop.focus_previous = NodePath(".") - var transparent_style := StyleBoxEmpty.new() + var backdrop_style := _portrait_overlay_backdrop_style() for state: StringName in [ &"normal", &"hover", &"focus", &"pressed", &"disabled", ]: _portrait_overlay_backdrop.add_theme_stylebox_override( - state, transparent_style + state, backdrop_style ) _portrait_overlay_backdrop.pressed.connect(_hide_portrait_overlay) _portrait_overlay_backdrop.gui_input.connect( @@ -1346,23 +1350,17 @@ func _build_portrait_overlay() -> void: ) _portrait_overlay.add_child(_portrait_overlay_backdrop) - var overlay_margin := MarginContainer.new() - overlay_margin.mouse_filter = Control.MOUSE_FILTER_IGNORE - overlay_margin.set_anchors_and_offsets_preset(Control.PRESET_FULL_RECT) - _set_margins( - overlay_margin, - DETAIL_OVERLAY_EDGE_MARGIN, - DETAIL_OVERLAY_EDGE_MARGIN, - DETAIL_OVERLAY_EDGE_MARGIN, - DETAIL_OVERLAY_EDGE_MARGIN, - ) - _portrait_overlay.add_child(overlay_margin) + var overlay_center := CenterContainer.new() + overlay_center.mouse_filter = Control.MOUSE_FILTER_IGNORE + overlay_center.set_anchors_and_offsets_preset(Control.PRESET_FULL_RECT) + _portrait_overlay.add_child(overlay_center) var card := PanelContainer.new() card.mouse_filter = Control.MOUSE_FILTER_STOP - card.size_flags_horizontal = Control.SIZE_EXPAND_FILL - card.size_flags_vertical = Control.SIZE_EXPAND_FILL + card.custom_minimum_size = DETAIL_OVERLAY_CARD_SIZE + card.size_flags_horizontal = Control.SIZE_SHRINK_CENTER + card.size_flags_vertical = Control.SIZE_SHRINK_CENTER card.add_theme_stylebox_override("panel", _portrait_view_style()) - overlay_margin.add_child(card) + overlay_center.add_child(card) var margin := MarginContainer.new() _set_margins( margin, @@ -1373,24 +1371,76 @@ func _build_portrait_overlay() -> void: ) card.add_child(margin) var overlay_stack := VBoxContainer.new() - overlay_stack.alignment = BoxContainer.ALIGNMENT_CENTER - overlay_stack.add_theme_constant_override("separation", 18) + overlay_stack.add_theme_constant_override("separation", 20) margin.add_child(overlay_stack) _portrait_overlay_title = _field_label( "", DETAIL_OVERLAY_TITLE_FONT_SIZE ) _portrait_overlay_title.horizontal_alignment = HORIZONTAL_ALIGNMENT_CENTER + _portrait_overlay_title.add_theme_color_override( + "font_color", UIPalette.TEXT + ) overlay_stack.add_child(_portrait_overlay_title) + var content_panel := PanelContainer.new() + content_panel.size_flags_horizontal = Control.SIZE_EXPAND_FILL + content_panel.size_flags_vertical = Control.SIZE_EXPAND_FILL + content_panel.add_theme_stylebox_override( + "panel", _portrait_overlay_content_style() + ) + overlay_stack.add_child(content_panel) + var content_margin := MarginContainer.new() + _set_margins(content_margin, 28, 24, 28, 24) + content_panel.add_child(content_margin) + var content_holder := Control.new() + content_holder.size_flags_horizontal = Control.SIZE_EXPAND_FILL + content_holder.size_flags_vertical = Control.SIZE_EXPAND_FILL + content_margin.add_child(content_holder) + + _portrait_overlay_artwork_view = CenterContainer.new() + _portrait_overlay_artwork_view.set_anchors_and_offsets_preset( + Control.PRESET_FULL_RECT + ) + content_holder.add_child(_portrait_overlay_artwork_view) _portrait_overlay_artwork = LogbookPortraitType.new() _portrait_overlay_artwork.size_flags_horizontal = Control.SIZE_SHRINK_CENTER - overlay_stack.add_child(_portrait_overlay_artwork) - _portrait_overlay_text = _label("", DETAIL_OVERLAY_TEXT_FONT_SIZE) - _portrait_overlay_text.size_flags_horizontal = Control.SIZE_EXPAND_FILL - _portrait_overlay_text.size_flags_vertical = Control.SIZE_EXPAND_FILL + _portrait_overlay_artwork_view.add_child(_portrait_overlay_artwork) + + _portrait_overlay_text = _field_label("", DETAIL_OVERLAY_TEXT_FONT_SIZE) + _portrait_overlay_text.set_anchors_and_offsets_preset( + Control.PRESET_FULL_RECT + ) _portrait_overlay_text.horizontal_alignment = HORIZONTAL_ALIGNMENT_LEFT _portrait_overlay_text.vertical_alignment = VERTICAL_ALIGNMENT_CENTER _portrait_overlay_text.autowrap_mode = TextServer.AUTOWRAP_WORD_SMART - overlay_stack.add_child(_portrait_overlay_text) + _portrait_overlay_text.add_theme_color_override( + "font_color", UIPalette.TEXT + ) + content_holder.add_child(_portrait_overlay_text) + + _portrait_overlay_quality_view = CenterContainer.new() + _portrait_overlay_quality_view.set_anchors_and_offsets_preset( + Control.PRESET_FULL_RECT + ) + content_holder.add_child(_portrait_overlay_quality_view) + _portrait_overlay_quality = VBoxContainer.new() + _portrait_overlay_quality.size_flags_horizontal = Control.SIZE_SHRINK_CENTER + _portrait_overlay_quality.size_flags_vertical = Control.SIZE_SHRINK_CENTER + _portrait_overlay_quality.add_theme_constant_override("separation", 22) + _portrait_overlay_quality_view.add_child(_portrait_overlay_quality) + + _portrait_overlay_stats_view = CenterContainer.new() + _portrait_overlay_stats_view.set_anchors_and_offsets_preset( + Control.PRESET_FULL_RECT + ) + content_holder.add_child(_portrait_overlay_stats_view) + _portrait_overlay_stats = GridContainer.new() + _portrait_overlay_stats.columns = 2 + _portrait_overlay_stats.size_flags_horizontal = Control.SIZE_SHRINK_CENTER + _portrait_overlay_stats.size_flags_vertical = Control.SIZE_SHRINK_CENTER + _portrait_overlay_stats.add_theme_constant_override("h_separation", 48) + _portrait_overlay_stats.add_theme_constant_override("v_separation", 12) + _portrait_overlay_stats_view.add_child(_portrait_overlay_stats) + _set_detail_overlay_view(&"text") func _show_portrait_overlay(portrait_texture: Texture2D) -> void: @@ -1401,8 +1451,7 @@ func _show_portrait_overlay(portrait_texture: Texture2D) -> void: PORTRAIT_VIEW_MAX_SIZE, ) _portrait_overlay_title.text = "artwork" - _portrait_overlay_artwork.visible = true - _portrait_overlay_text.visible = false + _set_detail_overlay_view(&"artwork") _overlay_return_focus = _detail_portrait_button _controller_zone = ControllerZone.OVERLAY set_interactive(_interactive) @@ -1419,9 +1468,16 @@ func _show_detail_text_overlay( if _portrait_overlay == null: return _portrait_overlay_title.text = section_title - _portrait_overlay_artwork.visible = false - _portrait_overlay_text.text = section_text - _portrait_overlay_text.visible = true + match section_title: + "quality collection": + _populate_quality_overlay(_selected_id) + _set_detail_overlay_view(&"quality") + "fish stats": + _populate_stats_overlay(section_text) + _set_detail_overlay_view(&"stats") + _: + _portrait_overlay_text.text = section_text + _set_detail_overlay_view(&"text") _overlay_return_focus = return_focus _controller_zone = ControllerZone.OVERLAY set_interactive(_interactive) @@ -1430,6 +1486,92 @@ func _show_detail_text_overlay( _portrait_overlay_backdrop.grab_focus() +func _set_detail_overlay_view(view: StringName) -> void: + _portrait_overlay_artwork_view.visible = view == &"artwork" + _portrait_overlay_text.visible = view == &"text" + _portrait_overlay_quality_view.visible = view == &"quality" + _portrait_overlay_stats_view.visible = view == &"stats" + + +func _populate_quality_overlay(fish_id: StringName) -> void: + _clear_overlay_container(_portrait_overlay_quality) + var discovered_count: int = 0 + for quality: int in FishQualityType.TIER_COUNT: + if _collection_log.has_discovered_quality(fish_id, quality): + discovered_count += 1 + var summary := _field_label( + "%d / %d collected" % [ + discovered_count, + FishQualityType.TIER_COUNT, + ], + DETAIL_OVERLAY_VALUE_FONT_SIZE, + ) + summary.horizontal_alignment = HORIZONTAL_ALIGNMENT_CENTER + summary.add_theme_color_override("font_color", UIPalette.MUTED_TEXT) + _portrait_overlay_quality.add_child(summary) + var quality_grid := GridContainer.new() + quality_grid.columns = 2 + quality_grid.add_theme_constant_override("h_separation", 44) + quality_grid.add_theme_constant_override("v_separation", 20) + _portrait_overlay_quality.add_child(quality_grid) + for quality: int in FishQualityType.TIER_COUNT: + var collected: bool = _collection_log.has_discovered_quality( + fish_id, + quality, + ) + var tier := HBoxContainer.new() + tier.custom_minimum_size.x = 250.0 + tier.add_theme_constant_override("separation", 12) + quality_grid.add_child(tier) + var quality_color: Color = UIPalette.get_quality_color(quality) + var dot := _field_label("●" if collected else "○", 34) + dot.add_theme_color_override("font_color", quality_color) + dot.modulate.a = 1.0 if collected else 0.55 + tier.add_child(dot) + var tier_label := _field_label( + FishQualityType.display_name(quality), + DETAIL_OVERLAY_VALUE_FONT_SIZE, + ) + tier_label.add_theme_color_override( + "font_color", + UIPalette.TEXT if collected else UIPalette.MUTED_TEXT, + ) + tier.add_child(tier_label) + + +func _populate_stats_overlay(section_text: String) -> void: + _clear_overlay_container(_portrait_overlay_stats) + for line: String in section_text.split("\n", false): + var separator_index: int = line.find(":") + if separator_index < 0: + continue + var field_name: String = line.left(separator_index).strip_edges() + var field_value: String = line.substr(separator_index + 1).strip_edges() + var field_label := _field_label( + field_name, + DETAIL_OVERLAY_FIELD_FONT_SIZE, + ) + field_label.custom_minimum_size.x = 210.0 + field_label.horizontal_alignment = HORIZONTAL_ALIGNMENT_RIGHT + field_label.add_theme_color_override( + "font_color", UIPalette.MUTED_TEXT + ) + _portrait_overlay_stats.add_child(field_label) + var value_label := _field_label( + field_value, + DETAIL_OVERLAY_VALUE_FONT_SIZE, + ) + value_label.custom_minimum_size.x = 280.0 + value_label.add_theme_color_override("font_color", UIPalette.TEXT) + _portrait_overlay_stats.add_child(value_label) + + +func _clear_overlay_container(container: Container) -> void: + for child: Node in container.get_children(): + container.remove_child(child) + child.queue_free() + + func _hide_portrait_overlay(restore_focus: bool = true) -> void: if _portrait_overlay == null or not _portrait_overlay.visible: return @@ -1467,9 +1609,27 @@ func _portrait_button_style(highlighted: bool) -> StyleBoxFlat: func _portrait_view_style() -> StyleBoxFlat: var style := StyleBoxFlat.new() - style.bg_color = Color("fff5dc") + style.bg_color = UIPalette.PANEL + style.border_color = UIPalette.PRIMARY + style.set_border_width_all(4) + style.set_corner_radius_all(24) + style.shadow_color = Color(0.0, 0.0, 0.0, 0.42) + style.shadow_size = 12 + return style + + +func _portrait_overlay_backdrop_style() -> StyleBoxFlat: + var style := StyleBoxFlat.new() + style.bg_color = Color(0.01, 0.045, 0.065, 0.82) style.set_border_width_all(0) - style.set_corner_radius_all(18) + return style + + +func _portrait_overlay_content_style() -> StyleBoxFlat: + var style := StyleBoxFlat.new() + style.bg_color = UIPalette.ELEVATED_PANEL + style.set_border_width_all(0) + style.set_corner_radius_all(16) return style