161 lines
5.2 KiB
GDScript
161 lines
5.2 KiB
GDScript
class_name ControllerInputWheelTextEdit
|
|
extends Control
|
|
|
|
enum EditMode { LINE_EDIT, TEXT_EDIT }
|
|
|
|
@onready var line_edit : LineEdit = $VBoxContainer/LineEdit
|
|
@onready var text_edit : TextEdit = $VBoxContainer/TextEdit
|
|
|
|
@export_enum("LineEdit", "TextEdit") var edit_mode : int = EditMode.LINE_EDIT : set = __set_mode
|
|
@export var text : String : set = __set_text, get = __get_text
|
|
|
|
@export_group("Inputs")
|
|
@export_subgroup("Joypad", "joypad_")
|
|
@export var joypad_exit : InputEventJoypadButton
|
|
|
|
var __stored_ui_actions : Dictionary = {}
|
|
|
|
|
|
func _enter_tree() -> void:
|
|
__configure_inputs()
|
|
|
|
func _ready() -> void:
|
|
match edit_mode:
|
|
EditMode.LINE_EDIT:
|
|
line_edit.visible = true
|
|
text_edit.visible = false
|
|
line_edit.grab_focus()
|
|
EditMode.TEXT_EDIT:
|
|
line_edit.visible = false
|
|
text_edit.visible = true
|
|
text_edit.grab_focus()
|
|
|
|
func _input(event:InputEvent) -> void:
|
|
if event.is_action_pressed(&"ui_exit_text_editor"):
|
|
queue_free()
|
|
return
|
|
|
|
func _exit_tree() -> void:
|
|
__deconfigure_inputs()
|
|
|
|
|
|
func _on_controller_input_wheel_new_character(char:String) -> void:
|
|
match edit_mode:
|
|
EditMode.LINE_EDIT: line_edit.insert_text_at_caret(char)
|
|
EditMode.TEXT_EDIT: text_edit.insert_text_at_caret(char)
|
|
|
|
func _on_controller_input_wheel_backspace() -> void:
|
|
match edit_mode:
|
|
EditMode.LINE_EDIT:
|
|
if line_edit.caret_column > 0:
|
|
line_edit.delete_text(line_edit.caret_column - 1, line_edit.caret_column)
|
|
EditMode.TEXT_EDIT:
|
|
text_edit.backspace()
|
|
|
|
func _on_controller_input_wheel_delete() -> void:
|
|
match edit_mode:
|
|
EditMode.LINE_EDIT:
|
|
if line_edit.caret_column < line_edit.text.length():
|
|
line_edit.delete_text(line_edit.caret_column, line_edit.caret_column + 1)
|
|
EditMode.TEXT_EDIT:
|
|
text_edit.begin_complex_operation()
|
|
text_edit.start_action(TextEdit.EditAction.ACTION_DELETE)
|
|
var caret_line : int = text_edit.get_caret_line()
|
|
var caret_column : int = text_edit.get_caret_column()
|
|
var current_line_length : int = text_edit.get_line(caret_line).length()
|
|
var next_line : int = caret_line if caret_column < current_line_length else caret_line + 1;
|
|
var next_column : int = (caret_column + 1) if caret_column < current_line_length else 0;
|
|
if next_line < text_edit.get_line_count() or next_column > current_line_length:
|
|
text_edit.remove_text(caret_line, caret_column, next_line, next_column)
|
|
text_edit.end_action()
|
|
text_edit.end_complex_operation()
|
|
text_edit.set_caret_column(caret_column)
|
|
|
|
func _on_controller_input_wheel_move_caret_up() -> void:
|
|
match edit_mode:
|
|
EditMode.TEXT_EDIT: text_edit.set_caret_line(clamp(text_edit.get_caret_line() - 1, 0, text_edit.get_line_count() - 1))
|
|
|
|
func _on_controller_input_wheel_move_caret_down() -> void:
|
|
match edit_mode:
|
|
EditMode.TEXT_EDIT: text_edit.set_caret_line(clamp(text_edit.get_caret_line() + 1, 0, text_edit.get_line_count() - 1))
|
|
|
|
func _on_controller_input_wheel_move_caret_left() -> void:
|
|
match edit_mode:
|
|
EditMode.LINE_EDIT: line_edit.caret_column = line_edit.caret_column - 1
|
|
EditMode.TEXT_EDIT: text_edit.set_caret_column(text_edit.get_caret_column() - 1)
|
|
|
|
func _on_controller_input_wheel_move_caret_right() -> void:
|
|
match edit_mode:
|
|
EditMode.LINE_EDIT: line_edit.caret_column = line_edit.caret_column + 1
|
|
EditMode.TEXT_EDIT: text_edit.set_caret_column(text_edit.get_caret_column() + 1)
|
|
|
|
|
|
func __configure_inputs() -> void:
|
|
__stash_ui_action(&"ui_up")
|
|
__stash_ui_action(&"ui_down")
|
|
__stash_ui_action(&"ui_left")
|
|
__stash_ui_action(&"ui_right")
|
|
__stash_ui_action(&"ui_focus_next")
|
|
__stash_ui_action(&"ui_focus_prev")
|
|
__stash_ui_action(&"ui_select")
|
|
__stash_ui_action(&"ui_cancel")
|
|
|
|
InputMap.add_action(&"ui_exit_text_editor")
|
|
InputMap.action_add_event(&"ui_exit_text_editor", joypad_exit)
|
|
|
|
func __deconfigure_inputs() -> void:
|
|
InputMap.action_erase_event(&"ui_exit_text_editor", joypad_exit)
|
|
InputMap.erase_action(&"ui_exit_text_editor")
|
|
|
|
__restore_ui_action(&"ui_cancel")
|
|
__restore_ui_action(&"ui_select")
|
|
__restore_ui_action(&"ui_focus_prev")
|
|
__restore_ui_action(&"ui_focus_next")
|
|
__restore_ui_action(&"ui_right")
|
|
__restore_ui_action(&"ui_left")
|
|
__restore_ui_action(&"ui_down")
|
|
__restore_ui_action(&"ui_up")
|
|
|
|
func __stash_ui_action(action:StringName):
|
|
__stored_ui_actions[action] = InputMap.action_get_events(action)
|
|
InputMap.action_erase_events(action)
|
|
|
|
func __restore_ui_action(action:StringName):
|
|
for event:InputEvent in __stored_ui_actions[action]:
|
|
InputMap.action_add_event(action, event)
|
|
|
|
|
|
func __set_mode(new_mode:int) -> void:
|
|
edit_mode = new_mode
|
|
match edit_mode:
|
|
EditMode.LINE_EDIT:
|
|
if line_edit:
|
|
line_edit.visible = true
|
|
line_edit.grab_focus()
|
|
if text_edit:
|
|
text_edit.visible = false
|
|
EditMode.TEXT_EDIT:
|
|
if line_edit:
|
|
line_edit.visible = false
|
|
if text_edit:
|
|
text_edit.visible = true
|
|
text_edit.grab_focus()
|
|
|
|
func __set_text(t:String) -> void:
|
|
match edit_mode:
|
|
EditMode.LINE_EDIT:
|
|
line_edit.text = t
|
|
line_edit.caret_column = t.length()
|
|
line_edit.grab_focus()
|
|
EditMode.TEXT_EDIT:
|
|
text_edit.text = t
|
|
text_edit.set_caret_line(text_edit.get_line_count()-1)
|
|
text_edit.set_caret_column(text_edit.get_line(text_edit.get_line_count()-1).length())
|
|
text_edit.grab_focus()
|
|
|
|
func __get_text() -> String:
|
|
match edit_mode:
|
|
EditMode.LINE_EDIT: return line_edit.text
|
|
EditMode.TEXT_EDIT: return text_edit.text
|
|
return text
|