diff options
| author | dam <dam@gudinoff> | 2021-12-02 22:19:02 +0000 |
|---|---|---|
| committer | dam <dam@gudinoff> | 2021-12-02 22:19:02 +0000 |
| commit | 7d515712404db480b6ba6eb45576ecc74988acd3 (patch) | |
| tree | 0da9c6f9e024d188da3e6f903ac0710d8d7921de /date_picker | |
| parent | 6bd6e27851f7beda9c279ddcd9b5c816569e2614 (diff) | |
| download | surgery-log-7d515712404db480b6ba6eb45576ecc74988acd3.tar.zst surgery-log-7d515712404db480b6ba6eb45576ecc74988acd3.zip | |
Implement date picker prototype.
Diffstat (limited to 'date_picker')
| -rw-r--r-- | date_picker/date_picker.tscn | 147 | ||||
| -rw-r--r-- | date_picker/scroll_picker.gd | 118 |
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] + + |
