From 6ad1c8255fe73a77ecfca00d8770d2bf7afd183d Mon Sep 17 00:00:00 2001 From: Jeroen Schweitzer Date: Sun, 5 Apr 2026 10:51:25 +0200 Subject: [PATCH] fix(ui): implant panel width constraint and text wrapping Panel now clips content and constrains children to its width. Components set autowrap and SIZE_FLAGS_FILL so text wraps within the panel instead of overflowing. Bold markdown markers stripped in ImplantTextBlock constructor. Co-Authored-By: Claude Opus 4.6 (1M context) --- client/ui/implant/implant_data_row.gd | 2 ++ client/ui/implant/implant_header.gd | 3 +++ client/ui/implant/implant_panel.gd | 4 ++++ client/ui/implant/implant_text_block.gd | 7 ++----- client/ui/star_map.gd | 1 + 5 files changed, 12 insertions(+), 5 deletions(-) diff --git a/client/ui/implant/implant_data_row.gd b/client/ui/implant/implant_data_row.gd index d04371194..120a02ab3 100644 --- a/client/ui/implant/implant_data_row.gd +++ b/client/ui/implant/implant_data_row.gd @@ -10,6 +10,8 @@ func _init(text: String = "", color: Color = Color.TRANSPARENT) -> void: self.text = text _color_override = color mouse_filter = Control.MOUSE_FILTER_IGNORE + autowrap_mode = TextServer.AUTOWRAP_WORD_SMART + size_flags_horizontal = Control.SIZE_FLAGS_FILL func set_content(text_value: String, color: Color = Color.TRANSPARENT) -> void: diff --git a/client/ui/implant/implant_header.gd b/client/ui/implant/implant_header.gd index 03144b5ed..60119f1a1 100644 --- a/client/ui/implant/implant_header.gd +++ b/client/ui/implant/implant_header.gd @@ -19,6 +19,9 @@ func _init(title: String = "", subtitle: String = "") -> void: func _ready() -> void: add_theme_constant_override("separation", 0) + size_flags_horizontal = Control.SIZE_FLAGS_FILL + _title_label.autowrap_mode = TextServer.AUTOWRAP_WORD_SMART + _subtitle_label.autowrap_mode = TextServer.AUTOWRAP_WORD_SMART add_child(_title_label) add_child(_subtitle_label) diff --git a/client/ui/implant/implant_panel.gd b/client/ui/implant/implant_panel.gd index 6f14e1354..72b8a6e27 100644 --- a/client/ui/implant/implant_panel.gd +++ b/client/ui/implant/implant_panel.gd @@ -14,6 +14,10 @@ var _vbox: VBoxContainer func _ready() -> void: + # Constrain panel to its custom_minimum_size width + size_flags_horizontal = Control.SIZE_FLAGS_SHRINK_END + clip_contents = true + _vbox = VBoxContainer.new() _vbox.name = "Content" add_child(_vbox) diff --git a/client/ui/implant/implant_text_block.gd b/client/ui/implant/implant_text_block.gd index a9227fd4a..21b5df62e 100644 --- a/client/ui/implant/implant_text_block.gd +++ b/client/ui/implant/implant_text_block.gd @@ -9,16 +9,13 @@ var _text_alpha: float = 0.75 func _init(content: String = "", max_lines: int = -1) -> void: _max_lines = max_lines - text = content + text = content.replace("**", "") # strip markdown bold bbcode_enabled = false fit_content = true scroll_active = false mouse_filter = Control.MOUSE_FILTER_IGNORE autowrap_mode = TextServer.AUTOWRAP_WORD_SMART - if max_lines > 0: - visible_characters_behavior = TextServer.VC_GLYPHS_LTR - # Godot 4 RichTextLabel doesn't have max_lines directly — - # we limit via visible_ratio or custom_minimum_size after layout. + size_flags_horizontal = Control.SIZE_FLAGS_FILL func set_content(content: String, max_lines: int = -1) -> void: diff --git a/client/ui/star_map.gd b/client/ui/star_map.gd index 61ba2c857..93bf08e3b 100644 --- a/client/ui/star_map.gd +++ b/client/ui/star_map.gd @@ -113,6 +113,7 @@ func _ready() -> void: _info_panel.name = "InfoPanel" _info_panel.theme_resource = _implant_theme _info_panel.custom_minimum_size.x = POPUP_WIDTH + _info_panel.size.x = POPUP_WIDTH _info_panel.visible = false _info_panel.mouse_filter = Control.MOUSE_FILTER_IGNORE add_child(_info_panel)