From e604c51ee9a01a67c81a2896cf167a8850f17320 Mon Sep 17 00:00:00 2001 From: Dylan Sarrazyn Date: Wed, 31 Jan 2024 16:56:35 +0100 Subject: [PATCH] Adds steps logic for the register form. --- LICENSE | 21 + .../godot-form-validator/control_validator.gd | 62 +++ addons/godot-form-validator/editor_icon.png | Bin 0 -> 524 bytes .../editor_icon.png.import | 34 ++ .../godot-form-validator/example/example.gd | 34 ++ .../godot-form-validator/example/example.tscn | 441 ++++++++++++++++++ addons/godot-form-validator/form_validator.gd | 125 +++++ addons/godot-form-validator/plugin.cfg | 7 + addons/godot-form-validator/plugin.gd | 14 + .../godot-form-validator/rules/alpha_rule.gd | 16 + .../rules/alphanumeric_rule.gd | 16 + .../rules/boolean_rule.gd | 15 + .../godot-form-validator/rules/custom_rule.gd | 36 ++ .../rules/does_not_match_rule.gd | 26 ++ .../godot-form-validator/rules/email_rule.gd | 16 + .../godot-form-validator/rules/equals_rule.gd | 15 + .../rules/greater_than_rule.gd | 15 + .../godot-form-validator/rules/length_rule.gd | 28 ++ .../rules/less_than_rule.gd | 15 + .../rules/matches_rule.gd | 26 ++ .../rules/not_blank_rule.gd | 16 + .../rules/not_empty_rule.gd | 16 + .../rules/numeric_rule.gd | 16 + .../rules/required_rule.gd | 18 + .../godot-form-validator/rules/rule_result.gd | 5 + .../rules/validator_rule.gd | 17 + addons/godot-form-validator/validation.gd | 39 ++ .../validator_functions.gd | 66 +++ .../validators/button_validator.gd | 14 + .../validators/line_edit_validator.gd | 14 + .../validators/range_validator.gd | 15 + .../validators/text_edit_validator.gd | 14 + .../validators/validator.gd | 37 ++ assets/bonuspath_a_01_complete.png | Bin 0 -> 11975 bytes assets/bonuspath_a_01_complete.png.import | 34 ++ assets/bonuspath_a_01_not_complete.png | Bin 0 -> 3822 bytes assets/bonuspath_a_01_not_complete.png.import | 34 ++ assets/path_a_01.png | Bin 0 -> 52385 bytes assets/path_a_01.png.import | 34 ++ assets/path_b_01.png | Bin 0 -> 47872 bytes assets/path_b_01.png.import | 34 ++ example_rules.png | Bin 0 -> 30463 bytes example_rules.png.import | 34 ++ example_tree.png | Bin 0 -> 22251 bytes example_tree.png.import | 34 ++ icon.png | Bin 0 -> 2143 bytes icon.png.import | 34 ++ logo.png | Bin 0 -> 4256 bytes logo.png.import | 34 ++ project.godot | 4 +- sources/menus/register/register_question.gd | 4 + sources/menus/register/register_screen.gd | 79 ++++ sources/menus/register/register_screen.tscn | 75 +++ sources/menus/register/steps/base_step.gd | 68 +++ sources/menus/register/steps/base_step.tscn | 101 ++++ .../menus/register/steps/credentials_step.gd | 13 + .../register/steps/credentials_step.tscn | 54 +++ .../steps/teacher/devices_count_step.tscn | 20 + .../register/steps/teacher/method_step.tscn | 19 + .../steps/teacher/students_count_step.tscn | 15 + 60 files changed, 1972 insertions(+), 1 deletion(-) create mode 100644 LICENSE create mode 100644 addons/godot-form-validator/control_validator.gd create mode 100644 addons/godot-form-validator/editor_icon.png create mode 100644 addons/godot-form-validator/editor_icon.png.import create mode 100644 addons/godot-form-validator/example/example.gd create mode 100644 addons/godot-form-validator/example/example.tscn create mode 100644 addons/godot-form-validator/form_validator.gd create mode 100644 addons/godot-form-validator/plugin.cfg create mode 100644 addons/godot-form-validator/plugin.gd create mode 100644 addons/godot-form-validator/rules/alpha_rule.gd create mode 100644 addons/godot-form-validator/rules/alphanumeric_rule.gd create mode 100644 addons/godot-form-validator/rules/boolean_rule.gd create mode 100644 addons/godot-form-validator/rules/custom_rule.gd create mode 100644 addons/godot-form-validator/rules/does_not_match_rule.gd create mode 100644 addons/godot-form-validator/rules/email_rule.gd create mode 100644 addons/godot-form-validator/rules/equals_rule.gd create mode 100644 addons/godot-form-validator/rules/greater_than_rule.gd create mode 100644 addons/godot-form-validator/rules/length_rule.gd create mode 100644 addons/godot-form-validator/rules/less_than_rule.gd create mode 100644 addons/godot-form-validator/rules/matches_rule.gd create mode 100644 addons/godot-form-validator/rules/not_blank_rule.gd create mode 100644 addons/godot-form-validator/rules/not_empty_rule.gd create mode 100644 addons/godot-form-validator/rules/numeric_rule.gd create mode 100644 addons/godot-form-validator/rules/required_rule.gd create mode 100644 addons/godot-form-validator/rules/rule_result.gd create mode 100644 addons/godot-form-validator/rules/validator_rule.gd create mode 100644 addons/godot-form-validator/validation.gd create mode 100644 addons/godot-form-validator/validator_functions.gd create mode 100644 addons/godot-form-validator/validators/button_validator.gd create mode 100644 addons/godot-form-validator/validators/line_edit_validator.gd create mode 100644 addons/godot-form-validator/validators/range_validator.gd create mode 100644 addons/godot-form-validator/validators/text_edit_validator.gd create mode 100644 addons/godot-form-validator/validators/validator.gd create mode 100644 assets/bonuspath_a_01_complete.png create mode 100644 assets/bonuspath_a_01_complete.png.import create mode 100644 assets/bonuspath_a_01_not_complete.png create mode 100644 assets/bonuspath_a_01_not_complete.png.import create mode 100644 assets/path_a_01.png create mode 100644 assets/path_a_01.png.import create mode 100644 assets/path_b_01.png create mode 100644 assets/path_b_01.png.import create mode 100644 example_rules.png create mode 100644 example_rules.png.import create mode 100644 example_tree.png create mode 100644 example_tree.png.import create mode 100644 icon.png create mode 100644 icon.png.import create mode 100644 logo.png create mode 100644 logo.png.import create mode 100644 sources/menus/register/register_question.gd create mode 100644 sources/menus/register/register_screen.gd create mode 100644 sources/menus/register/register_screen.tscn create mode 100644 sources/menus/register/steps/base_step.gd create mode 100644 sources/menus/register/steps/base_step.tscn create mode 100644 sources/menus/register/steps/credentials_step.gd create mode 100644 sources/menus/register/steps/credentials_step.tscn create mode 100644 sources/menus/register/steps/teacher/devices_count_step.tscn create mode 100644 sources/menus/register/steps/teacher/method_step.tscn create mode 100644 sources/menus/register/steps/teacher/students_count_step.tscn diff --git a/LICENSE b/LICENSE new file mode 100644 index 00000000..a7e4f2b3 --- /dev/null +++ b/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2023 deadpixelsociety + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/addons/godot-form-validator/control_validator.gd b/addons/godot-form-validator/control_validator.gd new file mode 100644 index 00000000..28f35d94 --- /dev/null +++ b/addons/godot-form-validator/control_validator.gd @@ -0,0 +1,62 @@ +@tool +extends Node +class_name ControlValidator + +@export var validator: Validator: + set(value): + validator = value + _on_validator_added() + + +func _ready() -> void: + tree_entered.connect(_on_tree_entered) + tree_exiting.connect(_on_tree_exiting) + _configure_validator() + _on_validator_added() + + +func _configure_validator() -> void: + if validator != null: + return + var parent = get_parent() + if not parent: + return + var found = Validation.find_validator(parent) + if found: + validator = found.duplicate(true) + else: + validator = Validator.new() + + +func _get_configuration_warnings() -> PackedStringArray: + if not validator: + return [] + var list = PackedStringArray() + for rule in validator.rules: + if not rule.is_valid(): + list.append(rule.get_invalid_message()) + return list + + +func _on_tree_entered() -> void: + _configure_validator() + _on_validator_added() + + +func _on_tree_exiting() -> void: + _on_validator_removed() + + +func _on_validator_added() -> void: + var parent = get_parent() + if not parent or not validator: + return + Validation.validator_added.emit(parent, validator) + update_configuration_warnings() + + +func _on_validator_removed() -> void: + var parent = get_parent() + if not parent: + return + Validation.validator_removed.emit(parent) diff --git a/addons/godot-form-validator/editor_icon.png b/addons/godot-form-validator/editor_icon.png new file mode 100644 index 0000000000000000000000000000000000000000..b3f822f84265497cb4888a6b990d80b8d70a0199 GIT binary patch literal 524 zcmV+n0`vWeP)Px#1ZP1_K>z@;j|==^1poj532;bRa{vGZT>t
$};!`J`-0ij7mK~y+TrISBP z13?hQXZ8}rDrK-xG+-l$g<6PO*w_l9K?K1xrqxQKb&Q~5t>QnBfQf>YUqHmh#t)DP zriut+8ZmM=zTLeT!$l$ZgJfpj?VD_7Z<(5qDdw&aDvBswRa6amyi6qBsaSlLDD1S3+q9mNsYZW<5S}+ZS=t;*`5Vjt_fuP5qykd6?h-F*W;mty>AKh+{ zN33Lcz-Pdw^g>Eavgh^+@fqr{mFbOz#ud!_D1MqtAMZ3KB74Zop65-FD}69$QP<3x zi1sRvR1!tSYKG3XcDh!?tIBnTn4Muv{uH`@l;2de*BoQ!F}H|892>dL9VTF&2HmAA^HOGQ+$wn>eJN# O0000 void: + var error_label = _get_error_label(control) + var valid_label = _get_valid_label(control) + if passed: + if error_label: + error_label.hide() + if valid_label: + valid_label.show() + else: + if error_label: + error_label.text = ", ".join(messages) + error_label.show() + if valid_label: + valid_label.hide() + + +func _get_error_label(control: Control) -> Label: + return find_child(control.name + "Error", true, false) as Label + + +func _get_valid_label(control: Control) -> Label: + return find_child(control.name + "Valid", true, false) as Label + + +func _on_validate_pressed() -> void: + form_validator_control.validate() + + +func _on_exit_pressed() -> void: + get_tree().quit() diff --git a/addons/godot-form-validator/example/example.tscn b/addons/godot-form-validator/example/example.tscn new file mode 100644 index 00000000..e053c21a --- /dev/null +++ b/addons/godot-form-validator/example/example.tscn @@ -0,0 +1,441 @@ +[gd_scene load_steps=41 format=3 uid="uid://dpi5vv8r80o7r"] + +[ext_resource type="Script" path="res://addons/godot-form-validator/example/example.gd" id="1_8caq6"] +[ext_resource type="Script" path="res://addons/godot-form-validator/form_validator.gd" id="2_mtxo0"] +[ext_resource type="Script" path="res://addons/godot-form-validator/control_validator.gd" id="3_hkwup"] +[ext_resource type="Script" path="res://addons/godot-form-validator/rules/alpha_rule.gd" id="4_dq1df"] +[ext_resource type="Script" path="res://addons/godot-form-validator/rules/required_rule.gd" id="5_cu56g"] +[ext_resource type="Script" path="res://addons/godot-form-validator/validators/line_edit_validator.gd" id="5_rknpr"] +[ext_resource type="Script" path="res://addons/godot-form-validator/rules/numeric_rule.gd" id="7_6vtuw"] +[ext_resource type="Script" path="res://addons/godot-form-validator/rules/alphanumeric_rule.gd" id="8_mu0ia"] +[ext_resource type="Script" path="res://addons/godot-form-validator/rules/email_rule.gd" id="9_4ynyw"] +[ext_resource type="Script" path="res://addons/godot-form-validator/rules/length_rule.gd" id="10_iuueu"] +[ext_resource type="Script" path="res://addons/godot-form-validator/rules/greater_than_rule.gd" id="11_1tya3"] +[ext_resource type="Script" path="res://addons/godot-form-validator/validators/range_validator.gd" id="11_51cp7"] +[ext_resource type="Script" path="res://addons/godot-form-validator/validators/button_validator.gd" id="13_eri47"] +[ext_resource type="Script" path="res://addons/godot-form-validator/rules/custom_rule.gd" id="13_ibg52"] +[ext_resource type="Script" path="res://addons/godot-form-validator/rules/boolean_rule.gd" id="15_xjpko"] + +[sub_resource type="LabelSettings" id="LabelSettings_nw8ds"] +font_size = 24 + +[sub_resource type="Resource" id="Resource_i25hd"] +script = ExtResource("5_cu56g") +fail_message = "A value is required." + +[sub_resource type="Resource" id="Resource_4mimn"] +script = ExtResource("4_dq1df") +fail_message = "Value must contain only alpha characters." + +[sub_resource type="Resource" id="Resource_15man"] +script = ExtResource("5_rknpr") +validation_order = 1 +validation_method = 0 +skip_validation = false +rules = Array[Resource("res://addons/godot-form-validator/rules/validator_rule.gd")]([SubResource("Resource_i25hd"), SubResource("Resource_4mimn")]) + +[sub_resource type="LabelSettings" id="LabelSettings_su7t3"] +font_color = Color(1, 0.568627, 0.580392, 1) + +[sub_resource type="LabelSettings" id="LabelSettings_urp4f"] +font_color = Color(0.254902, 0.831373, 0.556863, 1) + +[sub_resource type="Resource" id="Resource_j4pud"] +script = ExtResource("5_cu56g") +fail_message = "A value is required." + +[sub_resource type="Resource" id="Resource_xxhfq"] +script = ExtResource("7_6vtuw") +fail_message = "Value must contain only numbers." + +[sub_resource type="Resource" id="Resource_1t3q0"] +script = ExtResource("5_rknpr") +validation_order = 1 +validation_method = 0 +skip_validation = false +rules = Array[Resource("res://addons/godot-form-validator/rules/validator_rule.gd")]([SubResource("Resource_j4pud"), SubResource("Resource_xxhfq")]) + +[sub_resource type="Resource" id="Resource_ftvbf"] +script = ExtResource("8_mu0ia") +fail_message = "Value must contain only alphanumeric cahracters." + +[sub_resource type="Resource" id="Resource_my5ss"] +script = ExtResource("5_cu56g") +fail_message = "A value is required." + +[sub_resource type="Resource" id="Resource_61y5a"] +script = ExtResource("5_rknpr") +validation_order = 1 +validation_method = 0 +skip_validation = false +rules = Array[Resource("res://addons/godot-form-validator/rules/validator_rule.gd")]([SubResource("Resource_ftvbf"), SubResource("Resource_my5ss")]) + +[sub_resource type="Resource" id="Resource_f3i8j"] +script = ExtResource("9_4ynyw") +fail_message = "Value must be a valid email address." + +[sub_resource type="Resource" id="Resource_l5e3w"] +script = ExtResource("5_cu56g") +fail_message = "A value is required." + +[sub_resource type="Resource" id="Resource_q4oax"] +script = ExtResource("5_rknpr") +validation_order = 1 +validation_method = 0 +skip_validation = false +rules = Array[Resource("res://addons/godot-form-validator/rules/validator_rule.gd")]([SubResource("Resource_f3i8j"), SubResource("Resource_l5e3w")]) + +[sub_resource type="Resource" id="Resource_d1g5r"] +script = ExtResource("5_cu56g") +fail_message = "A value is required." + +[sub_resource type="Resource" id="Resource_jqdfw"] +script = ExtResource("10_iuueu") +min_length = 5 +max_length = 10 +fail_message = "" + +[sub_resource type="Resource" id="Resource_62odm"] +script = ExtResource("5_rknpr") +validation_order = 1 +validation_method = 0 +skip_validation = false +rules = Array[Resource("res://addons/godot-form-validator/rules/validator_rule.gd")]([SubResource("Resource_d1g5r"), SubResource("Resource_jqdfw")]) + +[sub_resource type="Resource" id="Resource_qm2iv"] +script = ExtResource("5_cu56g") +fail_message = "A value is required." + +[sub_resource type="Resource" id="Resource_brbah"] +script = ExtResource("11_1tya3") +target_value = "3" +fail_message = "" + +[sub_resource type="Resource" id="Resource_smogv"] +script = ExtResource("11_51cp7") +validation_order = 1 +validation_method = 0 +skip_validation = false +rules = Array[Resource("res://addons/godot-form-validator/rules/validator_rule.gd")]([SubResource("Resource_qm2iv"), SubResource("Resource_brbah")]) + +[sub_resource type="Resource" id="Resource_4riv3"] +script = ExtResource("13_ibg52") +expression = "control.color.r > 0.5" +fail_message = "The red channel must be greater than 0.5." + +[sub_resource type="Resource" id="Resource_mh7td"] +script = ExtResource("13_eri47") +validation_order = 1 +validation_method = 0 +skip_validation = false +rules = Array[Resource("res://addons/godot-form-validator/rules/validator_rule.gd")]([SubResource("Resource_4riv3")]) + +[sub_resource type="Resource" id="Resource_3nuq2"] +script = ExtResource("15_xjpko") +target_value = true +fail_message = "The check box must be checked." + +[sub_resource type="Resource" id="Resource_kbsj8"] +script = ExtResource("13_eri47") +validation_order = -1 +validation_method = 0 +skip_validation = false +rules = Array[Resource("res://addons/godot-form-validator/rules/validator_rule.gd")]([SubResource("Resource_3nuq2")]) + +[node name="Example" type="PanelContainer"] +anchors_preset = 15 +anchor_right = 1.0 +anchor_bottom = 1.0 +grow_horizontal = 2 +grow_vertical = 2 +script = ExtResource("1_8caq6") + +[node name="MarginContainer" type="MarginContainer" parent="."] +layout_mode = 2 +theme_override_constants/margin_left = 32 +theme_override_constants/margin_top = 32 +theme_override_constants/margin_right = 32 +theme_override_constants/margin_bottom = 32 + +[node name="FormValidator" type="Control" parent="MarginContainer"] +layout_mode = 2 +script = ExtResource("2_mtxo0") +auto_validate = true + +[node name="VBoxContainer2" type="VBoxContainer" parent="MarginContainer/FormValidator"] +layout_mode = 1 +anchors_preset = 15 +anchor_right = 1.0 +anchor_bottom = 1.0 +grow_horizontal = 2 +grow_vertical = 2 + +[node name="Title" type="Label" parent="MarginContainer/FormValidator/VBoxContainer2"] +layout_mode = 2 +text = "Godot Form Validator Examples" +label_settings = SubResource("LabelSettings_nw8ds") +horizontal_alignment = 1 +vertical_alignment = 1 + +[node name="GridContainer" type="GridContainer" parent="MarginContainer/FormValidator/VBoxContainer2"] +layout_mode = 2 +size_flags_vertical = 3 +theme_override_constants/h_separation = 16 +theme_override_constants/v_separation = 16 +columns = 4 + +[node name="Label" type="Label" parent="MarginContainer/FormValidator/VBoxContainer2/GridContainer"] +layout_mode = 2 +text = "Alpha" +vertical_alignment = 1 + +[node name="VBoxContainer" type="VBoxContainer" parent="MarginContainer/FormValidator/VBoxContainer2/GridContainer"] +layout_mode = 2 +size_flags_horizontal = 3 + +[node name="Alpha" type="LineEdit" parent="MarginContainer/FormValidator/VBoxContainer2/GridContainer/VBoxContainer"] +layout_mode = 2 + +[node name="ControlValidator" type="Node" parent="MarginContainer/FormValidator/VBoxContainer2/GridContainer/VBoxContainer/Alpha"] +script = ExtResource("3_hkwup") +validator = SubResource("Resource_15man") + +[node name="AlphaError" type="Label" parent="MarginContainer/FormValidator/VBoxContainer2/GridContainer/VBoxContainer"] +visible = false +layout_mode = 2 +text = "ERROR" +label_settings = SubResource("LabelSettings_su7t3") +autowrap_mode = 2 + +[node name="AlphaValid" type="Label" parent="MarginContainer/FormValidator/VBoxContainer2/GridContainer/VBoxContainer"] +visible = false +layout_mode = 2 +text = "Valid!" +label_settings = SubResource("LabelSettings_urp4f") + +[node name="Label2" type="Label" parent="MarginContainer/FormValidator/VBoxContainer2/GridContainer"] +layout_mode = 2 +text = "Numeric" +vertical_alignment = 1 + +[node name="VBoxContainer2" type="VBoxContainer" parent="MarginContainer/FormValidator/VBoxContainer2/GridContainer"] +layout_mode = 2 +size_flags_horizontal = 3 + +[node name="Numeric" type="LineEdit" parent="MarginContainer/FormValidator/VBoxContainer2/GridContainer/VBoxContainer2"] +layout_mode = 2 + +[node name="ControlValidator" type="Node" parent="MarginContainer/FormValidator/VBoxContainer2/GridContainer/VBoxContainer2/Numeric"] +script = ExtResource("3_hkwup") +validator = SubResource("Resource_1t3q0") + +[node name="NumericError" type="Label" parent="MarginContainer/FormValidator/VBoxContainer2/GridContainer/VBoxContainer2"] +visible = false +layout_mode = 2 +text = "ERROR" +label_settings = SubResource("LabelSettings_su7t3") +autowrap_mode = 2 + +[node name="NumericValid" type="Label" parent="MarginContainer/FormValidator/VBoxContainer2/GridContainer/VBoxContainer2"] +visible = false +layout_mode = 2 +text = "Valid!" +label_settings = SubResource("LabelSettings_urp4f") + +[node name="Label3" type="Label" parent="MarginContainer/FormValidator/VBoxContainer2/GridContainer"] +layout_mode = 2 +text = "Alphanumeric" +vertical_alignment = 1 + +[node name="VBoxContainer3" type="VBoxContainer" parent="MarginContainer/FormValidator/VBoxContainer2/GridContainer"] +layout_mode = 2 +size_flags_horizontal = 3 + +[node name="Alphanumeric" type="LineEdit" parent="MarginContainer/FormValidator/VBoxContainer2/GridContainer/VBoxContainer3"] +layout_mode = 2 + +[node name="ControlValidator" type="Node" parent="MarginContainer/FormValidator/VBoxContainer2/GridContainer/VBoxContainer3/Alphanumeric"] +script = ExtResource("3_hkwup") +validator = SubResource("Resource_61y5a") + +[node name="AlphanumericError" type="Label" parent="MarginContainer/FormValidator/VBoxContainer2/GridContainer/VBoxContainer3"] +visible = false +layout_mode = 2 +text = "ERROR" +label_settings = SubResource("LabelSettings_su7t3") +autowrap_mode = 2 + +[node name="AlphanumericValid" type="Label" parent="MarginContainer/FormValidator/VBoxContainer2/GridContainer/VBoxContainer3"] +visible = false +layout_mode = 2 +text = "Valid!" +label_settings = SubResource("LabelSettings_urp4f") + +[node name="Label4" type="Label" parent="MarginContainer/FormValidator/VBoxContainer2/GridContainer"] +layout_mode = 2 +text = "Email" +vertical_alignment = 1 + +[node name="VBoxContainer4" type="VBoxContainer" parent="MarginContainer/FormValidator/VBoxContainer2/GridContainer"] +layout_mode = 2 +size_flags_horizontal = 3 + +[node name="Email" type="LineEdit" parent="MarginContainer/FormValidator/VBoxContainer2/GridContainer/VBoxContainer4"] +layout_mode = 2 + +[node name="ControlValidator" type="Node" parent="MarginContainer/FormValidator/VBoxContainer2/GridContainer/VBoxContainer4/Email"] +script = ExtResource("3_hkwup") +validator = SubResource("Resource_q4oax") + +[node name="EmailError" type="Label" parent="MarginContainer/FormValidator/VBoxContainer2/GridContainer/VBoxContainer4"] +visible = false +layout_mode = 2 +text = "ERROR" +label_settings = SubResource("LabelSettings_su7t3") +autowrap_mode = 2 + +[node name="EmailValid" type="Label" parent="MarginContainer/FormValidator/VBoxContainer2/GridContainer/VBoxContainer4"] +visible = false +layout_mode = 2 +text = "Valid!" +label_settings = SubResource("LabelSettings_urp4f") + +[node name="Label5" type="Label" parent="MarginContainer/FormValidator/VBoxContainer2/GridContainer"] +layout_mode = 2 +text = "Length" +vertical_alignment = 1 + +[node name="VBoxContainer5" type="VBoxContainer" parent="MarginContainer/FormValidator/VBoxContainer2/GridContainer"] +layout_mode = 2 +size_flags_horizontal = 3 + +[node name="Length" type="LineEdit" parent="MarginContainer/FormValidator/VBoxContainer2/GridContainer/VBoxContainer5"] +layout_mode = 2 + +[node name="ControlValidator" type="Node" parent="MarginContainer/FormValidator/VBoxContainer2/GridContainer/VBoxContainer5/Length"] +script = ExtResource("3_hkwup") +validator = SubResource("Resource_62odm") + +[node name="LengthError" type="Label" parent="MarginContainer/FormValidator/VBoxContainer2/GridContainer/VBoxContainer5"] +visible = false +layout_mode = 2 +text = "ERROR" +label_settings = SubResource("LabelSettings_su7t3") +autowrap_mode = 2 + +[node name="LengthValid" type="Label" parent="MarginContainer/FormValidator/VBoxContainer2/GridContainer/VBoxContainer5"] +visible = false +layout_mode = 2 +text = "Valid!" +label_settings = SubResource("LabelSettings_urp4f") + +[node name="Label6" type="Label" parent="MarginContainer/FormValidator/VBoxContainer2/GridContainer"] +layout_mode = 2 +text = "Value" +vertical_alignment = 1 + +[node name="VBoxContainer6" type="VBoxContainer" parent="MarginContainer/FormValidator/VBoxContainer2/GridContainer"] +layout_mode = 2 +size_flags_horizontal = 3 + +[node name="Value" type="SpinBox" parent="MarginContainer/FormValidator/VBoxContainer2/GridContainer/VBoxContainer6"] +layout_mode = 2 + +[node name="ControlValidator" type="Node" parent="MarginContainer/FormValidator/VBoxContainer2/GridContainer/VBoxContainer6/Value"] +script = ExtResource("3_hkwup") +validator = SubResource("Resource_smogv") + +[node name="ValueError" type="Label" parent="MarginContainer/FormValidator/VBoxContainer2/GridContainer/VBoxContainer6"] +visible = false +layout_mode = 2 +text = "ERROR" +label_settings = SubResource("LabelSettings_su7t3") +autowrap_mode = 2 + +[node name="ValueValid" type="Label" parent="MarginContainer/FormValidator/VBoxContainer2/GridContainer/VBoxContainer6"] +visible = false +layout_mode = 2 +text = "Valid!" +label_settings = SubResource("LabelSettings_urp4f") + +[node name="Label7" type="Label" parent="MarginContainer/FormValidator/VBoxContainer2/GridContainer"] +layout_mode = 2 +text = "Custom" +vertical_alignment = 1 + +[node name="VBoxContainer7" type="VBoxContainer" parent="MarginContainer/FormValidator/VBoxContainer2/GridContainer"] +layout_mode = 2 +size_flags_horizontal = 3 + +[node name="ColorPicker" type="ColorPickerButton" parent="MarginContainer/FormValidator/VBoxContainer2/GridContainer/VBoxContainer7"] +custom_minimum_size = Vector2(0, 32) +layout_mode = 2 +size_flags_vertical = 3 + +[node name="ControlValidator" type="Node" parent="MarginContainer/FormValidator/VBoxContainer2/GridContainer/VBoxContainer7/ColorPicker"] +script = ExtResource("3_hkwup") +validator = SubResource("Resource_mh7td") + +[node name="ColorPickerError" type="Label" parent="MarginContainer/FormValidator/VBoxContainer2/GridContainer/VBoxContainer7"] +visible = false +layout_mode = 2 +text = "ERROR" +label_settings = SubResource("LabelSettings_su7t3") +autowrap_mode = 2 + +[node name="ColorPickerValid" type="Label" parent="MarginContainer/FormValidator/VBoxContainer2/GridContainer/VBoxContainer7"] +visible = false +layout_mode = 2 +text = "Valid!" +label_settings = SubResource("LabelSettings_urp4f") + +[node name="Label8" type="Label" parent="MarginContainer/FormValidator/VBoxContainer2/GridContainer"] +layout_mode = 2 +text = "Checked" +vertical_alignment = 1 + +[node name="VBoxContainer8" type="VBoxContainer" parent="MarginContainer/FormValidator/VBoxContainer2/GridContainer"] +layout_mode = 2 +size_flags_horizontal = 3 + +[node name="Checked" type="CheckBox" parent="MarginContainer/FormValidator/VBoxContainer2/GridContainer/VBoxContainer8"] +custom_minimum_size = Vector2(0, 32) +layout_mode = 2 +size_flags_vertical = 3 + +[node name="ControlValidator" type="Node" parent="MarginContainer/FormValidator/VBoxContainer2/GridContainer/VBoxContainer8/Checked"] +script = ExtResource("3_hkwup") +validator = SubResource("Resource_kbsj8") + +[node name="CheckedError" type="Label" parent="MarginContainer/FormValidator/VBoxContainer2/GridContainer/VBoxContainer8"] +visible = false +layout_mode = 2 +text = "ERROR" +label_settings = SubResource("LabelSettings_su7t3") +autowrap_mode = 2 + +[node name="CheckedValid" type="Label" parent="MarginContainer/FormValidator/VBoxContainer2/GridContainer/VBoxContainer8"] +visible = false +layout_mode = 2 +text = "Valid!" +label_settings = SubResource("LabelSettings_urp4f") + +[node name="HBoxContainer" type="HBoxContainer" parent="MarginContainer/FormValidator/VBoxContainer2"] +layout_mode = 2 +theme_override_constants/separation = 32 + +[node name="Validate" type="Button" parent="MarginContainer/FormValidator/VBoxContainer2/HBoxContainer"] +layout_mode = 2 +size_flags_horizontal = 3 +theme_override_font_sizes/font_size = 16 +text = "Validate Form" + +[node name="Exit" type="Button" parent="MarginContainer/FormValidator/VBoxContainer2/HBoxContainer"] +layout_mode = 2 +size_flags_horizontal = 3 +theme_override_font_sizes/font_size = 16 +text = "Exit" + +[connection signal="control_validated" from="MarginContainer/FormValidator" to="." method="_on_form_validator_control_control_validated"] +[connection signal="pressed" from="MarginContainer/FormValidator/VBoxContainer2/HBoxContainer/Validate" to="." method="_on_validate_pressed"] +[connection signal="pressed" from="MarginContainer/FormValidator/VBoxContainer2/HBoxContainer/Exit" to="." method="_on_exit_pressed"] diff --git a/addons/godot-form-validator/form_validator.gd b/addons/godot-form-validator/form_validator.gd new file mode 100644 index 00000000..865ac114 --- /dev/null +++ b/addons/godot-form-validator/form_validator.gd @@ -0,0 +1,125 @@ +@tool +extends Control +class_name FormValidator + +signal control_validated(control, passed, messages) + +class ValidatorInfo extends RefCounted: + var control: Control + var validator: Validator + +@export var auto_validate: bool = false +@export var validation_method: Validation.Method = Validation.Method.BATCH: + set(value): + validation_method = value + _update_validation_methods() + +var _control_validator_map: Dictionary = {} +var _control_messages_map: Dictionary = {} + + +func _ready() -> void: + Validation.validator_added.connect(_on_validator_added) + Validation.validator_removed.connect(_on_validator_removed) + _find_validators(self) + + +func get_messages() -> Dictionary: + return _control_messages_map + + +func get_messages_for_control(control: Control) -> PackedStringArray: + if not _control_messages_map.has(control): + return PackedStringArray() + return _control_messages_map[control] + + +func validate() -> bool: + _control_messages_map.clear() + var list = _get_validator_info_list() + var valid = true + for info in list: + if info.validator.skip_validation: + continue + var passed = info.validator.validate(info.control) + var messages = info.validator.get_messages() + if not passed: + _control_messages_map[info.control] = messages + control_validated.emit(info.control, passed, messages) + valid = valid and passed + if not valid and validation_method == Validation.Method.IMMEDIATE: + return valid + return valid + + +func _get_validator_info_list() -> Array[ValidatorInfo]: + var list: Array[ValidatorInfo] = [] + for control in _control_validator_map.keys(): + var validator = _control_validator_map[control] + if not validator: + continue + var info = ValidatorInfo.new() + info.control = control + info.validator = validator + list.append(info) + list.sort_custom(func (a: ValidatorInfo, b: ValidatorInfo): + return a.validator.validation_order < b.validator.validation_order + ) + return list + + +func _update_validation_methods() -> void: + var validators = _control_validator_map.values() + for item in validators: + var validator = item as Validator + if not validator: + continue + validator.validation_method = validation_method + + +func _find_validators(node: Node) -> void: + for child in node.get_children(): + var control_validator = child as ControlValidator + if control_validator: + control_validator._on_validator_added() + _find_validators(child) + + +func _auto_validate(control: Control) -> void: + if not auto_validate: + return + var validator = _control_validator_map[control] as Validator + if not validator: + return + var passed = validator.validate(control) + control_validated.emit(control, passed, validator.get_messages()) + + +func _on_validator_added(control: Control, validator: Validator) -> void: + if not control: + return + _control_validator_map[control] = validator + if not control.focus_exited.is_connected(_on_control_focus_exited): + control.focus_exited.connect(_on_control_focus_exited.bind(control)) + # Special case to handle range-type controls that don't respond to focus + # events for editing. + if control.has_signal("value_changed"): + if not control.value_changed.is_connected(_on_control_value_changed): + control.value_changed.connect(_on_control_value_changed.bind(control)) + + +func _on_validator_removed(control: Control) -> void: + _control_validator_map.erase(control) + if control.focus_exited.is_connected(_on_control_focus_exited): + control.focus_exited.disconnect(_on_control_focus_exited) + if control.has_signal("value_changed"): + if control.value_changed.is_connected(_on_control_value_changed): + control.value_changed.disconnect(_on_control_value_changed) + + +func _on_control_focus_exited(control: Control) -> void: + _auto_validate(control) + + +func _on_control_value_changed(value: float, control: Control) -> void: + _auto_validate(control) diff --git a/addons/godot-form-validator/plugin.cfg b/addons/godot-form-validator/plugin.cfg new file mode 100644 index 00000000..1500bd14 --- /dev/null +++ b/addons/godot-form-validator/plugin.cfg @@ -0,0 +1,7 @@ +[plugin] + +name="Godot Form Validator" +description="A plugin for Godot 4 that adds robust validation logic to any control." +author="deadpixelsociety" +version="1.0" +script="plugin.gd" diff --git a/addons/godot-form-validator/plugin.gd b/addons/godot-form-validator/plugin.gd new file mode 100644 index 00000000..0b997ff3 --- /dev/null +++ b/addons/godot-form-validator/plugin.gd @@ -0,0 +1,14 @@ +@tool +extends EditorPlugin + + +func _enter_tree() -> void: + add_autoload_singleton("Validation", "res://addons/godot-form-validator/validation.gd") + add_custom_type("FormValidator", "Control", preload("form_validator.gd"), preload("editor_icon.png")) + add_custom_type("ControlValidator", "Node", preload("control_validator.gd"), preload("editor_icon.png")) + + +func _exit_tree() -> void: + remove_custom_type("ControlValidator") + remove_custom_type("FormValidator") + remove_autoload_singleton("Validation") diff --git a/addons/godot-form-validator/rules/alpha_rule.gd b/addons/godot-form-validator/rules/alpha_rule.gd new file mode 100644 index 00000000..29ef594c --- /dev/null +++ b/addons/godot-form-validator/rules/alpha_rule.gd @@ -0,0 +1,16 @@ +@tool +extends ValidatorRule +class_name AlphaRule + + +func _init() -> void: + fail_message = "Value must contain only alpha characters." + + +func apply(control: Control, value) -> RuleResult: + var result = RuleResult.new() + if value is String: + result.passed = ValidatorFunctions.empty(value) or ValidatorFunctions.alpha(value) + if not result.passed: + result.message = fail_message + return result diff --git a/addons/godot-form-validator/rules/alphanumeric_rule.gd b/addons/godot-form-validator/rules/alphanumeric_rule.gd new file mode 100644 index 00000000..6da36301 --- /dev/null +++ b/addons/godot-form-validator/rules/alphanumeric_rule.gd @@ -0,0 +1,16 @@ +@tool +extends ValidatorRule +class_name AlphanumericRule + + +func _init() -> void: + fail_message = "Value must contain only alphanumeric cahracters." + + +func apply(control: Control, value) -> RuleResult: + var result = RuleResult.new() + if value is String: + result.passed = ValidatorFunctions.empty(value) or ValidatorFunctions.alphanumeric(value) + if not result.passed: + result.message = fail_message + return result diff --git a/addons/godot-form-validator/rules/boolean_rule.gd b/addons/godot-form-validator/rules/boolean_rule.gd new file mode 100644 index 00000000..b80a11a2 --- /dev/null +++ b/addons/godot-form-validator/rules/boolean_rule.gd @@ -0,0 +1,15 @@ +@tool +extends ValidatorRule +class_name BooleanRule + +@export var target_value: bool + + +func apply(control: Control, value) -> RuleResult: + if ValidatorFunctions.empty(fail_message): + fail_message = "The value must equal %s." % target_value + var result = RuleResult.new() + result.passed = value is bool and value == target_value + if not result.passed: + result.message = fail_message + return result diff --git a/addons/godot-form-validator/rules/custom_rule.gd b/addons/godot-form-validator/rules/custom_rule.gd new file mode 100644 index 00000000..c6c50758 --- /dev/null +++ b/addons/godot-form-validator/rules/custom_rule.gd @@ -0,0 +1,36 @@ +@tool +extends ValidatorRule +class_name CustomRule + +@export_multiline var expression: String = "" + +var _expression: Expression = Expression.new() + + +func apply(control: Control, value) -> RuleResult: + var result = RuleResult.new() + if not _validate_expression(): + result.passed = false + result.message = "Specified expression is not valid." + return result + var res = _expression.execute([ control, value ]) + if _expression.has_execute_failed(): + result.passed = false + result.message = "Execution of the specified expression has failed." + return result + result.passed = res == true + if not result.passed: + result.message = fail_message + return result + + +func is_valid() -> bool: + return _validate_expression() + + +func get_invalid_message() -> String: + return "Specified expression is not valid." + + +func _validate_expression() -> bool: + return _expression.parse(expression, [ "control", "value" ]) == OK diff --git a/addons/godot-form-validator/rules/does_not_match_rule.gd b/addons/godot-form-validator/rules/does_not_match_rule.gd new file mode 100644 index 00000000..b8e91756 --- /dev/null +++ b/addons/godot-form-validator/rules/does_not_match_rule.gd @@ -0,0 +1,26 @@ +@tool +extends ValidatorRule +class_name DoesNotMatchRule + +@export var pattern: String + + +func _init() -> void: + fail_message = "Invalid value." + + +func apply(control: Control, value) -> RuleResult: + var result = RuleResult.new() + if value is String: + result.passed = ValidatorFunctions.empty(value) or ValidatorFunctions.does_not_match(pattern, value) + if not result.passed: + result.message = fail_message + return result + + +func is_valid() -> bool: + return RegEx.create_from_string(pattern).is_valid() + + +func get_invalid_message() -> String: + return "Specified regular expression is not valid." diff --git a/addons/godot-form-validator/rules/email_rule.gd b/addons/godot-form-validator/rules/email_rule.gd new file mode 100644 index 00000000..f32111bb --- /dev/null +++ b/addons/godot-form-validator/rules/email_rule.gd @@ -0,0 +1,16 @@ +@tool +extends ValidatorRule +class_name EmailRule + + +func _init() -> void: + fail_message = "Value must be a valid email address." + + +func apply(control: Control, value) -> RuleResult: + var result = RuleResult.new() + if value is String: + result.passed = ValidatorFunctions.empty(value) or ValidatorFunctions.email(value) + if not result.passed: + result.message = fail_message + return result diff --git a/addons/godot-form-validator/rules/equals_rule.gd b/addons/godot-form-validator/rules/equals_rule.gd new file mode 100644 index 00000000..2a08436d --- /dev/null +++ b/addons/godot-form-validator/rules/equals_rule.gd @@ -0,0 +1,15 @@ +@tool +extends ValidatorRule +class_name EqualsRule + +@export var target_value: String + + +func apply(control: Control, value) -> RuleResult: + if ValidatorFunctions.empty(fail_message): + fail_message = "The value must equal %s." % target_value + var result = RuleResult.new() + result.passed = str(value) == target_value + if not result.passed: + result.message = fail_message + return result diff --git a/addons/godot-form-validator/rules/greater_than_rule.gd b/addons/godot-form-validator/rules/greater_than_rule.gd new file mode 100644 index 00000000..e80a807b --- /dev/null +++ b/addons/godot-form-validator/rules/greater_than_rule.gd @@ -0,0 +1,15 @@ +@tool +extends ValidatorRule +class_name GreaterThanRule + +@export var target_value: String + + +func apply(control: Control, value) -> RuleResult: + if ValidatorFunctions.empty(fail_message): + fail_message = "The value must be greater than %s." % target_value + var result = RuleResult.new() + result.passed = str(value) > target_value + if not result.passed: + result.message = fail_message + return result diff --git a/addons/godot-form-validator/rules/length_rule.gd b/addons/godot-form-validator/rules/length_rule.gd new file mode 100644 index 00000000..eb638456 --- /dev/null +++ b/addons/godot-form-validator/rules/length_rule.gd @@ -0,0 +1,28 @@ +@tool +extends ValidatorRule +class_name LengthRule + +const FAIL_MESSAGE: String = "The value must be between %d and %d characters long." + +@export var min_length: int = 0 +@export var max_length: int = 9999 + + +func apply(control: Control, value) -> RuleResult: + var result = RuleResult.new() + if value is String: + result.passed = ValidatorFunctions.length(value, min_length, max_length) + if not result.passed: + if ValidatorFunctions.empty(fail_message): + result.message = FAIL_MESSAGE % [ min_length, max_length ] + else: + result.message = fail_message + return result + + +func is_valid() -> bool: + return min_length <= max_length + + +func get_invalid_message() -> String: + return "Minimum length must be less than or equal to maximum length." diff --git a/addons/godot-form-validator/rules/less_than_rule.gd b/addons/godot-form-validator/rules/less_than_rule.gd new file mode 100644 index 00000000..9b069736 --- /dev/null +++ b/addons/godot-form-validator/rules/less_than_rule.gd @@ -0,0 +1,15 @@ +@tool +extends ValidatorRule +class_name LessThanRule + +@export var target_value: String + + +func apply(control: Control, value) -> RuleResult: + if ValidatorFunctions.empty(fail_message): + fail_message = "The value must be less than %s." % target_value + var result = RuleResult.new() + result.passed = str(value) < target_value + if not result.passed: + result.message = fail_message + return result diff --git a/addons/godot-form-validator/rules/matches_rule.gd b/addons/godot-form-validator/rules/matches_rule.gd new file mode 100644 index 00000000..b222b8e8 --- /dev/null +++ b/addons/godot-form-validator/rules/matches_rule.gd @@ -0,0 +1,26 @@ +@tool +extends ValidatorRule +class_name MatchesRule + +@export var pattern: String + + +func _init() -> void: + fail_message = "Invalid value." + + +func apply(control: Control, value) -> RuleResult: + var result = RuleResult.new() + if value is String: + result.passed = ValidatorFunctions.empty(value) or ValidatorFunctions.matches(pattern, value) + if not result.passed: + result.message = fail_message + return result + + +func is_valid() -> bool: + return RegEx.create_from_string(pattern).is_valid() + + +func get_invalid_message() -> String: + return "Specified regular expression is not valid." diff --git a/addons/godot-form-validator/rules/not_blank_rule.gd b/addons/godot-form-validator/rules/not_blank_rule.gd new file mode 100644 index 00000000..5b47874e --- /dev/null +++ b/addons/godot-form-validator/rules/not_blank_rule.gd @@ -0,0 +1,16 @@ +@tool +extends ValidatorRule +class_name NotBlankRule + + +func _init() -> void: + fail_message = "Value must not be blank." + + +func apply(control: Control, value) -> RuleResult: + var result = RuleResult.new() + if value is String: + result.passed = ValidatorFunctions.not_blank(value) + if not result.passed: + result.message = fail_message + return result diff --git a/addons/godot-form-validator/rules/not_empty_rule.gd b/addons/godot-form-validator/rules/not_empty_rule.gd new file mode 100644 index 00000000..e8db0100 --- /dev/null +++ b/addons/godot-form-validator/rules/not_empty_rule.gd @@ -0,0 +1,16 @@ +@tool +extends ValidatorRule +class_name NotEmptyRule + + +func _init() -> void: + fail_message = "Value must not be empty." + + +func apply(control: Control, value) -> RuleResult: + var result = RuleResult.new() + if value is String: + result.passed = ValidatorFunctions.not_empty(value) + if not result.passed: + result.message = fail_message + return result diff --git a/addons/godot-form-validator/rules/numeric_rule.gd b/addons/godot-form-validator/rules/numeric_rule.gd new file mode 100644 index 00000000..003e4f8c --- /dev/null +++ b/addons/godot-form-validator/rules/numeric_rule.gd @@ -0,0 +1,16 @@ +@tool +extends ValidatorRule +class_name NumericRule + + +func _init() -> void: + fail_message = "Value must contain only numbers." + + +func apply(control: Control, value) -> RuleResult: + var result = RuleResult.new() + if value is String: + result.passed = ValidatorFunctions.empty(value) or ValidatorFunctions.numeric(value) + if not result.passed: + result.message = fail_message + return result diff --git a/addons/godot-form-validator/rules/required_rule.gd b/addons/godot-form-validator/rules/required_rule.gd new file mode 100644 index 00000000..f6cc0edd --- /dev/null +++ b/addons/godot-form-validator/rules/required_rule.gd @@ -0,0 +1,18 @@ +@tool +extends ValidatorRule +class_name RequiredRule + + +func _init(): + fail_message = "A value is required." + + +func apply(control: Control, value) -> RuleResult: + var result = RuleResult.new() + if value is String: + result.passed = ValidatorFunctions.not_blank(value) + else: + result.passed = value != null + if not result.passed: + result.message = fail_message + return result diff --git a/addons/godot-form-validator/rules/rule_result.gd b/addons/godot-form-validator/rules/rule_result.gd new file mode 100644 index 00000000..3b4800cd --- /dev/null +++ b/addons/godot-form-validator/rules/rule_result.gd @@ -0,0 +1,5 @@ +extends RefCounted +class_name RuleResult + +var passed: bool = false +var message: String = "" diff --git a/addons/godot-form-validator/rules/validator_rule.gd b/addons/godot-form-validator/rules/validator_rule.gd new file mode 100644 index 00000000..fe97db07 --- /dev/null +++ b/addons/godot-form-validator/rules/validator_rule.gd @@ -0,0 +1,17 @@ +@tool +extends Resource +class_name ValidatorRule + +@export var fail_message: String = "" + + +func apply(control: Control, value) -> RuleResult: + return RuleResult.new() + + +func is_valid() -> bool: + return true + + +func get_invalid_message() -> String: + return "" diff --git a/addons/godot-form-validator/validation.gd b/addons/godot-form-validator/validation.gd new file mode 100644 index 00000000..a334e93f --- /dev/null +++ b/addons/godot-form-validator/validation.gd @@ -0,0 +1,39 @@ +@tool +extends Node + +signal validator_added(control, validator) +signal validator_removed(control) + +enum Method { + # Processes all validators and rules before returning a result. + BATCH, + # Processes validators until a rule failure is encountered, then proceeds to the next validator. + FAIL_FAST, + # Processes validators until a rule failure is encountered and returns immediately. + IMMEDIATE +} + +var _validators: Array[Validator] = [] + + +func _ready() -> void: + add_validator(ButtonValidator.new()) + add_validator(LineEditValidator.new()) + add_validator(RangeValidator.new()) + add_validator(TextEditValidator.new()) + + +func add_validator(validator: Validator) -> void: + if not _validators.has(validator): + _validators.append(validator) + + +func get_validators() -> Array[Validator]: + return _validators + + +func find_validator(node: Node) -> Validator: + for validator in get_validators(): + if validator.is_type(node): + return validator + return null diff --git a/addons/godot-form-validator/validator_functions.gd b/addons/godot-form-validator/validator_functions.gd new file mode 100644 index 00000000..cd11b04a --- /dev/null +++ b/addons/godot-form-validator/validator_functions.gd @@ -0,0 +1,66 @@ +extends Object +class_name ValidatorFunctions + + +static func matches(pattern: String, text: String) -> bool: + var regex = RegEx.create_from_string(pattern) + if not regex.is_valid(): + print_debug("WARNING: Invalid RegEx pattern supplied to matches function: ", pattern) + return false + var result = regex.search(text) + return result != null and result.strings.size() > 0 + + +static func does_not_match(pattern: String, text: String) -> bool: + var regex = RegEx.create_from_string(pattern) + if not regex.is_valid(): + print_debug("WARNING: Invalid RegEx pattern supplied to matches function: ", pattern) + return false + var result = regex.search(text) + return result == null + + +static func not_empty(text: String) -> bool: + return text != null and not text.is_empty() + + +static func empty(text: String) -> bool: + return not not_empty(text) + + +static func not_blank(text: String) -> bool: + if text == null: + return false + # Remove escape sequences + text = text.strip_escapes() + # Remove spaces + text = text.replace(" ", "") + return not text.is_empty() + + +static func alpha(text: String) -> bool: + var regex = RegEx.create_from_string("[^a-zA-Z]+") + var result = regex.search(text) + return result == null + + +static func numeric(text: String) -> bool: + var regex = RegEx.create_from_string("[^0-9]+") + var result = regex.search(text) + return result == null + + +static func alphanumeric(text: String) -> bool: + var regex = RegEx.create_from_string("[^a-zA-Z0-9]+") + var result = regex.search(text) + return result == null + + +static func email(text: String) -> bool: + var regex = RegEx.create_from_string("^[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\\.[A-Za-z]{2,6}$") + var result = regex.search(text) + return result != null and result.strings.size() > 0 + + +static func length(text: String, min_length: int = 0, max_length: int = 9999) -> bool: + return text != null and text.length() >= min_length and text.length() <= max_length diff --git a/addons/godot-form-validator/validators/button_validator.gd b/addons/godot-form-validator/validators/button_validator.gd new file mode 100644 index 00000000..651a527c --- /dev/null +++ b/addons/godot-form-validator/validators/button_validator.gd @@ -0,0 +1,14 @@ +@tool +extends Validator +class_name ButtonValidator + + +func get_value(control: Control): + var button = control as Button + if not button: + return null + return button.button_pressed + + +func is_type(node) -> bool: + return node is Button diff --git a/addons/godot-form-validator/validators/line_edit_validator.gd b/addons/godot-form-validator/validators/line_edit_validator.gd new file mode 100644 index 00000000..b5665bbe --- /dev/null +++ b/addons/godot-form-validator/validators/line_edit_validator.gd @@ -0,0 +1,14 @@ +@tool +extends Validator +class_name LineEditValidator + + +func get_value(control: Control): + var line_edit = control as LineEdit + if not line_edit: + return null + return line_edit.text + + +func is_type(node) -> bool: + return node is LineEdit diff --git a/addons/godot-form-validator/validators/range_validator.gd b/addons/godot-form-validator/validators/range_validator.gd new file mode 100644 index 00000000..46074fb6 --- /dev/null +++ b/addons/godot-form-validator/validators/range_validator.gd @@ -0,0 +1,15 @@ +@tool +extends Validator +class_name RangeValidator + + +func get_value(control: Control): + var range_control = control as Range + if not range_control: + return null + return range_control.value + + +func is_type(node) -> bool: + return node is Range and \ + not (node is ScrollBar or node is ProgressBar or node is TextureProgressBar) diff --git a/addons/godot-form-validator/validators/text_edit_validator.gd b/addons/godot-form-validator/validators/text_edit_validator.gd new file mode 100644 index 00000000..ef4d2579 --- /dev/null +++ b/addons/godot-form-validator/validators/text_edit_validator.gd @@ -0,0 +1,14 @@ +@tool +extends Validator +class_name TextEditValidator + + +func get_value(control: Control): + var text_edit = control as TextEdit + if not text_edit: + return null + return text_edit.text + + +func is_type(node) -> bool: + return node is TextEdit diff --git a/addons/godot-form-validator/validators/validator.gd b/addons/godot-form-validator/validators/validator.gd new file mode 100644 index 00000000..0b0aeb92 --- /dev/null +++ b/addons/godot-form-validator/validators/validator.gd @@ -0,0 +1,37 @@ +@tool +extends Resource +class_name Validator + +@export var validation_order: int = 1 +@export var validation_method: Validation.Method = Validation.Method.BATCH +@export var skip_validation: bool = false +@export var rules: Array[ValidatorRule] = [] + +var _messages: PackedStringArray = PackedStringArray() + + +func get_value(control: Control): + return null + + +func is_type(node) -> bool: + return node is Control + + +func get_messages() -> PackedStringArray: + return _messages + + +func validate(control: Control) -> bool: + _messages.clear() + var valid = true + for rule in rules: + var result = rule.apply(control, get_value(control)) + if not result.passed: + _messages.append(result.message) + valid = valid and result.passed + if not valid: + # Not BATCH, exit early. + if validation_method != Validation.Method.BATCH: + return valid + return valid diff --git a/assets/bonuspath_a_01_complete.png b/assets/bonuspath_a_01_complete.png new file mode 100644 index 0000000000000000000000000000000000000000..ffbc0a2fbfacce4554f405e974648faeaee965ef GIT binary patch literal 11975 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 Q2Grq{ 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 literal 0 HcmV?d00001 diff --git a/assets/bonuspath_a_01_not_complete.png.import b/assets/bonuspath_a_01_not_complete.png.import new file mode 100644 index 00000000..40840c0c --- /dev/null +++ b/assets/bonuspath_a_01_not_complete.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://blxcf17gus8c" +path="res://.godot/imported/bonuspath_a_01_not_complete.png-64b0f6f0d472897aab337e8a484b9938.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://assets/bonuspath_a_01_not_complete.png" +dest_files=["res://.godot/imported/bonuspath_a_01_not_complete.png-64b0f6f0d472897aab337e8a484b9938.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/assets/path_a_01.png b/assets/path_a_01.png new file mode 100644 index 0000000000000000000000000000000000000000..a1b49a361a74f63985e5be08b32e7a6c3947858d GIT binary patch literal 52385 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

VkUf*W3jBr5>Ho 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 literal 0 HcmV?d00001 diff --git a/assets/path_a_01.png.import b/assets/path_a_01.png.import new file mode 100644 index 00000000..ec69ee2b --- /dev/null +++ b/assets/path_a_01.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://bb080qc6juomq" +path="res://.godot/imported/path_a_01.png-93a1b4c2adfbc89d6517f795a9e687a9.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://assets/path_a_01.png" +dest_files=["res://.godot/imported/path_a_01.png-93a1b4c2adfbc89d6517f795a9e687a9.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/assets/path_b_01.png b/assets/path_b_01.png new file mode 100644 index 0000000000000000000000000000000000000000..675bc47dfb97589205daf6e2c28a52d56728a4a2 GIT binary patch literal 47872 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%0D&c6{O^CUq$S~~$M}{&K1(O? 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 literal 0 HcmV?d00001 diff --git a/example_rules.png.import b/example_rules.png.import new file mode 100644 index 00000000..f902bd89 --- /dev/null +++ b/example_rules.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://c13odbsfv53he" +path="res://.godot/imported/example_rules.png-faa9d2703b3ffa116338aa78beef009e.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://example_rules.png" +dest_files=["res://.godot/imported/example_rules.png-faa9d2703b3ffa116338aa78beef009e.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/example_tree.png b/example_tree.png new file mode 100644 index 0000000000000000000000000000000000000000..1bd149756f316315f6f1cccede6f36859e1889d6 GIT binary patch literal 22251 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 S$_E9t6x!+r7xUDv1^pM@lAO{2 literal 0 HcmV?d00001 diff --git a/example_tree.png.import b/example_tree.png.import new file mode 100644 index 00000000..b61077f6 --- /dev/null +++ b/example_tree.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://b1ynfmrih7ira" +path="res://.godot/imported/example_tree.png-f962c768c2ced2db3f35399da01825e8.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://example_tree.png" +dest_files=["res://.godot/imported/example_tree.png-f962c768c2ced2db3f35399da01825e8.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/icon.png b/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..f7a61a88383ca9a54f940f6fc244a513f86d9905 GIT binary patch literal 2143 zcmV-l2%z_gP)Px#1ZP1_K>z@;j|==^1poj532;bRa{vGpcmMzucmc)vxC8(I2lPoqK~#8N?VAZ~ z6jd0<-+R;UZo&JAhzH%>8q|114oTFYhD0ES7^R&e8n23ys33~cZHZZrcB`NXDjuIMS#}yDWgk&WmS`1Stq%>m<$yet6VGn#a39nT)N;yanN*w7SUL4q zc}N*W2|%bbyaZ>yO{%*Hr>~kCTa>K>3%4vgCFauV@c(8*J>9a>Hv+zzgS$Pp7=3Iz3Vk;9iI}m^kUB1m@gET14p#-G? zXo2tndi*iBZoL%-ce%*=2hP$DS%;jl z4L~sZ&Iv9an@TwyLl_^6vF9R~%dMk>h8X4z-fX1*)cfdT^&zpuet`>fPSW7V|p4XRxZF{kb+ zd=WlLHI0k_1fxqlF<04p5UVW9fPi@znN{zrU2LiUqVf0`?Bt{Jtf`8XmvsbpuFlBn zv;c?)3~oN86_>wEng#-nw!b&v)1Q}misneT8Wn9h#C&ef#=5%>y&mMjG@sLyCnMn& z^q8BZS_u2GiFJTnG12rh0{)s8q@E%a4cFrSBwy!~)OaH2g`}Jy^*jL4txMbj7tTJ; z$Yf%YQ*pkP(6jx)CVov_z^lJ5^%O0UHXUR6+YlYs403|gdy+v;1OU;Ugv477v7ig! zWP44@CW(qI^ybd?8z|*%5RY_T1J%9`1@8^1rw}cV-}V+nHO^ZYD6rR~#;m4I+g4n_ z7!%7)$6LqpW)I=!#DIUASQbms5^28$oq7pG+YtvCNc-Cxe0s)$N=vkT8tRg;t8_le z-zFvF;X4y)U#Rn6t67SP%)JmrW$#OzQhKwU^Jw|o;JmuD&*WIf$x95A zi#wt0vuyc;^goF*@+k`GrP7oF6PXt&C3B>j#6Vzft@qZfka~(xXWJbJ*Q*envPK2_ zkpVNAm|Rds#iC@~vgZ$)_ynZD$Ia1|vNYm#mtzhPHL#szm)o6X^ynbpoG2zv6w9{(sWV4uir1V^ow!hlJ{g{1Si`kcWg+|mHq#|FK zI8tm(GA2-^ua{aHjsbWgvTB4zjO|iY#X~Z|j=+#>`wYRc=#+6o zRr>d42(H-CpUz9pmir7G1Ax1)5mHo*TkiXl+yj9AT8s=B5YXiueR0kJT0#NfEcXB) z2OQI8uz_sOy$gVn$p8#>`DB1|;TUY-4mGz75N~~AccP^YevkntNuM&X4S?&I(rNu9 z6+=ziZeSmPuJ|9E(s>Zuv8kR7_9s80^;ZgCv~KfHX-mU#D%_iv&ail9cp<_ynv1u_ z#74>a*3qK_IIX((EFW&fwK161PQXa3>LE&w z@K(ZThY>f{&9AyKuhs0l1JIjLXSf4rnk?0RL9}*{ck{SHKb|<;FqkzOVdC4Ke3ruU z#ncG7N5z*TN&@h(zj`a$Bx5nNSa8l?Nq%lqC`tk#U_G8ku~Yt8n+ literal 0 HcmV?d00001 diff --git a/icon.png.import b/icon.png.import new file mode 100644 index 00000000..d38623ef --- /dev/null +++ b/icon.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://d3n0k21jubf3p" +path="res://.godot/imported/icon.png-487276ed1e3a0c39cad0279d744ee560.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://icon.png" +dest_files=["res://.godot/imported/icon.png-487276ed1e3a0c39cad0279d744ee560.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/logo.png b/logo.png new file mode 100644 index 0000000000000000000000000000000000000000..c387223cc66979a160e311717770f6a2d5f14917 GIT binary patch literal 4256 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 bool: + if not object: + return false + + for node in form_container.get_children(false): + var value + if node.name in object: + for property_name in checked_properties: + if property_name in node: + value = node.get(property_name) + + if value: + object.set(node.name, value) + else: + return false + + return true + + +func _on_validate_button_pressed(): + + print(form_validator.validate()) + + # Writes data in object + if _write_object(): + # Emit completed signal + emit_signal("completed") + else: + # TODO Show error message + print("Please fill all the fields") diff --git a/sources/menus/register/steps/base_step.tscn b/sources/menus/register/steps/base_step.tscn new file mode 100644 index 00000000..00c03c78 --- /dev/null +++ b/sources/menus/register/steps/base_step.tscn @@ -0,0 +1,101 @@ +[gd_scene load_steps=3 format=3 uid="uid://bxd3i06rqpxf0"] + +[ext_resource type="Script" path="res://sources/menus/register/steps/base_step.gd" id="1_02ocl"] +[ext_resource type="Script" path="res://addons/godot-form-validator/form_validator.gd" id="2_jbdsv"] + +[node name="BaseRegisterForm" type="Control"] +layout_mode = 3 +anchors_preset = 15 +anchor_right = 1.0 +anchor_bottom = 1.0 +grow_horizontal = 2 +grow_vertical = 2 +script = ExtResource("1_02ocl") + +[node name="RightMargin" type="MarginContainer" parent="."] +custom_minimum_size = Vector2(450, 2.08165e-12) +layout_mode = 1 +anchors_preset = 11 +anchor_left = 1.0 +anchor_right = 1.0 +anchor_bottom = 1.0 +offset_left = -450.0 +grow_horizontal = 0 +grow_vertical = 2 +size_flags_horizontal = 3 +size_flags_stretch_ratio = 2.0 +mouse_filter = 2 +theme_override_constants/margin_left = 50 +theme_override_constants/margin_top = 50 +theme_override_constants/margin_right = 50 +theme_override_constants/margin_bottom = 50 + +[node name="RightContainer" type="VBoxContainer" parent="RightMargin"] +layout_mode = 2 +mouse_filter = 2 +alignment = 2 + +[node name="ValidateButton" type="Button" parent="RightMargin/RightContainer"] +layout_mode = 2 +theme_override_font_sizes/font_size = 70 +text = "Next" + +[node name="PanelContainer" type="PanelContainer" parent="."] +layout_mode = 1 +anchors_preset = 5 +anchor_left = 0.5 +anchor_right = 0.5 +offset_left = -775.0 +offset_right = 775.0 +offset_bottom = 502.0 +grow_horizontal = 2 + +[node name="QuestionContainer" type="MarginContainer" parent="PanelContainer"] +layout_mode = 2 +theme_override_constants/margin_left = 25 +theme_override_constants/margin_right = 25 + +[node name="QuestionLabel" type="Label" parent="PanelContainer/QuestionContainer"] +unique_name_in_owner = true +custom_minimum_size = Vector2(1500, 500) +layout_mode = 2 +size_flags_vertical = 1 +theme_override_font_sizes/font_size = 70 +horizontal_alignment = 1 +vertical_alignment = 1 +autowrap_mode = 2 + +[node name="FormValidator" type="Control" parent="."] +unique_name_in_owner = true +layout_mode = 1 +anchors_preset = 7 +anchor_left = 0.5 +anchor_top = 1.0 +anchor_right = 0.5 +anchor_bottom = 1.0 +offset_left = -20.0 +offset_top = -40.0 +offset_right = 20.0 +grow_horizontal = 2 +grow_vertical = 0 +script = ExtResource("2_jbdsv") +auto_validate = true + +[node name="FormContainer" type="VBoxContainer" parent="FormValidator"] +unique_name_in_owner = true +custom_minimum_size = Vector2(1624, 812) +layout_mode = 1 +anchors_preset = 7 +anchor_left = 0.5 +anchor_top = 1.0 +anchor_right = 0.5 +anchor_bottom = 1.0 +offset_left = -812.0 +offset_top = -812.0 +offset_right = 812.0 +grow_horizontal = 2 +grow_vertical = 0 +theme_override_constants/separation = 25 +alignment = 1 + +[connection signal="pressed" from="RightMargin/RightContainer/ValidateButton" to="." method="_on_validate_button_pressed"] diff --git a/sources/menus/register/steps/credentials_step.gd b/sources/menus/register/steps/credentials_step.gd new file mode 100644 index 00000000..d0199c74 --- /dev/null +++ b/sources/menus/register/steps/credentials_step.gd @@ -0,0 +1,13 @@ +extends Step + + +@onready var password := %password +@onready var password_confirm := %password_confirm + +func _on_validate_button_pressed(): + + if password.text != password_confirm.text: + print("Make sure the password is the same in both fields") + return + + super._on_validate_button_pressed() diff --git a/sources/menus/register/steps/credentials_step.tscn b/sources/menus/register/steps/credentials_step.tscn new file mode 100644 index 00000000..7abffca2 --- /dev/null +++ b/sources/menus/register/steps/credentials_step.tscn @@ -0,0 +1,54 @@ +[gd_scene load_steps=10 format=3 uid="uid://cwqcybk5tvbly"] + +[ext_resource type="PackedScene" uid="uid://bxd3i06rqpxf0" path="res://sources/menus/register/steps/base_step.tscn" id="1_66bx5"] +[ext_resource type="Script" path="res://sources/menus/register/steps/credentials_step.gd" id="2_uwjaa"] +[ext_resource type="Script" path="res://addons/godot-form-validator/control_validator.gd" id="3_hblcf"] +[ext_resource type="Script" path="res://addons/godot-form-validator/rules/required_rule.gd" id="4_4ltsd"] +[ext_resource type="Script" path="res://addons/godot-form-validator/rules/email_rule.gd" id="5_cnymo"] +[ext_resource type="Script" path="res://addons/godot-form-validator/validators/line_edit_validator.gd" id="6_viaho"] + +[sub_resource type="Resource" id="Resource_os08u"] +script = ExtResource("4_4ltsd") +fail_message = "A value is required." + +[sub_resource type="Resource" id="Resource_j7vhe"] +script = ExtResource("5_cnymo") +fail_message = "Value must be a valid email address." + +[sub_resource type="Resource" id="Resource_84kj5"] +script = ExtResource("6_viaho") +validation_order = 1 +validation_method = 0 +skip_validation = false +rules = Array[Resource("res://addons/godot-form-validator/rules/validator_rule.gd")]([SubResource("Resource_os08u"), SubResource("Resource_j7vhe")]) + +[node name="CredentialsStep" instance=ExtResource("1_66bx5")] +script = ExtResource("2_uwjaa") +question_txt = "Fill in your credentials" + +[node name="ValidateButton" parent="RightMargin/RightContainer" index="0"] +text = "Validate" + +[node name="QuestionLabel" parent="PanelContainer/QuestionContainer" index="0"] +text = "Fill in your credentials" + +[node name="email" type="LineEdit" parent="FormValidator/FormContainer" index="0"] +layout_mode = 2 +theme_override_font_sizes/font_size = 70 +placeholder_text = "Email" + +[node name="ControlValidator" type="Node" parent="FormValidator/FormContainer/email" index="0"] +script = ExtResource("3_hblcf") +validator = SubResource("Resource_84kj5") + +[node name="password" type="LineEdit" parent="FormValidator/FormContainer" index="1"] +unique_name_in_owner = true +layout_mode = 2 +theme_override_font_sizes/font_size = 70 +placeholder_text = "Password" + +[node name="password_confirm" type="LineEdit" parent="FormValidator/FormContainer" index="2"] +unique_name_in_owner = true +layout_mode = 2 +theme_override_font_sizes/font_size = 70 +placeholder_text = "Confirm password" diff --git a/sources/menus/register/steps/teacher/devices_count_step.tscn b/sources/menus/register/steps/teacher/devices_count_step.tscn new file mode 100644 index 00000000..4844bcaa --- /dev/null +++ b/sources/menus/register/steps/teacher/devices_count_step.tscn @@ -0,0 +1,20 @@ +[gd_scene load_steps=2 format=3 uid="uid://do5e7c1oxkn5g"] + +[ext_resource type="PackedScene" uid="uid://bxd3i06rqpxf0" path="res://sources/menus/register/steps/base_step.tscn" id="1_w3urq"] + +[node name="DevicesCountStep" instance=ExtResource("1_w3urq")] +question_txt = "Choose the number of devices you are using" + +[node name="QuestionLabel" parent="PanelContainer/QuestionContainer" index="0"] +text = "Choose the number of devices you are using" + +[node name="FormContainer" parent="." index="2"] +offset_left = -812.0 +offset_top = -812.0 +offset_right = 812.0 + +[node name="devices_count" type="SpinBox" parent="FormContainer" index="0"] +layout_mode = 2 +min_value = 1.0 +max_value = 90.0 +value = 1.0 diff --git a/sources/menus/register/steps/teacher/method_step.tscn b/sources/menus/register/steps/teacher/method_step.tscn new file mode 100644 index 00000000..2396fec4 --- /dev/null +++ b/sources/menus/register/steps/teacher/method_step.tscn @@ -0,0 +1,19 @@ +[gd_scene load_steps=2 format=3 uid="uid://buhnx0oblueuq"] + +[ext_resource type="PackedScene" uid="uid://bxd3i06rqpxf0" path="res://sources/menus/register/steps/base_step.tscn" id="1_ksrhk"] + +[node name="MethodStep" instance=ExtResource("1_ksrhk")] +question_txt = "Choose the education method you are using" + +[node name="QuestionLabel" parent="PanelContainer/QuestionContainer" index="0"] +text = "Choose the education method you are using" + +[node name="method" type="ItemList" parent="FormContainer" index="0"] +layout_mode = 2 +theme_override_constants/h_separation = 25 +theme_override_constants/v_separation = 25 +theme_override_font_sizes/font_size = 70 +auto_height = true +item_count = 2 +item_0/text = "Complete" +item_1/text = "App Only" diff --git a/sources/menus/register/steps/teacher/students_count_step.tscn b/sources/menus/register/steps/teacher/students_count_step.tscn new file mode 100644 index 00000000..3780a290 --- /dev/null +++ b/sources/menus/register/steps/teacher/students_count_step.tscn @@ -0,0 +1,15 @@ +[gd_scene load_steps=2 format=3 uid="uid://cyhoa68y1yyyg"] + +[ext_resource type="PackedScene" uid="uid://bxd3i06rqpxf0" path="res://sources/menus/register/steps/base_step.tscn" id="1_par6r"] + +[node name="StudentsCountStep" instance=ExtResource("1_par6r")] +question_txt = "Choose the total number of students" + +[node name="QuestionLabel" parent="PanelContainer/QuestionContainer" index="0"] +text = "Choose the total number of students" + +[node name="students_count" type="SpinBox" parent="FormContainer" index="0"] +layout_mode = 2 +min_value = 1.0 +max_value = 90.0 +value = 1.0