WIP: create chat-messages from resources, calculate chat message size

This commit is contained in:
betalars 2025-05-26 17:44:11 +02:00
parent ccd36d0d59
commit 5755b65545
2 changed files with 46 additions and 10 deletions

View File

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

View File

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