mirror of
https://github.com/mr0xb/godot-flashcards.git
synced 2026-08-28 04:54:57 -04:00
95 lines
3 KiB
GDScript
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()
|