diary/user_interface/chat_panel/message_editable.gd
mono 7d285bd607 - reworked Chat Panel system
- added user switching
- added Topic Panel functionality (features are missing)
- some basic refactoring
2022-05-14 20:51:48 +02:00

159 lines
3.9 KiB
GDScript

extends EditableTextBlock
class_name MessageEditable
const BUBBLE_BY_CURRENT = preload("res://user_interface/chat_panel/bubble_by_current.png")
const BUBBLE_BY_INACTIVE = preload("res://user_interface/chat_panel/bubble_by_inactive.png")
const FOLLOW_UP_BUBBLE_BY_CURRENT = preload("res://user_interface/chat_panel/follow_up_bubble_by_current.png")
const FOLLOW_UP_BUBBLE_BY_INACTIVE = preload("res://user_interface/chat_panel/follow_up_bubble_by_inactive.png")
onready var message_inserted_sound = get_node("MessageInsertedSound")
var associated_message
var follow_up: bool = false
# If the node was spawned by PingSystem.
var insert_mode: bool = false
var ping_id: int = -1
func get_user() -> User:
return associated_message.get_user()
func _get_content_string() -> String: # Override.
return associated_message.content
func _setup(): # Override.
if _get_content_string().empty():
_setup_insert_mode()
else:
_setup_content()
_setup_appearance()
func _setup_insert_mode():
# warning-ignore:return_value_discarded
PingSystem.connect("ping_handled", self, "_on_ping_handled")
ping_id = PingSystem.total_ping_count
# warning-ignore:return_value_discarded
_check_if_next_ping()
insert_mode = true
var is_multiline = (randi() % 100) < 20
if is_multiline:
text_edit.min_width = 488
text_edit.min_height = 18 * (randi() % 2 + 2) + 19
else:
text_edit.min_width = randi() % 440 + 48
text_edit.min_height = 0
_enable_edit_mode()
func _setup_popup_menu_items(): # Override.
if associated_message.get_user() == Users.get_current():
popup_menu.add_item("Edit", 0)
popup_menu.add_item("Copy", 1)
popup_menu.add_item("Delete", 2)
else:
popup_menu.add_item("Copy", 1)
func _adjust_appearance_to_user(): # Override.
if get_user().is_current():
_set_appearance_to_style_current()
else:
_set_appearance_to_style_inactive()
func _set_appearance_to_style_current():
if follow_up:
nine_patch.texture = FOLLOW_UP_BUBBLE_BY_CURRENT
else:
nine_patch.texture = BUBBLE_BY_CURRENT
nine_patch.patch_margin_left = 12
nine_patch.patch_margin_right = 21
margin_container.add_constant_override("margin_left", 8)
margin_container.add_constant_override("margin_right", 17)
size_flags_horizontal = SIZE_SHRINK_END
nine_patch.self_modulate = get_user().own_message_color
func _set_appearance_to_style_inactive():
if follow_up:
nine_patch.texture = FOLLOW_UP_BUBBLE_BY_INACTIVE
else:
nine_patch.texture = BUBBLE_BY_INACTIVE
nine_patch.patch_margin_left = 21
nine_patch.patch_margin_right = 12
margin_container.add_constant_override("margin_left", 17)
margin_container.add_constant_override("margin_right", 8)
size_flags_horizontal = 0
nine_patch.self_modulate = Users.get_current().others_message_color
func _check_if_next_ping() -> bool:
if ping_id == PingSystem.current_ping_id:
text_edit.readonly = false
text_edit.placeholder = "Insert Message"
return true
else:
text_edit.readonly = true
return false
func _post_enable_edit_mode(): # Override.
if !insert_mode:
text_edit.grab_focus()
text_edit.confirm_on_focus_exit = true
func _post_disable_edit_mode(): # Override.
if insert_mode:
_disable_insert_mode()
func _disable_insert_mode():
insert_mode = false
text_edit.min_width = 0
text_edit.min_height = 0
PingSystem.disconnect("ping_handled", self, "_on_ping_handled")
PingSystem.emit_signal("ping_handled")
message_inserted_sound.play()
func _delete():
associated_message.delete()
func _on_popup_menu_id_pressed(id):
match id:
0: # Edit.
_enable_edit_mode()
1: # Copy.
OS.clipboard = associated_message.content
2: # Delete.
_delete()
func _on_text_edit_confirmed(confirmed_content): # Override
var test_string = confirmed_content.strip_edges()
if test_string.empty():
if not insert_mode:
_delete()
else:
associated_message.content = confirmed_content
_disable_edit_mode()
func _on_ping_handled():
if _check_if_next_ping():
text_edit.grab_focus()