""" 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()