77 lines
2.0 KiB
GDScript3
Raw Normal View History

2026-04-13 11:34:00 -05:00
class_name EditorTubeChatControl extends Control
## @experimental: This class is used as part of the TubeClientDebugPanel scene and is part of a scene. Should not be used as itself.
const MESSAGE_ITEM_CONTROL_SCENE := preload("uid://cfsei3airwx4s")
@export var messages_container: EditorTubeMessagesContainer
@export var max_messages_amount: int = 100
var message_item_controls: Array[EditorTubeMessagesItemControl] = []
var message_item_button_group := ButtonGroup.new()
@onready var line_edit: LineEdit = %LineEdit
func _ready() -> void:
message_item_button_group.allow_unpress = true
func add_message_item_control(data) -> EditorTubeMessagesItemControl:
if max_messages_amount <= message_item_controls.size():
var item := message_item_controls.pop_front()
item.queue_free()
var message_item_control := MESSAGE_ITEM_CONTROL_SCENE.instantiate()
message_item_controls.append(message_item_control)
message_item_control.data = data
message_item_control.button_group = message_item_button_group
return message_item_control
func update():
if is_instance_valid(messages_container):
if messages_container.is_displaying_from(self):
messages_container.display_messages(
message_item_controls,
self
)
func send_chat_message(p_message: String):
add_message_item_control(p_message).sent()
update()
receive_chat_message.rpc(p_message)
line_edit.text = ""
@rpc("any_peer", "call_remote", "reliable")
func receive_chat_message(p_message: String):
var peer_id := multiplayer.get_remote_sender_id()
var item := add_message_item_control(p_message)
item.received(peer_id)
update()
func _on_send_button_pressed() -> void:
send_chat_message(line_edit.text)
func _on_line_edit_text_submitted(new_text: String) -> void:
send_chat_message(new_text)
func _on_visibility_changed() -> void:
if not is_visible_in_tree():
return
if is_instance_valid(messages_container):
if not messages_container.is_displaying_from(self):
messages_container.display_messages(
message_item_controls,
self
)