Adds general conditions step and summary step to the register form. Adds devices summary to the teacher settings scene.

This commit is contained in:
Dylan Sarrazyn
2024-02-14 16:58:30 +01:00
parent d894e912d1
commit efaad2a0d0
24 changed files with 730 additions and 464 deletions
+18
View File
@@ -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
+13 -1
View File
@@ -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]
+1 -1
View File
@@ -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"
+1 -1
View File
@@ -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"]
+1 -1
View File
@@ -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"]
+11 -6
View File
@@ -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:
+1 -1
View File
@@ -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"]
@@ -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"
@@ -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
@@ -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
@@ -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()
@@ -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"]
@@ -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)
@@ -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
+30
View File
@@ -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
+38
View File
@@ -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
+25
View File
@@ -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)
+54
View File
@@ -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"]
@@ -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()
@@ -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"]
-18
View File
@@ -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)
-432
View File
@@ -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"]
@@ -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 #