87 lines
3.1 KiB
Python
87 lines
3.1 KiB
Python
import tkinter as tk
|
|
from tkinter import ttk, messagebox, filedialog
|
|
from ..config import settings as cfg_settings
|
|
from pathlib import Path
|
|
|
|
|
|
class SettingsDialog(tk.Toplevel):
|
|
def __init__(self, parent):
|
|
super().__init__(parent)
|
|
self.title("PyUcc Settings")
|
|
self.transient(parent)
|
|
self.resizable(False, False)
|
|
|
|
frm = ttk.Frame(self, padding=12)
|
|
frm.grid(row=0, column=0, sticky="nsew")
|
|
|
|
ttk.Label(frm, text="Baseline folder:").grid(row=0, column=0, sticky="w")
|
|
self.baseline_var = tk.StringVar(value=cfg_settings.get_baseline_dir() or "")
|
|
ent = ttk.Entry(frm, textvariable=self.baseline_var, width=60)
|
|
ent.grid(row=0, column=1, sticky="w", padx=(8, 0))
|
|
btn = ttk.Button(frm, text="📁 Browse...", command=self._on_browse)
|
|
btn.grid(row=0, column=2, sticky="w", padx=(8, 0))
|
|
|
|
ttk.Label(frm, text="Keep last N baselines per profile:").grid(
|
|
row=1, column=0, sticky="w", pady=(8, 0)
|
|
)
|
|
self.keep_var = tk.IntVar(value=cfg_settings.get_max_keep())
|
|
spin = ttk.Spinbox(frm, from_=1, to=100, textvariable=self.keep_var, width=6)
|
|
spin.grid(row=1, column=1, sticky="w", pady=(8, 0))
|
|
|
|
# Zip baselines option
|
|
self.zip_var = tk.BooleanVar(value=cfg_settings.get_zip_baselines())
|
|
chk = ttk.Checkbutton(
|
|
frm,
|
|
text="Create ZIP archives for baselines (slower, saves space)",
|
|
variable=self.zip_var,
|
|
)
|
|
chk.grid(row=2, column=0, columnspan=3, sticky="w", pady=(12, 0))
|
|
|
|
# Buttons
|
|
btn_frame = ttk.Frame(frm)
|
|
btn_frame.grid(row=3, column=0, columnspan=3, pady=(12, 0), sticky="e")
|
|
save_btn = ttk.Button(btn_frame, text="💾 Save", command=self._on_save)
|
|
save_btn.grid(row=0, column=0, padx=(0, 8))
|
|
cancel_btn = ttk.Button(btn_frame, text="❌ Cancel", command=self._on_cancel)
|
|
cancel_btn.grid(row=0, column=1)
|
|
|
|
self.grab_set()
|
|
# center over parent
|
|
try:
|
|
self.update_idletasks()
|
|
pw = parent.winfo_width()
|
|
ph = parent.winfo_height()
|
|
px = parent.winfo_rootx()
|
|
py = parent.winfo_rooty()
|
|
dw = self.winfo_reqwidth()
|
|
dh = self.winfo_reqheight()
|
|
x = px + (pw - dw) // 2
|
|
y = py + (ph - dh) // 2
|
|
self.geometry(f"+{x}+{y}")
|
|
except Exception:
|
|
pass
|
|
|
|
def _on_browse(self):
|
|
d = filedialog.askdirectory()
|
|
if d:
|
|
self.baseline_var.set(str(Path(d)))
|
|
|
|
def _on_save(self):
|
|
bd = self.baseline_var.get().strip() or None
|
|
try:
|
|
mk = int(self.keep_var.get())
|
|
if mk < 1:
|
|
raise ValueError()
|
|
except Exception:
|
|
messagebox.showerror(
|
|
"Invalid value", "Keep count must be a positive integer"
|
|
)
|
|
return
|
|
zip_enabled = self.zip_var.get()
|
|
cfg_settings.set_baseline_settings(bd, mk, zip_enabled)
|
|
messagebox.showinfo("Settings", "Settings saved")
|
|
self.destroy()
|
|
|
|
def _on_cancel(self):
|
|
self.destroy()
|