Added resource table plugin
All checks were successful
Create tag and build when new code gets to main / BumpTag (push) Successful in 8s
Create tag and build when new code gets to main / Export (push) Successful in 1m13s

This commit is contained in:
2026-01-31 10:23:20 +01:00
parent cd150a4513
commit 158e18f1fe
182 changed files with 9266 additions and 1 deletions

View File

@@ -0,0 +1,167 @@
@tool
extends Node
const TablesPluginEditorViewClass := preload("res://addons/resources_spreadsheet_view/editor_view.gd")
const TablesPluginSelectionManagerClass := preload("res://addons/resources_spreadsheet_view/main_screen/selection_manager.gd")
const TextEditingUtilsClass := preload("res://addons/resources_spreadsheet_view/text_editing_utils.gd")
@onready var editor_view : TablesPluginEditorViewClass = get_parent()
@onready var selection : TablesPluginSelectionManagerClass = get_node("../SelectionManager")
func _on_cell_gui_input(event : InputEvent, cell_node : Control):
var cell := selection.get_cell_node_position(cell_node)
if event is InputEventMouseButton:
editor_view.grab_focus()
if event.button_index == MOUSE_BUTTON_RIGHT and event.pressed:
if !cell in selection.edited_cells:
selection.deselect_all_cells()
selection.select_cell(cell)
selection.rightclick_cells()
if event.button_index == MOUSE_BUTTON_LEFT and event.pressed:
if event.is_command_or_control_pressed():
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_RIGHT and event.is_pressed():
selection.rightclick_cells()
if event.button_index == MOUSE_BUTTON_LEFT:
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 or event.keycode == KEY_META:
# Modifier keys do not get processed.
return
# Ctrl + Z (before, and instead of, committing the action!)
if event.is_command_or_control_pressed():
if event.keycode == KEY_Z or event.keycode == KEY_Y:
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 : bool = event.is_command_or_control_pressed()
# BETWEEN-CELL NAVIGATION
var grid_move_offset := (10 if ctrl_pressed else 1)
if event.keycode == KEY_UP:
_move_selection_on_grid(0, -grid_move_offset)
elif event.keycode == KEY_DOWN:
_move_selection_on_grid(0, +grid_move_offset)
elif Input.is_key_pressed(KEY_SHIFT) and event.keycode == KEY_TAB:
_move_selection_on_grid(-grid_move_offset, 0)
elif event.keycode == KEY_TAB:
_move_selection_on_grid(+grid_move_offset, 0)
elif ctrl_pressed and event.keycode == KEY_C:
TextEditingUtilsClass.multi_copy(selection.edited_cells_text)
get_viewport().set_input_as_handled()
# Ctrl + V
elif ctrl_pressed and event.keycode == KEY_V and editor_view.columns[column] != "resource_path":
selection.clipboard_paste()
get_viewport().set_input_as_handled()
# TEXT CARET MOVEMENT
var caret_move_offset := TextEditingUtilsClass.get_caret_movement_from_key(event.keycode)
if TextEditingUtilsClass.multi_move_caret(caret_move_offset, selection.edited_cells_text, selection.edit_cursor_positions, ctrl_pressed):
selection.queue_redraw()
return
# 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
# ERASING
elif event.keycode == KEY_BACKSPACE:
editor_view.set_edited_cells_values_text(TextEditingUtilsClass.multi_erase_left(
selection.edited_cells_text, selection.edit_cursor_positions, ctrl_pressed
))
elif event.keycode == KEY_DELETE:
editor_view.set_edited_cells_values_text(TextEditingUtilsClass.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_text(TextEditingUtilsClass.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_text(TextEditingUtilsClass.multi_input(
char(event.unicode), selection.edited_cells_text, selection.edit_cursor_positions
))
selection.queue_redraw()
func _move_selection_on_grid(move_h : int, move_v : int):
var selected_cells := selection.edited_cells.duplicate()
var num_columns := editor_view.columns.size()
var num_rows := editor_view.rows.size()
var new_child_pos := Vector2i(0, 0)
for i in selected_cells.size():
new_child_pos = selected_cells[i]
for move_count in 1000:
if move_v != 0 and (new_child_pos.y + move_v >= num_rows or new_child_pos.y + move_v < 0):
break
new_child_pos.x += move_h
new_child_pos.y += move_v
if new_child_pos.x < 0:
new_child_pos.x = num_columns - 1
if new_child_pos.y > 0:
new_child_pos.y -= 1
if new_child_pos.x >= num_columns:
new_child_pos.x = 0
if new_child_pos.y < num_rows - 1:
new_child_pos.y += 1
if selection.get_cell_node_from_position(new_child_pos) == null:
break
if selection.get_cell_node_from_position(new_child_pos).is_visible_in_tree():
break
selected_cells[i] = new_child_pos
editor_view.grab_focus()
selection.deselect_all_cells()
selection.select_cells(selected_cells)