diff options
Diffstat (limited to 'touch_scroll.gd')
| -rw-r--r-- | touch_scroll.gd | 66 |
1 files changed, 66 insertions, 0 deletions
diff --git a/touch_scroll.gd b/touch_scroll.gd new file mode 100644 index 0000000..ea92087 --- /dev/null +++ b/touch_scroll.gd @@ -0,0 +1,66 @@ +extends Control + + +func _gui_input(event: InputEvent): +#func _input(event: InputEvent): +# return + if event is InputEventScreenDrag: + self.v_scroll.value -= event.relative.y +# accept_event() + +#func _gui_input(event): +# accept_event() +# get_tree().set_input_as_handled() +# if event is InputEventScreenDrag: +# get_parent().v_scroll.value -= event.relative.y + + +export(float) var drag_threshold = 5 +onready var touch_enabled = OS.has_touchscreen_ui_hint() +onready var v_scroll = get_parent().get_v_scroll() + +var dragging = false +var pressed = false +var last_event +# must be _input, as _gui_input has bugs, with no touch.pressed = false events +# see: https://github.com/godotengine/godot/issues/16761 +func _input_disabled(event): +#func _gui_input(event): + + if not visible: + return + + if not touch_enabled: + return + + if event is InputEventScreenDrag: + accept_event() + if event.speed == Vector2(): + # we're on a device and speed is broken + # see: https://github.com/godotengine/godot/issues/3623 + event.speed = event.relative + if abs(event.speed.y) >= drag_threshold: + # scroll the list + dragging = true + v_scroll.value -= event.relative.y + return + + if event is InputEventScreenTouch: + if event.index == 0: + accept_event() + if dragging && event.pressed == false: + # prints("end drag") + dragging = false + pressed = false + else: + if event.pressed && pressed == false: + # prints("touch start") + pressed = true + # TODO: prevent select highlight + elif !event.pressed && pressed == true: + # prints("touch end and accept") + pressed = false + var ev = InputEventAction.new() + ev.action = "ui_accept" + ev.pressed = true + Input.parse_input_event(ev) |
