aboutsummaryrefslogtreecommitdiff
path: root/date_picker/scroll_picker.gd
diff options
context:
space:
mode:
Diffstat (limited to 'date_picker/scroll_picker.gd')
-rw-r--r--date_picker/scroll_picker.gd118
1 files changed, 118 insertions, 0 deletions
diff --git a/date_picker/scroll_picker.gd b/date_picker/scroll_picker.gd
new file mode 100644
index 0000000..ba70084
--- /dev/null
+++ b/date_picker/scroll_picker.gd
@@ -0,0 +1,118 @@
+extends Control
+
+const MAX_POINTERS = 10
+
+var pointer: Dictionary
+var value: float = 0.0
+var anchor: float = 0.0
+var pointer_id: int = -1
+var start_pos: float = 0.0
+var pos: float = 0.0
+
+
+func _ready():
+ pointer = {
+ index = -1,
+ initial_position = Vector2.ZERO,
+ current_position = Vector2.ZERO,
+ relative = Vector2.ZERO,
+ velocity = Vector2.ZERO,
+ is_active = false,
+ timestamp = 0
+ }
+
+
+
+func _process(delta: float):
+# $label.text = "%s" % pointer.index
+ pointer.velocity *= clamp((1.0 - 5.5 * delta), 0.0, 1.0) # pow(1.0-0.995, delta)
+ if pointer.is_active:
+ value = anchor + (pointer.current_position.y - pointer.initial_position.y)
+ elif is_zero_approx(pointer.velocity.y) == false:
+ value += pointer.velocity.y * delta
+ if abs(pointer.velocity.y) < 50.0:
+ var max_value := 10
+ var scroll_unit_height := 80
+ var normalized_value := -value / scroll_unit_height
+ var normalized_int_value := round(normalized_value) as int
+ var logic_value := fposmod(normalized_int_value, max_value)
+ var fix := ((normalized_int_value as float) - normalized_value) * scroll_unit_height
+ value -= fix * 5.0 * delta
+
+# pointer.timestamp = OS.get_ticks_msec()
+# ($test as TextureRect).rect_global_position.y = value
+# $debug.text = "value: %s\nvelocity: %s\n%s" % [value, pointer.velocity, pointer.relative]
+ var current_pos = value
+ var turn_over := 800
+ if current_pos >= turn_over || current_pos < 0.0:
+ value = fposmod(current_pos, turn_over)
+# elif current_pos < 0:
+# value = 800 - current_pos
+
+
+ var max_value := 10
+ var scroll_unit_height := 40
+ var normalized_value := -value / scroll_unit_height
+ var normalized_int_value := round(normalized_value) as int
+ var logic_value := fposmod(normalized_int_value, max_value)
+ var logic_next_value := fposmod(normalized_int_value + 1, max_value)
+ var logic_previous_value := fposmod(normalized_int_value - 1, max_value)
+
+ var value_base_position := 140.0 # 180.0
+ var value_next_base_position := 180.0 # 260.0
+ var value_previous_base_position := 100.0
+
+ $value.text = "%d" % logic_value
+ $value_next.text = "%d" % logic_next_value
+ $value_previous.text = "%d" % logic_previous_value
+# $debug.text = "%s" % normalized_value
+
+ ($value as Label).rect_position.y = value_base_position - (normalized_value - normalized_int_value) * scroll_unit_height
+ ($value_previous as Label).rect_position.y = value_previous_base_position - (normalized_value - normalized_int_value) * scroll_unit_height
+ ($value_next as Label).rect_position.y = value_next_base_position - (normalized_value - normalized_int_value) * scroll_unit_height
+
+# ($value as Label).modulate.a = (scroll_unit_height - (normalized_value - normalized_int_value) * scroll_unit_height) / (scroll_unit_height as float)
+# $debug.text = "%s ..." % [normalized_int_value - normalized_value]
+ ($value_next as Label).modulate.a = ((normalized_value - normalized_int_value) + 0.5)
+ ($value_previous as Label).modulate.a = ((normalized_int_value - normalized_value) + 0.5)
+# ($value_previous as Label).modulate.a = ((normalized_value + normalized_int_value) * scroll_unit_height) / (scroll_unit_height as float)
+#
+#func _input(event: InputEvent):
+# $log.text += "> input: %s\n" % event.to_string()
+# if event is InputEventScreenTouch && event.pressed == false:
+# pointer.index = -1
+
+func _gui_input(event: InputEvent):
+# get_tree().set_input_as_handled()
+# if event is InputEventScreenTouch && event.pressed == false:
+# $label.text = "AUTCH"
+# $log.text += "> event: %s\n" % event.to_string()
+
+ if event is InputEventScreenTouch:
+# if (event is InputEventScreenTouch && pointer.is_active && pointer.index == event.index
+# || event is InputEventScreenTouch && pointer.is_active == false):
+ var touch := event as InputEventScreenTouch
+ pointer.is_active = event.pressed
+ pointer.current_position = touch.position
+ var time := OS.get_ticks_msec()
+ if pointer.is_active:
+ pointer.index = touch.index
+ pointer.initial_position = touch.position
+ anchor = value
+ else:
+ pointer.index = -1
+# elif abs(pointer.timestamp - time) > 50.0:
+# pointer.velocity = Vector2.ZERO
+# if pointer.is_active == false:
+# $output.text += "%10d: touch %d\n" % [abs(pointer.timestamp - time), touch.index]
+
+ if event is InputEventScreenDrag: # && pointer.index == event.index:
+ var drag := event as InputEventScreenDrag
+ pointer.current_position = drag.position
+ pointer.velocity = drag.speed
+# $label.text = "%s"%drag.speed
+ pointer.relative = drag.relative
+ pointer.timestamp = OS.get_ticks_msec()
+# $output.text += "%10d: drag %d\n" % [pointer.timestamp, drag.index]
+
+