diff options
Diffstat (limited to 'logic')
| -rw-r--r-- | logic/database.gd | 226 | ||||
| -rw-r--r-- | logic/stage.gd | 88 |
2 files changed, 314 insertions, 0 deletions
diff --git a/logic/database.gd b/logic/database.gd new file mode 100644 index 0000000..1abb984 --- /dev/null +++ b/logic/database.gd @@ -0,0 +1,226 @@ +extends ItemList +class_name Database + +const DATABASE_FILE_PATH: String = "user://database.csv" +const DATE_SEPARATOR: String = "-" +const DATE_FORMAT: String = "%04d-%02d-%02d" +const ENTRY_PROTOTYPE: Dictionary = { + "process_id": "", + "surgery_id": "", + "place": "", + "date": "", + "date_year": 0, + "date_month": 0, + "date_day": 0, + "anesthetic": "", + "first_assistant": "", + "type": "", + "sub_type": "", + "sub_sub_type": "", + "pathology": "", + "intervention": "", + "is_urgency": false, + "notes": "", +} + +var db: Array +var staged_idx: int + +onready var delete_button: Button = get_node("actions/delete") +onready var edit_button: Button = get_node("actions/edit") +onready var add_button: Button = get_node("actions/add") + +onready var stage: Stage = get_node("/root/main/stage") + + +func _init(): + staged_idx = -1 + load_database() + store_database() # @DAM Only for testing. + + +# @DAM WIP +#func _notification(what: int): +# if what == MainLoop.NOTIFICATION_WM_GO_BACK_REQUEST: +# clear_selection() + + +func _ready(): + self.connect("nothing_selected", self, "clear_selection") + delete_button.connect("pressed", self, "delete_action") + edit_button.connect("pressed", self, "edit_action") + add_button.connect("pressed", self, "add_action") + stage.connect("save", self, "save") + stage.connect("discard", self, "discard") + refresh_list() + + +func get_entry_view(database_entry: Dictionary) -> String: + return "%6s | %6s | %s" % [database_entry.process_id, database_entry.surgery_id, get_entry_date(database_entry)] + + +func refresh_list(): + self.clear() + for it in db: + self.add_item(get_entry_view(it)) + + +func clear_selection(): + unselect_all() + + +func delete_action(): + # @DAM Could do some performance improvements + var selected_entries_idx := self.get_selected_items() + var sorted_idx := Array(selected_entries_idx) + sorted_idx.sort() + sorted_idx.invert() + for idx in sorted_idx: + db.remove(idx) + self.remove_item(idx) + + +func edit_action(): + var selected_entries_idx := self.get_selected_items() + if selected_entries_idx.size() != 1: + return + staged_idx = selected_entries_idx[0] + self.visible = false + stage.visible = true + stage.set_stage(db[staged_idx]) + + +func add_action(): + self.visible = false + stage.visible = true + var staged := instance_entry() + stage.set_stage(staged) + # @DAM This signal is connected but, if we select "DISCARD" it stays connectd. + # Maybe I should always keep the connection and use two different buttons on sage screen. + stage.connect("save", self, "save_new", [], CONNECT_ONESHOT) + + +func save(database_entry: Dictionary): + if staged_idx >= 0: + db[staged_idx] = database_entry + set_item_text(staged_idx, get_entry_view(database_entry)) +# items[staged_idx] = get_entry_view(database_entry) + else: + db.append(database_entry) + add_item(get_entry_view(database_entry)) + + staged_idx = -1 + self.visible = true + + +func discard(): + staged_idx = -1 + self.visible = true + + +func load_database(): + var file := File.new() + file.open(DATABASE_FILE_PATH, File.READ_WRITE) + var headers: PoolStringArray + var is_first_line := true +# while database_file.eof_reached() == false: + while file.get_position() < file.get_len(): + var csv_entry := file.get_csv_line() + if is_first_line: + is_first_line = false + headers = csv_entry + continue + var entry = ENTRY_PROTOTYPE.duplicate(true) + for idx in headers.size(): + var field_name := headers[idx] + var field_value := csv_entry[idx] + match field_name: + "date_year", "date_month", "date_day": + entry[field_name] = int(field_value) + "is_urgency": + entry[field_name] = true if field_value.strip_edges().to_lower() == "true" else false + _: + entry[field_name] = field_value + db.append(entry) + return + db = [ + instance_entry({ + "process_id": "000001", + "surgery_id": "100000", + "place": "central", + "date": "2020-01-31", + }), + instance_entry({ + "process_id": "000002", + "surgery_id": "200000", + "place": "central", + "date": "2020-02-31", + }), + instance_entry({ + "process_id": "000003", + "surgery_id": "300000", + "place": "central", + "date": "2020-03-31", + }), + instance_entry({ + "process_id": "000004", + "surgery_id": "400000", + "place": "central", + "date": "2020-04-31", + }), + instance_entry({ + "process_id": "000012", + "surgery_id": "210000", + "place": "central", + "date": "2020-12-31", + }), + ] + + +func store_database(): + var file := File.new() + file.open(DATABASE_FILE_PATH, File.WRITE) + var header := PoolStringArray(ENTRY_PROTOTYPE.keys()) + file.store_csv_line(header) + var entry := PoolStringArray() + for it in db: + file.store_csv_line(it.values()) + file.close() + + +func instance_entry(params: Dictionary = {}) -> Dictionary: + var new_entry := ENTRY_PROTOTYPE.duplicate(true) + new_entry.process_id = params.get("process_id", "") + new_entry.surgery_id = params.get("surgery_id", "") + new_entry.place = params.get("place", "") + + var today = OS.get_date() + set_entry_date(new_entry, params.get("date", DATE_FORMAT % [today.year, today.month, today.day])) + + new_entry.anesthetic = params.get("anesthetic", "") + new_entry.first_assistant = params.get("first_assistant", "") + new_entry.type = params.get("type", "") + new_entry.sub_type = params.get("sub_type", "") + new_entry.sub_sub_type = params.get("sub_sub_type", "") + new_entry.pathology = params.get("pathology", "") + new_entry.intervention = params.get("intervention", "") + new_entry.is_urgency = params.get("is_urgency", false) + new_entry.notes = params.get("notes", "") + + return new_entry + + +func get_entry_date(entry: Dictionary) -> String: + return DATE_FORMAT % [entry.date_year, entry.date_month, entry.date_day] + + +func set_entry_date(entry: Dictionary, date: String): + date = date.strip_edges().replace(" ", DATE_SEPARATOR).replace("/", DATE_SEPARATOR).replace("\\", DATE_SEPARATOR) + var year_month_idx := date.find(DATE_SEPARATOR) + var month_day_idx := date.find(DATE_SEPARATOR, year_month_idx + 1) + entry.date = date + entry.date_year = int(date.substr(0, year_month_idx)) + entry.date_month = int(date.substr(year_month_idx + 1, month_day_idx - year_month_idx - 1)) + entry.date_day = int(date.substr(month_day_idx + 1)) + + diff --git a/logic/stage.gd b/logic/stage.gd new file mode 100644 index 0000000..a9f4fee --- /dev/null +++ b/logic/stage.gd @@ -0,0 +1,88 @@ +extends Control +class_name Stage + +signal save # (database_entry: Dictionary) +signal discard # () + +onready var process_id: LineEdit = get_node("controls/process_id") +onready var surgery_id: LineEdit = get_node("controls/surgery_id") +onready var date: DatePicker = get_node("controls/date_picker") +onready var place: LineEdit = get_node("controls/place") +onready var anesthetic: LineEdit = get_node("controls/anesthetic") +onready var first_assistant: LineEdit = get_node("controls/first_assistant") +onready var type: LineEdit = get_node("controls/type") +onready var sub_type: LineEdit = get_node("controls/sub_type") +onready var sub_sub_type: LineEdit = get_node("controls/sub_sub_type") +onready var pathology: LineEdit = get_node("controls/pathology") +onready var intervention: LineEdit = get_node("controls/intervention") +onready var is_urgency: Button = get_node("controls/is_urgency") +onready var notes: LineEdit = get_node("controls/notes") +onready var save_button: Button = get_node("controls/save") +onready var discard_button: Button = get_node("controls/discard") + + +func _ready(): + save_button.connect("pressed", self, "save_action") + discard_button.connect("pressed", self, "discard_action") + + +func save_action(): + self.visible = false + emit_signal("save", get_stage()) + + +func discard_action(): + self.visible = false + emit_signal("discard") + + +func set_stage(entry: Dictionary): + process_id.text = entry.process_id + surgery_id.text = entry.surgery_id + date.set_date(entry.date_year, entry.date_month, entry.date_day) + place.text = entry.place + anesthetic.text = entry.anesthetic + first_assistant.text = entry.first_assistant + type.text = entry.type + sub_type.text = entry.sub_type + sub_sub_type.text = entry.sub_sub_type + pathology.text = entry.pathology + intervention.text = entry.intervention + is_urgency.pressed = entry.is_urgency + notes.text = entry.notes + self.scroll_vertical = 0 # @DAM TODO + + +func get_stage() -> Dictionary: + var entry: Dictionary + entry.process_id = process_id.text + entry.surgery_id = surgery_id.text + entry.date_year = date.get_year() + entry.date_month = date.get_month() + entry.date_day = date.get_day() + entry.place = place.text + entry.anesthetic = anesthetic.text + entry.first_assistant = first_assistant.text + entry.type = type.text + entry.sub_type = sub_type.text + entry.sub_sub_type = sub_sub_type.text + entry.pathology = pathology.text + entry.intervention = intervention.text + entry.is_urgency = is_urgency.pressed + entry.notes = notes.text + return entry + + +func _notification(what: int): + if what == MainLoop.NOTIFICATION_WM_GO_BACK_REQUEST: + discard_action() + + +func _unhandled_input(event): + get_node("/root/main/debug").text += "%s\n" % event.to_string() + + +func _unhandled_key_input(event): + get_node("/root/main/debug").text += "%s\n" % event.to_string() + + |
