Add Replace Folder option to preserve edits when swapping a clip

Right-click any folder in the source list → "Replace Folder..." opens
a file dialog. The new folder takes the old one's position and inherits
all settings: type override, trim, per-transition overlap, removed
files, and direct transition config.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
2026-02-12 12:56:01 +01:00
parent 0efc6e153f
commit 2c4778e598

View File

@@ -2560,6 +2560,52 @@ class SequenceLinkerUI(QWidget):
self._update_flow_arrows()
def _replace_source_folder(self, old_folder: Path, idx: int) -> None:
"""Replace a source folder with a new one, preserving edits.
Keeps: folder type override, trim settings, per-transition settings,
removed files set, direct transition settings, and position in list.
"""
start_dir = str(old_folder.parent) if old_folder.exists() else (self.last_directory or "")
path = QFileDialog.getExistingDirectory(
self, "Select Replacement Folder", start_dir
)
if not path:
return
new_folder = Path(path).resolve()
if new_folder == old_folder:
return
if new_folder in self.source_folders:
QMessageBox.warning(self, "Duplicate", "That folder is already in the list.")
return
# Migrate all settings from old path to new path
self.source_folders[idx] = new_folder
if old_folder in self._folder_type_overrides:
self._folder_type_overrides[new_folder] = self._folder_type_overrides.pop(old_folder)
if old_folder in self._folder_trim_settings:
self._folder_trim_settings[new_folder] = self._folder_trim_settings.pop(old_folder)
if old_folder in self._per_transition_settings:
pts = self._per_transition_settings.pop(old_folder)
self._per_transition_settings[new_folder] = PerTransitionSettings(
trans_folder=new_folder,
left_overlap=pts.left_overlap,
right_overlap=pts.right_overlap,
)
if old_folder in self._removed_files:
self._removed_files[new_folder] = self._removed_files.pop(old_folder)
if old_folder in self._direct_transitions:
self._direct_transitions[new_folder] = self._direct_transitions.pop(old_folder)
if old_folder in self._folder_file_counts:
del self._folder_file_counts[old_folder]
self.last_directory = str(new_folder.parent)
self._sync_dual_lists()
self._refresh_files()
self._update_flow_arrows()
def _remove_files_from_folder(self, folder: Path) -> None:
"""Remove all files from a specific folder without affecting order of other files."""
folder_str = str(folder)
@@ -3431,6 +3477,9 @@ class SequenceLinkerUI(QWidget):
overlap_action = menu.addAction("Set Overlap Frames...")
overlap_action.triggered.connect(lambda: self._show_overlap_dialog(folder))
replace_action = menu.addAction("Replace Folder...")
replace_action.triggered.connect(lambda: self._replace_source_folder(folder, idx))
menu.exec(self.source_list.mapToGlobal(pos))
def _show_overlap_dialog(self, folder: Path) -> None: