godot-engine.file-editor/addons/file-editor/scripts/CsvEditor.gd
Aaron Franke 96b564bb17
Format files using a script
Remove carriage return characters and remove trailing space characters
2020-06-04 20:40:07 -04:00

216 lines
6.0 KiB
GDScript

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()