SXXXXXXX_RadarDataReader/radar_data_reader/gui/rec_config_window.py
VALLONGOL d1b9838555 update readme, manual
add segment definition
2025-07-14 15:10:14 +02:00

141 lines
4.9 KiB
Python

# radar_data_reader/gui/rec_config_window.py
"""
GUI Window for editing the configuration for the g_reconvert.exe runner.
This version is now a lightweight wrapper around the GReconverterOptionsFrame.
"""
import tkinter as tk
from tkinter import ttk, filedialog
from typing import Dict, Any, Callable
import os
from .gui_utils import center_window
from .config_frames import GReconverterOptionsFrame
class RecConfigWindow(tk.Toplevel):
"""A Toplevel window for managing g_reconvert.exe parameters."""
def __init__(
self,
master,
controller,
current_config: Dict[str, Any],
title: str,
save_command: Callable[[Dict[str, Any]], None],
):
super().__init__(master)
self.controller = controller
self.config_data = current_config.copy()
self.window_title = title
self.save_callback = save_command
self.withdraw()
self._init_window()
self._init_vars()
self._populate_vars_from_config()
self._create_widgets()
center_window(self, self.master)
self.protocol("WM_DELETE_WINDOW", self._on_cancel)
def _init_window(self):
self.title(self.window_title)
self.geometry("800x650")
self.transient(self.master)
def _init_vars(self):
"""Initializes all Tkinter variables for the parameters."""
self.vars = {
"cpp_executable_path": tk.StringVar(),
"analyze_only": tk.BooleanVar(),
"no_sign": tk.BooleanVar(),
"use_fw_header": tk.BooleanVar(),
"fix_dsp_bug": tk.BooleanVar(),
"sync_signal_flows": tk.BooleanVar(),
"extract_sw_only": tk.BooleanVar(),
"extract_dsp_only": tk.BooleanVar(),
"stop_on_discontinuity": tk.BooleanVar(),
"dry_run": tk.BooleanVar(),
"start_from_stby": tk.BooleanVar(),
"fix_sata_date": tk.BooleanVar(),
"examine_data": tk.BooleanVar(),
"post_process": tk.BooleanVar(),
"post_process_level": tk.StringVar(),
"output_format": tk.StringVar(),
"json_config_file": tk.StringVar(),
"max_batches": tk.StringVar(),
"pri_number": tk.StringVar(),
"rbin_number": tk.StringVar(),
"video_out_to_rec": tk.BooleanVar(),
"video_show": tk.BooleanVar(),
"video_save": tk.BooleanVar(),
"video_fix_framerate": tk.BooleanVar(),
"gps_save_track": tk.BooleanVar(),
"fix_hr_debug": tk.BooleanVar(),
"sar_save_only": tk.BooleanVar(),
"video_add_subtitles": tk.BooleanVar(),
"verbose": tk.BooleanVar(),
"debug_messages": tk.BooleanVar(),
"quiet": tk.BooleanVar(),
"mask_warnings": tk.BooleanVar(),
"mask_errors": tk.BooleanVar(),
"silent_overwrite": tk.BooleanVar(),
"enable_python_worker_profiling": tk.BooleanVar(),
}
def _populate_vars_from_config(self):
for key, var in self.vars.items():
if key in self.config_data:
var.set(self.config_data.get(key, "")) # Usa un default per sicurezza
def _create_widgets(self):
main_frame = ttk.Frame(self, padding="10")
main_frame.pack(fill=tk.BOTH, expand=True)
exe_frame = ttk.LabelFrame(main_frame, text="Executable Path")
exe_frame.pack(fill=tk.X, pady=(0, 10))
exe_frame.columnconfigure(0, weight=1)
exe_entry = ttk.Entry(exe_frame, textvariable=self.vars["cpp_executable_path"])
exe_entry.grid(row=0, column=0, sticky="ew", padx=5, pady=5)
browse_button = ttk.Button(
exe_frame, text="Browse...", command=self._select_executable_path
)
browse_button.grid(row=0, column=1, padx=5, pady=5)
options_frame = GReconverterOptionsFrame(main_frame, self.vars)
options_frame.pack(fill=tk.BOTH, expand=True)
button_frame = ttk.Frame(main_frame)
button_frame.pack(fill=tk.X, pady=(10, 0))
ttk.Button(button_frame, text="Save & Close", command=self._on_save).pack(
side=tk.RIGHT, padx=5
)
ttk.Button(button_frame, text="Cancel", command=self._on_cancel).pack(
side=tk.RIGHT
)
def _select_executable_path(self):
filetypes = (
[("Executable", "*.exe"), ("All files", "*.*")]
if os.name == "nt"
else [("All files", "*")]
)
filepath = filedialog.askopenfilename(
title="Select g_reconvert Executable", filetypes=filetypes
)
if filepath:
self.vars["cpp_executable_path"].set(filepath)
def _on_save(self):
new_config = {key: var.get() for key, var in self.vars.items()}
self.save_callback(new_config)
self.destroy()
def _on_cancel(self):
self.destroy()