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