Add synced user notes
This commit is contained in:
@@ -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
|
||||
Reference in New Issue
Block a user