app: sequence management -- new-sequence dialog, folders, sequences in the project bin

- File > New > Sequence opens a real dialog (name, PAL/NTSC/HD presets,
  width/height/frame rate, progressive/interlaced); VideoParams gains an
  interlaced flag
- File > New > Folder creates a folder in the project root
- sequences are mounted under the root folder so they appear in the
  project explorer (including the auto-created Sequence 1 and orphans
  from older projects); right-click > Sequence Properties edits the
  parameters afterwards
- dropping footage onto an empty, sequence-less timeline auto-creates a
  sequence from the footage's first video stream
This commit is contained in:
2026-08-27 17:38:30 +08:00
parent d65b84a6ca
commit bad2f9552e
21 changed files with 1614 additions and 6 deletions
+18 -1
View File
@@ -151,9 +151,19 @@ impl<E: AppEngine> ProjectExplorerPanel<E> {
})
.detach();
}
LOCAL_RENAME | LOCAL_DELETE | LOCAL_PROPERTIES | LOCAL_OPEN_IN_NEW_TAB => {
LOCAL_RENAME | LOCAL_DELETE | LOCAL_OPEN_IN_NEW_TAB => {
println!("[project explorer] menu action {item} (not implemented yet)");
}
LOCAL_PROPERTIES => {
let Some(id) = self.context_entry else {
return;
};
if self.engine.read(cx).entry_is_sequence(id) {
cx.emit(SequencePropertiesRequested(id));
} else {
println!("[project explorer] properties for non-sequence entry {id} (not implemented yet)");
}
}
LOCAL_PROXY_GENERATE | LOCAL_PROXY_USE | LOCAL_PROXY_REVEAL | LOCAL_PROXY_DELETE => {
let Some(id) = self.context_entry else {
return;
@@ -243,6 +253,13 @@ impl<E: AppEngine> EventEmitter<PanelEvent> for ProjectExplorerPanel<E> {}
impl<E: AppEngine> EventEmitter<ContextMenuTriggered> for ProjectExplorerPanel<E> {}
/// The project explorer asked the shell to open the sequence properties
/// dialog for the given sequence entry.
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub struct SequencePropertiesRequested(pub u64);
impl<E: AppEngine> EventEmitter<SequencePropertiesRequested> for ProjectExplorerPanel<E> {}
impl<E: AppEngine> DockPanel for ProjectExplorerPanel<E> {
fn panel_id(&self) -> gpui::dock::PanelId {
PROJECT