diff --git a/resources/themes/kalulu_theme.tres b/resources/themes/kalulu_theme.tres index d48e60c3..cc04fd93 100644 --- a/resources/themes/kalulu_theme.tres +++ b/resources/themes/kalulu_theme.tres @@ -199,6 +199,9 @@ Button/styles/disabled = SubResource("StyleBoxFlat_osxio") Button/styles/hover = SubResource("StyleBoxFlat_xiby0") Button/styles/normal = SubResource("StyleBoxFlat_xitiu") Button/styles/pressed = SubResource("StyleBoxFlat_qwwu7") +CheckBox/constants/h_separation = 15 +CheckBox/font_sizes/font_size = 32 +CheckBox/fonts/font = ExtResource("1_shpmh") Combobox/base_type = &"OptionButton" Combobox/styles/disabled = SubResource("StyleBoxFlat_whtl8") Combobox/styles/disabled_mirrored = SubResource("StyleBoxFlat_vnibo") @@ -223,6 +226,21 @@ OptionButton/font_sizes/font_size = 32 Panel/styles/panel = SubResource("StyleBoxFlat_sfncn") PanelContainer/styles/panel = SubResource("StyleBoxFlat_3gh3j") PopupMenu/font_sizes/font_size = 100 +PopupMenu/fonts/font = ExtResource("1_shpmh") +PopupMenu/fonts/font_separator = ExtResource("1_shpmh") +TabBar/font_sizes/font_size = 70 +TabBar/fonts/font = ExtResource("1_shpmh") +TabContainer/colors/drop_mark_color = Color(1, 1, 1, 1) +TabContainer/colors/font_outline_color = Color(0, 0, 0, 1) +TabContainer/constants/outline_size = 1 +TabContainer/constants/side_margin = 0 +TabContainer/font_sizes/font_size = 70 +TabContainer/fonts/font = ExtResource("1_shpmh") +TabContainer/styles/tab_disabled = null +TabContainer/styles/tab_focus = null +TabContainer/styles/tab_hovered = null +TabContainer/styles/tab_selected = null +TabContainer/styles/tab_unselected = null TextEdit/font_sizes/font_size = 32 TooltipLabel/font_sizes/font_size = 80 Tree/font_sizes/font_size = 32 diff --git a/resources/user/teacher_settings.gd b/resources/user/teacher_settings.gd index b0f7e613..f8c01aa7 100644 --- a/resources/user/teacher_settings.gd +++ b/resources/user/teacher_settings.gd @@ -16,7 +16,7 @@ enum EducationMethod { @export var account_type : AccountType @export var education_method : EducationMethod @export var devices_count : int -@export var students : Dictionary +@export var students : Dictionary # int : Array[StudentData] @export var email : String @export var password : String # Temporary @@ -36,5 +36,17 @@ func get_new_code() -> String : return code +func get_students_count() -> int : + if not students: + return 0 + + var count = 0 + for device in students.keys(): + var students_array = students[device] as Array + if students_array: + count += students[device].size() + + return count + func _to_string(): return "{Account Type: %s, Education Method: %s, Devices count: %d, Students: %s, Email: %s, Password: %s}" % [AccountType.keys()[account_type], EducationMethod.keys()[education_method], devices_count, str(students), email, password] diff --git a/sources/menus/night_sky/night_sky.tscn b/sources/menus/components/night_sky/night_sky.tscn similarity index 100% rename from sources/menus/night_sky/night_sky.tscn rename to sources/menus/components/night_sky/night_sky.tscn diff --git a/sources/menus/login/login.gd b/sources/menus/login/login.gd index 3fcd712f..34f9f2ff 100644 --- a/sources/menus/login/login.gd +++ b/sources/menus/login/login.gd @@ -3,7 +3,7 @@ extends Control const teacher_password : String = "42" const back_scene_path: = "res://sources/menus/main/main_menu.tscn" const next_scene_path: = "res://sources/menus/minigame_selection.tscn" -const teacher_scene_path: = "res://sources/menus/teacher/teacher_settings.tscn" +const teacher_scene_path: = "res://sources/menus/settings/teacher_settings.tscn" const help_speech_path : String = "main_menu/audio/login_screen_help_code.mp3" const wrong_password_speech_path : String = "main_menu/audio/login_screen_feedback_wrong_password.mp3" const right_password_speech_path : String = "main_menu/audio/login_screen_feedback_right_password.mp3" diff --git a/sources/menus/login/login.tscn b/sources/menus/login/login.tscn index 16d477d4..5fd837f4 100644 --- a/sources/menus/login/login.tscn +++ b/sources/menus/login/login.tscn @@ -1,7 +1,7 @@ [gd_scene load_steps=15 format=3 uid="uid://2wab3q35ssta"] [ext_resource type="Script" path="res://sources/menus/login/login.gd" id="1_spyuf"] -[ext_resource type="PackedScene" uid="uid://wdjp1sv55q4f" path="res://sources/menus/night_sky/night_sky.tscn" id="3_0my6t"] +[ext_resource type="PackedScene" uid="uid://wdjp1sv55q4f" path="res://sources/menus/components/night_sky/night_sky.tscn" id="3_0my6t"] [ext_resource type="PackedScene" uid="uid://blos4rn53qkwg" path="res://sources/minigames/base/kalulu.tscn" id="3_5b1v0"] [ext_resource type="PackedScene" uid="uid://dxc82xcl7jncd" path="res://sources/menus/main/plants/palm.tscn" id="3_yrwu8"] [ext_resource type="Texture2D" uid="uid://wtx3wqs0l4si" path="res://assets/minigames/minigame_ui/graphic/button_back_up.png" id="4_3vuah"] diff --git a/sources/menus/main/main_menu.tscn b/sources/menus/main/main_menu.tscn index 0d7a6317..457322e7 100644 --- a/sources/menus/main/main_menu.tscn +++ b/sources/menus/main/main_menu.tscn @@ -1,7 +1,7 @@ [gd_scene load_steps=31 format=3 uid="uid://6v3nachs7j71"] [ext_resource type="Script" path="res://sources/menus/main/main_menu.gd" id="1_0r1ij"] -[ext_resource type="PackedScene" uid="uid://wdjp1sv55q4f" path="res://sources/menus/night_sky/night_sky.tscn" id="1_afd4d"] +[ext_resource type="PackedScene" uid="uid://wdjp1sv55q4f" path="res://sources/menus/components/night_sky/night_sky.tscn" id="1_afd4d"] [ext_resource type="PackedScene" uid="uid://dxc82xcl7jncd" path="res://sources/menus/main/plants/palm.tscn" id="3_77rmy"] [ext_resource type="PackedScene" uid="uid://dp4182l80ntvn" path="res://sources/menus/main/plants/flower.tscn" id="4_cdedv"] [ext_resource type="PackedScene" uid="uid://dqtclljq6bvtg" path="res://sources/menus/main/plants/bush.tscn" id="4_onj68"] diff --git a/sources/menus/register/register.gd b/sources/menus/register/register.gd index be9d4cf9..48d24c36 100644 --- a/sources/menus/register/register.gd +++ b/sources/menus/register/register.gd @@ -1,7 +1,7 @@ extends Control const main_menu_path := "res://sources/menus/main/main_menu.tscn" -const next_scene_path := "res://sources/menus/teacher/teacher_settings.tscn" +const next_scene_path := "res://sources/menus/settings/teacher_settings.tscn" const symbols_names = { "1" : "star", "2" : "bar", @@ -18,9 +18,12 @@ const symbols_names = { @onready var parent_steps : Array[PackedScene] = [ preload("res://sources/menus/register/steps/parent/players_count_step.tscn") ] - +@onready var last_steps: Array[PackedScene] = [ + preload("res://sources/menus/register/steps/credentials_step.tscn"), + preload("res://sources/menus/register/steps/general_conditions_step.tscn"), + preload("res://sources/menus/register/steps/recap_step.tscn") +] @onready var account_type_step : PackedScene = preload("res://sources/menus/register/steps/account_type_step.tscn") -@onready var credential_step : PackedScene = preload("res://sources/menus/register/steps/credentials_step.tscn") @onready var students_step : PackedScene = preload("res://sources/menus/register/steps/teacher/students_count_step.tscn") @onready var player_step : PackedScene = preload("res://sources/menus/register/steps/parent/player_step.tscn") @@ -106,7 +109,7 @@ func _on_step_completed(step : Step): elif register_data.account_type == TeacherSettings.AccountType.Parent: for scene in parent_steps: current_steps.append(scene.instantiate()) - progress_bar.max_value = current_steps.size() + progress_bar.max_value = current_steps.size() + 3 "devices": # Adds students steps for teachers _remove_future_steps() @@ -118,7 +121,8 @@ func _on_step_completed(step : Step): current_steps.append(students_step_scene) else: students_step_scene.queue_free() - current_steps.append(credential_step.instantiate()) + for scene in last_steps: + current_steps.append(scene.instantiate()) progress_bar.max_value = current_steps.size() "players": # Adds students steps for parents @@ -130,7 +134,8 @@ func _on_step_completed(step : Step): student_step_scene.data = student current_steps.append(student_step_scene) student_count += 1 - current_steps.append(credential_step.instantiate()) + for scene in last_steps: + current_steps.append(scene.instantiate()) progress_bar.max_value = current_steps.size() if progress_bar.value == current_steps.size()-1: diff --git a/sources/menus/register/register.tscn b/sources/menus/register/register.tscn index 102c671b..f0a5304c 100644 --- a/sources/menus/register/register.tscn +++ b/sources/menus/register/register.tscn @@ -2,7 +2,7 @@ [ext_resource type="Script" path="res://sources/menus/register/register.gd" id="1_jsnxc"] [ext_resource type="PackedScene" uid="uid://cp27bjh6v5bkj" path="res://sources/minigames/base/opening_curtain.tscn" id="2_kfcp0"] -[ext_resource type="PackedScene" uid="uid://wdjp1sv55q4f" path="res://sources/menus/night_sky/night_sky.tscn" id="2_tirf6"] +[ext_resource type="PackedScene" uid="uid://wdjp1sv55q4f" path="res://sources/menus/components/night_sky/night_sky.tscn" id="2_tirf6"] [ext_resource type="PackedScene" uid="uid://dxc82xcl7jncd" path="res://sources/menus/main/plants/palm.tscn" id="3_25mko"] [ext_resource type="PackedScene" uid="uid://nwur175781jf" path="res://sources/menus/main/plants/large_flower.tscn" id="5_23tyx"] [ext_resource type="PackedScene" uid="uid://dqtclljq6bvtg" path="res://sources/menus/main/plants/bush.tscn" id="6_i6t6f"] diff --git a/sources/menus/register/steps/credentials_step.tscn b/sources/menus/register/steps/credentials_step.tscn index dcf0c629..9b7fec42 100644 --- a/sources/menus/register/steps/credentials_step.tscn +++ b/sources/menus/register/steps/credentials_step.tscn @@ -43,9 +43,6 @@ rules = Array[Resource("res://addons/godot-form-validator/rules/validator_rule.g step_name = "credentials" question = "Enter your credentials" -[node name="ValidateButton" parent="RightMargin/RightContainer" index="0"] -text = "Validate" - [node name="QuestionLabel" parent="PanelContainer/QuestionContainer" index="0"] text = "Enter your credentials" diff --git a/sources/menus/register/steps/device_recap.gd b/sources/menus/register/steps/device_recap.gd new file mode 100644 index 00000000..72548ea7 --- /dev/null +++ b/sources/menus/register/steps/device_recap.gd @@ -0,0 +1,25 @@ +extends Control +class_name DeviceRecap + +const student_panel_scene = preload("res://sources/menus/settings/student_panel.tscn") + +@export var title : String +@export var students : Array[StudentData] = [] + +@onready var title_label : Label = %Title +@onready var students_container : GridContainer = %StudentsContainer + +func _ready(): + + if title: + title_label.text = title + + var i := 1 + for student in students: + var student_panel : StudentPanel = student_panel_scene.instantiate() + student_panel.student_count = i + student_panel.student_data = student + + students_container.add_child(student_panel) + + i+= 1 diff --git a/sources/menus/register/steps/device_recap.tscn b/sources/menus/register/steps/device_recap.tscn new file mode 100644 index 00000000..2c50f078 --- /dev/null +++ b/sources/menus/register/steps/device_recap.tscn @@ -0,0 +1,30 @@ +[gd_scene load_steps=2 format=3 uid="uid://dsvgeiocp4y36"] + +[ext_resource type="Script" path="res://sources/menus/register/steps/device_recap.gd" id="1_q1dk1"] + +[node name="DeviceRecap" type="MarginContainer"] +anchors_preset = 15 +anchor_right = 1.0 +anchor_bottom = 1.0 +grow_horizontal = 2 +grow_vertical = 2 +size_flags_horizontal = 3 +size_flags_vertical = 3 +theme_override_constants/margin_top = 25 +theme_override_constants/margin_bottom = 25 +script = ExtResource("1_q1dk1") + +[node name="VBoxContainer" type="VBoxContainer" parent="."] +layout_mode = 2 + +[node name="Title" type="Label" parent="VBoxContainer"] +unique_name_in_owner = true +layout_mode = 2 +theme_override_font_sizes/font_size = 50 +text = "Device 1 :" + +[node name="StudentsContainer" type="GridContainer" parent="VBoxContainer"] +unique_name_in_owner = true +layout_mode = 2 +size_flags_vertical = 3 +columns = 2 diff --git a/sources/menus/register/steps/general_conditions_step.gd b/sources/menus/register/steps/general_conditions_step.gd new file mode 100644 index 00000000..99823a65 --- /dev/null +++ b/sources/menus/register/steps/general_conditions_step.gd @@ -0,0 +1,31 @@ +extends Step + +@onready var conditions_label : RichTextLabel = %ConditionsLabel +@onready var accept : CheckBox = %Accept +@onready var accept_error : Label = %AcceptError + + +func _ready(): + # TODO Load the text here + pass + + +func _on_back() -> bool: + accept.button_pressed = false + return true + + +func _on_next() -> bool: + if not accept.button_pressed: + accept_error.show() + return false + return true + + +func _on_validate_button_pressed(): + if _on_next(): + next.emit(self) + + +func _on_accept_pressed(): + accept_error.hide() diff --git a/sources/menus/register/steps/general_conditions_step.tscn b/sources/menus/register/steps/general_conditions_step.tscn new file mode 100644 index 00000000..1c99470d --- /dev/null +++ b/sources/menus/register/steps/general_conditions_step.tscn @@ -0,0 +1,83 @@ +[gd_scene load_steps=3 format=3 uid="uid://dimxdgkufgo12"] + +[ext_resource type="PackedScene" uid="uid://bxd3i06rqpxf0" path="res://sources/menus/register/steps/base_step.tscn" id="1_up4b7"] +[ext_resource type="Script" path="res://sources/menus/register/steps/general_conditions_step.gd" id="2_5ibpi"] + +[node name="GeneralConditionsStep" instance=ExtResource("1_up4b7")] +script = ExtResource("2_5ibpi") + +[node name="PanelContainer" parent="." index="2"] +offset_left = -785.0 +offset_right = 785.0 +offset_bottom = 1344.0 + +[node name="QuestionContainer" parent="PanelContainer" index="0"] +theme_override_constants/margin_top = 25 + +[node name="VBoxContainer" type="VBoxContainer" parent="PanelContainer/QuestionContainer" index="0"] +layout_mode = 2 + +[node name="ConditionsLabel" type="RichTextLabel" parent="PanelContainer/QuestionContainer/VBoxContainer" index="0"] +unique_name_in_owner = true +custom_minimum_size = Vector2(0, 250) +layout_mode = 2 +size_flags_horizontal = 3 +size_flags_vertical = 3 +theme_override_font_sizes/normal_font_size = 32 +theme_override_font_sizes/bold_font_size = 32 +theme_override_font_sizes/italics_font_size = 32 +theme_override_font_sizes/bold_italics_font_size = 32 +theme_override_font_sizes/mono_font_size = 32 +text = "Lorem ipsum dolor sit amet, consectetur adipiscing elit. Praesent eu facilisis est. Pellentesque pulvinar urna sit amet mollis luctus. Vestibulum posuere viverra accumsan. Quisque viverra luctus facilisis. Aenean varius venenatis egestas. Donec finibus semper quam in auctor. Integer in faucibus magna. Nunc aliquet leo eu leo efficitur, non vehicula nibh vestibulum. Vivamus magna ex, laoreet nec nunc non, accumsan interdum odio. Nulla facilisi. Nam quis vehicula velit, ut euismod nibh. Interdum et malesuada fames ac ante ipsum primis in faucibus. + +Proin a dolor posuere dolor vulputate cursus vitae at metus. Donec gravida, mi id pellentesque eleifend, lectus dolor vehicula tellus, eu malesuada nisl metus eu nunc. Donec eleifend purus sed ex vestibulum, vitae mollis eros malesuada. Integer efficitur dolor sed mi tincidunt, ac venenatis nulla vehicula. Morbi vel aliquet purus. Cras facilisis nisl ante, eu commodo sem posuere ut. Duis nec diam gravida lectus sagittis malesuada vel quis libero. Suspendisse nulla dolor, tempor sed lectus in, vehicula laoreet neque. Vestibulum iaculis massa et ex dignissim vehicula. Aliquam fringilla scelerisque ante, eu ornare massa hendrerit quis. Curabitur eu ultrices lectus, non laoreet velit. In sit amet iaculis arcu. Nullam commodo vel neque eu fringilla. + +Maecenas id ligula egestas arcu porttitor posuere sit amet sit amet dui. Suspendisse id erat accumsan, faucibus enim et, vulputate erat. Donec augue risus, tempus sit amet eleifend nec, gravida eget ligula. Morbi a lectus a nunc vulputate commodo eget vitae nunc. Curabitur tincidunt tellus sit amet purus aliquam vehicula. Vestibulum facilisis dolor orci, sed varius ex sollicitudin ac. Sed ornare accumsan eros, id placerat lectus consequat quis. Ut ultricies congue mattis. Pellentesque tellus nisl, placerat sollicitudin mauris vitae, aliquet sollicitudin urna. Etiam nec facilisis sem. + +Nam vel lectus at mauris ultrices fermentum ut quis ligula. Proin ac purus eu turpis cursus commodo. Proin auctor nisi eget eros feugiat scelerisque. Donec dictum arcu vel ex ultricies, et gravida eros dignissim. Fusce sit amet tempor arcu. Sed sagittis pellentesque velit, ac tincidunt purus pharetra at. Ut ac purus ac sem tempor scelerisque eget pretium dolor. Ut id mi elit. + +Proin semper eu erat nec feugiat. Vivamus eros enim, semper quis venenatis et, porta id neque. Etiam interdum nibh eget diam aliquam, dignissim suscipit enim malesuada. Pellentesque lacus ipsum, ultrices et lobortis in, semper quis mauris. Maecenas ut faucibus odio. Aenean neque felis, consequat ac auctor at, cursus vitae libero. Vestibulum porttitor convallis sapien nec imperdiet. Nulla tortor magna, aliquet in viverra quis, efficitur quis nisl. Nullam varius gravida felis. Donec sed ultricies lectus. + +Morbi sed orci ex. Fusce sagittis sapien ut nisi commodo tristique. Cras vitae egestas sem. Cras fermentum elementum massa vitae ultricies. Suspendisse hendrerit, massa non semper laoreet, leo leo posuere lectus, a porta ipsum nulla dictum arcu. Nam eleifend mi neque, sed dignissim dui sodales quis. Suspendisse vel pharetra diam. Interdum et malesuada fames ac ante ipsum primis in faucibus. Integer ac mi orci. Sed gravida lacus a nibh bibendum rutrum. Vestibulum facilisis molestie purus, eget fringilla mi ultricies eget. Aenean tristique at libero a placerat. Phasellus eu odio pellentesque, posuere nisi id, cursus metus. + +In hac habitasse platea dictumst. Vivamus fermentum tortor non hendrerit facilisis. Mauris finibus cursus ante a vestibulum. Sed consectetur neque sed velit scelerisque, sit amet sodales justo auctor. Maecenas elit enim, luctus ut rutrum eget, aliquam facilisis ipsum. Duis eu odio egestas, ultrices augue in, vulputate odio. Donec fringilla sem non eros consequat, eu efficitur massa cursus. Vivamus tincidunt libero sed dolor pretium pellentesque. Mauris ac nisl vitae mauris gravida tempus quis a turpis. Maecenas molestie porta ornare. Etiam eu orci ante. Nam molestie libero non tincidunt sodales. + +Nulla facilisi. Praesent aliquam magna ut porta suscipit. Cras et ullamcorper est, ut elementum ipsum. Cras sit amet venenatis orci. Aliquam est ligula, tincidunt accumsan leo id, volutpat iaculis arcu. Fusce ultrices augue et urna egestas facilisis. Vivamus a malesuada turpis. + +Donec libero mauris, euismod sit amet cursus eu, varius eget sapien. Duis nisi nisl, sagittis sit amet augue vitae, elementum gravida dolor. Nam in accumsan magna. Pellentesque et sem nec ante molestie mollis eu in quam. Mauris ac rhoncus sapien. Mauris sapien nibh, maximus at eros eu, blandit interdum justo. Curabitur et purus non ipsum ultricies interdum. Nunc rutrum turpis ut odio lacinia, vitae mollis nulla imperdiet. Vestibulum vehicula diam tellus, at tincidunt diam tincidunt quis. Praesent sed tellus non dolor accumsan fermentum. Aliquam erat volutpat. Aliquam massa tortor, consectetur sed dapibus at, mollis vel diam. + +Praesent sollicitudin mattis justo, vel feugiat felis faucibus eu. Phasellus ut risus eu risus vestibulum elementum et sit amet ligula. Vestibulum eleifend nisl a ipsum fringilla tincidunt. Nullam non purus pulvinar, facilisis magna malesuada, tincidunt odio. Aliquam pulvinar ante nec feugiat vulputate. Pellentesque interdum nunc at massa mollis, at aliquam dolor ornare. Cras tincidunt felis ut molestie placerat. Aliquam fringilla rutrum velit, id congue felis commodo vehicula. Donec id mi facilisis, congue lectus ut, sodales lorem." +autowrap_mode = 2 +shortcut_keys_enabled = false + +[node name="AcceptContainer" type="MarginContainer" parent="PanelContainer/QuestionContainer/VBoxContainer" index="1"] +layout_mode = 2 +size_flags_vertical = 8 +theme_override_constants/margin_left = 20 +theme_override_constants/margin_top = 20 +theme_override_constants/margin_right = 20 +theme_override_constants/margin_bottom = 20 + +[node name="VBoxContainer" type="VBoxContainer" parent="PanelContainer/QuestionContainer/VBoxContainer/AcceptContainer" index="0"] +layout_mode = 2 + +[node name="Accept" type="CheckBox" parent="PanelContainer/QuestionContainer/VBoxContainer/AcceptContainer/VBoxContainer" index="0"] +unique_name_in_owner = true +layout_mode = 2 +theme_override_font_sizes/font_size = 50 +text = "Accept" +flat = true + +[node name="AcceptError" type="Label" parent="PanelContainer/QuestionContainer/VBoxContainer/AcceptContainer/VBoxContainer" index="1"] +unique_name_in_owner = true +visible = false +layout_mode = 2 +text = "Please click accept to move forward" + +[node name="QuestionLabel" parent="PanelContainer/QuestionContainer" index="1"] +visible = false + +[node name="Background" parent="." index="3"] +visible = false + +[connection signal="pressed" from="PanelContainer/QuestionContainer/VBoxContainer/AcceptContainer/VBoxContainer/Accept" to="." method="_on_accept_pressed"] diff --git a/sources/menus/register/steps/recap_step.gd b/sources/menus/register/steps/recap_step.gd new file mode 100644 index 00000000..d2141cfb --- /dev/null +++ b/sources/menus/register/steps/recap_step.gd @@ -0,0 +1,45 @@ +extends Step + +const device_recap_scene : PackedScene = preload("res://sources/menus/register/steps/device_recap.tscn") + +@onready var recap_container = %RecapContainer +@onready var email : Label = %Email +@onready var account_type : Label = %AccountType +@onready var education_method : Label = %EducationMethod +@onready var devices_count : Label = %DevicesCount +@onready var students_count : Label = %StudentsCount + + +func _ready(): + super._ready() + + var register_data = data as TeacherSettings + if not register_data: + return + + email.text = email.text % register_data.email + account_type.text = account_type.text % register_data.account_type + + if register_data.account_type == TeacherSettings.AccountType.Teacher: + education_method.text = education_method.text % register_data.education_method + education_method.show() + else: + education_method.hide() + + devices_count.text = devices_count.text % register_data.students.size() + + students_count.text = students_count.text % register_data.get_students_count() + + for device in register_data.students.keys(): + var device_recap : DeviceRecap = device_recap_scene.instantiate() + + if register_data.account_type == TeacherSettings.AccountType.Teacher: + device_recap.title = "Device %d" % device + else: + device_recap.title = "Players" + device_recap.students = register_data.students[device] + + + + recap_container.add_child(device_recap) + diff --git a/sources/menus/register/steps/recap_step.tscn b/sources/menus/register/steps/recap_step.tscn new file mode 100644 index 00000000..2bd2a1d9 --- /dev/null +++ b/sources/menus/register/steps/recap_step.tscn @@ -0,0 +1,76 @@ +[gd_scene load_steps=3 format=3 uid="uid://0arkj3ss1fbj"] + +[ext_resource type="PackedScene" uid="uid://bxd3i06rqpxf0" path="res://sources/menus/register/steps/base_step.tscn" id="1_crpog"] +[ext_resource type="Script" path="res://sources/menus/register/steps/recap_step.gd" id="2_0vlqx"] + +[node name="RecapStep" instance=ExtResource("1_crpog")] +script = ExtResource("2_0vlqx") + +[node name="ValidateButton" parent="RightMargin/RightContainer" index="0"] +text = "Validate" + +[node name="PanelContainer" parent="." index="2"] +offset_left = -1024.0 +offset_right = 1024.0 +offset_bottom = 1344.0 + +[node name="QuestionLabel" parent="PanelContainer/QuestionContainer" index="0"] +visible = false + +[node name="VBoxContainer" type="VBoxContainer" parent="PanelContainer/QuestionContainer" index="1"] +layout_mode = 2 +theme_override_constants/separation = 50 + +[node name="Title" type="Label" parent="PanelContainer/QuestionContainer/VBoxContainer" index="0"] +layout_mode = 2 +theme_override_font_sizes/font_size = 70 +text = "Registration summary" +horizontal_alignment = 1 +vertical_alignment = 1 + +[node name="ScrollContainer" type="ScrollContainer" parent="PanelContainer/QuestionContainer/VBoxContainer" index="1"] +layout_mode = 2 +size_flags_vertical = 3 + +[node name="VBoxContainer" type="VBoxContainer" parent="PanelContainer/QuestionContainer/VBoxContainer/ScrollContainer" index="0"] +layout_mode = 2 +size_flags_horizontal = 3 +size_flags_vertical = 3 +theme_override_constants/separation = 20 + +[node name="Email" type="Label" parent="PanelContainer/QuestionContainer/VBoxContainer/ScrollContainer/VBoxContainer" index="0"] +unique_name_in_owner = true +layout_mode = 2 +theme_override_font_sizes/font_size = 50 +text = "Email address : %s" + +[node name="AccountType" type="Label" parent="PanelContainer/QuestionContainer/VBoxContainer/ScrollContainer/VBoxContainer" index="1"] +unique_name_in_owner = true +layout_mode = 2 +theme_override_font_sizes/font_size = 50 +text = "Account type : %s" + +[node name="EducationMethod" type="Label" parent="PanelContainer/QuestionContainer/VBoxContainer/ScrollContainer/VBoxContainer" index="2"] +unique_name_in_owner = true +layout_mode = 2 +theme_override_font_sizes/font_size = 50 +text = "Education method : %s" + +[node name="DevicesCount" type="Label" parent="PanelContainer/QuestionContainer/VBoxContainer/ScrollContainer/VBoxContainer" index="3"] +unique_name_in_owner = true +layout_mode = 2 +theme_override_font_sizes/font_size = 50 +text = "Number of devices : %d" + +[node name="StudentsCount" type="Label" parent="PanelContainer/QuestionContainer/VBoxContainer/ScrollContainer/VBoxContainer" index="4"] +unique_name_in_owner = true +layout_mode = 2 +theme_override_font_sizes/font_size = 50 +text = "Number of students : %d" + +[node name="RecapContainer" type="VBoxContainer" parent="PanelContainer/QuestionContainer/VBoxContainer/ScrollContainer/VBoxContainer" index="5"] +unique_name_in_owner = true +layout_mode = 2 + +[node name="Background" parent="." index="3"] +visible = false diff --git a/sources/menus/settings/device_tab.gd b/sources/menus/settings/device_tab.gd new file mode 100644 index 00000000..12ef461e --- /dev/null +++ b/sources/menus/settings/device_tab.gd @@ -0,0 +1,30 @@ +extends TabBar +class_name DeviceTab + +const student_panel_scene : PackedScene = preload("res://sources/menus/settings/student_panel.tscn") + +@onready var students_container : GridContainer = %StudentsContainer + +@export var device_id : int +@export var students : Array[StudentData] = [] + + +func _ready(): + refresh() + + +func refresh(): + for child in students_container.get_children(): + child.queue_free() + + if not students: + return + + var student_count : int = 1 + for student in students: + var student_panel := student_panel_scene.instantiate() + student_panel.student_count = student_count + student_panel.student_data = student + students_container.add_child(student_panel) + + student_count += 1 diff --git a/sources/menus/settings/device_tab.tscn b/sources/menus/settings/device_tab.tscn new file mode 100644 index 00000000..87ff6e52 --- /dev/null +++ b/sources/menus/settings/device_tab.tscn @@ -0,0 +1,38 @@ +[gd_scene load_steps=2 format=3 uid="uid://c4jpo4l5w2vhv"] + +[ext_resource type="Script" path="res://sources/menus/settings/device_tab.gd" id="1_40sjo"] + +[node name="DeviceTab" type="TabBar"] +anchors_preset = 15 +anchor_right = 1.0 +anchor_bottom = 1.0 +grow_horizontal = 2 +grow_vertical = 2 +script = ExtResource("1_40sjo") + +[node name="ScrollContainer" type="ScrollContainer" parent="."] +layout_mode = 1 +anchors_preset = 15 +anchor_right = 1.0 +anchor_bottom = 1.0 +grow_horizontal = 2 +grow_vertical = 2 +horizontal_scroll_mode = 0 + +[node name="MarginContainer" type="MarginContainer" parent="ScrollContainer"] +layout_mode = 2 +size_flags_horizontal = 3 +size_flags_vertical = 3 +theme_override_constants/margin_left = 100 +theme_override_constants/margin_top = 100 +theme_override_constants/margin_right = 100 +theme_override_constants/margin_bottom = 100 + +[node name="StudentsContainer" type="GridContainer" parent="ScrollContainer/MarginContainer"] +unique_name_in_owner = true +layout_mode = 2 +size_flags_horizontal = 3 +size_flags_vertical = 3 +theme_override_constants/h_separation = 25 +theme_override_constants/v_separation = 25 +columns = 2 diff --git a/sources/menus/settings/student_panel.gd b/sources/menus/settings/student_panel.gd new file mode 100644 index 00000000..607a4830 --- /dev/null +++ b/sources/menus/settings/student_panel.gd @@ -0,0 +1,25 @@ +extends Control +class_name StudentPanel + +@onready var name_label : Label = %NameLabel +@onready var password_visualizer : PasswordVisualizer = %PasswordVisualizer + +@export var student_count : int +@export var student_data : StudentData + +func _ready(): + if not student_data: + return + + if student_data.name: + name_label.text = student_data.name + else: + name_label.text = "Student %d" % student_count + + if student_data.code: + password_visualizer.password = student_data.code + + +func _on_details_button_pressed(): + # UserDataManager.delete_student(1, student_data.code) + print(student_data) diff --git a/sources/menus/settings/student_panel.tscn b/sources/menus/settings/student_panel.tscn new file mode 100644 index 00000000..bc0e68b8 --- /dev/null +++ b/sources/menus/settings/student_panel.tscn @@ -0,0 +1,54 @@ +[gd_scene load_steps=3 format=3 uid="uid://ds3sacjbuqac"] + +[ext_resource type="PackedScene" uid="uid://c5ey1jk06asiq" path="res://sources/menus/components/password_visualizer.tscn" id="1_7chbh"] +[ext_resource type="Script" path="res://sources/menus/settings/student_panel.gd" id="1_teefe"] + +[node name="StudentPanel" type="Control"] +custom_minimum_size = Vector2(822, 500) +layout_mode = 3 +anchors_preset = 0 +offset_right = 500.0 +offset_bottom = 500.0 +size_flags_horizontal = 3 +script = ExtResource("1_teefe") + +[node name="StudentContainer" type="PanelContainer" parent="."] +layout_mode = 1 +anchors_preset = 8 +anchor_left = 0.5 +anchor_top = 0.5 +anchor_right = 0.5 +anchor_bottom = 0.5 +offset_left = -411.0 +offset_top = -180.0 +offset_right = 411.0 +offset_bottom = 180.0 +grow_horizontal = 2 +grow_vertical = 2 + +[node name="MarginContainer" type="MarginContainer" parent="StudentContainer"] +layout_mode = 2 +theme_override_constants/margin_left = 25 +theme_override_constants/margin_top = 25 +theme_override_constants/margin_right = 25 +theme_override_constants/margin_bottom = 25 + +[node name="VBoxContainer" type="VBoxContainer" parent="StudentContainer/MarginContainer"] +layout_mode = 2 +theme_override_constants/separation = 20 + +[node name="NameLabel" type="Label" parent="StudentContainer/MarginContainer/VBoxContainer"] +unique_name_in_owner = true +layout_mode = 2 +theme_override_font_sizes/font_size = 50 +horizontal_alignment = 1 +vertical_alignment = 1 + +[node name="PasswordVisualizer" parent="StudentContainer/MarginContainer/VBoxContainer" instance=ExtResource("1_7chbh")] +unique_name_in_owner = true +layout_mode = 2 + +[node name="DetailsButton" type="TextureButton" parent="StudentContainer"] +layout_mode = 2 + +[connection signal="pressed" from="StudentContainer/DetailsButton" to="." method="_on_details_button_pressed"] diff --git a/sources/menus/settings/teacher_settings.gd b/sources/menus/settings/teacher_settings.gd new file mode 100644 index 00000000..d87a43b4 --- /dev/null +++ b/sources/menus/settings/teacher_settings.gd @@ -0,0 +1,59 @@ +extends Control + +const main_menu_path := "res://sources/menus/main/main_menu.tscn" +const login_menu_path := "res://sources/menus/login/login.tscn" + +const device_tab_scene : PackedScene = preload("res://sources/menus/settings/device_tab.tscn") + +@onready var devices_tab_container : TabContainer = %DevicesTabContainer + +func _ready(): + _refresh_devices_tabs() + + +func _refresh_devices_tabs() -> void: + for child in devices_tab_container.get_children(false): + child.queue_free() + + if not UserDataManager.teacher_settings: + push_error("Teacher settings not found") + return + + for device in UserDataManager.teacher_settings.students.keys(): + var device_tab := device_tab_scene.instantiate() + device_tab.name = "Device " + str(device) + device_tab.device_id = device + device_tab.students = UserDataManager.teacher_settings.students[device] + devices_tab_container.add_child(device_tab) + + +func _on_back_button_pressed(): + get_tree().change_scene_to_file(login_menu_path) + + +func _on_button_pressed(): + if UserDataManager.teacher_settings: + print(UserDataManager.teacher_settings.students) + + +func _on_logout_button_pressed(): + UserDataManager.logout() + get_tree().change_scene_to_file(main_menu_path) + + +func _on_add_student_button_pressed(): + var current_tab = devices_tab_container.get_current_tab_control() as DeviceTab + if not current_tab: + return + + # TODO If parent -> show a creation popup + # TODO If teacher -> create a default student + + if UserDataManager.add_default_student(current_tab.device_id): + current_tab.students = UserDataManager.teacher_settings.students[current_tab.device_id] + current_tab.refresh() + + +func _on_add_device_button_pressed(): + if UserDataManager.add_device(): + _refresh_devices_tabs() diff --git a/sources/menus/settings/teacher_settings.tscn b/sources/menus/settings/teacher_settings.tscn new file mode 100644 index 00000000..7493bf2c --- /dev/null +++ b/sources/menus/settings/teacher_settings.tscn @@ -0,0 +1,101 @@ +[gd_scene load_steps=6 format=3 uid="uid://ci7ueo06f24k3"] + +[ext_resource type="Script" path="res://sources/menus/settings/teacher_settings.gd" id="1_ojivk"] +[ext_resource type="PackedScene" uid="uid://wdjp1sv55q4f" path="res://sources/menus/components/night_sky/night_sky.tscn" id="1_v06h8"] +[ext_resource type="Texture2D" uid="uid://wtx3wqs0l4si" path="res://assets/minigames/minigame_ui/graphic/button_back_up.png" id="3_hvu1i"] +[ext_resource type="Texture2D" uid="uid://cbhip35yyqneg" path="res://assets/minigames/minigame_ui/graphic/button_back_down.png" id="4_045cm"] +[ext_resource type="Texture2D" uid="uid://tcapan0mj64o" path="res://assets/minigames/minigame_ui/graphic/button_back_disabled.png" id="5_e3piv"] + +[node name="TeacherSettings" 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_ojivk") + +[node name="Background" parent="." instance=ExtResource("1_v06h8")] +layout_mode = 1 + +[node name="InterfaceLeft" type="MarginContainer" parent="."] +custom_minimum_size = Vector2(450, 0) +layout_mode = 1 +anchors_preset = 9 +anchor_bottom = 1.0 +offset_right = 450.0 +grow_vertical = 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="Container" type="VBoxContainer" parent="InterfaceLeft"] +layout_mode = 2 + +[node name="BackButton" type="TextureButton" parent="InterfaceLeft/Container"] +layout_mode = 2 +size_flags_vertical = 3 +size_flags_stretch_ratio = 4.0 +texture_normal = ExtResource("3_hvu1i") +texture_pressed = ExtResource("4_045cm") +texture_disabled = ExtResource("5_e3piv") +stretch_mode = 4 + +[node name="LogoutButton" type="Button" parent="InterfaceLeft/Container"] +layout_mode = 2 +theme_override_font_sizes/font_size = 70 +text = "Logout" + +[node name="VBoxContainer" type="VBoxContainer" parent="."] +custom_minimum_size = Vector2(2112, 1800) +layout_mode = 1 +anchors_preset = 11 +anchor_left = 1.0 +anchor_right = 1.0 +anchor_bottom = 1.0 +offset_left = -632.0 +grow_horizontal = 0 +grow_vertical = 2 + +[node name="DevicesTabContainer" type="TabContainer" parent="VBoxContainer"] +unique_name_in_owner = true +layout_mode = 2 +size_flags_vertical = 3 + +[node name="InterfaceBottom" type="MarginContainer" parent="VBoxContainer"] +layout_mode = 2 +theme_override_constants/margin_top = 25 +theme_override_constants/margin_right = 50 +theme_override_constants/margin_bottom = 50 + +[node name="Container" type="HBoxContainer" parent="VBoxContainer/InterfaceBottom"] +layout_mode = 2 +theme_override_constants/separation = 25 +alignment = 2 + +[node name="AddDeviceButton" type="Button" parent="VBoxContainer/InterfaceBottom/Container"] +layout_mode = 2 +theme_override_font_sizes/font_size = 70 +text = "Add device" + +[node name="AddStudentButton" type="Button" parent="VBoxContainer/InterfaceBottom/Container"] +layout_mode = 2 +theme_override_font_sizes/font_size = 70 +text = "Add student" + +[node name="DeleteDeviceButton" type="Button" parent="VBoxContainer/InterfaceBottom/Container"] +layout_mode = 2 +theme_override_font_sizes/font_size = 70 +text = "Delete device" + +[node name="PrintButton" type="Button" parent="VBoxContainer/InterfaceBottom/Container"] +layout_mode = 2 +theme_override_font_sizes/font_size = 70 +text = "Print" + +[connection signal="pressed" from="InterfaceLeft/Container/BackButton" to="." method="_on_back_button_pressed"] +[connection signal="pressed" from="InterfaceLeft/Container/LogoutButton" to="." method="_on_logout_button_pressed"] +[connection signal="pressed" from="VBoxContainer/InterfaceBottom/Container/AddDeviceButton" to="." method="_on_add_device_button_pressed"] +[connection signal="pressed" from="VBoxContainer/InterfaceBottom/Container/AddStudentButton" to="." method="_on_add_student_button_pressed"] +[connection signal="pressed" from="VBoxContainer/InterfaceBottom/Container/PrintButton" to="." method="_on_button_pressed"] diff --git a/sources/menus/teacher/teacher_settings.gd b/sources/menus/teacher/teacher_settings.gd deleted file mode 100644 index 77164aa6..00000000 --- a/sources/menus/teacher/teacher_settings.gd +++ /dev/null @@ -1,18 +0,0 @@ -extends Control - -const main_menu_path := "res://sources/menus/main/main_menu.tscn" -const login_menu_path := "res://sources/menus/login/login.tscn" - - -func _on_back_button_pressed(): - get_tree().change_scene_to_file(login_menu_path) - - -func _on_button_pressed(): - if UserDataManager.teacher_settings: - print(UserDataManager.teacher_settings.students) - - -func _on_logout_button_pressed(): - UserDataManager.logout() - get_tree().change_scene_to_file(main_menu_path) diff --git a/sources/menus/teacher/teacher_settings.tscn b/sources/menus/teacher/teacher_settings.tscn deleted file mode 100644 index 7710a031..00000000 --- a/sources/menus/teacher/teacher_settings.tscn +++ /dev/null @@ -1,432 +0,0 @@ -[gd_scene load_steps=7 format=3 uid="uid://ci7ueo06f24k3"] - -[ext_resource type="Script" path="res://sources/menus/teacher/teacher_settings.gd" id="1_ojivk"] -[ext_resource type="PackedScene" uid="uid://wdjp1sv55q4f" path="res://sources/menus/night_sky/night_sky.tscn" id="1_v06h8"] -[ext_resource type="Texture2D" uid="uid://wtx3wqs0l4si" path="res://assets/minigames/minigame_ui/graphic/button_back_up.png" id="3_hvu1i"] -[ext_resource type="Texture2D" uid="uid://cbhip35yyqneg" path="res://assets/minigames/minigame_ui/graphic/button_back_down.png" id="4_045cm"] -[ext_resource type="Texture2D" uid="uid://tcapan0mj64o" path="res://assets/minigames/minigame_ui/graphic/button_back_disabled.png" id="5_e3piv"] -[ext_resource type="PackedScene" uid="uid://c5ey1jk06asiq" path="res://sources/menus/components/password_visualizer.tscn" id="6_lywux"] - -[node name="TeacherSettings" 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_ojivk") - -[node name="Background" parent="." instance=ExtResource("1_v06h8")] -layout_mode = 1 - -[node name="InterfaceLeft" type="MarginContainer" parent="."] -custom_minimum_size = Vector2(450, 0) -layout_mode = 1 -anchors_preset = 9 -anchor_bottom = 1.0 -offset_right = 450.0 -grow_vertical = 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="Container" type="VBoxContainer" parent="InterfaceLeft"] -layout_mode = 2 - -[node name="BackButton" type="TextureButton" parent="InterfaceLeft/Container"] -layout_mode = 2 -size_flags_vertical = 3 -size_flags_stretch_ratio = 4.0 -texture_normal = ExtResource("3_hvu1i") -texture_pressed = ExtResource("4_045cm") -texture_disabled = ExtResource("5_e3piv") -stretch_mode = 4 - -[node name="LogoutButton" type="Button" parent="InterfaceLeft/Container"] -layout_mode = 2 -theme_override_font_sizes/font_size = 70 -text = "Logout" - -[node name="VBoxContainer" type="VBoxContainer" parent="."] -custom_minimum_size = Vector2(2112, 1800) -layout_mode = 1 -anchors_preset = 11 -anchor_left = 1.0 -anchor_right = 1.0 -anchor_bottom = 1.0 -offset_left = -632.0 -grow_horizontal = 0 -grow_vertical = 2 - -[node name="TabContainer" type="TabContainer" parent="VBoxContainer"] -layout_mode = 2 -size_flags_vertical = 3 -theme_override_constants/outline_size = 0 -theme_override_font_sizes/font_size = 70 - -[node name="Device 1" type="TabBar" parent="VBoxContainer/TabContainer"] -layout_mode = 2 - -[node name="ScrollContainer" type="ScrollContainer" parent="VBoxContainer/TabContainer/Device 1"] -layout_mode = 1 -anchors_preset = 15 -anchor_right = 1.0 -anchor_bottom = 1.0 -grow_horizontal = 2 -grow_vertical = 2 - -[node name="MarginContainer" type="MarginContainer" parent="VBoxContainer/TabContainer/Device 1/ScrollContainer"] -layout_mode = 2 -size_flags_horizontal = 3 -size_flags_vertical = 3 -theme_override_constants/margin_left = 100 -theme_override_constants/margin_top = 100 -theme_override_constants/margin_right = 100 -theme_override_constants/margin_bottom = 100 - -[node name="GridContainer" type="GridContainer" parent="VBoxContainer/TabContainer/Device 1/ScrollContainer/MarginContainer"] -layout_mode = 2 -size_flags_horizontal = 3 -size_flags_vertical = 3 -theme_override_constants/h_separation = 25 -theme_override_constants/v_separation = 25 -columns = 2 - -[node name="Control" type="Control" parent="VBoxContainer/TabContainer/Device 1/ScrollContainer/MarginContainer/GridContainer"] -custom_minimum_size = Vector2(0, 500) -layout_mode = 2 -size_flags_horizontal = 3 -size_flags_vertical = 3 - -[node name="StudentContainer" type="PanelContainer" parent="VBoxContainer/TabContainer/Device 1/ScrollContainer/MarginContainer/GridContainer/Control"] -layout_mode = 1 -anchors_preset = 8 -anchor_left = 0.5 -anchor_top = 0.5 -anchor_right = 0.5 -anchor_bottom = 0.5 -offset_left = -411.0 -offset_top = -180.0 -offset_right = 411.0 -offset_bottom = 180.0 -grow_horizontal = 2 -grow_vertical = 2 - -[node name="MarginContainer" type="MarginContainer" parent="VBoxContainer/TabContainer/Device 1/ScrollContainer/MarginContainer/GridContainer/Control/StudentContainer"] -layout_mode = 2 -theme_override_constants/margin_left = 25 -theme_override_constants/margin_top = 25 -theme_override_constants/margin_right = 25 -theme_override_constants/margin_bottom = 25 - -[node name="VBoxContainer" type="VBoxContainer" parent="VBoxContainer/TabContainer/Device 1/ScrollContainer/MarginContainer/GridContainer/Control/StudentContainer/MarginContainer"] -layout_mode = 2 - -[node name="Label" type="Label" parent="VBoxContainer/TabContainer/Device 1/ScrollContainer/MarginContainer/GridContainer/Control/StudentContainer/MarginContainer/VBoxContainer"] -layout_mode = 2 -theme_override_font_sizes/font_size = 50 -text = "Student 1" -horizontal_alignment = 1 -vertical_alignment = 1 - -[node name="PasswordVisualizer" parent="VBoxContainer/TabContainer/Device 1/ScrollContainer/MarginContainer/GridContainer/Control/StudentContainer/MarginContainer/VBoxContainer" instance=ExtResource("6_lywux")] -layout_mode = 2 -password = "123" - -[node name="Control2" type="Control" parent="VBoxContainer/TabContainer/Device 1/ScrollContainer/MarginContainer/GridContainer"] -custom_minimum_size = Vector2(0, 500) -layout_mode = 2 -size_flags_horizontal = 3 -size_flags_vertical = 3 - -[node name="StudentContainer" type="PanelContainer" parent="VBoxContainer/TabContainer/Device 1/ScrollContainer/MarginContainer/GridContainer/Control2"] -layout_mode = 1 -anchors_preset = 8 -anchor_left = 0.5 -anchor_top = 0.5 -anchor_right = 0.5 -anchor_bottom = 0.5 -offset_left = -411.0 -offset_top = -180.0 -offset_right = 411.0 -offset_bottom = 180.0 -grow_horizontal = 2 -grow_vertical = 2 - -[node name="MarginContainer" type="MarginContainer" parent="VBoxContainer/TabContainer/Device 1/ScrollContainer/MarginContainer/GridContainer/Control2/StudentContainer"] -layout_mode = 2 -theme_override_constants/margin_left = 25 -theme_override_constants/margin_top = 25 -theme_override_constants/margin_right = 25 -theme_override_constants/margin_bottom = 25 - -[node name="VBoxContainer" type="VBoxContainer" parent="VBoxContainer/TabContainer/Device 1/ScrollContainer/MarginContainer/GridContainer/Control2/StudentContainer/MarginContainer"] -layout_mode = 2 - -[node name="Label" type="Label" parent="VBoxContainer/TabContainer/Device 1/ScrollContainer/MarginContainer/GridContainer/Control2/StudentContainer/MarginContainer/VBoxContainer"] -layout_mode = 2 -theme_override_font_sizes/font_size = 50 -text = "Student 1" -horizontal_alignment = 1 -vertical_alignment = 1 - -[node name="PasswordVisualizer" parent="VBoxContainer/TabContainer/Device 1/ScrollContainer/MarginContainer/GridContainer/Control2/StudentContainer/MarginContainer/VBoxContainer" instance=ExtResource("6_lywux")] -layout_mode = 2 -password = "123" - -[node name="Control3" type="Control" parent="VBoxContainer/TabContainer/Device 1/ScrollContainer/MarginContainer/GridContainer"] -custom_minimum_size = Vector2(0, 500) -layout_mode = 2 -size_flags_horizontal = 3 -size_flags_vertical = 3 - -[node name="StudentContainer" type="PanelContainer" parent="VBoxContainer/TabContainer/Device 1/ScrollContainer/MarginContainer/GridContainer/Control3"] -layout_mode = 1 -anchors_preset = 8 -anchor_left = 0.5 -anchor_top = 0.5 -anchor_right = 0.5 -anchor_bottom = 0.5 -offset_left = -411.0 -offset_top = -180.0 -offset_right = 411.0 -offset_bottom = 180.0 -grow_horizontal = 2 -grow_vertical = 2 - -[node name="MarginContainer" type="MarginContainer" parent="VBoxContainer/TabContainer/Device 1/ScrollContainer/MarginContainer/GridContainer/Control3/StudentContainer"] -layout_mode = 2 -theme_override_constants/margin_left = 25 -theme_override_constants/margin_top = 25 -theme_override_constants/margin_right = 25 -theme_override_constants/margin_bottom = 25 - -[node name="VBoxContainer" type="VBoxContainer" parent="VBoxContainer/TabContainer/Device 1/ScrollContainer/MarginContainer/GridContainer/Control3/StudentContainer/MarginContainer"] -layout_mode = 2 - -[node name="Label" type="Label" parent="VBoxContainer/TabContainer/Device 1/ScrollContainer/MarginContainer/GridContainer/Control3/StudentContainer/MarginContainer/VBoxContainer"] -layout_mode = 2 -theme_override_font_sizes/font_size = 50 -text = "Student 1" -horizontal_alignment = 1 -vertical_alignment = 1 - -[node name="PasswordVisualizer" parent="VBoxContainer/TabContainer/Device 1/ScrollContainer/MarginContainer/GridContainer/Control3/StudentContainer/MarginContainer/VBoxContainer" instance=ExtResource("6_lywux")] -layout_mode = 2 -password = "123" - -[node name="Control4" type="Control" parent="VBoxContainer/TabContainer/Device 1/ScrollContainer/MarginContainer/GridContainer"] -custom_minimum_size = Vector2(0, 500) -layout_mode = 2 -size_flags_horizontal = 3 -size_flags_vertical = 3 - -[node name="StudentContainer" type="PanelContainer" parent="VBoxContainer/TabContainer/Device 1/ScrollContainer/MarginContainer/GridContainer/Control4"] -layout_mode = 1 -anchors_preset = 8 -anchor_left = 0.5 -anchor_top = 0.5 -anchor_right = 0.5 -anchor_bottom = 0.5 -offset_left = -411.0 -offset_top = -180.0 -offset_right = 411.0 -offset_bottom = 180.0 -grow_horizontal = 2 -grow_vertical = 2 - -[node name="MarginContainer" type="MarginContainer" parent="VBoxContainer/TabContainer/Device 1/ScrollContainer/MarginContainer/GridContainer/Control4/StudentContainer"] -layout_mode = 2 -theme_override_constants/margin_left = 25 -theme_override_constants/margin_top = 25 -theme_override_constants/margin_right = 25 -theme_override_constants/margin_bottom = 25 - -[node name="VBoxContainer" type="VBoxContainer" parent="VBoxContainer/TabContainer/Device 1/ScrollContainer/MarginContainer/GridContainer/Control4/StudentContainer/MarginContainer"] -layout_mode = 2 - -[node name="Label" type="Label" parent="VBoxContainer/TabContainer/Device 1/ScrollContainer/MarginContainer/GridContainer/Control4/StudentContainer/MarginContainer/VBoxContainer"] -layout_mode = 2 -theme_override_font_sizes/font_size = 50 -text = "Student 1" -horizontal_alignment = 1 -vertical_alignment = 1 - -[node name="PasswordVisualizer" parent="VBoxContainer/TabContainer/Device 1/ScrollContainer/MarginContainer/GridContainer/Control4/StudentContainer/MarginContainer/VBoxContainer" instance=ExtResource("6_lywux")] -layout_mode = 2 -password = "123" - -[node name="Control5" type="Control" parent="VBoxContainer/TabContainer/Device 1/ScrollContainer/MarginContainer/GridContainer"] -custom_minimum_size = Vector2(0, 500) -layout_mode = 2 -size_flags_horizontal = 3 -size_flags_vertical = 3 - -[node name="StudentContainer" type="PanelContainer" parent="VBoxContainer/TabContainer/Device 1/ScrollContainer/MarginContainer/GridContainer/Control5"] -layout_mode = 1 -anchors_preset = 8 -anchor_left = 0.5 -anchor_top = 0.5 -anchor_right = 0.5 -anchor_bottom = 0.5 -offset_left = -411.0 -offset_top = -180.0 -offset_right = 411.0 -offset_bottom = 180.0 -grow_horizontal = 2 -grow_vertical = 2 - -[node name="MarginContainer" type="MarginContainer" parent="VBoxContainer/TabContainer/Device 1/ScrollContainer/MarginContainer/GridContainer/Control5/StudentContainer"] -layout_mode = 2 -theme_override_constants/margin_left = 25 -theme_override_constants/margin_top = 25 -theme_override_constants/margin_right = 25 -theme_override_constants/margin_bottom = 25 - -[node name="VBoxContainer" type="VBoxContainer" parent="VBoxContainer/TabContainer/Device 1/ScrollContainer/MarginContainer/GridContainer/Control5/StudentContainer/MarginContainer"] -layout_mode = 2 - -[node name="Label" type="Label" parent="VBoxContainer/TabContainer/Device 1/ScrollContainer/MarginContainer/GridContainer/Control5/StudentContainer/MarginContainer/VBoxContainer"] -layout_mode = 2 -theme_override_font_sizes/font_size = 50 -text = "Student 1" -horizontal_alignment = 1 -vertical_alignment = 1 - -[node name="PasswordVisualizer" parent="VBoxContainer/TabContainer/Device 1/ScrollContainer/MarginContainer/GridContainer/Control5/StudentContainer/MarginContainer/VBoxContainer" instance=ExtResource("6_lywux")] -layout_mode = 2 -password = "123" - -[node name="Control6" type="Control" parent="VBoxContainer/TabContainer/Device 1/ScrollContainer/MarginContainer/GridContainer"] -custom_minimum_size = Vector2(0, 500) -layout_mode = 2 -size_flags_horizontal = 3 -size_flags_vertical = 3 - -[node name="StudentContainer" type="PanelContainer" parent="VBoxContainer/TabContainer/Device 1/ScrollContainer/MarginContainer/GridContainer/Control6"] -layout_mode = 1 -anchors_preset = 8 -anchor_left = 0.5 -anchor_top = 0.5 -anchor_right = 0.5 -anchor_bottom = 0.5 -offset_left = -411.0 -offset_top = -180.0 -offset_right = 411.0 -offset_bottom = 180.0 -grow_horizontal = 2 -grow_vertical = 2 - -[node name="MarginContainer" type="MarginContainer" parent="VBoxContainer/TabContainer/Device 1/ScrollContainer/MarginContainer/GridContainer/Control6/StudentContainer"] -layout_mode = 2 -theme_override_constants/margin_left = 25 -theme_override_constants/margin_top = 25 -theme_override_constants/margin_right = 25 -theme_override_constants/margin_bottom = 25 - -[node name="VBoxContainer" type="VBoxContainer" parent="VBoxContainer/TabContainer/Device 1/ScrollContainer/MarginContainer/GridContainer/Control6/StudentContainer/MarginContainer"] -layout_mode = 2 - -[node name="Label" type="Label" parent="VBoxContainer/TabContainer/Device 1/ScrollContainer/MarginContainer/GridContainer/Control6/StudentContainer/MarginContainer/VBoxContainer"] -layout_mode = 2 -theme_override_font_sizes/font_size = 50 -text = "Student 1" -horizontal_alignment = 1 -vertical_alignment = 1 - -[node name="PasswordVisualizer" parent="VBoxContainer/TabContainer/Device 1/ScrollContainer/MarginContainer/GridContainer/Control6/StudentContainer/MarginContainer/VBoxContainer" instance=ExtResource("6_lywux")] -layout_mode = 2 -password = "123" - -[node name="Control7" type="Control" parent="VBoxContainer/TabContainer/Device 1/ScrollContainer/MarginContainer/GridContainer"] -custom_minimum_size = Vector2(0, 500) -layout_mode = 2 -size_flags_horizontal = 3 -size_flags_vertical = 3 - -[node name="StudentContainer" type="PanelContainer" parent="VBoxContainer/TabContainer/Device 1/ScrollContainer/MarginContainer/GridContainer/Control7"] -layout_mode = 1 -anchors_preset = 8 -anchor_left = 0.5 -anchor_top = 0.5 -anchor_right = 0.5 -anchor_bottom = 0.5 -offset_left = -411.0 -offset_top = -180.0 -offset_right = 411.0 -offset_bottom = 180.0 -grow_horizontal = 2 -grow_vertical = 2 - -[node name="MarginContainer" type="MarginContainer" parent="VBoxContainer/TabContainer/Device 1/ScrollContainer/MarginContainer/GridContainer/Control7/StudentContainer"] -layout_mode = 2 -theme_override_constants/margin_left = 25 -theme_override_constants/margin_top = 25 -theme_override_constants/margin_right = 25 -theme_override_constants/margin_bottom = 25 - -[node name="VBoxContainer" type="VBoxContainer" parent="VBoxContainer/TabContainer/Device 1/ScrollContainer/MarginContainer/GridContainer/Control7/StudentContainer/MarginContainer"] -layout_mode = 2 - -[node name="Label" type="Label" parent="VBoxContainer/TabContainer/Device 1/ScrollContainer/MarginContainer/GridContainer/Control7/StudentContainer/MarginContainer/VBoxContainer"] -layout_mode = 2 -theme_override_font_sizes/font_size = 50 -text = "Student 1" -horizontal_alignment = 1 -vertical_alignment = 1 - -[node name="PasswordVisualizer" parent="VBoxContainer/TabContainer/Device 1/ScrollContainer/MarginContainer/GridContainer/Control7/StudentContainer/MarginContainer/VBoxContainer" instance=ExtResource("6_lywux")] -layout_mode = 2 -password = "123" - -[node name="Control8" type="Control" parent="VBoxContainer/TabContainer/Device 1/ScrollContainer/MarginContainer/GridContainer"] -custom_minimum_size = Vector2(0, 500) -layout_mode = 2 -size_flags_horizontal = 3 -size_flags_vertical = 3 - -[node name="StudentContainer" type="PanelContainer" parent="VBoxContainer/TabContainer/Device 1/ScrollContainer/MarginContainer/GridContainer/Control8"] -layout_mode = 1 -anchors_preset = 8 -anchor_left = 0.5 -anchor_top = 0.5 -anchor_right = 0.5 -anchor_bottom = 0.5 -offset_left = -411.0 -offset_top = -180.0 -offset_right = 411.0 -offset_bottom = 180.0 -grow_horizontal = 2 -grow_vertical = 2 - -[node name="MarginContainer" type="MarginContainer" parent="VBoxContainer/TabContainer/Device 1/ScrollContainer/MarginContainer/GridContainer/Control8/StudentContainer"] -layout_mode = 2 -theme_override_constants/margin_left = 25 -theme_override_constants/margin_top = 25 -theme_override_constants/margin_right = 25 -theme_override_constants/margin_bottom = 25 - -[node name="VBoxContainer" type="VBoxContainer" parent="VBoxContainer/TabContainer/Device 1/ScrollContainer/MarginContainer/GridContainer/Control8/StudentContainer/MarginContainer"] -layout_mode = 2 - -[node name="Label" type="Label" parent="VBoxContainer/TabContainer/Device 1/ScrollContainer/MarginContainer/GridContainer/Control8/StudentContainer/MarginContainer/VBoxContainer"] -layout_mode = 2 -theme_override_font_sizes/font_size = 50 -text = "Student 1" -horizontal_alignment = 1 -vertical_alignment = 1 - -[node name="PasswordVisualizer" parent="VBoxContainer/TabContainer/Device 1/ScrollContainer/MarginContainer/GridContainer/Control8/StudentContainer/MarginContainer/VBoxContainer" instance=ExtResource("6_lywux")] -layout_mode = 2 -password = "123" - -[node name="PrintButton" type="Button" parent="VBoxContainer"] -visible = false -layout_mode = 2 -theme_override_font_sizes/font_size = 70 -text = "Print teacher settings" - -[connection signal="pressed" from="InterfaceLeft/Container/BackButton" to="." method="_on_back_button_pressed"] -[connection signal="pressed" from="InterfaceLeft/Container/LogoutButton" to="." method="_on_logout_button_pressed"] -[connection signal="pressed" from="VBoxContainer/PrintButton" to="." method="_on_button_pressed"] diff --git a/sources/utils/autoloads/user_data_manager.gd b/sources/utils/autoloads/user_data_manager.gd index 84024f6f..96cc2aac 100644 --- a/sources/utils/autoloads/user_data_manager.gd +++ b/sources/utils/autoloads/user_data_manager.gd @@ -145,6 +145,93 @@ func _load_teacher_settings() -> void: func _save_teacher_settings(): ResourceSaver.save(teacher_settings, get_teacher_settings_path()) +func add_device() -> bool: + if not teacher_settings: + return false + + # Checks if the logged user is a teacher (only teachers have several devices) + if teacher_settings.account_type != TeacherSettings.AccountType.Teacher: + return false + + # Gets the last device number + if not teacher_settings.students: + return false + + var device_id = teacher_settings.students.keys().back() + 1 + + # Adds the new device + var students_array : Array[StudentData] = [] + teacher_settings.students[device_id] = students_array + + # Saves the settings + _save_teacher_settings() + + return true + +func delete_device(device_id : int) -> bool: + + # Gets the list of students on the device + + # Deletes students saves + + # Removes the device + + # Saves the settings + + return true + +func add_student(device_id : int, student_data : StudentData) -> bool: + if not teacher_settings: + return false + + # Finds the device + if not teacher_settings.students or not teacher_settings.students.has(device_id): + return false + + # Checks the student + if not student_data: + return false + + # Generates a password + student_data.code = teacher_settings.get_new_code() + if not student_data.code: + return false + + # Adds the student on the device + teacher_settings.students[device_id].append(student_data) + + # Saves the settings + _save_teacher_settings() + + return true + +func add_default_student(device_id : int) -> bool: + return add_student(device_id, StudentData.new()) + +func delete_student(device_id : int, code : String) -> bool: + if not teacher_settings: + return false + + # Finds the device + if not teacher_settings.students or not teacher_settings.students.has(device_id): + return false + + # Finds the student + var student_data : StudentData + for s in teacher_settings.students[device_id]: + if s.code == code: + student_data = s + break + + # Deletes the saves TODO + + # Removes the student + teacher_settings.students[device_id].erase(student_data) + + # Saves the settings + _save_teacher_settings() + + return true # Student settings #