From 30911e894ab91d7f32668dc55fc97b5f6b044ef8 Mon Sep 17 00:00:00 2001 From: Ethanfel Date: Thu, 26 Feb 2026 17:55:45 +0100 Subject: [PATCH] Sync file removal with trim slider for edge selections Removing files contiguous from the start/end of a sequence now adjusts the trim handles instead of tracking them as individual removals, so dragging the slider back restores them. Middle removals still tracked separately. Co-Authored-By: Claude Opus 4.6 --- ui/main_window.py | 69 +++++++++++++++++++++++++++++++++++++++++------ 1 file changed, 61 insertions(+), 8 deletions(-) diff --git a/ui/main_window.py b/ui/main_window.py index 7e35e78..0deba9b 100644 --- a/ui/main_window.py +++ b/ui/main_window.py @@ -2781,26 +2781,79 @@ class SequenceLinkerUI(QWidget): self.file_list.takeTopLevelItem(row) def _remove_selected_files(self) -> None: - """Remove selected files from the file list.""" + """Remove selected files from the file list. + + Files contiguous from the start/end of the trimmed range adjust the + trim handles so they can be restored by dragging the slider back. + Files removed from the middle are tracked as individual removals. + """ selected = self.file_list.selectedItems() if not selected: return - # Track removed files for persistence + # Group selected filenames by fid + removed_by_fid: dict[int, set[str]] = {} for item in selected: data = item.data(0, Qt.ItemDataRole.UserRole) if data: filename = data[1] fid = item.data(0, Qt.ItemDataRole.UserRole + 2) or 0 + removed_by_fid.setdefault(fid, set()).add(filename) + + # For each fid, convert edge removals into trim adjustments + for fid, filenames in removed_by_fid.items(): + idx = self._folder_ids.index(fid) if fid in self._folder_ids else -1 + if idx < 0: + continue + folder = self.source_folders[idx] + trimmed = self._get_trimmed_file_list(fid, folder) + already_removed = self._removed_files.get(fid, set()) + # Effective list: trimmed minus already-removed + effective = [f for f in trimmed if f not in already_removed] + + if not effective: + continue + + # Count contiguous removals from start + start_bump = 0 + for f in effective: + if f in filenames: + start_bump += 1 + else: + break + + # Count contiguous removals from end + end_bump = 0 + for f in reversed(effective): + if f in filenames: + end_bump += 1 + else: + break + + # Avoid double-counting if all files are removed + if start_bump + end_bump > len(effective): + start_bump = len(effective) + end_bump = 0 + + edge_files = set() + if start_bump > 0: + edge_files.update(effective[:start_bump]) + if end_bump > 0: + edge_files.update(effective[-end_bump:]) + + # Adjust trim settings for edge removals + if start_bump > 0 or end_bump > 0: + trim_start, trim_end = self._folder_trim_settings.get(fid, (0, 0)) + self._folder_trim_settings[fid] = (trim_start + start_bump, trim_end + end_bump) + + # Remaining removals (middle) go to _removed_files + middle_files = filenames - edge_files + if middle_files: if fid not in self._removed_files: self._removed_files[fid] = set() - self._removed_files[fid].add(filename) + self._removed_files[fid].update(middle_files) - rows = sorted([self.file_list.indexOfTopLevelItem(item) for item in selected], reverse=True) - for row in rows: - self.file_list.takeTopLevelItem(row) - - # Update the With Transitions tab to reflect the removal + self._refresh_files() self._update_sequence_table() def _get_path_history_file(self) -> Path: