aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authordam <dam@gudinoff>2021-12-06 00:45:18 +0000
committerdam <dam@gudinoff>2021-12-06 00:45:18 +0000
commitab3e8de3e1d107d42ba62571ea7d17e741203123 (patch)
treed0186b0844ff503733f0cacc27d6f40cb7cddd99
parent1a575d34a178fdcc0d6e72a22e8de1e6da7c88c4 (diff)
downloadsurgery-log-ab3e8de3e1d107d42ba62571ea7d17e741203123.tar.zst
surgery-log-ab3e8de3e1d107d42ba62571ea7d17e741203123.zip
Avoid invalid dates on date picker.
-rw-r--r--date_picker/date_picker.gd65
-rw-r--r--date_picker/date_picker.tscn48
-rw-r--r--date_picker/value_picker.gd (renamed from date_picker/scroll_picker.gd)25
-rw-r--r--project.godot16
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"