@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): open(cells, true, true) func open(cells : Array, pin_to_cell : bool = false, from_leftclick : bool = false): if cells.size() == 0 or (from_leftclick and !ProjectSettings.get_setting(TablesPluginSettingsClass.PREFIX + "context_menu_on_leftclick")): 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(): pass func _input(event : InputEvent): if !editor_view.is_visible_in_tree(): close() return if event is InputEventMouseButton and event.is_pressed(): close() return if event is InputEventKey: if event.is_pressed() and event.is_command_or_control_pressed(): global_position = get_global_mouse_position() + Vector2.ONE if cell != null: global_position = Vector2( cell.global_position.x + cell.size.x, cell.global_position.y ) # Dupe if event.keycode == KEY_D: _on_Duplicate_pressed() return # Rename if event.keycode == KEY_R: _on_Rename_pressed() return 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() show() 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()