From 76676f53f5ef9ea23c2ee72f5cef19a665599122 Mon Sep 17 00:00:00 2001 From: teatov Date: Fri, 14 Feb 2025 01:05:40 +1000 Subject: [PATCH] make messages scroll to bottom on new messages --- scenes/ui/chat.tscn | 36 ++++++++++++++++++++++++++++-------- scripts/ui/chat.gd | 18 +++++++++++++++--- 2 files changed, 43 insertions(+), 11 deletions(-) diff --git a/scenes/ui/chat.tscn b/scenes/ui/chat.tscn index 2400564..d7d3e2f 100644 --- a/scenes/ui/chat.tscn +++ b/scenes/ui/chat.tscn @@ -5,10 +5,11 @@ [node name="Chat" type="CanvasLayer"] script = ExtResource("1_ulx3h") -[node name="Root" type="MarginContainer" parent="."] +[node name="MsgMargin" type="MarginContainer" parent="."] anchors_preset = 15 anchor_right = 1.0 anchor_bottom = 1.0 +offset_bottom = -70.0 grow_horizontal = 2 grow_vertical = 2 size_flags_horizontal = 3 @@ -17,20 +18,19 @@ mouse_filter = 2 theme_override_constants/margin_left = 50 theme_override_constants/margin_top = 20 theme_override_constants/margin_right = 50 -theme_override_constants/margin_bottom = 20 -[node name="VBox" type="VBoxContainer" parent="Root"] +[node name="MsgVBox" type="VBoxContainer" parent="MsgMargin"] layout_mode = 2 mouse_filter = 2 theme_override_constants/separation = 0 -[node name="MsgScroll" type="ScrollContainer" parent="Root/VBox"] +[node name="MsgScroll" type="ScrollContainer" parent="MsgMargin/MsgVBox"] layout_mode = 2 size_flags_vertical = 3 -mouse_filter = 2 +follow_focus = true horizontal_scroll_mode = 0 -[node name="MsgMargin" type="MarginContainer" parent="Root/VBox/MsgScroll"] +[node name="MsgMargin" type="MarginContainer" parent="MsgMargin/MsgVBox/MsgScroll"] layout_mode = 2 size_flags_horizontal = 3 size_flags_vertical = 3 @@ -39,13 +39,33 @@ theme_override_constants/margin_left = 10 theme_override_constants/margin_right = 10 theme_override_constants/margin_bottom = 30 -[node name="MsgContainer" type="VBoxContainer" parent="Root/VBox/MsgScroll/MsgMargin"] +[node name="MsgContainer" type="VBoxContainer" parent="MsgMargin/MsgVBox/MsgScroll/MsgMargin"] layout_mode = 2 size_flags_horizontal = 3 size_flags_vertical = 3 mouse_filter = 2 alignment = 2 -[node name="MessageEdit" type="LineEdit" parent="Root/VBox"] +[node name="EditMargin" type="MarginContainer" parent="."] +anchors_preset = 15 +anchor_right = 1.0 +anchor_bottom = 1.0 +offset_top = 1016.0 +grow_horizontal = 2 +grow_vertical = 2 +size_flags_horizontal = 3 +size_flags_vertical = 3 +mouse_filter = 2 +theme_override_constants/margin_left = 50 +theme_override_constants/margin_right = 50 +theme_override_constants/margin_bottom = 20 + +[node name="EditVBox" type="VBoxContainer" parent="EditMargin"] +layout_mode = 2 +mouse_filter = 2 +theme_override_constants/separation = 0 +alignment = 2 + +[node name="MessageEdit" type="LineEdit" parent="EditMargin/EditVBox"] layout_mode = 2 theme_override_font_sizes/font_size = 26 diff --git a/scripts/ui/chat.gd b/scripts/ui/chat.gd index db71c77..fb1b80f 100644 --- a/scripts/ui/chat.gd +++ b/scripts/ui/chat.gd @@ -5,13 +5,17 @@ var open: bool = false var _chat_message_scene := preload("res://scenes/ui/chat_message.tscn") -@onready var _messages_container: Container = $Root/VBox/MsgScroll/MsgMargin/MsgContainer -@onready var _message_edit: LineEdit = $Root/VBox/MessageEdit +@onready var _msg_scroll: ScrollContainer = $MsgMargin/MsgVBox/MsgScroll +@onready +var _msg_container: Container = $MsgMargin/MsgVBox/MsgScroll/MsgMargin/MsgContainer +@onready var _msg_margin: Container = $MsgMargin/MsgVBox/MsgScroll/MsgMargin +@onready var _message_edit: LineEdit = $EditMargin/EditVBox/MessageEdit func _ready() -> void: _message_edit.text_submitted.connect(_on_message_edit_text_submitted) _message_edit.visible = false + _msg_margin.minimum_size_changed.connect(_on_message_margin_minimum_size_changed) Referencer.chat = self @@ -48,7 +52,7 @@ func _send_message(message: String) -> void: Networker.players[multiplayer.get_remote_sender_id()]["name"] as String ) var message_node := _make_message_node(player_name, message) - _messages_container.add_child(message_node) + _msg_container.add_child(message_node) print(player_name + ": " + message) @@ -60,5 +64,13 @@ func _make_message_node(player_name: String, message: String) -> RichTextLabel: func _on_message_edit_text_submitted(message: String) -> void: + if _message_edit.text == "": + return _message_edit.text = "" _send_message.rpc(message) + + +func _on_message_margin_minimum_size_changed() -> void: + _msg_scroll.set_deferred( + "scroll_vertical", int(_msg_scroll.get_v_scroll_bar().max_value) + 100 + )