godot-flashcards/scenes/ui/quiz_mode/quiz_scene.gd
2025-12-27 00:20:33 -05:00

95 lines
3 KiB
GDScript

extends Control
@onready var exit_btn = $MarginContainer/VBoxContainer/Header/ExitButton
@onready var progress_label = $MarginContainer/VBoxContainer/Header/ProgressLabel
@onready var score_label = $MarginContainer/VBoxContainer/ScorePanel/ScoreLabel
@onready var card_container = $MarginContainer/VBoxContainer/CardContainer
var quiz_session: QuizSession
var current_card_display: Node
const FlashcardDisplayScene = preload("res://scenes/ui/quiz_mode/flashcard_display.tscn")
const MultipleChoiceDisplayScene = preload("res://scenes/ui/quiz_mode/multiple_choice_display.tscn")
func _ready() -> void:
exit_btn.pressed.connect(_on_exit_pressed)
func start_quiz(deck: Deck) -> void:
if not deck or deck.cards.is_empty():
push_error("Cannot start quiz with empty or null deck")
return
quiz_session = QuizSession.new()
quiz_session.question_answered.connect(_on_question_answered)
quiz_session.session_completed.connect(_on_session_completed)
quiz_session.progress_updated.connect(_on_progress_updated)
quiz_session.start_session(deck, true)
var progress = DataManager.get_or_create_progress(deck.id)
progress.start_session()
DataManager.save_progress()
_show_next_card()
_update_ui()
func _show_next_card() -> void:
var card = quiz_session.get_current_card()
if not card:
return
if current_card_display:
current_card_display.queue_free()
current_card_display = null
if card.card_type == Flashcard.QuestionType.BASIC:
current_card_display = FlashcardDisplayScene.instantiate()
else:
current_card_display = MultipleChoiceDisplayScene.instantiate()
card_container.add_child(current_card_display)
current_card_display.set_card(card)
current_card_display.answer_submitted.connect(_on_answer_submitted)
func _on_answer_submitted(is_correct: bool) -> void:
var card = quiz_session.get_current_card()
if quiz_session.deck:
DataManager.record_quiz_result(quiz_session.deck.id, card.id, is_correct)
quiz_session.answer_question(is_correct)
func _on_question_answered(is_correct: bool, card: Flashcard) -> void:
await get_tree().create_timer(0.5).timeout
_update_ui()
_show_next_card()
func _on_progress_updated(current: int, total: int) -> void:
_update_ui()
func _on_session_completed(results: Dictionary) -> void:
print("Quiz completed! Results:")
print(" Total: %d" % results.total_questions)
print(" Correct: %d" % results.correct)
print(" Incorrect: %d" % results.incorrect)
print(" Accuracy: %.1f%%" % results.accuracy)
print(" Duration: %.1f seconds" % results.duration_seconds)
await get_tree().create_timer(1.0).timeout
GameManager.return_to_main_menu()
func _update_ui() -> void:
if quiz_session:
progress_label.text = "Card %d / %d" % [
quiz_session.current_index + 1,
quiz_session.shuffled_cards.size()
]
score_label.text = "Score: %d correct, %d incorrect (%.1f%%)" % [
quiz_session.session_correct,
quiz_session.session_incorrect,
quiz_session.get_session_accuracy()
]
func _on_exit_pressed() -> void:
GameManager.return_to_main_menu()