generated from krampus/template-godot4
77 lines
2.0 KiB
GDScript
77 lines
2.0 KiB
GDScript
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
|
|
)
|