mirror of
https://github.com/mr0xb/godot-flashcards.git
synced 2026-08-27 20:44:56 -04:00
initial commit
This commit is contained in:
commit
94847a50a2
42 changed files with 2063 additions and 0 deletions
95
scenes/ui/quiz_mode/quiz_scene.gd
Normal file
95
scenes/ui/quiz_mode/quiz_scene.gd
Normal file
|
|
@ -0,0 +1,95 @@
|
|||
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()
|
||||
Loading…
Reference in a new issue