The source panel had maxWidth(400) which barely let the splitter move
beyond its starting position. Removed the cap, lowered minWidth from
250 to 150, and widened both splitter handles to 5px for easier grab.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
ResizeToContents columns can't be dragged — they snap back to their
computed width, making resize attempts feel broken. Changed to
Interactive mode with explicit initial widths and minimum section
size so columns are freely draggable while still having sensible
defaults.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- Session list now supports extended selection (Shift+click for range,
Ctrl+click for individual)
- "Delete Selected" button removes chosen sessions with confirmation
- List refreshes in-place after deletion so you can keep cleaning up
- Added delete_sessions() batch method to database (single transaction)
- Simplified delete_session() to rely on ON DELETE CASCADE
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
The export loop was opening a new DB connection per file AND starving
the Qt event loop, causing the progress bar to freeze then jump and
the app to crash during large copy exports.
Fixes:
- All record_symlink calls in both export paths now collect records
and batch-insert in a single transaction at the end
- Added explicit QApplication.processEvents() in export loops
- Throttled progress label updates to every 10 files (text rendering
was adding overhead on every iteration)
- Moved shutil import out of inner loops
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
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>
Save freeze fix:
- Added record_symlinks_batch() that inserts all symlinks in a single
DB transaction instead of opening a new connection per file
- _save_session and _auto_save_session now use batch inserts
- With 1700 files this goes from 1700 connection cycles to 1
Removed files fix:
- _restore_files_from_session now filters by _removed_files so
individually deleted files stay removed even when restoring from
session data that pre-dates the removal
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Session restore fixes:
- AUTO-typed folders now default to MAIN on restore instead of using
position-based index%2, which silently flipped half the folders to
TRANSITION when restoring legacy sessions
- All restored folders get explicit type overrides so no folder relies
on position-based typing after restore
- TRANSITION folders with symlink data are auto-recovered as MAIN
(catches incorrectly saved types from older export paths)
- Export Sequence path now saves with save_effective_types=True,
preventing folder type loss
- Removed redundant trim-only save that used unresolved paths
- Auto-save guards against overwriting sessions with empty file lists
UI improvements:
- Added 4th "Frame" column to Sequence Order tab showing overall
frame number (1-based)
- Last frame of each sequence is bold for visual clarity
- Fixed column resizing (ResizeToContents + Stretch) to prevent
column collapse bugs
- Save Session dialog now reports main + transition folder counts
- Default optical flow preset changed to Max
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- Fix export range not covering TRANSITION folder middle frames: range max
was based on MAIN-only file count, causing blends at sequence end to be
silently skipped. Now uses full sequence frame count from preview table.
- Fix preview table not counting TRANSITION middle frames: these frames are
output as symlinks in export but were shown without sequence numbers in
preview. Now displayed as [T] entries with proper output_seq numbering.
- Fix session restore path resolution: all folder paths now .resolve()'d on
save and restored with _resolve_lookup() fallback for both raw and resolved
forms. Fixes folder order corruption on restore.
- Fix legacy session restore: detect pre-migration sessions (all folder_order=0)
and fall back to symlink-derived ordering with get_all_folder_settings().
- Fix ffmpeg concat demuxer duration format: use decimal instead of fraction.
- Fix QProgressDialog false cancellation from autoReset at max value.
- Fix Export with Transitions skipping TRANSITION folders entirely while
preview processed them, causing cutoff at blend boundaries.
- Fix Encode Video Only not finding transition-exported files in trans_dest.
- Add video encoding module (core/video.py) with concat demuxer support.
- Add direct_transition_settings DB table and persistence.
- Add sticky folder types on reorder and placeholder transition slots.
- Add blend-skipped-range counter to export completion dialog.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- Rewrite _export_sequence with QProgressDialog, per-file error handling,
cancel support, and continuous seq_00000 naming
- Add folder progress labels to _process_with_transitions
- Extend cleanup_old_links to remove film_temp_*.png temporaries
- Add copy-files checkbox for Docker/remote destinations
- Persist individually removed files across sessions (removed_files table)
- Recover file removals from export history for older sessions
- Save effective folder types in transition exports for reliable restore
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Implement standalone PyTorch-based RIFE interpolation that runs in a
dedicated virtual environment to avoid Qt/OpenCV conflicts:
- Add PracticalRifeEnv class for managing venv and subprocess execution
- Add rife_worker.py standalone interpolation script using Practical-RIFE
- Add RIFE_PRACTICAL blending model with ensemble/fast mode settings
- Add UI controls for Practical-RIFE configuration
- Update .gitignore to exclude venv-rife/ directory
The implementation downloads Practical-RIFE models on first use and runs
interpolation in a separate process with proper progress reporting.
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Split monolithic symlink.py into modular components:
- config.py: Constants and configuration
- core/: Models, database, blender, manager
- ui/: Main window and widgets
New features included:
- Cross-dissolve transitions with multiple blend methods
- Alpha blend, Optical Flow, and RIFE (AI) interpolation
- Per-folder trim settings with start/end frame control
- Per-transition asymmetric overlap settings
- Folder type overrides (Main/Transition)
- Dual destination folders (sequence + transitions)
- WebP lossless output with compression method setting
- Video and image sequence preview with zoom/pan
- Session resume from destination folder
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
PyQt6 application to create sequenced symlinks for image files.
Features:
- GUI and CLI modes
- Multiple source folder support with drag & drop
- SQLite database for tracking symlink sessions
- Multi-select and reorder files
- Two-column file view (filename + source path)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>