mirror of
https://github.com/storytold/filmcraft.git
synced 2026-10-24 10:10:05 -06:00
93 lines
6.1 KiB
Markdown
93 lines
6.1 KiB
Markdown
# FilmCraft interface
|
|
|
|
The egui frontend draws panels and dialogs, and dispatches project changes through the engine.
|
|
Interactive controls keep stable automation ids regardless of the interface language.
|
|
|
|
## Transition drop previews
|
|
|
|
Dragging a video or audio transition over a compatible clip shows its actual time span, the
|
|
selected cut and an In/Out label. Shared cuts center the span; isolated edges use a one-sided
|
|
span. The preview uses the engine's read-only transition planner, including Timeline duration
|
|
preferences, and release dispatches `effects.apply` with the same edge. Locked tracks and
|
|
incompatible clip types show no valid transition preview. Ordinary effects retain their clip
|
|
outline. `timeline.transitionDropPreview` exposes the span and edge to automation.
|
|
|
|
`transition_drop_ui` covers both edges of short video/audio clips, hover without project edits,
|
|
the committed span and undo. Set `FILMCRAFT_UI_SNAPSHOT_DIR` to render screenshots with wgpu.
|
|
|
|
## Localisation
|
|
|
|
Edit > Language offers English, Japanese, Spanish, Brazilian Portuguese, Ukrainian, Simplified
|
|
Chinese, German, Russian, French, Indonesian, Korean and Italian (all but Ukrainian and Russian cover
|
|
the whole interface; those two cover the core menus). The language is stored in the engine's `general.interfaceLanguage` preference,
|
|
restored on startup, and also available in Settings > General.
|
|
Its default, System Language (`system`), follows the operating system: the first of the user's
|
|
preferred languages that the interface has (the host supplies them through
|
|
`HostHooks::system_languages`: `sys-locale` on the desktop, `navigator.languages` on the web),
|
|
otherwise English.
|
|
The `app.language.*` UI commands and `prefs.set` reach it through the control channel.
|
|
Japanese requires a craft-fonts build or a suitable installed font.
|
|
|
|
English source strings are lookup keys in `src/i18n/<code>.tsv`. `tl!` translates literals, `tlf!`
|
|
fills translated templates, and `i18n::t` translates names from registries. Placeholder values
|
|
(including user filenames containing braces) are inserted literally. Catalog translations are
|
|
original work using ordinary language, without proprietary localisation resources.
|
|
|
|
Spanish, Japanese, Simplified Chinese, French, Brazilian Portuguese and German cover menus, panels, dialogs, settings and registry labels. Searches accept both the
|
|
translated label and its English source, including Unicode capitals. Project content, command ids
|
|
and preference values retain their original values. Engine errors, CLI and MCP messages remain
|
|
English. Ukrainian and Russian currently cover the core menus; they fall back to English elsewhere.
|
|
|
|
A string a catalog lacks shows in English, so a missing translation never fails a test or a
|
|
build. `cargo xtask i18n-report` prints each language's missing strings (menus, `tl!` literals and
|
|
registry names) and its entries whose source the interface no longer has; `cargo xtask ci` prints
|
|
the same report in its log.
|
|
|
|
Verification: `cargo test -p filmcraft-ui-egui` checks catalog syntax, duplicate keys, placeholders
|
|
and UI behaviour in other languages (switching, search, font coverage); `cargo xtask ci` runs the
|
|
workspace gates. Visual checks use the control channel to switch language and capture the resulting
|
|
panels.
|
|
|
|
## Source playback
|
|
|
|
`source_playback.rs` auditions media independently of Program playback. It reuses MediaSource
|
|
decoding, output mapping, the device clock and the desktop play-ahead buffer. Only one monitor
|
|
owns the device at a time. Source frame jobs use the existing frame server and Source resolution.
|
|
The live project, undo stack and timeline playhead are unchanged. See [monitor documentation](../../docs/monitors.md)
|
|
for behavior, commands, limitations and regression tests. Source playback tests use synthetic
|
|
demo media and fake audio outputs; no third-party assets are introduced.
|
|
|
|
Source drag controls snapshot the selected span and dispatch `timeline.place` for video, audio,
|
|
or linked video/audio. Full-clip marks are implicit until set by the user. The engine owns edits,
|
|
range validation and undo; the UI owns the drag gesture. See `source_drag_ui` and the engine's
|
|
`source_placement_tests` for regression coverage.
|
|
|
|
Source range handles use transient gesture previews and the engine's integer-frame
|
|
`source_monitor::adjust_range`; release dispatches one mark edit. Monitor command routing
|
|
keeps Source navigation, markers and marked-range playback separate from Program.
|
|
|
|
## Pane layout controls
|
|
|
|
Dock transactions and pointer targets use `craft-ui::docking`; bounded split geometry and
|
|
keyboard-accessible resize handles use `craft-ui::layout`. FilmCraft adapts its existing saved
|
|
dock tree and panel identities to the shared model. Panel tabs or their header grip can move
|
|
between tab groups, split at an edge, reorder, or float when released with Cmd/Ctrl. Floating
|
|
panels move by their empty header and resize from the bottom-right corner. Timeline sequence
|
|
tabs retain their sequence-opening, closing and horizontal reorder behavior; the header grip
|
|
moves the Timeline panel. Workspace saves retain floating groups alongside the legacy layout
|
|
JSON, and workspaces without floating data still load. Automation IDs and workspace commands
|
|
remain the integration boundary.
|
|
|
|
Tools and dock tabs expose their actual egui widget IDs, paint keyboard focus, and support
|
|
Tab/Shift-Tab traversal and Space/Enter activation. Control-injected keys can reach focused
|
|
widgets in a background window. The optional `--control-input-only` native launch mode isolates
|
|
automation from native widget/menu input; `ui.inspect` reports native and effective focus
|
|
separately. Focus and input-ownership regressions cover document/playhead preservation.
|
|
|
|
Compact monitor layouts separate the current and duration timecodes from zoom, resolution and
|
|
settings. Source video/audio drag choices retain their existing placement behavior. Transport
|
|
buttons use `craft-ui::layout::fit_toolbar`; commands beyond the available width remain available
|
|
through More, including their selected state and Source/Program routing. A scrolling fallback
|
|
retains all commands if even More cannot fit. `monitor_geometry` checks the painted readouts,
|
|
control bounds, overflow actions and Source drag payloads across monitor widths and themes.
|