diff options
| author | dam <dam@gudinoff> | 2022-01-02 03:04:48 +0000 |
|---|---|---|
| committer | dam <dam@gudinoff> | 2022-01-02 03:04:48 +0000 |
| commit | 88f355c29987c39b01727a08d3dfef8a312bd9ec (patch) | |
| tree | 5559d27940295dff1cf24399e992bf19f389d411 /logic/database.gd | |
| parent | c59f89e99c90c0e756cdf780bcbf04d782eb3e6f (diff) | |
| download | surgery-log-88f355c29987c39b01727a08d3dfef8a312bd9ec.tar.zst surgery-log-88f355c29987c39b01727a08d3dfef8a312bd9ec.zip | |
Implement scroll by dragging on database and stage screens.
Diffstat (limited to 'logic/database.gd')
| -rw-r--r-- | logic/database.gd | 144 |
1 files changed, 54 insertions, 90 deletions
diff --git a/logic/database.gd b/logic/database.gd index 41ba679..c492321 100644 --- a/logic/database.gd +++ b/logic/database.gd @@ -22,16 +22,19 @@ const ENTRY_PROTOTYPE: Dictionary = { "is_urgency": false, "notes": "", } +const POINTER_VELOCITY_DECAYING_FACTOR: float = 2.5 var db: Array var selected_idx: int var staged_idx: int +var is_pointer_dragging := false +var pointer_drag_velocity := 0.0 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() # @DAM Stop scroll inertia when buttons are pressed. +onready var v_scroll_bar: ScrollBar = get_v_scroll() onready var drag_sensor: PointerInputSensor = get_node("drag_sensor") @@ -53,66 +56,25 @@ func _ready(): 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") + drag_sensor.connect("on_press", self, "pointer_input_handler") + drag_sensor.connect("on_drag", self, "pointer_input_handler") + drag_sensor.connect("on_end_drag", self, "pointer_input_handler") + drag_sensor.connect("on_click", self, "pointer_input_handler") 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 - - + # Apply drag movement inertia. + if is_pointer_dragging == false && abs(pointer_drag_velocity) > 0.5: + pointer_drag_velocity *= clamp((1.0 - POINTER_VELOCITY_DECAYING_FACTOR * delta), 0.0, 1.0) + v_scroll_bar.value -= pointer_drag_velocity * delta func _notification(what: int): - if visible == false: + # @DAM Yet to be polished. + if visible == false || has_focus() == false: return if what == MainLoop.NOTIFICATION_WM_GO_BACK_REQUEST: @@ -127,11 +89,7 @@ func get_entry_view(database_entry: Dictionary) -> String: 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(): @@ -223,40 +181,6 @@ func load_database(file_path: String = DATABASE_FILE_PATH): db.append(entry) fake_database() - 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(file_path: String = DATABASE_FILE_PATH): @@ -321,3 +245,43 @@ func fake_database(): "date": "%04d-%02d-%02d" % [date_year, date_month, date_day] })) + +func pointer_input_handler(pointer: PointerInputSensor.PointerInputData): + match pointer.action: + PointerInputSensor.PointerInputAction.ON_PRESS: + is_pointer_dragging = true + + PointerInputSensor.PointerInputAction.ON_DRAG: + is_pointer_dragging = true + pointer_drag_velocity = pointer.velocity.y + v_scroll_bar.value -= pointer.relative_position.y + + PointerInputSensor.PointerInputAction.ON_END_DRAG: + is_pointer_dragging = false + + PointerInputSensor.PointerInputAction.ON_CLICK: + 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) + + |
