aboutsummaryrefslogtreecommitdiff
path: root/date_picker
diff options
context:
space:
mode:
authordam <dam@gudinoff>2021-12-02 22:19:02 +0000
committerdam <dam@gudinoff>2021-12-02 22:19:02 +0000
commit7d515712404db480b6ba6eb45576ecc74988acd3 (patch)
tree0da9c6f9e024d188da3e6f903ac0710d8d7921de /date_picker
parent6bd6e27851f7beda9c279ddcd9b5c816569e2614 (diff)
downloadsurgery-log-7d515712404db480b6ba6eb45576ecc74988acd3.tar.zst
surgery-log-7d515712404db480b6ba6eb45576ecc74988acd3.zip
Implement date picker prototype.
Diffstat (limited to 'date_picker')
-rw-r--r--date_picker/date_picker.tscn147
-rw-r--r--date_picker/scroll_picker.gd118
2 files changed, 265 insertions, 0 deletions
diff --git a/date_picker/date_picker.tscn b/date_picker/date_picker.tscn
new file mode 100644
index 0000000..88f98d8
--- /dev/null
+++ b/date_picker/date_picker.tscn
@@ -0,0 +1,147 @@
+[gd_scene load_steps=2 format=2]
+
+[ext_resource path="res://date_picker/scroll_picker.gd" type="Script" id=1]
+
+[node name="date_picker" type="HBoxContainer"]
+anchor_right = 1.0
+anchor_bottom = 1.0
+mouse_filter = 2
+alignment = 1
+__meta__ = {
+"_edit_use_anchors_": false
+}
+
+[node name="day_scroll" type="Control" parent="."]
+margin_left = 5.0
+margin_right = 239.0
+margin_bottom = 1280.0
+rect_min_size = Vector2( 234, 0 )
+script = ExtResource( 1 )
+__meta__ = {
+"_edit_use_anchors_": false
+}
+
+[node name="label" type="Label" parent="day_scroll"]
+anchor_right = 1.0
+text = "day"
+align = 1
+__meta__ = {
+"_edit_use_anchors_": false
+}
+
+[node name="value_previous" type="Label" parent="day_scroll"]
+anchor_right = 1.0
+margin_bottom = 80.0
+mouse_filter = 1
+align = 1
+__meta__ = {
+"_edit_use_anchors_": false
+}
+
+[node name="value" type="Label" parent="day_scroll"]
+anchor_right = 1.0
+margin_top = 80.0
+margin_bottom = 160.0
+mouse_filter = 1
+align = 1
+__meta__ = {
+"_edit_use_anchors_": false
+}
+
+[node name="value_next" type="Label" parent="day_scroll"]
+anchor_right = 1.0
+margin_top = 160.0
+margin_bottom = 240.0
+mouse_filter = 1
+align = 1
+__meta__ = {
+"_edit_use_anchors_": false
+}
+
+[node name="month_scroll" type="Control" parent="."]
+margin_left = 243.0
+margin_right = 477.0
+margin_bottom = 1280.0
+rect_min_size = Vector2( 234, 0 )
+script = ExtResource( 1 )
+
+[node name="label" type="Label" parent="month_scroll"]
+anchor_right = 1.0
+text = "month"
+align = 1
+__meta__ = {
+"_edit_use_anchors_": false
+}
+
+[node name="value_previous" type="Label" parent="month_scroll"]
+anchor_right = 1.0
+margin_bottom = 80.0
+mouse_filter = 1
+align = 1
+__meta__ = {
+"_edit_use_anchors_": false
+}
+
+[node name="value" type="Label" parent="month_scroll"]
+anchor_right = 1.0
+margin_top = 80.0
+margin_bottom = 160.0
+mouse_filter = 1
+align = 1
+__meta__ = {
+"_edit_use_anchors_": false
+}
+
+[node name="value_next" type="Label" parent="month_scroll"]
+anchor_right = 1.0
+margin_top = 160.0
+margin_bottom = 240.0
+mouse_filter = 1
+align = 1
+__meta__ = {
+"_edit_use_anchors_": false
+}
+
+[node name="year_scroll" type="Control" parent="."]
+margin_left = 481.0
+margin_right = 715.0
+margin_bottom = 1280.0
+rect_min_size = Vector2( 234, 0 )
+script = ExtResource( 1 )
+
+[node name="label" type="Label" parent="year_scroll"]
+anchor_right = 1.0
+text = "year"
+align = 1
+__meta__ = {
+"_edit_use_anchors_": false
+}
+
+[node name="value_previous" type="Label" parent="year_scroll"]
+anchor_right = 1.0
+margin_bottom = 80.0
+mouse_filter = 1
+align = 1
+__meta__ = {
+"_edit_use_anchors_": false
+}
+
+[node name="value" type="Label" parent="year_scroll"]
+anchor_right = 1.0
+margin_top = 80.0
+margin_bottom = 160.0
+mouse_filter = 1
+align = 1
+__meta__ = {
+"_edit_use_anchors_": false
+}
+
+[node name="value_next" type="Label" parent="year_scroll"]
+anchor_right = 1.0
+margin_top = 160.0
+margin_bottom = 240.0
+mouse_filter = 1
+align = 1
+__meta__ = {
+"_edit_use_anchors_": false
+}
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]
+
+