Under load its thread pulled samples before the test read the clock, so
'from the first frame' saw frame 1 and a_started_preview_follows_its_sound flaked.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
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>
Session::write_output (and refuse_export) is the one place that checks; Save Frame As
(PNG/PSD/EXR), Export Lottie, Save a Copy (+XML), Collect Files, Export Timeline (and its
pre-rendered movies), Export Template, Save Animation Preset, Export Guides and Export
Shortcuts write through it. The control channel's render.frame/ui.screenshot, MCP
render_frame and CLI render-frame --out check first (new query file.checkOutput for the
bridged cases). Save/Save As/auto-save are untouched.
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
#1339 was written before ui-egui's integration tests became modules of one binary
(`tests/it/main.rs`), so its six test files landed at the top of `tests/`, each its own crate
and link. They move into `tests/it/` as modules; the a11y module's doc names the new path.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Timeline and Effect Controls value editors sent every write with the property's scrub merge
key, so two separate picks from a drop-down (or two check box toggles) on the same property
folded into one undo step. Drop-down, check box, layer and mask picks now record their own
step; scrubs and typed numbers still merge as before.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Main routes viewer scrolling through viewer_scroll, so a raw-event scrub fought the wheel zoom. With general.viewerWheelScrubbing on, an unmodified wheel steps frames and the rest of that notch does not zoom or pan. The preference stays off, so the wheel still zooms.
- ui_accessibility_audit: main's new Character panel controls (stroke width presets, line
join, stroke order) raise Character:default to 46 findings (22 unnamed); the ratchet entry
follows, since that panel is not yet audited. The control filter is written as clippy's
nonminimal_bool asks.
- ui_timeline_shapes (main's #2513 test): this PR names the Properties panel's Position row,
so "Position" is no longer unique; the test takes the Animate menu's new entry.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Gradient Overlay's gradient showed "Edit in the Timeline" text in the Layer Style dialog.
It is now an Edit Gradient… button that runs prop.editGradient on that property; OK or
Cancel in the Gradient Editor returns to the Layer Style dialog, as in After Effects.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The stroke width was a field labelled W, which read as the width of the
text, not its stroke. It now shows the stroke-width icon (three bars,
thin to thick), sits beside the stroke order menu as before, and has a
presets menu (0.25 to 100 px) next to its value, as in After Effects;
fractional widths show their decimals.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>