aboutsummaryrefslogtreecommitdiff
path: root/ui/touch_item_list
diff options
context:
space:
mode:
authordam <dam@gudinoff>2022-04-18 09:06:19 +0000
committerdam <dam@gudinoff>2022-04-18 09:06:19 +0000
commit79691f93bab7aa093bb606bfb80d2b4b236ee091 (patch)
tree6e90c6601893895d7640f478f0cad402cc7590b4 /ui/touch_item_list
parent697e1ba3c4cb0a96c4584f1553de368d46287ab7 (diff)
parentee31a9a3d387121030a5f4503adeac5816d7726f (diff)
downloadsurgery-log-79691f93bab7aa093bb606bfb80d2b4b236ee091.tar.zst
surgery-log-79691f93bab7aa093bb606bfb80d2b4b236ee091.zip
Merge godot branch.v1.0
Diffstat (limited to 'ui/touch_item_list')
-rw-r--r--ui/touch_item_list/touch_item_list.gd68
-rw-r--r--ui/touch_item_list/touch_item_list.tscn19
2 files changed, 87 insertions, 0 deletions
diff --git a/ui/touch_item_list/touch_item_list.gd b/ui/touch_item_list/touch_item_list.gd
new file mode 100644
index 0000000..6794138
--- /dev/null
+++ b/ui/touch_item_list/touch_item_list.gd
@@ -0,0 +1,68 @@
+extends ItemList
+class_name TouchItemList
+
+const POINTER_VELOCITY_DECAYING_FACTOR: float = PI
+const POINTER_VELOCITY_BOOST_FACTOR: float = 1.25
+const EXACT_SELECTION: bool = true
+
+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
+
+
+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)
+ 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):
+ 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)
+
+
diff --git a/ui/touch_item_list/touch_item_list.tscn b/ui/touch_item_list/touch_item_list.tscn
new file mode 100644
index 0000000..38f9a7e
--- /dev/null
+++ b/ui/touch_item_list/touch_item_list.tscn
@@ -0,0 +1,19 @@
+[gd_scene load_steps=3 format=2]
+
+[ext_resource path="res://ui/pointer_input_sensor.gd" type="Script" id=1]
+[ext_resource path="res://ui/touch_item_list/touch_item_list.gd" type="Script" id=2]
+
+[node name="item_list" type="ItemList"]
+anchor_right = 1.0
+anchor_bottom = 1.0
+mouse_filter = 2
+script = ExtResource( 2 )
+
+[node name="sensor" type="Control" parent="."]
+anchor_right = 1.0
+anchor_bottom = 1.0
+margin_right = -8.0
+script = ExtResource( 1 )
+__meta__ = {
+"_edit_use_anchors_": false
+}