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 match edit_mode: EditMode.LINE_EDIT: line_edit.grab_focus() EditMode.TEXT_EDIT: text_edit.grab_focus() 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: __stored_ui_actions[&"ui_up"] = InputMap.action_get_events(&"ui_up") InputMap.action_erase_events(&"ui_up") __stored_ui_actions[&"ui_down"] = InputMap.action_get_events(&"ui_down") InputMap.action_erase_events(&"ui_down") __stored_ui_actions[&"ui_left"] = InputMap.action_get_events(&"ui_left") InputMap.action_erase_events(&"ui_left") __stored_ui_actions[&"ui_right"] = InputMap.action_get_events(&"ui_right") InputMap.action_erase_events(&"ui_right") 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") for event:InputEvent in __stored_ui_actions[&"ui_right"]: InputMap.action_add_event(&"ui_right", event) for event:InputEvent in __stored_ui_actions[&"ui_left"]: InputMap.action_add_event(&"ui_left", event) for event:InputEvent in __stored_ui_actions[&"ui_down"]: InputMap.action_add_event(&"ui_down", event) for event:InputEvent in __stored_ui_actions[&"ui_up"]: InputMap.action_add_event(&"ui_up", 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 if text_edit: text_edit.visible = false EditMode.TEXT_EDIT: if line_edit: line_edit.visible = false if text_edit: text_edit.visible = true func __set_text(t:String) -> void: match edit_mode: EditMode.LINE_EDIT: line_edit.text = t line_edit.caret_column = t.length() 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()) func __get_text() -> String: match edit_mode: EditMode.LINE_EDIT: return line_edit.text EditMode.TEXT_EDIT: return text_edit.text return text