You cannot select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
	
	
		
			164 lines
		
	
	
		
			5.3 KiB
		
	
	
	
		
			GDScript
		
	
		
		
			
		
	
	
			164 lines
		
	
	
		
			5.3 KiB
		
	
	
	
		
			GDScript
		
	
| 
								 
											2 years ago
										 
									 | 
							
								@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 : Control):
							 | 
						||
| 
								 | 
							
									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 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_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:
							 | 
						||
| 
								 | 
							
										# 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 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 := 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)
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									# CURSOR MOVEMENT
							 | 
						||
| 
								 | 
							
									if event.keycode == KEY_LEFT:
							 | 
						||
| 
								 | 
							
										TextEditingUtilsClass.multi_move_left(
							 | 
						||
| 
								 | 
							
											selection.edited_cells_text, selection.edit_cursor_positions, ctrl_pressed
							 | 
						||
| 
								 | 
							
										)
							 | 
						||
| 
								 | 
							
									
							 | 
						||
| 
								 | 
							
									elif event.keycode == KEY_RIGHT:
							 | 
						||
| 
								 | 
							
										TextEditingUtilsClass.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:
							 | 
						||
| 
								 | 
							
										TextEditingUtilsClass.multi_copy(selection.edited_cells_text)
							 | 
						||
| 
								 | 
							
										get_viewport().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(TextEditingUtilsClass.multi_paste(
							 | 
						||
| 
								 | 
							
											selection.edited_cells_text, selection.edit_cursor_positions
							 | 
						||
| 
								 | 
							
										))
							 | 
						||
| 
								 | 
							
										get_viewport().set_input_as_handled()
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									# ERASING
							 | 
						||
| 
								 | 
							
									elif event.keycode == KEY_BACKSPACE:
							 | 
						||
| 
								 | 
							
										editor_view.set_edited_cells_values(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(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(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(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 child_count := editor_view.node_table_root.get_child_count()
							 | 
						||
| 
								 | 
							
									var new_child_index := 0
							 | 
						||
| 
								 | 
							
									for i in selected_cells.size():
							 | 
						||
| 
								 | 
							
										new_child_index = (
							 | 
						||
| 
								 | 
							
											selected_cells[i].get_index()
							 | 
						||
| 
								 | 
							
											+ move_h
							 | 
						||
| 
								 | 
							
											+ move_v * editor_view.columns.size()
							 | 
						||
| 
								 | 
							
										)
							 | 
						||
| 
								 | 
							
										if child_count < new_child_index: continue
							 | 
						||
| 
								 | 
							
										selected_cells[i] = editor_view.node_table_root.get_child(new_child_index)
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									editor_view.grab_focus()
							 | 
						||
| 
								 | 
							
									selection.deselect_all_cells()
							 | 
						||
| 
								 | 
							
									selection.select_cells(selected_cells)
							 |