Skip to main content

Panels & Dialogs

The window is built from egui docked panels plus floating windows. Each panel's visibility and size live in Settings::panels, so the layout survives restarts.

Window layout

ch7-window-layout.png

egui allocates panels in the order they are added. The left column comes first and takes the full height; the timeline then takes the bottom of what is left; the properties panel sits on the right above it; the viewer column gets the centre.

How panels edit the project

Panels never write to the project. Each one returns a list of commands, and the app applies them in one place:

  1. The panel reads the project and the selection, draws its controls and returns Vec<BoxedCommand>.
  2. apply_effect_changes wraps several commands in one CompositeCommand (multi-selection edits undo together).
  3. While the pointer is down, or a preview dropdown is open, commands join one undo group, closed on release.

The properties panel and keyframe editor target the selected clips: the first one supplies the displayed values, changes go to all of them. Values are read at the playhead mapped into each clip's source frame, because keyframes live in source frames.

Panels

PanelModule · contents
Media poolmedia_pool_ui, media_pool · folders, thumbnails, offline state; selection logic is a pure function, testable without egui
Effectsmedia_pool_ui · generators, filters and transitions to drag onto the timeline
Propertiesproperties_panel · Video, Audio, Selection tabs with keyframe toggles, title editor; a selected transition replaces the tabs. The color correction section is grade_panel, shared with the Color window
Color windowcolor_window · two GPU scopes of the selected clip, measured by itself, above its color correction (see Color Correction & Scopes)
Keyframe editorkeyframe_editor · one row per animated parameter, curve of the chosen row; painter-drawn like the timeline
Mixermixer_panel · one strip per audio track plus master, meters, effect chain
EQ / compressoreq_panel, compressor_panel · response curve over the live spectrum, draggable bands; presets saved to settings at once
Audio metermain.rs · narrow band right of the timeline, peak with decay

Dialogs

A dialog is an Option<…Dialog> field on VenturiApp: Some while open, drawn every frame, set back to None on close. Widgets that cannot open one themselves (the timeline) raise a request flag the app reads in the same frame.

DialogModule
Export settingsexport_dialog
Settingssettings_dialog
Project settings (processing precision)app_menu
New timelinenew_timeline_dialog
Clip speedspeed_dialog
Remove silencessilence_dialog
Paste attributespaste_attributes
Forced relinkforced_relink_dialog
Progress, warnings, unsaved changes, OTIO mergeproject_io, main.rs

File pickers run on a separate thread (pending_dialog): on the GNOME/Wayland event-loop thread a blocking picker would mark the app as unresponsive.

Background workers owned by the UI

WorkerJob
ProxyWorkerAll-intra proxies, one at a time, on its own thread so playback decoding is not slowed; paused during export
WaveformWorkerWaveform peaks for audio streams, one at a time
ThumbnailWorkerMedia-pool thumbnails; opening and seeking a file costs too much on the UI thread

All three are created on the first import, skip what the on-disk cache already has, and are polled once per frame.