diff options
| author | dam <dam@gudinoff> | 2022-01-01 04:56:58 +0000 |
|---|---|---|
| committer | dam <dam@gudinoff> | 2022-01-01 04:56:58 +0000 |
| commit | c59f89e99c90c0e756cdf780bcbf04d782eb3e6f (patch) | |
| tree | afeea78d9d5f68092f61d573dff2f677b1c40aa8 /logic | |
| parent | 7f0580b6b49a9dbafc54a0190bf573503c54417a (diff) | |
| download | surgery-log-c59f89e99c90c0e756cdf780bcbf04d782eb3e6f.tar.zst surgery-log-c59f89e99c90c0e756cdf780bcbf04d782eb3e6f.zip | |
Change touch scroll detection to pointer-input-sensor approach using signals/events.
Diffstat (limited to 'logic')
| -rw-r--r-- | logic/database.gd | 60 | ||||
| -rw-r--r-- | logic/stage.gd | 104 |
2 files changed, 132 insertions, 32 deletions
diff --git a/logic/database.gd b/logic/database.gd index 4f3e613..41ba679 100644 --- a/logic/database.gd +++ b/logic/database.gd @@ -31,7 +31,8 @@ onready var stage: Stage = get_node("/root/main/stage") 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 v_scroll_bar: ScrollBar = get_v_scroll() +onready var v_scroll_bar: ScrollBar = get_v_scroll() # @DAM Stop scroll inertia when buttons are pressed. +onready var drag_sensor: PointerInputSensor = get_node("drag_sensor") func _init(): @@ -44,15 +45,72 @@ func _init(): 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") add_button.connect("pressed", self, "add_action") + stage.connect("save", self, "save") stage.connect("discard", self, "discard") + + drag_sensor.connect("on_press", self, "on_press") + drag_sensor.connect("on_drag", self, "on_drag") + drag_sensor.connect("on_end_drag", self, "on_end_drag") + drag_sensor.connect("on_click", self, "on_click") + for it in db: self.add_item(get_entry_view(it)) +# @DAM Cleanup this code. +export var scroll_velocity_decaying_factor: float = 2.5 +var drag_velocity := 0.0 +var is_dragging := false + +func _process(delta: float): + if is_dragging == false && abs(drag_velocity) > 0.5: + drag_velocity *= clamp((1.0 - scroll_velocity_decaying_factor * delta), 0.0, 1.0) + v_scroll_bar.value -= drag_velocity * delta + +func on_click(pointer: PointerInputSensor.PointerInputData): + var target := self + var position := target.get_global_mouse_position() - target.rect_global_position + + var event_touch := InputEventScreenTouch.new() + event_touch.index = 0 + event_touch.position = position + + var event_mouse := InputEventMouseButton.new() + event_mouse.button_index = BUTTON_LEFT + event_mouse.button_mask = BUTTON_MASK_LEFT + event_mouse.position = position + + event_mouse.pressed = true + event_touch.pressed = true + target._gui_input(event_mouse) + target._gui_input(event_touch) + + target.grab_focus() + + event_mouse.pressed = false + event_touch.pressed = false + target._gui_input(event_mouse) + target._gui_input(event_touch) + +func on_press(pointer: PointerInputSensor.PointerInputData): + is_dragging = true + +func on_end_drag(pointer: PointerInputSensor.PointerInputData): + is_dragging = false + +func on_drag(pointer: PointerInputSensor.PointerInputData): + is_dragging = true + drag_velocity = pointer.velocity.y + v_scroll_bar.value -= pointer.relative_position.y + + + + func _notification(what: int): if visible == false: return diff --git a/logic/stage.gd b/logic/stage.gd index f7cced4..62e0a58 100644 --- a/logic/stage.gd +++ b/logic/stage.gd @@ -37,7 +37,6 @@ 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") @@ -48,19 +47,82 @@ func _ready(): match it.name: "date_picker", "save", "discard": print("- %s" % it.name) - + _: # "first_assistant": print("+ %s" % it.name) - var touch_scroll = TouchScroll.new() - touch_scroll.name = "touch_scroll" - touch_scroll.click_target_path = "../" - touch_scroll.scroll_target_path = "../../../" - touch_scroll.scroll_bar_get_method = "get_v_scrollbar" - touch_scroll.mouse_default_cursor_shape = Control.CURSOR_IBEAM - (it as Control).add_child(touch_scroll) - touch_scroll.anchor_right = 1.0 - touch_scroll.anchor_bottom = 1.0 + var drag_sensor = PointerInputSensor.new() + drag_sensor.name = "drag_sensor" + drag_sensor.mouse_default_cursor_shape = Control.CURSOR_IBEAM + (it as Control).add_child(drag_sensor) + drag_sensor.anchor_right = 1.0 + drag_sensor.anchor_bottom = 1.0 + + drag_sensor.connect("on_press", self, "on_press") + drag_sensor.connect("on_drag", self, "on_drag") + drag_sensor.connect("on_end_drag", self, "on_end_drag") + drag_sensor.connect("on_click", self, "on_click") + drag_sensor.on_process = funcref(self, "bazinga") + + +# @DAM Cleanup this code. +onready var v_scroll_bar: VScrollBar = get_v_scrollbar() +export var scroll_velocity_decaying_factor: float = 2.5 +var drag_velocity := 0.0 +var is_dragging := false + +func bazinga(delta: float, pointer: PointerInputSensor): + if (pointer.get_parent() as Control).has_focus(): + pointer.mouse_filter = Control.MOUSE_FILTER_IGNORE + else: + pointer.mouse_filter = Control.MOUSE_FILTER_STOP + +func _process(delta: float): + if is_dragging == false && abs(drag_velocity) > 0.5: + drag_velocity *= clamp((1.0 - scroll_velocity_decaying_factor * delta), 0.0, 1.0) + v_scroll_bar.value -= drag_velocity * delta + +func on_click(pointer: PointerInputSensor.PointerInputData): + var target: Control = pointer.target.get_parent() + var position := target.get_global_mouse_position() - target.rect_global_position + + var event_touch := InputEventScreenTouch.new() + event_touch.index = 0 + event_touch.position = position + + var event_mouse := InputEventMouseButton.new() + event_mouse.button_index = BUTTON_LEFT + event_mouse.button_mask = BUTTON_MASK_LEFT + event_mouse.position = position + + event_mouse.pressed = true + event_touch.pressed = true + target._gui_input(event_mouse) + target._gui_input(event_touch) + + target.grab_focus() + + event_mouse.pressed = false + event_touch.pressed = false + target._gui_input(event_mouse) + target._gui_input(event_touch) + +func on_press(pointer: PointerInputSensor.PointerInputData): + is_dragging = true + +func on_end_drag(pointer: PointerInputSensor.PointerInputData): + is_dragging = false + +func on_drag(pointer: PointerInputSensor.PointerInputData): + is_dragging = true + drag_velocity = pointer.velocity.y + v_scroll_bar.value -= pointer.relative_position.y + + + + + + func save_action(): @@ -91,18 +153,6 @@ func set_stage(entry: Dictionary): func get_stage() -> Dictionary: - -# var entry: Dictionary = Database.instance_entry({ -# "process_id": process_id.text, -# "surgery_id": surgery_id.text, -# "date_year": date.get_year(), -# "date_month": date.get_month(), -# "date_day": date.get_day(), -# "place": place.text, -# "anesthetic": anesthetic.text, -# "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, @@ -124,14 +174,6 @@ 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() |
