S1005403_RisCC/target_simulator/gui/mathlab_export_window.py
2025-11-24 10:11:15 +01:00

88 lines
3.1 KiB
Python

"""
MathLab Export configuration dialog.
Allows the user to enable/disable exporting trajectory CSVs for MathLab and
to select the output folder where the CSV will be written.
"""
import tkinter as tk
from tkinter import ttk, filedialog, messagebox
from typing import Any, Dict
from target_simulator.utils.config_manager import ConfigManager
class MathLabExportWindow(tk.Toplevel):
"""Modal dialog to configure MathLab CSV export settings."""
def __init__(self, master, config_manager: ConfigManager):
super().__init__(master)
self.master_view = master
self.config_manager = config_manager
self.title("MathLab Export Settings")
self.transient(master)
self.grab_set()
self.resizable(False, False)
# Load current settings
general = self.config_manager.get_general_settings() or {}
math_cfg = general.get("mathlab_export", {}) or {}
self.enabled_var = tk.BooleanVar(value=bool(math_cfg.get("enabled", False)))
self.folder_var = tk.StringVar(value=math_cfg.get("folder", ""))
frame = ttk.Frame(self, padding=10)
frame.pack(fill=tk.BOTH, expand=True)
ttk.Checkbutton(
frame,
text="Enable MathLab CSV export",
variable=self.enabled_var,
).grid(row=0, column=0, columnspan=3, sticky=tk.W, pady=(0, 8))
ttk.Label(frame, text="Output folder:").grid(
row=1, column=0, sticky=tk.W, pady=2
)
ttk.Entry(frame, textvariable=self.folder_var, width=50).grid(
row=1, column=1, sticky=tk.EW, padx=5
)
ttk.Button(frame, text="Browse...", command=self._on_browse).grid(
row=1, column=2, sticky=tk.E, padx=(5, 0)
)
btn_frame = ttk.Frame(frame)
btn_frame.grid(row=2, column=0, columnspan=3, sticky=tk.EW, pady=(12, 0))
ttk.Button(btn_frame, text="Cancel", command=self.destroy).pack(
side=tk.RIGHT, padx=(0, 6)
)
ttk.Button(btn_frame, text="Save", command=self._on_save).pack(side=tk.RIGHT)
self.protocol("WM_DELETE_WINDOW", self.destroy)
self.wait_window(self)
def _on_browse(self):
path = filedialog.askdirectory(parent=self, title="Select output folder")
if path:
self.folder_var.set(path)
def _on_save(self):
enabled = bool(self.enabled_var.get())
folder = str(self.folder_var.get()).strip()
if enabled and not folder:
messagebox.showerror(
"Validation", "Please select an output folder when enabling export.", parent=self
)
return
# Persist settings via ConfigManager (merge behavior preserved there)
try:
self.config_manager.save_general_settings(
{"mathlab_export": {"enabled": enabled, "folder": folder}}
)
messagebox.showinfo("Saved", "MathLab export settings saved.", parent=self)
except Exception as e:
messagebox.showerror("Error", f"Could not save settings: {e}", parent=self)
finally:
self.destroy()