From 79cac2d7115e31987ff205b7b726b353014dd62b Mon Sep 17 00:00:00 2001 From: dam Date: Fri, 4 Mar 2022 00:07:40 +0000 Subject: Improved touch scroll. --- main.gd | 1 + pointer_input_sensor.gd | 19 +++++++------------ touch_item_list/touch_item_list.gd | 13 +++++++++---- touch_vertical_container/touch_vertical_container.gd | 19 +++++++++++++++---- 4 files changed, 32 insertions(+), 20 deletions(-) diff --git a/main.gd b/main.gd index 614c9b1..5a78ede 100644 --- a/main.gd +++ b/main.gd @@ -24,6 +24,7 @@ func _init(): func _ready(): + Input.set_use_accumulated_input(false) confirm_action.get_cancel().connect("pressed", self, "dialog_cancelled", ["confirmed"]) file_picker.get_cancel().connect("pressed", self, "dialog_cancelled", ["file_selected"]) diff --git a/pointer_input_sensor.gd b/pointer_input_sensor.gd index be4d158..588bb81 100644 --- a/pointer_input_sensor.gd +++ b/pointer_input_sensor.gd @@ -70,18 +70,19 @@ func _gui_input(event: InputEvent): return pointer.event = event -# pointer.index = -1 -# pointer.scroll = 0.0 -# pointer.action = PointerInputAction.UNDEFINED -# pointer.velocity = Vector2.ZERO + pointer.action = PointerInputAction.UNDEFINED + pointer.velocity = Vector2.ZERO + pointer.relative_position = Vector2.ZERO + pointer.scroll = 0.0 + pointer.current_position = get_global_mouse_position() if event is InputEventScreenTouch && (pointer.is_pressed == false || pointer.index == event.index): var touch := event as InputEventScreenTouch pointer.is_pressed = event.pressed - pointer.current_position = get_global_mouse_position() + if pointer.is_pressed: pointer.index = touch.index - pointer.initial_position = get_global_mouse_position() + pointer.initial_position = pointer.current_position pointer.action = PointerInputAction.ON_PRESS emit_signal("on_press", pointer) else: @@ -95,14 +96,9 @@ func _gui_input(event: InputEvent): emit_signal("on_end_drag", pointer) pointer.index = -1 pointer.was_dragged = false - # @DAM Maybe add this. -# pointer.initial_position = Vector2.ZERO -# pointer.current_position = Vector2.ZERO -# pointer.relative_position = Vector2.ZERO if event is InputEventScreenDrag && event.index == pointer.index: var drag := event as InputEventScreenDrag - pointer.current_position = get_global_mouse_position() pointer.velocity = drag.speed pointer.relative_position = drag.relative if pointer.was_dragged == false && pointer.current_position.distance_to(pointer.initial_position) > drag_threshold_cm * screen_dpcm: @@ -112,7 +108,6 @@ func _gui_input(event: InputEvent): pointer.action = PointerInputAction.ON_DRAG emit_signal("on_drag", pointer) - # @DAM Clean this code please. if event is InputEventMouseButton && event.is_pressed(): if event.button_index == BUTTON_WHEEL_UP || event.button_index == BUTTON_WHEEL_DOWN: pointer.scroll = -1.0 if event.button_index == BUTTON_WHEEL_UP else 1.0 diff --git a/touch_item_list/touch_item_list.gd b/touch_item_list/touch_item_list.gd index 8b79431..67f88d7 100644 --- a/touch_item_list/touch_item_list.gd +++ b/touch_item_list/touch_item_list.gd @@ -1,12 +1,13 @@ extends ItemList class_name TouchItemList -const POINTER_VELOCITY_DECAYING_FACTOR: float = 2.5 -const POINTER_VELOCITY_BOOST_FACTOR: float = 1.5 +const POINTER_VELOCITY_DECAYING_FACTOR: float = PI +const POINTER_VELOCITY_BOOST_FACTOR: float = 1.25 const EXACT_SELECTION: bool = false var is_pointer_dragging := false var pointer_drag_velocity := 0.0 +var when_last_dragged := 0 onready var sensor := get_node("sensor") as PointerInputSensor onready var v_scroll_bar := get_v_scroll() as ScrollBar @@ -37,13 +38,17 @@ func pointer_input_on_drag_handler(pointer: PointerInputSensor.PointerInputData) var reported_velocity_abs := abs(pointer.velocity.y) var relative_velocity := pointer.relative_position.y * Engine.get_frames_per_second() var relative_velocity_abs := abs(relative_velocity) - var max_velocity := pointer.velocity.y if reported_velocity_abs > relative_velocity_abs else relative_velocity - pointer_drag_velocity = max_velocity * POINTER_VELOCITY_BOOST_FACTOR + pointer_drag_velocity = pointer.velocity.y if reported_velocity_abs > relative_velocity_abs else relative_velocity v_scroll_bar.value -= pointer.relative_position.y + when_last_dragged = OS.get_ticks_msec() func pointer_input_on_end_drag_handler(pointer: PointerInputSensor.PointerInputData): is_pointer_dragging = false + if OS.get_ticks_msec() - when_last_dragged > 20: + pointer_drag_velocity = 0.0 + else: + pointer_drag_velocity *= POINTER_VELOCITY_BOOST_FACTOR func pointer_input_on_click_handler(pointer: PointerInputSensor.PointerInputData): diff --git a/touch_vertical_container/touch_vertical_container.gd b/touch_vertical_container/touch_vertical_container.gd index 07b8714..4633c64 100644 --- a/touch_vertical_container/touch_vertical_container.gd +++ b/touch_vertical_container/touch_vertical_container.gd @@ -1,11 +1,12 @@ extends ScrollContainer class_name TouchVerticalContainer -const POINTER_VELOCITY_DECAYING_FACTOR: float = 2.5 -const POINTER_VELOCITY_BOOST_FACTOR: float = 1.5 +const POINTER_VELOCITY_DECAYING_FACTOR: float = PI +const POINTER_VELOCITY_BOOST_FACTOR: float = 1.25 var is_pointer_dragging := false var pointer_drag_velocity := 0.0 +var when_last_dragged := 0 var exclude_controls := [] onready var controls = get_node("controls") @@ -34,6 +35,7 @@ func _ready(): sensor.connect("on_drag", self, "pointer_input_on_drag_handler") sensor.connect("on_end_drag", self, "pointer_input_on_end_drag_handler") sensor.connect("on_click", self, "pointer_input_on_click_handler") + sensor.connect("on_scroll", self, "pointer_input_on_scroll_handler") func _process(delta: float): @@ -53,13 +55,17 @@ func pointer_input_on_drag_handler(pointer: PointerInputSensor.PointerInputData) var reported_velocity_abs := abs(pointer.velocity.y) var relative_velocity := pointer.relative_position.y * Engine.get_frames_per_second() var relative_velocity_abs := abs(relative_velocity) - var max_velocity := pointer.velocity.y if reported_velocity_abs > relative_velocity_abs else relative_velocity - pointer_drag_velocity = max_velocity * POINTER_VELOCITY_BOOST_FACTOR + pointer_drag_velocity = pointer.velocity.y if reported_velocity_abs > relative_velocity_abs else relative_velocity self.scroll_vertical -= pointer.relative_position.y + when_last_dragged = OS.get_ticks_msec() func pointer_input_on_end_drag_handler(pointer: PointerInputSensor.PointerInputData): is_pointer_dragging = false + if OS.get_ticks_msec() - when_last_dragged > 20: + pointer_drag_velocity = 0.0 + else: + pointer_drag_velocity *= POINTER_VELOCITY_BOOST_FACTOR func pointer_input_on_click_handler(pointer: PointerInputSensor.PointerInputData): @@ -105,3 +111,8 @@ func pointer_input_on_click_handler(pointer: PointerInputSensor.PointerInputData break +func pointer_input_on_scroll_handler(pointer: PointerInputSensor.PointerInputData): + var target := self + target._gui_input(pointer.event) + + -- cgit v1.2.3