1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
|
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
grab_focus()
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 selected_idx := get_item_at_position(pointer.current_position - rect_global_position, true)
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)
|