aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--date_picker/value_picker.gd7
-rwxr-xr-xicons/icon.pngbin42947 -> 43811 bytes
-rw-r--r--icons/icon.xcfbin112237 -> 151900 bytes
-rw-r--r--icons/icon_background.pngbin36824 -> 37713 bytes
-rw-r--r--logic/database.gd137
-rw-r--r--logic/stage.gd11
-rw-r--r--main.tscn1
-rw-r--r--project.godot2
-rw-r--r--touch_scroll.gd66
9 files changed, 205 insertions, 19 deletions
diff --git a/date_picker/value_picker.gd b/date_picker/value_picker.gd
index 5e77294..fcd7dff 100644
--- a/date_picker/value_picker.gd
+++ b/date_picker/value_picker.gd
@@ -5,6 +5,7 @@ class_name ValuePicker
const VELOCITY_DECAYING_FACTOR: float = 5.5
const BINNING_THRESHOLD: float = 0.75
const BINNING_ADJUST_P: float = 5.0
+const DRAG_THRESHOLD_CM: float = 0.250
export var min_value: int
export var max_value: int
@@ -19,6 +20,7 @@ var anchor: float
var value: int
var offset: float
+var screen_dpcm: float
var scroll_unit_height: float
var label_previous_base_position: float
var label_current_base_position: float
@@ -39,6 +41,7 @@ func _ready():
input.connect("focus_entered", self, "input_focus_entered")
input.connect("focus_exited", self, "input_focus_exited")
+ screen_dpcm = float(OS.get_screen_dpi()) / 2.54
scroll_unit_height = label_current.rect_size.y
label_previous_base_position = label_previous.rect_position.y
label_current_base_position = label_current.rect_position.y
@@ -105,7 +108,8 @@ func _gui_input(event: InputEvent):
var drag := event as InputEventScreenDrag
pointer.current_position = drag.position
pointer.velocity = drag.speed
- pointer.was_dragged = true
+ if pointer.current_position.distance_to(pointer.initial_position) / screen_dpcm > DRAG_THRESHOLD_CM:
+ pointer.was_dragged = true
func input_text_entered(new_text: String):
@@ -113,6 +117,7 @@ func input_text_entered(new_text: String):
func input_focus_entered():
+ pointer.velocity = Vector2.ZERO # Avoid changing to other value once entering input.
input.text = "%d" % value
input.visible = true
input.select_all()
diff --git a/icons/icon.png b/icons/icon.png
index 63760ec..95c7db3 100755
--- a/icons/icon.png
+++ b/icons/icon.png
Binary files differ
diff --git a/icons/icon.xcf b/icons/icon.xcf
index abfbec1..57986fb 100644
--- a/icons/icon.xcf
+++ b/icons/icon.xcf
Binary files differ
diff --git a/icons/icon_background.png b/icons/icon_background.png
index 6ee62e1..bbb555d 100644
--- a/icons/icon_background.png
+++ b/icons/icon_background.png
Binary files differ
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()
diff --git a/main.tscn b/main.tscn
index 53f083a..4096c59 100644
--- a/main.tscn
+++ b/main.tscn
@@ -116,6 +116,7 @@ margin_top = 112.0
margin_right = 1080.0
margin_bottom = 312.0
rect_min_size = Vector2( 400, 200 )
+mouse_filter = 0
[node name="place" type="LineEdit" parent="stage/controls"]
margin_top = 316.0
diff --git a/project.godot b/project.godot
index 584ffa8..3df8f21 100644
--- a/project.godot
+++ b/project.godot
@@ -19,7 +19,7 @@ _global_script_classes=[ {
"language": "GDScript",
"path": "res://date_picker/date_picker.gd"
}, {
-"base": "Control",
+"base": "ScrollContainer",
"class": "Stage",
"language": "GDScript",
"path": "res://logic/stage.gd"
diff --git a/touch_scroll.gd b/touch_scroll.gd
new file mode 100644
index 0000000..ea92087
--- /dev/null
+++ b/touch_scroll.gd
@@ -0,0 +1,66 @@
+extends Control
+
+
+func _gui_input(event: InputEvent):
+#func _input(event: InputEvent):
+# return
+ if event is InputEventScreenDrag:
+ self.v_scroll.value -= event.relative.y
+# accept_event()
+
+#func _gui_input(event):
+# accept_event()
+# get_tree().set_input_as_handled()
+# if event is InputEventScreenDrag:
+# get_parent().v_scroll.value -= event.relative.y
+
+
+export(float) var drag_threshold = 5
+onready var touch_enabled = OS.has_touchscreen_ui_hint()
+onready var v_scroll = get_parent().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 _input_disabled(event):
+#func _gui_input(event):
+
+ 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
+ # 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)