Add exam-style question calculator

This commit is contained in:
hz
2026-07-23 05:19:12 -05:00
parent ba155fd38a
commit 50f07a77a5
8 changed files with 673 additions and 4 deletions
+33 -1
View File
@@ -3,6 +3,7 @@ extends VBoxContainer
const Style := preload("res://scripts/ui/ui_style.gd")
const Brand := preload("res://scripts/ui/medmind_style.gd")
const FlashcardPrefillDialog := preload("res://scripts/ui/flashcard_prefill_dialog.gd")
const CalculatorPanel := preload("res://scripts/ui/calculator_panel.gd")
const CLEAR_HIGHLIGHT_DARK_ICON := preload("res://assets/icons/medmind/clear-highlight-dark.svg")
const CLEAR_HIGHLIGHT_LIGHT_ICON := preload("res://assets/icons/medmind/clear-highlight-light.svg")
const LABS_DARK_ICON := preload("res://assets/icons/medmind/labs-dark.svg")
@@ -81,6 +82,7 @@ var skip_button: Button
var text_smaller_button: Button
var text_larger_button: Button
var labs_button: Button
var calculator_button: Button
var clear_highlight_button: Button
var flag_button: Button
var report_button: Button
@@ -109,6 +111,7 @@ var feedback_fog: ColorRect
var labs_overlay: Control
var labs_panel: PanelContainer
var labs_content: VBoxContainer
var calculator_panel
var report_overlay: Control
var report_panel: PanelContainer
var report_form_content: VBoxContainer
@@ -258,6 +261,19 @@ func _ready() -> void:
text_larger_button.pressed.connect(func(): _adjust_question_text_scale(TEXT_SCALE_STEP))
question_toolbar.add_child(text_larger_button)
calculator_button = Button.new()
calculator_button.name = "CalculatorButton"
calculator_button.tooltip_text = "Open calculator"
calculator_button.icon = preload("res://assets/icons/lucide/calculator.svg")
calculator_button.custom_minimum_size = Vector2(44, 44)
calculator_button.add_theme_constant_override("icon_max_width", 22)
calculator_button.alignment = HORIZONTAL_ALIGNMENT_CENTER
calculator_button.icon_alignment = HORIZONTAL_ALIGNMENT_CENTER
calculator_button.focus_mode = Control.FOCUS_NONE
UISoundService.set_button_sound(calculator_button, "open")
calculator_button.pressed.connect(_toggle_calculator)
question_toolbar.add_child(calculator_button)
labs_button = Button.new()
labs_button.tooltip_text = "Review lab results"
labs_button.custom_minimum_size = Vector2(44, 44)
@@ -574,6 +590,8 @@ func _ready() -> void:
add_child(feedback_fog)
_build_labs_modal()
calculator_panel = CalculatorPanel.new()
add_child(calculator_panel)
_build_report_modal()
_build_media_viewer()
resized.connect(_fit_modal_panels)
@@ -909,7 +927,7 @@ func _apply_question_theme() -> void:
var navigator_heading := navigator_popup.find_child("NavigatorHeading", true, false) as Label
if navigator_heading != null:
navigator_heading.add_theme_color_override("font_color", Brand.text_color(dark))
for control in [text_smaller_button, text_larger_button, bookmark_button, notes_button, flashcard_button, app_feedback_button]:
for control in [text_smaller_button, text_larger_button, calculator_button, bookmark_button, notes_button, flashcard_button, app_feedback_button]:
if control == null:
continue
var active: bool = control == bookmark_button and BookmarkService.is_bookmarked(str(BlockSessionService.get_current_question().get("id", "")))
@@ -923,6 +941,8 @@ func _apply_question_theme() -> void:
_style_asset_toolbar_button(report_button, REPORT_QUESTION_DARK_ICON if dark else REPORT_QUESTION_LIGHT_ICON, dark)
_style_asset_toolbar_button(flag_button, FLAG_DARK_ICON if dark else FLAG_LIGHT_ICON, dark, flagged)
_style_theme_toggle_button(dark)
if calculator_panel != null:
calculator_panel.refresh_theme_controls()
if skip_button != null:
skip_button.add_theme_stylebox_override("normal", _toolbar_box(dark))
skip_button.add_theme_stylebox_override("hover", _toolbar_box(dark, true))
@@ -963,6 +983,9 @@ func on_hide() -> void:
_hide_media_viewer()
_hide_report_modal(true)
_hide_labs_modal()
if calculator_panel != null:
calculator_panel.close_panel()
calculator_panel.reset_calculation()
func _save_simulation_current_response() -> void:
@@ -1049,6 +1072,8 @@ func _input(event: InputEvent) -> void:
_hide_labs_modal()
get_viewport().set_input_as_handled()
return
if calculator_panel != null and calculator_panel.visible and event is InputEventKey:
return
if not visible or pending_correct_advance or stem_label == null:
return
@@ -2038,9 +2063,16 @@ func _refresh_toolbar_state() -> void:
var bookmark_value := BookmarkService.is_bookmarked(bookmark_question_id)
var bookmark_pending := BookmarkService.is_pending(bookmark_question_id)
bookmark_button.tooltip_text = ("Saved; waiting to sync" if bookmark_pending else "Remove bookmark") if bookmark_value else ("Removal waiting to sync" if bookmark_pending else "Save question")
if calculator_button != null:
calculator_button.visible = true
_apply_question_theme()
func _toggle_calculator() -> void:
if calculator_panel != null:
calculator_panel.toggle_panel()
func _toggle_bookmark_current_question() -> void:
var question := BlockSessionService.get_current_question()
if not question.is_empty():