Source code for frontend.ui_dialogs.loading_dialog

"""Loading dialog shown while the solver runs."""

from __future__ import annotations

import tkinter as tk
from tkinter import ttk

from config import get_env_from_schema
from frontend.theme import get_font
from frontend.window_utils import center_window


[docs] class LoadingDialog: """Modal loading overlay shown during solver execution. Args: parent: Parent window. message: Text to display (e.g. "Solving..."). """ def __init__( self, parent: tk.Tk | tk.Toplevel, *, message: str = "Solving...", ) -> None: self.parent = parent self.win = tk.Toplevel(parent) self.win.title("") self.win.resizable(False, False) bg: str = get_env_from_schema("UI_BACKGROUND") self.win.configure(bg=bg) # Remove window decorations for a cleaner overlay look self.win.overrideredirect(False) self.win.transient(parent) self.win.grab_set() pad: int = get_env_from_schema("UI_PADDING") font_family, font_size = get_font() main_frame = ttk.Frame(self.win, padding=pad * 2) main_frame.pack(fill=tk.BOTH, expand=True) lbl = ttk.Label( main_frame, text=message, font=(font_family, font_size + 2), ) lbl.pack(pady=(0, pad)) self._progress = ttk.Progressbar( main_frame, mode="indeterminate", length=280, ) self._progress.pack(pady=pad) self._progress.start(10) self.win.update_idletasks() center_window( self.win, width=320, height=120, preserve_size=False, )
[docs] def destroy(self) -> None: """Stop the progress bar and close the dialog.""" try: self._progress.stop() except tk.TclError: pass self.win.grab_release() self.win.destroy()