Milestone alpha3
This commit is contained in:
@@ -7,7 +7,6 @@ from tkinter import messagebox, ttk
|
||||
from typing import Any
|
||||
|
||||
from audit_log import log_session_event
|
||||
from busy_overlay import InlineBusyOverlay
|
||||
from gestione_aree import AsyncRunner
|
||||
from locale_text import load_locale_catalog, text as loc_text
|
||||
from ui_theme import theme_section, theme_value
|
||||
@@ -62,10 +61,11 @@ class LoginWindow(tk.Toplevel):
|
||||
self._login_button: ttk.Button | None = None
|
||||
self._cancel_button: ttk.Button | None = None
|
||||
self._status_var = tk.StringVar(value="")
|
||||
self._busy = InlineBusyOverlay(self, self._theme)
|
||||
self._show_ready_after_id: str | None = None
|
||||
self._clear_topmost_after_id: str | None = None
|
||||
|
||||
self.title(loc_text("login.msg.title", catalog=self._locale_catalog, default="Login"))
|
||||
self.geometry("170x145+0+0" if self.compact else str(theme_value(self._theme, "window_geometry", "235x185+0+0")))
|
||||
self.geometry("170x145+0+0" if self.compact else str(theme_value(self._theme, "window_geometry", "165x155+0+0")))
|
||||
self.resizable(False, False)
|
||||
try:
|
||||
if parent is not None and parent.winfo_viewable():
|
||||
@@ -83,33 +83,24 @@ class LoginWindow(tk.Toplevel):
|
||||
self.deiconify()
|
||||
self.lift()
|
||||
self.attributes("-topmost", True)
|
||||
self.after(50, self._show_ready)
|
||||
self._show_ready_after_id = self.after(50, self._show_ready)
|
||||
|
||||
def _build_ui(self) -> None:
|
||||
"""Build the compact operator login form."""
|
||||
|
||||
body = ttk.Frame(self, padding=8 if self.compact else 10)
|
||||
body = ttk.Frame(self, padding=8 if self.compact else 8)
|
||||
body.pack(fill="both", expand=True)
|
||||
body.columnconfigure(1, weight=1)
|
||||
body.columnconfigure(1, weight=0)
|
||||
|
||||
row_offset = 0
|
||||
if not self.compact:
|
||||
ttk.Label(
|
||||
body,
|
||||
text=loc_text("login.heading", catalog=self._locale_catalog, default="Autenticazione operatore"),
|
||||
font=("Segoe UI", 9, "bold"),
|
||||
).grid(row=0, column=0, columnspan=2, sticky="w", pady=(0, 8))
|
||||
row_offset = 1
|
||||
|
||||
ttk.Label(body, text="User:").grid(
|
||||
row=row_offset, column=0, sticky="w", padx=(0, 6), pady=4 if self.compact else 6
|
||||
)
|
||||
ttk.Label(body, text="User:").grid(row=row_offset, column=0, sticky="w", padx=(0, 4), pady=4)
|
||||
self.login_entry = ttk.Entry(body, textvariable=self.login_var, width=10, font=("Segoe UI", 10 if self.compact else 9))
|
||||
self.login_entry.grid(row=row_offset, column=1, sticky="ew", pady=4 if self.compact else 6)
|
||||
self.login_entry.grid(row=row_offset, column=1, sticky="w", pady=4)
|
||||
|
||||
ttk.Label(body, text="Pwd:").grid(row=row_offset + 1, column=0, sticky="w", padx=(0, 6), pady=4 if self.compact else 6)
|
||||
ttk.Label(body, text="Pwd:").grid(row=row_offset + 1, column=0, sticky="w", padx=(0, 4), pady=4)
|
||||
self.password_entry = ttk.Entry(body, textvariable=self.password_var, width=10, show="*", font=("Segoe UI", 10 if self.compact else 9))
|
||||
self.password_entry.grid(row=row_offset + 1, column=1, sticky="ew", pady=4 if self.compact else 6)
|
||||
self.password_entry.grid(row=row_offset + 1, column=1, sticky="w", pady=4)
|
||||
|
||||
if self.compact:
|
||||
actions = ttk.Frame(body)
|
||||
@@ -128,10 +119,10 @@ class LoginWindow(tk.Toplevel):
|
||||
self._login_button.grid(row=0, column=0, sticky="ew")
|
||||
else:
|
||||
self.status_label = ttk.Label(body, textvariable=self._status_var, foreground="#555555")
|
||||
self.status_label.grid(row=3, column=0, columnspan=2, sticky="w", pady=(2, 2))
|
||||
self.status_label.grid(row=2, column=0, columnspan=2, sticky="w", pady=(2, 2))
|
||||
|
||||
actions = ttk.Frame(body)
|
||||
actions.grid(row=4, column=0, columnspan=2, sticky="w", pady=(6, 0))
|
||||
actions.grid(row=3, column=0, columnspan=2, sticky="w", pady=(6, 0))
|
||||
self._cancel_button = ttk.Button(
|
||||
actions,
|
||||
text=loc_text("login.button.cancel", catalog=self._locale_catalog, default="Annulla"),
|
||||
@@ -168,10 +159,6 @@ class LoginWindow(tk.Toplevel):
|
||||
self._cancel_button.configure(state=state)
|
||||
self.configure(cursor="watch" if busy else "")
|
||||
self._status_var.set(message)
|
||||
if busy:
|
||||
self._busy.show(message or loc_text("login.status.checking", catalog=self._locale_catalog, default="Verifico credenziali..."))
|
||||
else:
|
||||
self._busy.hide()
|
||||
self.update_idletasks()
|
||||
except Exception:
|
||||
pass
|
||||
@@ -195,7 +182,7 @@ class LoginWindow(tk.Toplevel):
|
||||
self._focus_login()
|
||||
finally:
|
||||
try:
|
||||
self.after(250, lambda: self.attributes("-topmost", False))
|
||||
self._clear_topmost_after_id = self.after(250, lambda: self.attributes("-topmost", False))
|
||||
except Exception:
|
||||
pass
|
||||
|
||||
@@ -283,6 +270,18 @@ class LoginWindow(tk.Toplevel):
|
||||
def _close(self) -> None:
|
||||
"""Release the modal grab and destroy the login window."""
|
||||
|
||||
if self._show_ready_after_id is not None:
|
||||
try:
|
||||
self.after_cancel(self._show_ready_after_id)
|
||||
except Exception:
|
||||
pass
|
||||
self._show_ready_after_id = None
|
||||
if self._clear_topmost_after_id is not None:
|
||||
try:
|
||||
self.after_cancel(self._clear_topmost_after_id)
|
||||
except Exception:
|
||||
pass
|
||||
self._clear_topmost_after_id = None
|
||||
try:
|
||||
self.grab_release()
|
||||
except Exception:
|
||||
|
||||
Reference in New Issue
Block a user