extends ItemList class_name TouchItemList const POINTER_VELOCITY_DECAYING_FACTOR: float = 2.5 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 func pointer_input_on_drag_handler(pointer: PointerInputSensor.PointerInputData): is_pointer_dragging = true pointer_drag_velocity = pointer.velocity.y 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 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 pointer_input_on_scroll_handler(pointer: PointerInputSensor.PointerInputData): var target := self target._gui_input(pointer.event)