godot-resources-as-sheets-p.../addons/resources_spreadsheet_view/main_screen/input_handler.gd
2023-01-24 12:58:13 +02:00

178 lines
5.3 KiB
GDScript

@tool
extends Node
const EditorView = preload("res://addons/resources_spreadsheet_view/editor_view.gd")
const SelectionManager = preload("res://addons/resources_spreadsheet_view/main_screen/selection_manager.gd")
@onready var editor_view : EditorView = get_parent()
@onready var selection : SelectionManager = get_node("../SelectionManager")
func _on_cell_gui_input(event : InputEvent, cell : Control):
if event is InputEventMouseButton:
editor_view.grab_focus()
if event.button_index != MOUSE_BUTTON_LEFT:
if event.button_index == MOUSE_BUTTON_RIGHT && event.is_pressed():
if !cell in selection.edited_cells:
selection.deselect_all_cells()
selection.select_cell(cell)
selection.rightclick_cells()
return
if event.pressed:
if Input.is_key_pressed(KEY_CTRL):
if cell in selection.edited_cells:
selection.deselect_cell(cell)
else:
selection.select_cell(cell)
elif Input.is_key_pressed(KEY_SHIFT):
selection.select_cells_to(cell)
else:
selection.deselect_all_cells()
selection.select_cell(cell)
func _gui_input(event : InputEvent):
if event is InputEventMouseButton:
if event.button_index != MOUSE_BUTTON_LEFT:
if event.button_index == MOUSE_BUTTON_RIGHT && event.is_pressed():
editor_view.cells_context.emit(selection.edited_cells)
return
editor_view.grab_focus()
if !event.pressed:
selection.deselect_all_cells()
func _input(event : InputEvent):
if !event is InputEventKey or !event.pressed:
return
if !editor_view.has_focus() or selection.edited_cells.size() == 0:
return
if event.keycode == KEY_CTRL or event.keycode == KEY_SHIFT:
# Modifier keys do not get processed.
return
# Ctrl + Z (before, and instead of, committing the action!)
if Input.is_key_pressed(KEY_CTRL):
if event.keycode == KEY_Z:
if Input.is_key_pressed(KEY_SHIFT):
editor_view.editor_plugin.undo_redo.redo()
# Ctrl + z (smol)
else:
editor_view.editor_plugin.undo_redo.undo()
return
# This shortcut is used by Godot as well.
if event.keycode == KEY_Y:
editor_view.editor_plugin.undo_redo.redo()
return
_key_specific_action(event)
editor_view.grab_focus()
editor_view.editor_interface.get_resource_filesystem().scan()
func _key_specific_action(event : InputEvent):
var column = selection.get_cell_column(selection.edited_cells[0])
var ctrl_pressed := Input.is_key_pressed(KEY_CTRL)
# BETWEEN-CELL NAVIGATION
if event.keycode == KEY_UP:
_move_selection_on_grid(0, (-1 if !ctrl_pressed else -10))
elif event.keycode == KEY_DOWN:
_move_selection_on_grid(0, (1 if !ctrl_pressed else 10))
elif Input.is_key_pressed(KEY_SHIFT) and event.keycode == KEY_TAB:
_move_selection_on_grid((-1 if !ctrl_pressed else -10), 0)
elif event.keycode == KEY_TAB:
_move_selection_on_grid((1 if !ctrl_pressed else 10), 0)
# Non-text and paths can't be edited.
if editor_view.columns[column] == "resource_path":
return
if !selection.column_editors[column].is_text():
return
# CURSOR MOVEMENT
if event.keycode == KEY_LEFT:
TextEditingUtils.multi_move_left(
selection.edited_cells_text, selection.edit_cursor_positions, ctrl_pressed
)
elif event.keycode == KEY_RIGHT:
TextEditingUtils.multi_move_right(
selection.edited_cells_text, selection.edit_cursor_positions, ctrl_pressed
)
elif event.keycode == KEY_HOME:
for i in selection.edit_cursor_positions.size():
selection.edit_cursor_positions[i] = 0
elif event.keycode == KEY_END:
for i in selection.edit_cursor_positions.size():
selection.edit_cursor_positions[i] = selection.edited_cells_text[i].length()
# Ctrl + C (so you can edit in a proper text editor instead of this wacky nonsense)
elif ctrl_pressed and event.keycode == KEY_C:
TextEditingUtils.multi_copy(selection.edited_cells_text)
get_tree().set_input_as_handled()
# The following actions do not work on non-editable cells.
if !selection.column_editors[column].is_text() or editor_view.columns[column] == "resource_path":
return
# Ctrl + V
elif ctrl_pressed and event.keycode == KEY_V:
editor_view.set_edited_cells_values(TextEditingUtils.multi_paste(
selection.edited_cells_text, selection.edit_cursor_positions
))
get_tree().set_input_as_handled()
# ERASING
elif event.keycode == KEY_BACKSPACE:
editor_view.set_edited_cells_values(TextEditingUtils.multi_erase_left(
selection.edited_cells_text, selection.edit_cursor_positions, ctrl_pressed
))
elif event.keycode == KEY_DELETE:
editor_view.set_edited_cells_values(TextEditingUtils.multi_erase_right(
selection.edited_cells_text, selection.edit_cursor_positions, ctrl_pressed
))
get_viewport().set_input_as_handled()
# And finally, text typing.
elif event.keycode == KEY_ENTER:
editor_view.set_edited_cells_values(TextEditingUtils.multi_input(
"\n", selection.edited_cells_text, selection.edit_cursor_positions
))
elif event.unicode != 0 and event.unicode != 127:
editor_view.set_edited_cells_values(TextEditingUtils.multi_input(
char(event.unicode), selection.edited_cells_text, selection.edit_cursor_positions
))
func _move_selection_on_grid(move_h : int, move_v : int):
var cell = selection.edited_cells[0]
editor_view.grab_focus()
selection.deselect_all_cells()
selection.select_cell(
editor_view.node_table_root.get_child(
cell.get_index()
+ move_h + move_v * editor_view.columns.size()
)
)