aboutsummaryrefslogtreecommitdiff
path: root/logic/database.gd
diff options
context:
space:
mode:
Diffstat (limited to 'logic/database.gd')
-rw-r--r--logic/database.gd137
1 files changed, 121 insertions, 16 deletions
diff --git a/logic/database.gd b/logic/database.gd
index db449ae..5f91c12 100644
--- a/logic/database.gd
+++ b/logic/database.gd
@@ -24,6 +24,7 @@ const ENTRY_PROTOTYPE: Dictionary = {
}
var db: Array
+var selected_idx: int
var staged_idx: int
onready var delete_button: Button = get_node("actions/delete")
@@ -34,18 +35,14 @@ onready var stage: Stage = get_node("/root/main/stage")
func _init():
+ selected_idx = -1
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("item_selected", self, "item_selected")
self.connect("nothing_selected", self, "clear_selection")
delete_button.connect("pressed", self, "delete_action")
edit_button.connect("pressed", self, "edit_action")
@@ -56,31 +53,63 @@ func _ready():
self.add_item(get_entry_view(it))
+func _notification(what: int):
+ if what == MainLoop.NOTIFICATION_WM_GO_BACK_REQUEST:
+ if selected_idx >= 0:
+ clear_selection()
+ else:
+ get_tree().quit()
+
+
+# @DAM Testing
+#var last_event
+#var bypass: bool = false
+#func _gui_input(event: InputEvent):
+# if bypass == false:
+# if event is InputEventScreenTouch && event.is_pressed():
+# accept_event()
+# last_event = event
+# elif event is InputEventScreenTouch && event.is_pressed() == false:
+# bypass = true
+# get_tree().input_event(event)
+# bypass = false
+# else:
+# var x = 3
+
+
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 item_selected(index: int):
+ if selected_idx >= 0:
+ set_item_text(selected_idx, get_entry_view(db[selected_idx]))
+ selected_idx = index
+ set_item_text(selected_idx, "> " + get_entry_view(db[selected_idx]) + " <")
+
+
+
func clear_selection():
+ if selected_idx >= 0:
+ set_item_text(selected_idx, get_entry_view(db[selected_idx]))
+ selected_idx = -1
unselect_all()
func delete_action():
- var selected_entries_idx := self.get_selected_items()
- if selected_entries_idx.size() == 0:
+ if selected_idx < 0:
return
- assert(selected_entries_idx.size() == 1, "Multiple selected items not supported.")
- var selected_idx = selected_entries_idx[0]
+
db.remove(selected_idx)
self.remove_item(selected_idx)
store_database()
func edit_action():
- var selected_entries_idx := self.get_selected_items()
- if selected_entries_idx.size() == 0:
+ if selected_idx < 0:
return
- assert(selected_entries_idx.size() == 1, "Multiple selected items not supported.")
- staged_idx = selected_entries_idx[0]
+
+ staged_idx = selected_idx
self.visible = false
stage.visible = true
stage.set_stage(db[staged_idx])
@@ -116,7 +145,7 @@ func load_database(file_path: String = DATABASE_FILE_PATH):
file.open(file_path, File.READ_WRITE)
var headers: PoolStringArray
var is_first_line := true
-# while database_file.eof_reached() == false:
+# while database_file.eof_reached() == false: # @DAM Why this?
while file.get_position() < file.get_len():
var csv_entry := file.get_csv_line()
if is_first_line:
@@ -135,7 +164,10 @@ func load_database(file_path: String = DATABASE_FILE_PATH):
_:
entry[field_name] = field_value
db.append(entry)
+
+ fake_database()
return
+
db = [
instance_entry({
"process_id": "000001",
@@ -191,7 +223,7 @@ static func instance_entry(params: Dictionary = {}) -> Dictionary:
new_entry.date_year = params.get("date_year", today.year)
new_entry.date_month = params.get("date_month", today.month)
new_entry.date_day = params.get("date_day", today.day)
- new_entry.date = params.get("date", get_entry_date(new_entry))
+ new_entry.date = params.get("date", get_entry_date(new_entry)) # @DAM We should store only one version of the date.
new_entry.anesthetic = params.get("anesthetic", "")
new_entry.first_assistant = params.get("first_assistant", "")
@@ -220,3 +252,76 @@ static func set_entry_date(entry: Dictionary, date: String):
entry.date_day = int(date.substr(month_day_idx + 1))
+func fake_database():
+ db.resize(0)
+ for idx in range(50):
+ var date_year = 1 + int(float(idx) / 365.0)
+ var date_month = idx % 12
+ var date_day = idx % 365
+ db.append(instance_entry({
+ "process_id": "%06d" % idx,
+ "surgery_id": "s%05d" % idx,
+ "date": "%04d-%02d-%02d" % [date_year, date_month, date_day]
+ }))
+
+
+
+
+
+
+
+# @DAM Testing.
+export(float) var drag_threshold = 5
+
+onready var touch_enabled = OS.has_touchscreen_ui_hint()
+onready var v_scroll = get_v_scroll()
+
+var dragging = false
+var pressed = false
+var last_event
+# must be _input, as _gui_input has bugs, with no touch.pressed = false events
+# see: https://github.com/godotengine/godot/issues/16761
+func _gui_input(event):
+
+ if event is InputEventScreenDrag:
+ self.v_scroll.value -= event.relative.y
+
+ return
+ if not visible:
+ return
+
+ if not touch_enabled:
+ return
+
+ if event is InputEventScreenDrag:
+ accept_event()
+ if event.speed == Vector2():
+ # we're on a device and speed is broken
+ # see: https://github.com/godotengine/godot/issues/3623
+ event.speed = event.relative
+ if abs(event.speed.y) >= drag_threshold:
+ # scroll the list
+ dragging = true
+ v_scroll.value -= event.relative.y
+ return
+
+ if event is InputEventScreenTouch:
+ if event.index == 0:
+ accept_event()
+ if dragging && event.pressed == false:
+ # prints("end drag")
+ dragging = false
+ pressed = false
+ else:
+ if event.pressed && pressed == false:
+ # prints("touch start")
+ pressed = true
+ accept_event()
+ # TODO: prevent select highlight
+ elif !event.pressed && pressed == true:
+ # prints("touch end and accept")
+ pressed = false
+ var ev = InputEventAction.new()
+ ev.action = "ui_accept"
+ ev.pressed = true
+ Input.parse_input_event(ev)