Add data-driven dynamic question mode
This commit is contained in:
@@ -164,6 +164,14 @@ func _ready() -> void:
|
||||
QuestionBankService.question_report_submitted.connect(_on_question_report_submitted)
|
||||
if not QuestionBankService.question_report_failed.is_connected(_on_question_report_failed):
|
||||
QuestionBankService.question_report_failed.connect(_on_question_report_failed)
|
||||
if not DynamicQuestionService.question_loaded.is_connected(_on_dynamic_question_loaded):
|
||||
DynamicQuestionService.question_loaded.connect(_on_dynamic_question_loaded)
|
||||
if not DynamicQuestionService.request_failed.is_connected(_on_dynamic_question_failed):
|
||||
DynamicQuestionService.request_failed.connect(_on_dynamic_question_failed)
|
||||
if not DynamicQuestionService.report_submitted.is_connected(_on_question_report_submitted):
|
||||
DynamicQuestionService.report_submitted.connect(_on_question_report_submitted)
|
||||
if not DynamicQuestionService.report_failed.is_connected(_on_question_report_failed):
|
||||
DynamicQuestionService.report_failed.connect(_on_question_report_failed)
|
||||
if not QuestionBankService.questions_changed.is_connected(_on_random_question_changed):
|
||||
QuestionBankService.questions_changed.connect(_on_random_question_changed)
|
||||
if not QuestionBankService.questions_load_failed.is_connected(_on_random_question_failed):
|
||||
@@ -1115,7 +1123,7 @@ func _load_question() -> void:
|
||||
next_button.text = "Submit"
|
||||
next_button.disabled = true
|
||||
skip_button.disabled = false
|
||||
skip_button.visible = BlockSessionService.session_kind != "review"
|
||||
skip_button.visible = BlockSessionService.session_kind not in ["review", "dynamic"]
|
||||
skip_button.text = "Skip"
|
||||
report_button.visible = BlockSessionService.session_kind != "simulation"
|
||||
|
||||
@@ -1123,13 +1131,16 @@ func _load_question() -> void:
|
||||
if question.is_empty():
|
||||
if BlockSessionService.session_kind == "review":
|
||||
main.show_screen("dashboard")
|
||||
elif BlockSessionService.session_kind == "dynamic":
|
||||
main.show_screen("dynamic_questions")
|
||||
else:
|
||||
main.show_screen("bookmarks" if BlockSessionService.session_kind == "bookmark" else "selection", "exam" if BlockSessionService.session_kind == "core" else "step3")
|
||||
return
|
||||
BookmarkService.observe_question(question)
|
||||
if BlockSessionService.session_kind != "dynamic":
|
||||
BookmarkService.observe_question(question)
|
||||
progress_button.text = _question_progress_text()
|
||||
progress_button.disabled = BlockSessionService.session_kind in ["core", "bookmark", "review"]
|
||||
progress_button.tooltip_text = "" if BlockSessionService.session_kind in ["core", "bookmark", "review"] else "Open question navigator"
|
||||
progress_button.disabled = BlockSessionService.session_kind in ["core", "bookmark", "review", "dynamic"]
|
||||
progress_button.tooltip_text = "" if BlockSessionService.session_kind in ["core", "bookmark", "review", "dynamic"] else "Open question navigator"
|
||||
var show_timer := _is_session_timer_visible()
|
||||
timer_label.visible = show_timer
|
||||
timer_bar.visible = show_timer
|
||||
@@ -1373,6 +1384,12 @@ func _submit_or_next() -> void:
|
||||
if selected_choice == "":
|
||||
return
|
||||
var question_id_for_attempt := str(BlockSessionService.get_current_question().get("id", ""))
|
||||
if BlockSessionService.session_kind == "dynamic":
|
||||
var elapsed := int(floor(BlockSessionService.get_current_elapsed_seconds()))
|
||||
DynamicQuestionService.submit_attempt(selected_choice, elapsed)
|
||||
current_answer = BlockSessionService.answer_current(selected_choice, eliminated, false)
|
||||
_show_answer_review()
|
||||
return
|
||||
if BlockSessionService.session_kind in ["core", "bookmark", "review"]:
|
||||
var attempted_choice := selected_choice
|
||||
if BlockSessionService.session_kind == "core":
|
||||
@@ -1422,7 +1439,12 @@ func _submit_or_next() -> void:
|
||||
current_answer = BlockSessionService.answer_current(selected_choice, eliminated, flagged)
|
||||
_show_answer_review()
|
||||
else:
|
||||
if BlockSessionService.session_kind == "core":
|
||||
if BlockSessionService.session_kind == "dynamic":
|
||||
awaiting_next_question = true
|
||||
next_button.text = "Generating…"
|
||||
next_button.disabled = true
|
||||
DynamicQuestionService.load_next()
|
||||
elif BlockSessionService.session_kind == "core":
|
||||
_request_next_core_question()
|
||||
elif BlockSessionService.session_kind == "bookmark":
|
||||
if BookmarkService.has_next_practice():
|
||||
@@ -1441,6 +1463,26 @@ func _submit_or_next() -> void:
|
||||
_advance_or_finish()
|
||||
|
||||
|
||||
func _on_dynamic_question_loaded(question: Dictionary) -> void:
|
||||
if not awaiting_next_question or BlockSessionService.session_kind != "dynamic":
|
||||
return
|
||||
if not BlockSessionService.replace_dynamic_question(question):
|
||||
_on_dynamic_question_failed("The next dynamic question could not be prepared.")
|
||||
return
|
||||
awaiting_next_question = false
|
||||
_load_question()
|
||||
UISoundService.play_sound("question")
|
||||
|
||||
|
||||
func _on_dynamic_question_failed(message: String) -> void:
|
||||
if not awaiting_next_question or BlockSessionService.session_kind != "dynamic":
|
||||
return
|
||||
awaiting_next_question = false
|
||||
next_button.text = "Retry"
|
||||
next_button.disabled = false
|
||||
next_button.tooltip_text = message
|
||||
|
||||
|
||||
func _request_next_core_question() -> void:
|
||||
awaiting_next_question = true
|
||||
next_button.text = "Loading..."
|
||||
@@ -2053,12 +2095,12 @@ func _refresh_toolbar_state() -> void:
|
||||
var question_id := str(BlockSessionService.get_current_question().get("id", ""))
|
||||
report_button.tooltip_text = "Report submitted; report another issue" if reported_question_ids.has(question_id) else "Report question"
|
||||
if notes_button != null:
|
||||
notes_button.visible = BlockSessionService.session_kind != "simulation"
|
||||
notes_button.visible = BlockSessionService.session_kind not in ["simulation", "dynamic"]
|
||||
if flashcard_button != null:
|
||||
flashcard_button.visible = BlockSessionService.session_kind != "simulation"
|
||||
flashcard_button.visible = BlockSessionService.session_kind not in ["simulation", "dynamic"]
|
||||
flashcard_button.disabled = current_answer.is_empty()
|
||||
if bookmark_button != null:
|
||||
bookmark_button.visible = BlockSessionService.session_kind != "simulation"
|
||||
bookmark_button.visible = BlockSessionService.session_kind not in ["simulation", "dynamic"]
|
||||
var bookmark_question_id := str(BlockSessionService.get_current_question().get("id", ""))
|
||||
var bookmark_value := BookmarkService.is_bookmarked(bookmark_question_id)
|
||||
var bookmark_pending := BookmarkService.is_pending(bookmark_question_id)
|
||||
@@ -2797,7 +2839,10 @@ func _submit_question_report() -> void:
|
||||
return
|
||||
report_error_label.text = ""
|
||||
_set_report_submitting(true)
|
||||
QuestionBankService.submit_question_report(report_question_id, category, details)
|
||||
if BlockSessionService.session_kind == "dynamic":
|
||||
DynamicQuestionService.submit_report(report_question_id, category, details)
|
||||
else:
|
||||
QuestionBankService.submit_question_report(report_question_id, category, details)
|
||||
|
||||
|
||||
func _on_question_report_submitted(question_id: String, _report_id: String) -> void:
|
||||
|
||||
Reference in New Issue
Block a user