rat-times/scripts/time_sheet.gd

95 lines
2.4 KiB
GDScript3
Raw Normal View History

2023-03-03 21:12:54 +00:00
class_name TimeSheet
2023-03-09 20:26:57 +00:00
signal entry_started
signal entry_stopped
2023-03-03 21:12:54 +00:00
var source_path := ""
2023-03-09 20:26:57 +00:00
var entries := []
2023-03-03 21:12:54 +00:00
var entries_names := {}
var current_entry: TimeEntry
2023-03-09 20:26:57 +00:00
2023-03-03 21:12:54 +00:00
## Loads the data file
func load_file() -> bool:
2023-03-09 20:26:57 +00:00
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:
2023-03-03 21:12:54 +00:00
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)
if entry.closed == false:
current_entry = entry
if not entries_names.has(entry.name):
entries_names[entry.name] = 0
entries_names[entry.name] += entry.get_elapsed_seconds()
file.close()
return true
## Adds a new time entry to the tree and to the data file
func start_entry(entry_name: String) -> void:
current_entry = TimeEntry.new().start_recording()
current_entry.name = entry_name
current_entry.closed = false
if entry_name in entries_names:
current_entry.previous_total = entries_names[entry_name]
2023-03-09 20:26:57 +00:00
var file := File.new()
var success := file.open(source_path, File.READ_WRITE)
if success != OK:
2023-03-03 21:12:54 +00:00
printerr("Could not open file")
return
2023-03-03 21:12:54 +00:00
entries.append(current_entry)
file.store_csv_line(current_entry.to_csv_line())
2023-03-09 20:26:57 +00:00
emit_signal("entry_started")
2023-03-03 21:12:54 +00:00
func update() -> void:
current_entry.update()
entries_names[current_entry.name] = current_entry.get_total_elapsed_seconds()
func close_entry() -> void:
current_entry.closed = true
save()
2023-03-09 20:26:57 +00:00
emit_signal("entry_stopped")
2023-03-03 21:12:54 +00:00
func get_period() -> String:
return current_entry.get_period()
func get_total_elapsed_seconds() -> int:
return current_entry.get_total_elapsed_seconds()
func save() -> void:
2023-03-09 20:26:57 +00:00
var file := File.new()
var success := file.open(source_path, File.WRITE)
if success != OK:
2023-03-03 21:12:54 +00:00
printerr("Could not open file")
return
2023-03-03 21:12:54 +00:00
for time_entry in entries:
file.store_csv_line(time_entry.to_csv_line())
static func restore(file_path: String) -> TimeSheet:
2023-03-09 20:26:57 +00:00
var timesheet = load("res://scripts/time_sheet.gd").new()
2023-03-03 21:12:54 +00:00
timesheet.source_path = file_path
2023-03-09 20:26:57 +00:00
var success: bool = timesheet.load_file()
2023-03-03 21:12:54 +00:00
if success:
return timesheet
return null