diff options
| author | dam <dam@gudinoff> | 2021-12-06 00:45:18 +0000 |
|---|---|---|
| committer | dam <dam@gudinoff> | 2021-12-06 00:45:18 +0000 |
| commit | ab3e8de3e1d107d42ba62571ea7d17e741203123 (patch) | |
| tree | d0186b0844ff503733f0cacc27d6f40cb7cddd99 | |
| parent | 1a575d34a178fdcc0d6e72a22e8de1e6da7c88c4 (diff) | |
| download | surgery-log-ab3e8de3e1d107d42ba62571ea7d17e741203123.tar.zst surgery-log-ab3e8de3e1d107d42ba62571ea7d17e741203123.zip | |
Avoid invalid dates on date picker.
| -rw-r--r-- | date_picker/date_picker.gd | 65 | ||||
| -rw-r--r-- | date_picker/date_picker.tscn | 48 | ||||
| -rw-r--r-- | date_picker/value_picker.gd (renamed from date_picker/scroll_picker.gd) | 25 | ||||
| -rw-r--r-- | project.godot | 16 |
4 files changed, 113 insertions, 41 deletions
diff --git a/date_picker/date_picker.gd b/date_picker/date_picker.gd new file mode 100644 index 0000000..6298156 --- /dev/null +++ b/date_picker/date_picker.gd @@ -0,0 +1,65 @@ +extends Control + +class_name DatePicker + +const days_per_month: Dictionary = { + 1: 31, + 2: 28, + 3: 31, + 4: 30, + 5: 31, + 6: 30, + 7: 31, + 8: 31, + 9: 30, + 10: 31, + 11: 30, + 12: 31, +} + +onready var year_picker: ValuePicker = get_node("year") +onready var month_picker: ValuePicker = get_node("month") +onready var day_picker: ValuePicker = get_node("day") + + +func _process(delta: float): + var year := year_picker.value + var month := month_picker.value + var day := day_picker.value + var days_on_month: int = days_per_month[month] + + var is_leap_year := (year % 4 == 0 && year % 100 != 0) || year % 400 == 0 + if is_leap_year && month == 2: + days_on_month = 29 + + if day > days_on_month: + day_picker.value = days_on_month + day_picker.max_value = days_on_month + + +func get_day() -> int: + return day_picker.value + + +func get_month() -> int: + return month_picker.value + + +func get_year() -> int: + return year_picker.value + + +func get_date() -> Dictionary: + return { + year = year_picker.value, + month = month_picker.value, + day = day_picker.value, + } + + +func set_date(new_year: int, new_month: int, new_day: int): + year_picker.value = new_year + month_picker.value = new_month + day_picker.value = new_day + + diff --git a/date_picker/date_picker.tscn b/date_picker/date_picker.tscn index 3414283..c7fc7c7 100644 --- a/date_picker/date_picker.tscn +++ b/date_picker/date_picker.tscn @@ -1,16 +1,18 @@ -[gd_scene load_steps=2 format=2] +[gd_scene load_steps=3 format=2] -[ext_resource path="res://date_picker/scroll_picker.gd" type="Script" id=1] +[ext_resource path="res://date_picker/value_picker.gd" type="Script" id=1] +[ext_resource path="res://date_picker/date_picker.gd" type="Script" id=2] [node name="date_picker" type="Control"] anchor_right = 1.0 anchor_bottom = 1.0 mouse_filter = 2 +script = ExtResource( 2 ) __meta__ = { "_edit_use_anchors_": false } -[node name="year_value" type="Control" parent="."] +[node name="year" type="Control" parent="."] anchor_right = 0.333 anchor_bottom = 1.0 script = ExtResource( 1 ) @@ -19,7 +21,7 @@ __meta__ = { } max_value = 9999 -[node name="previous" type="Label" parent="year_value"] +[node name="previous" type="Label" parent="year"] anchor_right = 1.0 anchor_bottom = 0.333 mouse_filter = 1 @@ -29,7 +31,7 @@ __meta__ = { "_edit_use_anchors_": false } -[node name="current" type="Label" parent="year_value"] +[node name="current" type="Label" parent="year"] anchor_top = 0.333 anchor_right = 1.0 anchor_bottom = 0.666 @@ -40,16 +42,16 @@ __meta__ = { "_edit_use_anchors_": false } -[node name="input" type="LineEdit" parent="year_value/current"] +[node name="input" type="LineEdit" parent="year/current"] visible = false anchor_right = 1.0 anchor_bottom = 1.0 -focus_next = NodePath("../../../month_value/current/input") +focus_next = NodePath("../../../month/current/input") align = 1 max_length = 4 caret_blink = true -[node name="next" type="Label" parent="year_value"] +[node name="next" type="Label" parent="year"] anchor_top = 0.666 anchor_right = 1.0 anchor_bottom = 1.0 @@ -60,7 +62,7 @@ __meta__ = { "_edit_use_anchors_": false } -[node name="month_value" type="Control" parent="."] +[node name="month" type="Control" parent="."] anchor_left = 0.333 anchor_right = 0.666 anchor_bottom = 1.0 @@ -68,7 +70,7 @@ script = ExtResource( 1 ) min_value = 1 max_value = 12 -[node name="previous" type="Label" parent="month_value"] +[node name="previous" type="Label" parent="month"] anchor_right = 1.0 anchor_bottom = 0.333 mouse_filter = 1 @@ -78,7 +80,7 @@ __meta__ = { "_edit_use_anchors_": false } -[node name="current" type="Label" parent="month_value"] +[node name="current" type="Label" parent="month"] anchor_top = 0.333 anchor_right = 1.0 anchor_bottom = 0.666 @@ -89,17 +91,17 @@ __meta__ = { "_edit_use_anchors_": false } -[node name="input" type="LineEdit" parent="month_value/current"] +[node name="input" type="LineEdit" parent="month/current"] visible = false anchor_right = 1.0 anchor_bottom = 1.0 -focus_next = NodePath("../../../day_value/current/input") -focus_previous = NodePath("../../../year_value/current/input") +focus_next = NodePath("../../../day/current/input") +focus_previous = NodePath("../../../year/current/input") align = 1 max_length = 2 caret_blink = true -[node name="next" type="Label" parent="month_value"] +[node name="next" type="Label" parent="month"] anchor_top = 0.666 anchor_right = 1.0 anchor_bottom = 1.0 @@ -110,7 +112,7 @@ __meta__ = { "_edit_use_anchors_": false } -[node name="day_value" type="Control" parent="."] +[node name="day" type="Control" parent="."] anchor_left = 0.666 anchor_right = 1.0 anchor_bottom = 1.0 @@ -121,7 +123,7 @@ __meta__ = { min_value = 1 max_value = 31 -[node name="previous" type="Label" parent="day_value"] +[node name="previous" type="Label" parent="day"] anchor_right = 1.0 anchor_bottom = 0.333 mouse_filter = 1 @@ -131,7 +133,7 @@ __meta__ = { "_edit_use_anchors_": false } -[node name="current" type="Label" parent="day_value"] +[node name="current" type="Label" parent="day"] anchor_top = 0.333 anchor_right = 1.0 anchor_bottom = 0.666 @@ -142,16 +144,16 @@ __meta__ = { "_edit_use_anchors_": false } -[node name="input" type="LineEdit" parent="day_value/current"] +[node name="input" type="LineEdit" parent="day/current"] visible = false anchor_right = 1.0 anchor_bottom = 1.0 -focus_previous = NodePath("../../../month_value/current/input") +focus_previous = NodePath("../../../month/current/input") align = 1 max_length = 2 caret_blink = true -[node name="next" type="Label" parent="day_value"] +[node name="next" type="Label" parent="day"] anchor_top = 0.666 anchor_right = 1.0 anchor_bottom = 1.0 @@ -162,7 +164,7 @@ __meta__ = { "_edit_use_anchors_": false } -[node name="split_previous" type="ColorRect" parent="."] +[node name="split_upper" type="ColorRect" parent="."] anchor_top = 0.333 anchor_right = 1.0 anchor_bottom = 0.343 @@ -171,7 +173,7 @@ __meta__ = { "_edit_use_anchors_": false } -[node name="split_next" type="ColorRect" parent="."] +[node name="split_lower" type="ColorRect" parent="."] anchor_top = 0.666 anchor_right = 1.0 anchor_bottom = 0.676 diff --git a/date_picker/scroll_picker.gd b/date_picker/value_picker.gd index 7d3004a..98c9755 100644 --- a/date_picker/scroll_picker.gd +++ b/date_picker/value_picker.gd @@ -1,5 +1,7 @@ extends Control +class_name ValuePicker + const VELOCITY_DECAYING_FACTOR: float = 5.5 const BINNING_THRESHOLD: float = 0.75 const BINNING_ADJUST_P: float = 5.0 @@ -7,16 +9,16 @@ const BINNING_ADJUST_P: float = 5.0 export var min_value: int export var max_value: int +onready var input: LineEdit = get_node("current/input") +onready var label_previous: Label = get_node("previous") +onready var label_current: Label = get_node("current") +onready var label_next: Label = get_node("next") + var pointer: Dictionary var anchor: float var value: int var offset: float -var input: LineEdit -var label_previous: Label -var label_current: Label -var label_next: Label - var scroll_unit_height: float var label_previous_base_position: float var label_current_base_position: float @@ -33,15 +35,10 @@ func _ready(): is_active = false, } - input = get_node("current/input") input.connect("text_entered", self, "input_text_entered") input.connect("focus_entered", self, "input_focus_entered") input.connect("focus_exited", self, "input_focus_exited") - label_previous = get_node("previous") - label_current = get_node("current") - label_next = get_node("next") - scroll_unit_height = label_current.rect_size.y label_previous_base_position = label_previous.rect_position.y label_current_base_position = label_current.rect_position.y @@ -127,11 +124,3 @@ func input_focus_exited(): input.visible = false -func set_value(new_value: int): - value = new_value - - -func get_value() -> int: - return value - - diff --git a/project.godot b/project.godot index fa00ba4..adc16f7 100644 --- a/project.godot +++ b/project.godot @@ -8,6 +8,22 @@ config_version=4 +_global_script_classes=[ { +"base": "Control", +"class": "DatePicker", +"language": "GDScript", +"path": "res://date_picker/date_picker.gd" +}, { +"base": "Control", +"class": "ValuePicker", +"language": "GDScript", +"path": "res://date_picker/value_picker.gd" +} ] +_global_script_class_icons={ +"DatePicker": "", +"ValuePicker": "" +} + [application] config/name="Surgery Log" |
