diff --git a/radar_data_reader/gui/main_window.py b/radar_data_reader/gui/main_window.py index 3552169..77897b5 100644 --- a/radar_data_reader/gui/main_window.py +++ b/radar_data_reader/gui/main_window.py @@ -405,6 +405,16 @@ class MainWindow(tk.Frame): progress = (self.segments_done_count / total_segs) * 100 self.analyzer_progress_var.set(progress) self.analyzer_progress_text_var.set(f"Exported {self.segments_done_count} / {total_segs}") + # --- NUOVO GESTORE MESSAGGIO --- + elif msg_type == "batch_progress": + current = msg.get("current", 0) + total = msg.get("total", 0) + if total > 0: + progress = (current / total) * 100 + self.segment_processor_tab.progress_var.set(progress) + self.segment_processor_tab.progress_text_var.set( + f"Processing segment {current} of {total}: {msg.get('segment_name', '')}" + ) elif msg_type == "cpp_complete": self.controller.handle_final_analysis_steps() elif msg_type == "data_batch": @@ -414,6 +424,8 @@ class MainWindow(tk.Frame): elif msg_type in ("success", "complete", "error"): self.analyzer_progress_var.set(100) self.analyzer_progress_text_var.set("Done") + self.segment_processor_tab.progress_var.set(100) + self.segment_processor_tab.progress_text_var.set("Finished.") self.controller.handle_worker_completion(msg) except queue.Empty: diff --git a/radar_data_reader/gui/segment_processor_tab.py b/radar_data_reader/gui/segment_processor_tab.py index 49c1da6..18f5675 100644 --- a/radar_data_reader/gui/segment_processor_tab.py +++ b/radar_data_reader/gui/segment_processor_tab.py @@ -56,23 +56,27 @@ class SegmentProcessorTab(ttk.Frame): segments_frame.columnconfigure(0, weight=1) segments_frame.rowconfigure(0, weight=1) - # --- MODIFICA: Nuova struttura della Treeview --- self.segments_tree = ttk.Treeview( segments_frame, - columns=("status", "name", "start_time", "end_time", "duration"), + columns=("status", "name", "start_batch", "end_batch", "duration", "start_file", "end_file"), show="headings", selectmode="extended" ) self.segments_tree.heading("status", text="Status") self.segments_tree.heading("name", text="Segment Name") - self.segments_tree.heading("start_time", text="Start Time") - self.segments_tree.heading("end_time", text="End Time") + self.segments_tree.heading("start_batch", text="Start Batch") + self.segments_tree.heading("end_batch", text="End Batch") self.segments_tree.heading("duration", text="Duration (s)") + self.segments_tree.heading("start_file", text="Start File") + self.segments_tree.heading("end_file", text="End File") + self.segments_tree.column("status", width=100, anchor="center", stretch=False) - self.segments_tree.column("name", width=300, stretch=True) - self.segments_tree.column("start_time", width=100, anchor="center", stretch=False) - self.segments_tree.column("end_time", width=100, anchor="center", stretch=False) - self.segments_tree.column("duration", width=100, anchor="center", stretch=False) + self.segments_tree.column("name", width=250, stretch=True) + self.segments_tree.column("start_batch", width=100, anchor="center") + self.segments_tree.column("end_batch", width=100, anchor="center") + self.segments_tree.column("duration", width=100, anchor="center") + self.segments_tree.column("start_file", width=200, stretch=True) + self.segments_tree.column("end_file", width=200, stretch=True) self.segments_tree.grid(row=0, column=0, sticky="nsew") @@ -105,10 +109,17 @@ class SegmentProcessorTab(ttk.Frame): ttk.Label(output_config_frame, text="Output Directory:").grid(row=0, column=0, padx=5, pady=5, sticky="w") dir_entry = ttk.Entry(output_config_frame, textvariable=self.output_dir_var) dir_entry.grid(row=0, column=1, sticky="ew", padx=5) + + dir_buttons_frame = ttk.Frame(output_config_frame) + dir_buttons_frame.grid(row=0, column=2, padx=5) ttk.Button( - output_config_frame, text="Browse...", + dir_buttons_frame, text="Browse...", command=lambda: self.controller.select_output_dir(self.output_dir_var) - ).grid(row=0, column=2, padx=5) + ).pack(side=tk.LEFT) + ttk.Button( + dir_buttons_frame, text="Open...", + command=lambda: self.controller.open_folder_from_path(self.output_dir_var.get()) + ).pack(side=tk.LEFT, padx=(5,0)) formats_frame = ttk.Frame(output_config_frame) formats_frame.grid(row=1, column=0, columnspan=3, sticky="ew", padx=10, pady=5) @@ -117,13 +128,13 @@ class SegmentProcessorTab(ttk.Frame): self.csv_check = ttk.Checkbutton(formats_frame, text="Generate .csv file", variable=self.generate_csv_var, command=self._on_format_toggle) self.csv_check.grid(row=0, column=0, sticky="w") ttk.Label(formats_frame, text="CSV Profile:").grid(row=0, column=1, sticky="e", padx=(10, 2)) - self.csv_profile_combobox = ttk.Combobox(formats_frame, textvariable=self.csv_profile_var, state="readonly", width=30) + self.csv_profile_combobox = ttk.Combobox(formats_frame, textvariable=self.csv_profile_var, state="readonly", width=25) self.csv_profile_combobox.grid(row=0, column=2, sticky="ew") self.json_check = ttk.Checkbutton(formats_frame, text="Generate .json file", variable=self.generate_json_var, command=self._on_format_toggle) self.json_check.grid(row=1, column=0, sticky="w") ttk.Label(formats_frame, text="JSON Profile:").grid(row=1, column=1, sticky="e", padx=(10, 2)) - self.json_profile_combobox = ttk.Combobox(formats_frame, textvariable=self.json_profile_var, state="readonly", width=30) + self.json_profile_combobox = ttk.Combobox(formats_frame, textvariable=self.json_profile_var, state="readonly", width=25) self.json_profile_combobox.grid(row=1, column=2, sticky="ew") self._on_format_toggle() @@ -142,16 +153,15 @@ class SegmentProcessorTab(ttk.Frame): variable=self.use_full_path_var ).pack(side=tk.LEFT, anchor="w", padx=(20, 0)) - # --- NUOVO: Progress Frame --- progress_frame = ttk.LabelFrame(self, text="Processing Progress") progress_frame.grid(row=4, column=0, sticky="ew", pady=(10,0)) - progress_frame.columnconfigure(0, weight=1) + progress_frame.columnconfigure(1, weight=1) self.progress_bar = ttk.Progressbar(progress_frame, variable=self.progress_var) - self.progress_bar.grid(row=0, column=0, sticky="ew", padx=5, pady=5) + self.progress_bar.grid(row=0, column=0, columnspan=2, sticky="ew", padx=10, pady=5) self.progress_label = ttk.Label(progress_frame, textvariable=self.progress_text_var) - self.progress_label.grid(row=1, column=0, sticky="w", padx=5, pady=(0, 5)) + self.progress_label.grid(row=1, column=0, sticky="w", padx=10, pady=(0, 5)) self.process_button = ttk.Button( progress_frame, @@ -159,12 +169,11 @@ class SegmentProcessorTab(ttk.Frame): command=self.controller.start_segment_batch_processing, state=tk.DISABLED ) - self.process_button.grid(row=0, column=1, rowspan=2, padx=10) + self.process_button.grid(row=1, column=1, sticky="e", padx=10, pady=(0, 5)) def _on_format_toggle(self): - """Enable/disable profile comboboxes based on checkbox state.""" - self.csv_profile_combobox.config(state=tk.NORMAL if self.generate_csv_var.get() else tk.DISABLED) - self.json_profile_combobox.config(state=tk.NORMAL if self.generate_json_var.get() else tk.DISABLED) + self.csv_profile_combobox.config(state="readonly" if self.generate_csv_var.get() else tk.DISABLED) + self.json_profile_combobox.config(state="readonly" if self.generate_json_var.get() else tk.DISABLED) def _select_all_ready(self): self.segments_tree.selection_remove(self.segments_tree.selection()) @@ -182,18 +191,19 @@ class SegmentProcessorTab(ttk.Frame): has_selectable_items = False for i, segment in enumerate(self.segments_data_store): - name = segment.get('Segment (Mode | Scale | WF)', 'Unknown Segment') - start_time = segment.get('start_time_str', 'N/A') - end_time = segment.get('end_time_str', 'N/A') - duration = segment.get('Duration (s)', 0) - - if segment.get('is_exported_and_valid'): - status_text, tag = "Ready", "ready" - has_selectable_items = True - else: - status_text, tag = "Not Exported", "not_exported" + values_tuple = ( + "Ready" if segment.get('is_exported_and_valid') else "Not Exported", + segment.get('Segment (Mode | Scale | WF)', 'N/A'), + segment.get('Start Batch', 'N/A'), + segment.get('End Batch', 'N/A'), + f"{segment.get('Duration (s)', 0):.2f}", + segment.get('Start File', 'N/A'), + segment.get('End File', 'N/A') + ) + tag = "ready" if segment.get('is_exported_and_valid') else "not_exported" + if tag == "ready": has_selectable_items = True - self.segments_tree.insert("", "end", iid=str(i), values=(status_text, name, start_time, end_time, f"{duration:.2f}"), tags=(tag,)) + self.segments_tree.insert("", "end", iid=str(i), values=values_tuple, tags=(tag,)) self.process_button.config(state=tk.NORMAL if has_selectable_items else tk.DISABLED)