fix: polish logbook details

This commit is contained in:
Alexander Sellite 2026-08-19 00:07:24 -04:00
parent 09341dbd3d
commit 487688c145
2 changed files with 305 additions and 68 deletions

View file

@ -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

View file

@ -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