rat-times/scripts/time_sheet.gd
2023-03-10 03:25:50 +04:00

88 lines
2.3 KiB
GDScript

class_name TimeSheet
var source_path := ""
var entries := []
var tree := TimeEntryTreeItem.new()
## Loads the data file
func load_file() -> bool:
var file := File.new()
var success := file.open(source_path, File.READ)
if success != OK:
success = file.open(source_path, File.WRITE)
if success != OK:
printerr("Failed to open file %s"%[ProjectSettings.globalize_path(source_path)])
return false
return true
while not file.eof_reached():
var line := file.get_csv_line()
if line.size() == 0 or "".join(line).length() == 0:
continue
if not TimeEntry.is_csv_line_valid(line):
push_warning("CSV Line `%s` is not conform"%[",".join(line)])
continue
var entry := TimeEntry.new().from_csv_line(line)
entries.append(entry)
# warning-ignore:return_value_discarded
entry.connect("closed", self, "save")
file.close()
entries.sort_custom(self, "_sort_entries")
for entry_index in entries.size():
var entry: TimeEntry = entries[entry_index]
var parts: PoolStringArray = entry.name.split("/")
var repo: TimeEntryTreeItem = tree.get_child(parts, true)
repo.append(entry)
return true
func _sort_entries(a: TimeEntry, b: TimeEntry) -> bool:
return a.name < b.name
## Adds a new time entry to the tree and to the data file
func start_entry(entry_name: String) -> void:
var current_entry := TimeEntry.new().start_recording()
current_entry.name = entry_name
current_entry.closed = false
var file := File.new()
var success := file.open(source_path, File.READ_WRITE)
if success != OK:
printerr("Could not open file")
return
entries.append(current_entry)
file.store_csv_line(current_entry.to_csv_line())
emit_signal("entry_started")
func update() -> void:
for entry in entries:
var time_entry := entry as TimeEntry
if time_entry.is_closed == false:
time_entry.update()
func save() -> void:
var file := File.new()
var success := file.open(source_path, File.WRITE)
if success != OK:
printerr("Could not open file")
return
for time_entry in entries:
file.store_csv_line(time_entry.to_csv_line())
static func restore(file_path: String) -> TimeSheet:
var timesheet = load("res://scripts/time_sheet.gd").new()
timesheet.source_path = file_path
var success: bool = timesheet.load_file()
if success:
return timesheet
return null