The command checks look at the paths an agent gives, but a project it opens or
imports from a read root names its own footage, which was read wherever it is
when the project rendered: render_frame returned its pixels.
Backend::confine now wraps a headless session's footage and services:
ConfinedFootage reads frames, audio, aux channels, models and vector frames
only for footage inside the read roots (problem() says why the rest shows
nothing), and ConfinedServices checks read_file, exists, stamp, list_dir and
is_dir the same way. Writes are left to the command checks.
Test: automation_roots_confine_the_footage_a_project_names covers an absolute
path, `../`, a linked file and a linked folder, each opened and imported.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The ≡ menu of a panel in its own OS window ("Move Panel to New Window")
was a root-layer Area drawn by the main window's pass at window-local
coordinates, so it opened in the main window at the wrong place.
The open menu now remembers the viewport that owns the click and is
drawn by that viewport's pass (after the window's last panel body); the
main window draws only its own panels' menus. The menu takes at most its
window's width (a floated panel can be narrower than the menu), a press
in another window dismisses it, and a menu left behind by a window that
closed is dropped.
Ports the FilmCraft fix (filmcraft#3633).
Tested: new unit tests in panels.rs run passes of two viewports against
one context: the menu is drawn in the owner's pass and not the main
window's, a main-window menu stays there, a 160 pt window holds the
menu, a press in another window closes it, and a closed window's menu is
dropped. effectcraft-ui-egui lib tests (387), clippy -D warnings, fmt.
A project file can carry footage with a frame rate of den 0; frame_position
divided by zero while rendering it. Treat non-positive rates as having no
frame to land between.
When two primary releases land on a slot in one frame, derive prev_modified from the earlier release so an Alt-then-plain pair cannot create-on-double-click.
egui pairs a plain click with a prior Alt-click as a double-click; remember the previous click's Alt so create-on-double-click only runs for two plain clicks.
A shortcut belongs to the application, a panel or a context (editing text, a paint or
camera tool active, a mask selected). The narrowest active scope runs a chord: an active
context, the focused panel, the panel sharing its shortcuts (Timeline and Composition),
the application. A context's shortcuts never run outside it.
- shortcuts.rs: scope table for engine commands and menu entries, scope_rank,
scope_label; UiCommand can state its scope.
- Conflicts: the same chord in two scopes is an override (both keep working), reported
with overrides: true; shortcuts.conflicts lists same-scope pairs only.
- Scoped now, keys unchanged: Remember / Apply Interpretation and Delete Without
Confirmation (Project), Duplicate Render Item (Render Queue).
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>