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.
		
		
		
		
		
			
		
			
	
	
		
			191 lines
		
	
	
		
			4.4 KiB
		
	
	
	
		
			GDScript
		
	
		
		
			
		
	
	
			191 lines
		
	
	
		
			4.4 KiB
		
	
	
	
		
			GDScript
		
	
| 
											2 years ago
										 | @tool | ||
|  | extends MarginContainer | ||
|  | 
 | ||
|  | enum { | ||
|  | 	EDITBOX_DUPLICATE = 1, | ||
|  | 	EDITBOX_RENAME, | ||
|  | 	EDITBOX_DELETE, | ||
|  | } | ||
|  | 
 | ||
|  | const TextEditingUtilsClass := preload("res://addons/resources_spreadsheet_view/text_editing_utils.gd") | ||
|  | const TablesPluginSettingsClass := preload("res://addons/resources_spreadsheet_view/settings_grid.gd") | ||
|  | 
 | ||
|  | @export @onready var editor_view := $"../.." | ||
|  | @export @onready var selection := $"../../SelectionManager" | ||
|  | 
 | ||
|  | @onready var editbox_node := $"Control/ColorRect/Popup" | ||
|  | @onready var editbox_label : Label = editbox_node.get_node("Panel/VBoxContainer/Label") | ||
|  | @onready var editbox_input : LineEdit = editbox_node.get_node("Panel/VBoxContainer/LineEdit") | ||
|  | 
 | ||
|  | var cell : Control | ||
|  | var editbox_action : int | ||
|  | 
 | ||
|  | 
 | ||
|  | func _ready(): | ||
|  | 	editbox_input.get_node("../..").add_theme_stylebox_override( | ||
|  | 		"panel", | ||
|  | 		get_theme_stylebox(&"Content", &"EditorStyles") | ||
|  | 	) | ||
|  | 	editbox_input.text_submitted.connect(func(_new_text): _on_editbox_accepted()) | ||
|  | 	close() | ||
|  | 
 | ||
|  | 
 | ||
|  | func _on_grid_cells_rightclicked(cells): | ||
|  | 	open(cells) | ||
|  | 
 | ||
|  | 
 | ||
|  | func _on_grid_cells_selected(cells): | ||
|  | 	if ProjectSettings.get_setting(TablesPluginSettingsClass.PREFIX + "context_menu_on_leftclick"): | ||
|  | 		open(cells, true) | ||
|  | 
 | ||
|  | 	else: hide() | ||
|  | 
 | ||
|  | 
 | ||
|  | func open(cells : Array, pin_to_cell : bool = false): | ||
|  | 	set_process_input(true) | ||
|  | 	set_process_unhandled_input(true) | ||
|  | 	if cells.size() == 0: | ||
|  | 		hide() | ||
|  | 		cell = null | ||
|  | 		return | ||
|  | 	 | ||
|  | 	if pin_to_cell: | ||
|  | 		cell = cells[-1] | ||
|  | 		set_deferred(&"global_position", Vector2( | ||
|  | 			cell.global_position.x + cell.size.x, | ||
|  | 			cell.global_position.y | ||
|  | 		)) | ||
|  | 
 | ||
|  | 	else: | ||
|  | 		cell = null | ||
|  | 		set_deferred(&"global_position", get_global_mouse_position() + Vector2.ONE) | ||
|  | 
 | ||
|  | 	show() | ||
|  | 	size = Vector2.ZERO | ||
|  | 	top_level = true | ||
|  | 	$"Control2/Label".text = str(cells.size()) + (" Cells" if cells.size() % 10 != 1 else " Cell") | ||
|  | 	$"GridContainer/Rename".visible = editor_view.has_row_names() | ||
|  | 
 | ||
|  | 
 | ||
|  | func close(): | ||
|  | 	set_process_input(false) | ||
|  | 	set_process_unhandled_input(false) | ||
|  | 
 | ||
|  | 
 | ||
|  | func _unhandled_input(event): | ||
|  | 	if !editor_view.is_visible_in_tree(): | ||
|  | 		close() | ||
|  | 		return | ||
|  | 	 | ||
|  | 	if event is InputEventKey: | ||
|  | 		if Input.is_key_pressed(KEY_CTRL): | ||
|  | 			# Dupe | ||
|  | 			if event.keycode == KEY_D: | ||
|  | 				_on_Duplicate_pressed() | ||
|  | 				return | ||
|  | 			 | ||
|  | 			# Rename | ||
|  | 			if event.keycode == KEY_R: | ||
|  | 				_on_Rename_pressed() | ||
|  | 				return | ||
|  | 				 | ||
|  | 	if event is InputEventMouseButton and event.is_pressed(): | ||
|  | 		close() | ||
|  | 
 | ||
|  | 
 | ||
|  | func _input(event): | ||
|  | 	if cell == null: return | ||
|  | 	if !editor_view.is_visible_in_tree(): | ||
|  | 		close() | ||
|  | 		return | ||
|  | 
 | ||
|  | 	global_position = Vector2( | ||
|  | 		cell.global_position.x + cell.size.x, | ||
|  | 		cell.global_position.y | ||
|  | 	) | ||
|  | 
 | ||
|  | 
 | ||
|  | func _on_Duplicate_pressed(): | ||
|  | 	_show_editbox(EDITBOX_DUPLICATE) | ||
|  | 
 | ||
|  | 
 | ||
|  | func _on_CbCopy_pressed(): | ||
|  | 	TextEditingUtilsClass.multi_copy(selection.edited_cells_text) | ||
|  | 
 | ||
|  | 
 | ||
|  | func _on_CbPaste_pressed(): | ||
|  | 	editor_view.set_edited_cells_values( | ||
|  | 		TextEditingUtilsClass.multi_paste( | ||
|  | 			selection.edited_cells_text, | ||
|  | 			selection.edit_cursor_positions | ||
|  | 		) | ||
|  | 	) | ||
|  | 
 | ||
|  | 
 | ||
|  | func _on_Rename_pressed(): | ||
|  | 	_show_editbox(EDITBOX_RENAME) | ||
|  | 
 | ||
|  | 
 | ||
|  | func _on_Delete_pressed(): | ||
|  | 	_show_editbox(EDITBOX_DELETE) | ||
|  | 
 | ||
|  | 
 | ||
|  | func _show_editbox(action): | ||
|  | 	editbox_action = action | ||
|  | 	match action: | ||
|  | 		EDITBOX_DUPLICATE: | ||
|  | 			if !editor_view.has_row_names(): | ||
|  | 				_on_editbox_accepted() | ||
|  | 				return | ||
|  | 
 | ||
|  | 			if selection.edited_cells.size() == 1: | ||
|  | 				editbox_label.text = "Input new row's name..." | ||
|  | 				editbox_input.text = editor_view.get_last_selected_row()\ | ||
|  | 					.resource_path.get_file().get_basename() | ||
|  | 
 | ||
|  | 			else: | ||
|  | 				editbox_label.text = "Input suffix to append to names..." | ||
|  | 				editbox_input.text = "" | ||
|  | 
 | ||
|  | 		EDITBOX_RENAME: | ||
|  | 			editbox_label.text = "Input new name for row..." | ||
|  | 			editbox_input.text = editor_view.get_last_selected_row()\ | ||
|  | 				.resource_path.get_file().get_basename() | ||
|  | 
 | ||
|  | 		EDITBOX_DELETE: | ||
|  | 			editbox_label.text = "Really delete selected rows? (Irreversible!!!)" | ||
|  | 			editbox_input.text = editor_view.get_last_selected_row()\ | ||
|  | 				.resource_path.get_file().get_basename() | ||
|  | 	 | ||
|  | 	editbox_input.grab_focus() | ||
|  | 	editbox_input.caret_column = 999999999 | ||
|  | 	editbox_node.size = Vector2.ZERO | ||
|  | 	editbox_node.show() | ||
|  | 	$"Control/ColorRect".show() | ||
|  | 	$"Control/ColorRect".top_level = true | ||
|  | 	$"Control/ColorRect".size = get_viewport_rect().size * 4.0 | ||
|  | 	editbox_node.global_position = ( | ||
|  | 		global_position | ||
|  | 		+ size * 0.5 | ||
|  | 		- editbox_node.get_child(0).size * 0.5 | ||
|  | 	) | ||
|  | 
 | ||
|  | 
 | ||
|  | func _on_editbox_closed(): | ||
|  | 	editbox_node.hide() | ||
|  | 	$"Control/ColorRect".hide() | ||
|  | 
 | ||
|  | 
 | ||
|  | func _on_editbox_accepted(): | ||
|  | 	match(editbox_action): | ||
|  | 		EDITBOX_DUPLICATE: | ||
|  | 			editor_view.duplicate_selected_rows(editbox_input.text) | ||
|  | 
 | ||
|  | 		EDITBOX_RENAME: | ||
|  | 			editor_view.rename_row(editor_view.get_last_selected_row(), editbox_input.text) | ||
|  | 
 | ||
|  | 		EDITBOX_DELETE: | ||
|  | 			editor_view.delete_selected_rows() | ||
|  | 
 | ||
|  | 	_on_editbox_closed() |