diff options
| author | dam <dam@gudinoff> | 2021-12-18 03:14:52 +0000 |
|---|---|---|
| committer | dam <dam@gudinoff> | 2021-12-18 03:14:52 +0000 |
| commit | a2af4c7d07259a091deabdceaa5da1a2f7757c5e (patch) | |
| tree | fd630b7fd6f1de2ac6a285271a202eb84aeda5eb /logic | |
| parent | 3f29bb41d713240eb7ba831f68981674d4db9eb9 (diff) | |
| download | surgery-log-a2af4c7d07259a091deabdceaa5da1a2f7757c5e.tar.zst surgery-log-a2af4c7d07259a091deabdceaa5da1a2f7757c5e.zip | |
Add drag detection threshold to date picker.
Prototype touch drag on database screen.
Diffstat (limited to 'logic')
| -rw-r--r-- | logic/database.gd | 137 | ||||
| -rw-r--r-- | logic/stage.gd | 11 |
2 files changed, 131 insertions, 17 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) diff --git a/logic/stage.gd b/logic/stage.gd index 19018fa..207b451 100644 --- a/logic/stage.gd +++ b/logic/stage.gd @@ -1,4 +1,4 @@ -extends Control +extends ScrollContainer class_name Stage signal save # (database_entry: Dictionary) @@ -66,6 +66,7 @@ func get_stage() -> Dictionary: # "first_assistant": first_assistant.text, # "type": type.text, # }) + # @DAM Simplify all this... avoid creating multiple entries/dictionaries. var entry: Dictionary = { "process_id": process_id.text, "surgery_id": surgery_id.text, @@ -86,6 +87,14 @@ func get_stage() -> Dictionary: return entry +# @DAM Testing. Needs all children controllers to have Mouse > Filter : Pass. +func _gui_input(event): + accept_event() + if event is InputEventScreenDrag: + self.scroll_vertical -= event.relative.y + return + + func _notification(what: int): if what == MainLoop.NOTIFICATION_WM_GO_BACK_REQUEST: discard_action() |
