From 5755b65545e0f5cbb883cf2b144fd7f6c44004ed Mon Sep 17 00:00:00 2001 From: betalars Date: Mon, 26 May 2025 17:44:11 +0200 Subject: [PATCH] WIP: create chat-messages from resources, calculate chat message size --- .../chat_view/chat-view-protoyping.tscn | 29 ++++++++++++------- src/logic-scenes/chat_view/chat-view.gd | 27 +++++++++++++++++ 2 files changed, 46 insertions(+), 10 deletions(-) diff --git a/src/logic-scenes/chat_view/chat-view-protoyping.tscn b/src/logic-scenes/chat_view/chat-view-protoyping.tscn index d6b491f..e6c50c6 100644 --- a/src/logic-scenes/chat_view/chat-view-protoyping.tscn +++ b/src/logic-scenes/chat_view/chat-view-protoyping.tscn @@ -59,25 +59,35 @@ theme = SubResource("Theme_w8y7q") layout_mode = 0 offset_right = 582.0 offset_bottom = 1082.0 +theme = SubResource("Theme_w8y7q") script = ExtResource("4_n65mw") messages = Array[ExtResource("5_1hd2w")]([SubResource("Resource_iwd5k"), SubResource("Resource_1hd2w"), SubResource("Resource_w8y7q")]) -[node name="VBoxContainer" type="VBoxContainer" parent="ScrollContainer"] +[node name="Template" type="ScrollContainer" parent="."] +layout_mode = 2 +offset_left = 1061.0 +offset_top = 78.0 +offset_right = 1643.0 +offset_bottom = 702.0 + +[node name="VBoxContainer" type="VBoxContainer" parent="Template"] layout_mode = 2 size_flags_horizontal = 3 -[node name="RichTextLabel2" type="RichTextLabel" parent="ScrollContainer/VBoxContainer"] +[node name="RichTextLabel2" type="RichTextLabel" parent="Template/VBoxContainer"] layout_mode = 2 size_flags_horizontal = 0 theme = SubResource("Theme_w8y7q") bbcode_enabled = true -text = "Dies ist eine Telegram-Message +text = "Dies ist eine Telegram-Message. +Ich schreibe mal etwas länger, ob zu sehen, +ob der Bums irgendwann umbricht. [i]8:12 PM[/i]" fit_content = true scroll_active = false autowrap_mode = 0 -[node name="RichTextLabel3" type="RichTextLabel" parent="ScrollContainer/VBoxContainer"] +[node name="RichTextLabel3" type="RichTextLabel" parent="Template/VBoxContainer"] layout_mode = 2 theme = SubResource("Theme_w8y7q") bbcode_enabled = true @@ -85,7 +95,7 @@ text = "Dies ist eine Telegram-Message [i]8:12 PM[/i]" fit_content = true -[node name="RichTextLabel4" type="RichTextLabel" parent="ScrollContainer/VBoxContainer"] +[node name="RichTextLabel4" type="RichTextLabel" parent="Template/VBoxContainer"] layout_mode = 2 theme = SubResource("Theme_w8y7q") bbcode_enabled = true @@ -93,7 +103,7 @@ text = "Dies ist eine Telegram-Message [i]8:12 PM[/i]" fit_content = true -[node name="RichTextLabel5" type="RichTextLabel" parent="ScrollContainer/VBoxContainer"] +[node name="RichTextLabel5" type="RichTextLabel" parent="Template/VBoxContainer"] layout_mode = 2 theme = SubResource("Theme_w8y7q") bbcode_enabled = true @@ -102,7 +112,7 @@ text = "Dies ist eine Telegram-Message fit_content = true horizontal_alignment = 2 -[node name="RichTextLabel6" type="RichTextLabel" parent="ScrollContainer/VBoxContainer"] +[node name="RichTextLabel6" type="RichTextLabel" parent="Template/VBoxContainer"] layout_mode = 2 theme = SubResource("Theme_w8y7q") bbcode_enabled = true @@ -110,12 +120,11 @@ text = "Dies ist eine Telegram-Message [i]8:12 PM[/i]" fit_content = true -[node name="RichTextLabel" type="RichTextLabel" parent="ScrollContainer/VBoxContainer"] +[node name="RichTextLabel" type="RichTextLabel" parent="Template/VBoxContainer"] layout_mode = 2 size_flags_horizontal = 3 theme = SubResource("Theme_w8y7q") bbcode_enabled = true -text = "[] [] [] [] [] -Dies ist eine Telegram-Message, die deutlich länger ist, als die vorherige, um das mal abzuschätzen. +text = "Dies ist eine Telegram-Message, die deutlich länger ist, als die vorherige, um das mal abzuschätzen. [i]8:12 PM[/i]" fit_content = true diff --git a/src/logic-scenes/chat_view/chat-view.gd b/src/logic-scenes/chat_view/chat-view.gd index 1fa7ffb..8cef447 100644 --- a/src/logic-scenes/chat_view/chat-view.gd +++ b/src/logic-scenes/chat_view/chat-view.gd @@ -2,3 +2,30 @@ class_name ChatView extends ScrollContainer @export var messages: Array[ChatMessage] + +var v_box: VBoxContainer + +func _ready() -> void: + v_box = VBoxContainer.new() + add_child(v_box, false, Node.INTERNAL_MODE_BACK) + rebuild() + +func rebuild(): + for child in v_box.get_children(): + child.free() + + var text_server: = TextServerManager.get_primary_interface() + + for message in messages: + var shaped_tex: RID = text_server.create_shaped_text(TextServer.DIRECTION_AUTO, TextServer.ORIENTATION_HORIZONTAL) + text_server.shaped_text_add_string(shaped_tex, message.text, [theme.default_font.get_rid()], theme.default_base_scale) + + text_server.shaped_text_fit_to_width(shaped_tex, size.x) + + var label: = RichTextLabel.new() + label.custom_minimum_size = text_server.shaped_text_get_size(shaped_tex) + Vector2( 16, 16 ) + + label.text = message.text + label.size_flags_horizontal = Control.SIZE_SHRINK_END if message.is_own_message else Control.SIZE_SHRINK_BEGIN + + v_box.add_child(label)