tool extends Control var IconLoader = preload("res://addons/file-editor/scripts/IconLoader.gd").new() var LastOpenedFiles = preload("res://addons/file-editor/scripts/LastOpenedFiles.gd").new() onready var Table = $Editor/TableContainer/ScrollContainer/Table onready var AlignBTN = $Editor/Buttons/align_bt.get_popup() onready var EditBTN = $Editor/Buttons/edit_bt.get_popup() onready var OptionsBTN = $Editor/Buttons/options_btn.get_popup() onready var FileInfo = $Editor/FileInfo onready var ReadOnly = $Editor/FileInfo/Readonly onready var Horizontal = $Editor/Horizontal onready var Vertical = $Editor/TableContainer/Vertical onready var ChangeDelimiterDialog = $ChangeDelimiterDialog var current_file_path : String = "" var rows : int var columns : int var csv_delimiter : String var filepath : String signal update_file() func _ready(): add_to_group("csv_editor") connect_signals() load_icons() func connect_signals(): AlignBTN.connect("id_pressed",self,"on_align_pressed") EditBTN.connect("id_pressed",self,"on_edit_pressed") OptionsBTN.connect("id_pressed",self,"on_options_pressed") ReadOnly.connect("toggled",self,"_on_Readonly_toggled") ChangeDelimiterDialog.connect("confirmed",self,"on_changedelimiter_confirmed") connect("visibility_changed",self,"_on_visibility_changed") func load_icons(): $Editor/Buttons/align_bt.set_button_icon(IconLoader.load_icon_from_name("align")) $Editor/Buttons/edit_bt.set_button_icon(IconLoader.load_icon_from_name("edit_")) AlignBTN.set_item_icon(0,IconLoader.load_icon_from_name("text-left")) AlignBTN.set_item_icon(1,IconLoader.load_icon_from_name("text-center")) AlignBTN.set_item_icon(2,IconLoader.load_icon_from_name("text-right")) AlignBTN.set_item_icon(3,IconLoader.load_icon_from_name("text-fill")) EditBTN.set_item_icon(0,IconLoader.load_icon_from_name("row")) EditBTN.set_item_icon(1,IconLoader.load_icon_from_name("column")) EditBTN.set_item_icon(3,IconLoader.load_icon_from_name("save")) ReadOnly.set("custom_icons/checked",IconLoader.load_icon_from_name("read")) ReadOnly.set("custom_icons/unchecked",IconLoader.load_icon_from_name("edit")) func open_csv_file(filepath : String, csv_delimiter : String) -> void: self.filepath = filepath var csv = File.new() csv.open(filepath,File.READ) var rows : Array = [] var columns = -1 while not csv.eof_reached(): rows.append(csv.get_csv_line(csv_delimiter)) if columns == -1: columns = rows[0].size() csv.close() self.csv_delimiter = csv_delimiter load_file_in_table(rows,columns) ReadOnly.pressed = (true) $Editor/FileInfo/delimiter.set_text(csv_delimiter) ChangeDelimiterDialog.get_node("VBoxContainer/delim_read").set_text(csv_delimiter) func load_file_in_table(rows : Array, columns : int) -> void: Table.set_columns(columns) for row in rows: add_row(row.size(),"",row) update_dimensions(rows.size()-1,columns) func add_row(columns : int, cell_text : String = "", cell2text : PoolStringArray = []): for i in range(0,columns): if cell2text.size()<1: var cell = LineEdit.new() cell.set_h_size_flags(2) cell.set_h_size_flags(3) cell.set_text(cell_text) Table.add_child(cell) if ReadOnly.pressed: cell.set_editable(false) else: if cell2text[i]!="": var cell = LineEdit.new() cell.set_h_size_flags(2) cell.set_h_size_flags(3) Table.add_child(cell) if cell2text: cell.set_text(cell2text[i]) else: cell.set_text(cell_text) if ReadOnly.pressed: cell.set_editable(false) func add_column(rows : int ,cell_text : String = ""): for i in range(0,rows): var cell = LineEdit.new() cell.set_h_size_flags(2) cell.set_h_size_flags(3) Table.add_child(cell) Table.move_child(cell,(columns)*(i+1)-1) cell.set_text(cell_text) if ReadOnly.pressed: cell.set_editable(false) func on_align_pressed(index : int) -> void: for cell in Table.get_children(): cell.set_align(index) func on_edit_pressed(index :int) -> void: match index: 0: update_dimensions(rows+1,columns) add_row(columns) 1: update_dimensions(rows,columns+1) add_column(rows) 3: save_table() func on_options_pressed(index : int) -> void: match index: 0: ChangeDelimiterDialog.popup() func table_ruler(rows : int, columns : int): for child in Vertical.get_children(): child.queue_free() for child in Horizontal.get_children(): child.queue_free() for i in range(0,rows): var lb = Label.new() lb.set_h_size_flags(2) lb.set_h_size_flags(3) lb.set_text(str(i+1)) Vertical.add_child(lb) var lb = Label.new() lb.set_text(" ") Horizontal.add_child(lb) for j in range(0,columns): var lb2 = Label.new() lb2.set_h_size_flags(2) lb2.set_h_size_flags(3) lb2.set_align(1) lb2.set_text(str(j+1)) Horizontal.add_child(lb2) func update_dimensions(rows : int, columns : int): self.rows = rows self.columns = columns table_ruler(rows,columns) Table.set_columns(columns) FileInfo.get_node("rows").set_text(str(rows)) FileInfo.get_node("columns").set_text(str(columns)) func _on_Readonly_toggled(button_pressed): if button_pressed: ReadOnly.set_text("Read Only") for cell in Table.get_children(): cell.set_editable(false) else: ReadOnly.set_text("Can Edit") for cell in Table.get_children(): cell.set_editable(true) func save_table(): var content : Array = [] var column = 0 var row_ : PoolStringArray = [] for cell in Table.get_children(): if column < columns: row_.append(cell.get_text()) column+=1 else: content.append(row_) row_ = [] row_.append(cell.get_text()) column = 1 content.append(row_) var file = File.new() file.open(filepath, File.WRITE) for line in content: file.store_csv_line(line,csv_delimiter) file.close() emit_signal("update_file") func on_changedelimiter_confirmed(): change_delimiter(ChangeDelimiterDialog.get_node("VBoxContainer/delim_read").get_text()) func change_delimiter(delim : String): csv_delimiter = delim reload() func reload(): for element in Table.get_children(): element.queue_free() open_csv_file(current_file_path,csv_delimiter) FileInfo.show() func _on_visibility_changed(): if visible: reload()