extends ItemList class_name TouchItemList const POINTER_VELOCITY_DECAYING_FACTOR: float = 2.5 const POINTER_VELOCITY_BOOST_FACTOR: float = 1.5 const EXACT_SELECTION: bool = false var is_pointer_dragging := false var pointer_drag_velocity := 0.0 onready var sensor := get_node("sensor") as PointerInputSensor onready var v_scroll_bar := get_v_scroll() as ScrollBar func _ready(): sensor.connect("on_press", self, "pointer_input_on_press_handler") 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): # 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 pointer_input_on_press_handler(pointer: PointerInputSensor.PointerInputData): is_pointer_dragging = true grab_focus() func pointer_input_on_drag_handler(pointer: PointerInputSensor.PointerInputData): is_pointer_dragging = true 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 v_scroll_bar.value -= pointer.relative_position.y func pointer_input_on_end_drag_handler(pointer: PointerInputSensor.PointerInputData): is_pointer_dragging = false func pointer_input_on_click_handler(pointer: PointerInputSensor.PointerInputData): var selected_idx := get_item_at_position(pointer.current_position - rect_global_position, EXACT_SELECTION) if selected_idx >= 0: select(selected_idx) emit_signal("item_selected", selected_idx) else: unselect_all() emit_signal("nothing_selected") func pointer_input_on_scroll_handler(pointer: PointerInputSensor.PointerInputData): var target := self target._gui_input(pointer.event)