Skip to content

Commit d03b022

Browse files
committed
Fix: Prevent re-conversion of previously selected Acquifer subfolders
When scanning a parent folder with multiple Acquifer subfolders and selecting them sequentially with 'Export All Series', the conversion was accumulating all previously selected folders. Changes: - Modified convert_files() to only convert the currently displayed file instead of iterating through all entries in selected_series dict - Refactored convert_all_files() to handle batch conversion independently - Fixed SeriesDetailWidget.set_file() to properly restore checkbox state - Added _start_conversion_worker() helper method to reduce code duplication This ensures that when converting subfolder B, it no longer re-converts subfolder A, and so on for subsequent folders.
1 parent 364d892 commit d03b022

1 file changed

Lines changed: 113 additions & 58 deletions

File tree

src/napari_tmidas/_file_conversion.py

Lines changed: 113 additions & 58 deletions
Original file line numberDiff line numberDiff line change
@@ -162,13 +162,25 @@ def toggle_export_all(self, checked):
162162
self.parent.set_export_all_series(self.current_file, checked)
163163
if not checked:
164164
self.series_selected(self.series_selector.currentIndex())
165+
else:
166+
# When export all is enabled, ensure selected_series is also set
167+
self.parent.set_selected_series(self.current_file, 0)
165168

166169
def set_file(self, filepath: str):
167170
"""Set the current file and update series list"""
168171
self.current_file = filepath
169172
self.series_selector.clear()
170-
self.export_all_checkbox.setChecked(False)
171-
self.series_selector.setEnabled(True)
173+
174+
# Block signals to avoid triggering toggle_export_all during initialization
175+
self.export_all_checkbox.blockSignals(True)
176+
177+
# Check if this file already has export_all flag set
178+
export_all = self.parent.export_all_series.get(filepath, False)
179+
self.export_all_checkbox.setChecked(export_all)
180+
self.series_selector.setEnabled(not export_all)
181+
182+
# Re-enable signals
183+
self.export_all_checkbox.blockSignals(False)
172184

173185
try:
174186
file_loader = self.parent.get_file_loader(filepath)
@@ -2158,18 +2170,98 @@ def handle_format_toggle(self, checked: bool):
21582170
self.updating_format_buttons = False
21592171

21602172
def convert_files(self):
2161-
"""Convert selected files"""
2173+
"""Convert selected files - only converts the currently displayed file"""
21622174
try:
2163-
# Prepare conversion list
2164-
if not self.selected_series:
2165-
all_files = list(self.files_table.file_data.keys())
2166-
if not all_files:
2167-
self.status_label.setText(
2168-
"No files available for conversion"
2169-
)
2170-
return
2171-
for filepath in all_files:
2172-
self.selected_series[filepath] = 0
2175+
# Get the currently displayed file from series_widget
2176+
current_file = self.series_widget.current_file
2177+
2178+
if not current_file:
2179+
self.status_label.setText(
2180+
"Please select a file from the table first"
2181+
)
2182+
return
2183+
2184+
# Ensure the current file is in selected_series
2185+
if current_file not in self.selected_series:
2186+
self.selected_series[current_file] = 0
2187+
2188+
# Validate output folder
2189+
output_folder = self.output_edit.text()
2190+
if not output_folder:
2191+
output_folder = os.path.join(
2192+
self.folder_edit.text(), "converted"
2193+
)
2194+
2195+
if not self._validate_output_folder(output_folder):
2196+
return
2197+
2198+
# Build conversion list - only for the current file
2199+
files_to_convert = []
2200+
filepath = current_file
2201+
series_index = self.selected_series.get(filepath, 0)
2202+
2203+
if self.export_all_series.get(filepath, False):
2204+
loader = self.get_file_loader(filepath)
2205+
if loader:
2206+
try:
2207+
series_count = loader.get_series_count(filepath)
2208+
for i in range(series_count):
2209+
files_to_convert.append((filepath, i))
2210+
except (OSError, FileFormatError, ValueError) as e:
2211+
self.status_label.setText(
2212+
f"Error getting series count: {str(e)}"
2213+
)
2214+
return
2215+
else:
2216+
files_to_convert.append((filepath, series_index))
2217+
2218+
if not files_to_convert:
2219+
self.status_label.setText("No valid files to convert")
2220+
return
2221+
2222+
# Start conversion
2223+
self._start_conversion_worker(files_to_convert, output_folder)
2224+
2225+
except (OSError, PermissionError, ValueError) as e:
2226+
QMessageBox.critical(
2227+
self,
2228+
"Conversion Error",
2229+
f"Failed to start conversion: {str(e)}",
2230+
)
2231+
2232+
def _start_conversion_worker(
2233+
self, files_to_convert: List[Tuple[str, int]], output_folder: str
2234+
):
2235+
"""Start the conversion worker thread"""
2236+
self.conversion_worker = ConversionWorker(
2237+
files_to_convert=files_to_convert,
2238+
output_folder=output_folder,
2239+
use_zarr=self.zarr_radio.isChecked(),
2240+
file_loader_func=self.get_file_loader,
2241+
)
2242+
2243+
self.conversion_worker.progress.connect(
2244+
self.update_conversion_progress
2245+
)
2246+
self.conversion_worker.file_done.connect(self.handle_conversion_result)
2247+
self.conversion_worker.finished.connect(self.conversion_completed)
2248+
2249+
self.conversion_progress.setVisible(True)
2250+
self.conversion_progress.setValue(0)
2251+
self.cancel_button.setVisible(True)
2252+
self.status_label.setText(
2253+
f"Converting {len(files_to_convert)} files/series..."
2254+
)
2255+
2256+
self.conversion_worker.start()
2257+
2258+
def convert_all_files(self):
2259+
"""Convert all files with default settings"""
2260+
try:
2261+
all_files = list(self.files_table.file_data.keys())
2262+
if not all_files:
2263+
self.status_label.setText("No files available for conversion")
2264+
return
21732265

21742266
# Validate output folder
21752267
output_folder = self.output_edit.text()
@@ -2181,10 +2273,12 @@ def convert_files(self):
21812273
if not self._validate_output_folder(output_folder):
21822274
return
21832275

2184-
# Build conversion list
2276+
# Build conversion list for all files
21852277
files_to_convert = []
2186-
for filepath, series_index in self.selected_series.items():
2187-
if self.export_all_series.get(filepath, False):
2278+
for filepath in all_files:
2279+
file_info = self.files_table.file_data.get(filepath)
2280+
if file_info and file_info.get("series_count", 0) > 1:
2281+
# For files with multiple series, export all
21882282
loader = self.get_file_loader(filepath)
21892283
if loader:
21902284
try:
@@ -2197,36 +2291,15 @@ def convert_files(self):
21972291
)
21982292
return
21992293
else:
2200-
files_to_convert.append((filepath, series_index))
2294+
# For single image files
2295+
files_to_convert.append((filepath, 0))
22012296

22022297
if not files_to_convert:
22032298
self.status_label.setText("No valid files to convert")
22042299
return
22052300

22062301
# Start conversion
2207-
self.conversion_worker = ConversionWorker(
2208-
files_to_convert=files_to_convert,
2209-
output_folder=output_folder,
2210-
use_zarr=self.zarr_radio.isChecked(),
2211-
file_loader_func=self.get_file_loader,
2212-
)
2213-
2214-
self.conversion_worker.progress.connect(
2215-
self.update_conversion_progress
2216-
)
2217-
self.conversion_worker.file_done.connect(
2218-
self.handle_conversion_result
2219-
)
2220-
self.conversion_worker.finished.connect(self.conversion_completed)
2221-
2222-
self.conversion_progress.setVisible(True)
2223-
self.conversion_progress.setValue(0)
2224-
self.cancel_button.setVisible(True)
2225-
self.status_label.setText(
2226-
f"Converting {len(files_to_convert)} files/series..."
2227-
)
2228-
2229-
self.conversion_worker.start()
2302+
self._start_conversion_worker(files_to_convert, output_folder)
22302303

22312304
except (OSError, PermissionError, ValueError) as e:
22322305
QMessageBox.critical(
@@ -2235,24 +2308,6 @@ def convert_files(self):
22352308
f"Failed to start conversion: {str(e)}",
22362309
)
22372310

2238-
def convert_all_files(self):
2239-
"""Convert all files with default settings"""
2240-
self.selected_series.clear()
2241-
self.export_all_series.clear()
2242-
2243-
all_files = list(self.files_table.file_data.keys())
2244-
if not all_files:
2245-
self.status_label.setText("No files available for conversion")
2246-
return
2247-
2248-
for filepath in all_files:
2249-
self.selected_series[filepath] = 0
2250-
file_info = self.files_table.file_data.get(filepath)
2251-
if file_info and file_info.get("series_count", 0) > 1:
2252-
self.export_all_series[filepath] = True
2253-
2254-
self.convert_files()
2255-
22562311
def _validate_output_folder(self, folder: str) -> bool:
22572312
"""Validate output folder"""
22582313
if not folder:

0 commit comments

Comments
 (0)