Add synced user notes

This commit is contained in:
hz
2026-07-18 22:22:29 -05:00
parent a232e18c46
commit d0bb271b14
22 changed files with 930 additions and 2 deletions
+108
View File
@@ -0,0 +1,108 @@
extends Control
const Brand := preload("res://scripts/ui/medmind_style.gd")
const NotesEditor := preload("res://scripts/ui/notes_editor.gd")
signal closed
var panel: PanelContainer
var notes_editor: VBoxContainer
var theme_service: Node
var block_session_service: Node
func _ready() -> void:
theme_service = get_node("/root/UIThemeService")
block_session_service = get_node("/root/BlockSessionService")
visible = false
top_level = true
mouse_filter = Control.MOUSE_FILTER_STOP
set_anchors_and_offsets_preset(Control.PRESET_FULL_RECT)
var dim := ColorRect.new()
dim.color = Color(0, 0, 0, 0.72)
dim.set_anchors_preset(Control.PRESET_FULL_RECT)
dim.gui_input.connect(_on_dim_input)
add_child(dim)
var center := CenterContainer.new()
center.set_anchors_preset(Control.PRESET_FULL_RECT)
add_child(center)
panel = PanelContainer.new()
panel.custom_minimum_size = Vector2(760, 650)
center.add_child(panel)
var content := VBoxContainer.new()
content.add_theme_constant_override("separation", 12)
panel.add_child(content)
var header := HBoxContainer.new()
content.add_child(header)
var title := Label.new()
title.text = "Notes"
title.size_flags_horizontal = Control.SIZE_EXPAND_FILL
title.add_theme_font_override("font", Brand.font)
title.add_theme_font_size_override("font_size", 26)
header.add_child(title)
var close_button := Button.new()
close_button.icon = preload("res://assets/icons/lucide/x.svg")
close_button.tooltip_text = "Close notes"
close_button.custom_minimum_size = Vector2(42, 42)
close_button.add_theme_constant_override("icon_max_width", 20)
close_button.pressed.connect(hide_dialog)
header.add_child(close_button)
notes_editor = NotesEditor.new()
content.add_child(notes_editor)
theme_service.theme_changed.connect(_on_theme_changed)
resized.connect(_fit_panel)
_apply_theme()
_fit_panel()
func show_dialog() -> void:
notes_editor.activate()
visible = true
move_to_front()
block_session_service.pause_current_question_timer()
call_deferred("_focus_editor")
func hide_dialog() -> void:
if not visible:
return
visible = false
get_node("/root/NotesService").flush()
block_session_service.resume_current_question_timer()
closed.emit()
func _focus_editor() -> void:
notes_editor.focus_editor()
func _input(event: InputEvent) -> void:
if visible and event.is_action_pressed("ui_cancel"):
hide_dialog()
get_viewport().set_input_as_handled()
func _on_dim_input(event: InputEvent) -> void:
var mouse_event := event as InputEventMouseButton
if mouse_event != null and mouse_event.pressed and mouse_event.button_index == MOUSE_BUTTON_LEFT:
hide_dialog()
get_viewport().set_input_as_handled()
func _on_theme_changed(_dark: bool) -> void:
_apply_theme()
func _apply_theme() -> void:
panel.add_theme_stylebox_override("panel", Brand.panel_box(theme_service.is_dark_mode()))
func _fit_panel() -> void:
if panel == null:
return
var available := get_viewport_rect().size - Vector2(32, 32)
var target_size := Vector2(
minf(760.0, maxf(300.0, available.x)),
minf(650.0, maxf(420.0, available.y)))
if panel.custom_minimum_size != target_size:
panel.custom_minimum_size = target_size