diff options
| author | dam <dam@gudinoff> | 2021-12-16 01:17:34 +0000 |
|---|---|---|
| committer | dam <dam@gudinoff> | 2021-12-16 01:17:34 +0000 |
| commit | 9724fb73abf9fd3760a4f3f3ac941a119708c97b (patch) | |
| tree | 1892493f0e922a3c0b99c049a7039771d739dea7 /logic/database.gd | |
| parent | ecd75887d99d887aabe828f4511d9fd3e1c41428 (diff) | |
| download | surgery-log-9724fb73abf9fd3760a4f3f3ac941a119708c97b.tar.zst surgery-log-9724fb73abf9fd3760a4f3f3ac941a119708c97b.zip | |
First prototype with working database and staging area.
Fix incorrect warp in date picker.
Disable physics engine.
Diffstat (limited to 'logic/database.gd')
| -rw-r--r-- | logic/database.gd | 226 |
1 files changed, 226 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)) + + |
