Files
Kalulu/sources/menus/settings/lesson_unlocks.gd
T
2025-09-05 15:55:48 +02:00

109 lines
3.7 KiB
GDScript

class_name LessonUnlocks
extends Control
signal student_deleted(code: int)
const DEVICE_BUTTON_SCENE: PackedScene = preload("res://sources/menus/main/device_button.tscn")
const LESSON_UNLOCK_SCENE: PackedScene = preload("res://sources/menus/settings/lesson_unlock.tscn")
@export var device: int:
set = _on_device_changed
@export var student: int:
set = _on_student_changed
var progression: StudentProgression
var teacher_settings: SettingsTeacherSettings = null
@onready var lesson_container: VBoxContainer = %LessonContainer
@onready var name_line_edit: LineEdit = %NameLineEdit
@onready var device_selection_container: PanelContainer = %DeviceSelectionContainer
@onready var container: GridContainer = %GridContainer
func _ready() -> void:
name_line_edit.connect("text_submitted", _on_name_changed)
device_selection_container.visible = false
func _create_lessons() -> void:
for lesson_unlock: Node in lesson_container.get_children():
lesson_unlock.queue_free()
Database.db.query("SELECT LessonNb, group_concat(Grapheme || '-' ||Phoneme, ' ') GPs FROM Lessons
INNER JOIN GPsInLessons ON GPsInLessons.LessonID = Lessons.ID
INNER JOIN GPs ON GPsInLessons.GPID = GPs.ID
GROUP BY LessonNb
ORDER BY LessonNb")
for element: Dictionary in Database.db.query_result:
var student_unlock: LessonUnlock = LESSON_UNLOCK_SCENE.instantiate()
student_unlock.lesson_gps = element.GPs
student_unlock.lesson_number = element.LessonNb
if not progression:
Logger.trace("LessonUnlocks: User selected a student with no progression data")
return
student_unlock.unlocks = progression.unlocks
lesson_container.add_child(student_unlock)
student_unlock.unlocks_changed.connect(_create_lessons)
func _on_device_changed(value: int)-> void:
device = value
func _on_student_changed(value: int)-> void:
student = value
progression = UserDataManager.get_student_progression_for_code(device, student)
_create_lessons()
(%PasswordVisualizer as PasswordVisualizer).password = str(value)
var all_students: Array = UserDataManager.teacher_settings.students[device]
for student_data: StudentData in all_students:
if student_data.code == value:
name_line_edit.text = student_data.name
break
func _on_back_button_pressed() -> void:
progression.last_modified = Time.get_datetime_string_from_system(true)
UserDataManager.save_student_progression_for_code(device, student, progression)
hide()
func _on_delete_button_pressed() -> void:
student_deleted.emit(int(student))
func _on_device_change_button_pressed() -> void:
_device_selection_refresh()
device_selection_container.visible = true
func _on_name_changed(new_name: String) -> void:
UserDataManager.teacher_settings.update_student_name(student, new_name)
teacher_settings.update_student_name(student, new_name)
func _device_selection_refresh() -> void:
if not UserDataManager.teacher_settings:
return
for child: Node in container.get_children():
child.queue_free()
for device_id: int in UserDataManager.teacher_settings.students.keys():
var button: DeviceButton = DEVICE_BUTTON_SCENE.instantiate()
button.number = device_id
button.background_color = Globals.device_colors[device_id-1 % Globals.device_colors.size()]
container.add_child(button)
button.pressed.connect(_device_button_pressed.bind(device_id))
func _device_button_pressed(device_id: int) -> void:
device_selection_container.visible = false
UserDataManager.teacher_settings.update_student_device(student, device_id)
await teacher_settings.refresh_devices_tabs()
device = device_id
var res_set: Dictionary = await ServerManager.set_student_data(student, {"device_id": device_id})
if not res_set.success:
Logger.trace("LessonUnlocks: Device was updated locally for the student, but the network update failed.")