Commit Graph
1593 Commits
Author SHA1 Message Date
tylerjenningsw bfb7507565 Timeline: a Quick Offset of layer bars ends on release off screen (#1012)
The layer bar Quick Offset was followed and ended in its row's code, and
rows out of view aren't drawn. Released with its row scrolled away, it
stayed active: the next drag of that bar, even a plain one, ran as a
Quick Offset from the old origin, into the old undo step.

Like the key drag, it now follows the pointer below the rows and ends
when the button is released, wherever the bar's row is.

Test: a_quick_offset_released_off_screen_ends (release with the row
scrolled away; a plain drag after it moves both layers together as its
own undo step; fails before).
2026-10-12 18:49:51 -04:00
tylerjenningsw e1c9c33fb1 Keyframes: a refused key drag step doesn't count towards the drag (#1012)
keys.quickOffset and keys.move stored the drag's new total before the
edit ran. When the edit refused the step (keys.quickOffset with a key
landing past the end of time), the project stayed as it was but the
total kept the refused delta, and with incremental steps (merge without
fromStart) the next step moved by it too.

The drag state is now stored only after the edit applies.

Test: a_refused_step_does_not_count_towards_the_drag (+1 s, a refused
step, -1 s: the keys end where they started; fails before: the last key
ends near the end of time).
2026-10-12 18:49:48 -04:00
tylerjenningsw f72b8993ef Keyframes: moving keys keeps subframe spacing (#1012)
keys.move and the nudges snapped each key's destination to the nearest
frame, so moving keys a Quick Offset had staggered onto subframes put
them back on frames: four keys at 0, 1/3, 2/3 and 1 frame, moved one
frame, came out at 1, 1, 2 and 2. Layer bars kept theirs, because
layer.timing snaps the move, not the times.

The move is now rounded to whole frames and every key translated by it.
layer_shift turns a comp-time move into a layer-time move through the
layer's start and stretch (reversed too) without a round trip through
comp time; keys.quickOffset uses it as well.

Test: moving_staggered_keys_keeps_their_subframe_spacing (Quick Offset,
then keys.move and keys.nudgeForward; fails before: 1/3 frame lands on
a frame).
2026-10-12 18:49:34 -04:00
tylerjenningsw e2d50ec926 Timeline: Shift ranges and key boxes stagger in comp order (#1012)
In After Effects a marquee selection staggers in the comp's layer order,
not in the direction the box was drawn. A Shift-click range of layer
bars and a box of keys already come out top layer first; this test makes
both with the pointer (the range from the bottom layer up, the box from
the bottom right to the top left) and checks the Quick Offset that
follows: the top layer stays and the bottom one moves the whole delta.
2026-10-12 17:45:30 -04:00
tylerjenningsw 94b4d0ca34 Timeline: Quick Offset layers and keyframes in selection order (#1012)
Ctrl/Cmd+Alt dragging a selected layer bar or a selected key now runs a
Quick Offset (layer.quickOffset / keys.quickOffset with fromStart, one
undo step). The mode is chosen when the drag starts and needs at least
two unlocked layers; the last selected layer moves by whole frames with
the pointer. A readout by the pointer shows the Total Offset and the
offset Per Layer, translated.

A plain drag still moves the selection together, Alt alone still scales
a key group in time (it now leaves Ctrl/Cmd+Alt to Quick Offset), and
Ctrl/Cmd+Alt+click still toggles Hold. The key drag's readout is drawn
by a shared drag_tip. Keys also register timeline.keyAt.<uid>.<ticks>,
exact where keys on subframes can share a frame.

Tests (ui_quick_offset): staggering layer bars in selection order and
keys per layer, one undo each; plain drags and Alt scaling unchanged; the
readout while dragging.
2026-10-12 17:37:34 -04:00
tylerjenningsw 28e9e5229e Quick Offset: layer.quickOffset and keys.quickOffset commands (#1012)
After Effects 25.4's Quick Offset staggers selected layers, or each
layer's selected keyframes, in the order they were selected: the first
stays, the last moves by the drag and the ones between by equal steps,
landing on subframes.

layer.quickOffset {delta, layers?} moves each layer's start, in and out
point by total * i / (n - 1), worked out once in ticks with integer
arithmetic, so 1 frame over 4 layers gives 0, 1/3, 2/3 and 1 frame
exactly. keys.quickOffset {delta} does the same per layer for the
selected keys, the layers in the order their first key was selected;
every selected key of a layer, across its properties, moves by that
layer's comp-time offset through its start and stretch (reversed too),
keeping values, interpolation, easing and labels. Locked layers are
skipped and at least two layers are needed. With merge and fromStart,
delta is the whole drag and each step starts again from before it, so
the drag is one undo step and a key passed over survives. A delta or a
destination out of the range of times is an error, not a clamped move.

Docs: agents.md; architecture.md notes Quick Offset as the exception to
times snapping to frames.
2026-10-12 17:37:31 -04:00
tylerjenningsw 7643f803e0 Keyframes: moving keys keeps the selection order
keys.move (and nudging) rebuilt the key selection in layer and property
order, so the order the keys were selected in was lost after a move. A
Quick Offset that follows staggers layers in that order (#1012).

The move now goes through move_key_refs, which maps each selected key to
its new time and returns the selection in its original order, with the
same collisions (a key landing on another replaces it), roving retiming
and locked-layer handling as before. key_gesture is the drag-step logic
(start again from the keys and project as they were before the drag)
split out of shift_keys so other key drags can share it.

Test: moving_keys_keeps_the_selection_order (fails before: the keys come
back sorted by layer).
2026-10-12 17:37:29 -04:00
Brandon ThomasandClaude Opus 5.5 470ea7a3af Release 0.9.2: install the wasm-bindgen CLI for the web release build
The shared release workflow installs trunk, but EffectCraft's web build
runs the wasm-bindgen CLI directly (cargo xtask web), so the Web job
fails with "wasm-bindgen CLI not found". In CI, package.sh now installs
the CLI at xtask's WASM_BINDGEN version, as the per-app release.yml did
before the move to craft-common-actions.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
v0.9.2
2026-10-12 12:37:47 -04:00
Brandon ThomasandClaude Opus 5.5 e2f314f753 Release 0.9.1: rebuild with the fixed shared release workflow
The previous release build failed in craft-common-actions, not in this
repo: riscv64 packaging got --formats deb,rpm,tar (fixed in
craft-common-actions#3), Linux jobs lacked the ALSA headers
(craft-common-actions#5), and Windows signing needed the AZURE_* secrets
listed in the caller.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-12 11:11:08 -04:00
Brandon ThomasandClaude Opus 5.5 9efe75330c Release prep: 0.9.0
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-12 05:44:26 -04:00
Brandon ThomasandClaude Opus 5.5 bfea3d1253 i18n: Czech entries for the extrusion Front/Bevel/Side/Back Color submenus
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-12 05:30:10 -04:00
Brandon Thomas af671f6997 Merge pull request #987 from Losminek/cs-ui
i18n: add Czech (cs) interface language

# Conflicts:
#	crates/engine/src/prefs.rs
#	crates/ui-egui/src/i18n.rs
#	crates/ui-egui/src/i18n/ui.rs
#	docs/localization-parity.md
2026-10-12 05:22:10 -04:00
Brandon Thomas 84c6281da9 Merge pull request #984 from MarekSpodBiedry/issue-957
Show the Continuously Rasterize switch on vector footage layers (#957)

# Conflicts:
#	crates/ui-egui/src/panels/timeline.rs
2026-10-12 05:21:57 -04:00
Brandon Thomas cb59a959f4 Merge pull request #983 from MarekSpodBiedry/issue-974
Scale the timeline waveform by the layer's Audio Levels (#974)
2026-10-12 05:21:55 -04:00
Brandon ThomasandClaude Opus 5.5 61aaf83612 Fix tests and two behaviours after the community batch
- Renderer: no cover step for adjustment layers (#686); their buffer is the comp below.
  Restores a single CPU step in split adjustment stacks.
- Effect Controls rename (#953): focus the name field the frame it exists. Focusing an id
  not yet drawn left AccessKit with a focus outside its tree (a panic in the consumer).
  The tests double-click at 60 fps, within egui's double-click time.
- i18n: Russian, French and German entries for Copy Frame to Clipboard and the extrusion
  Front/Bevel/Side/Back Color submenus added by today's other PRs.
- Tests: "fr" is now a valid language; the marker dialog's comment is focused on open
  (#922), so Enter-is-OK is tested with the focus elsewhere; the toolbar gradient tests
  give the selected layer its paint kind, since the toolbar mirrors it (#732).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-12 05:08:58 -04:00
Brandon Thomas bbc3a231c7 Merge pull request #928 from storytold/release-pass-azure-secrets
Release workflow: pass the Azure signing secrets
2026-10-12 04:29:35 -04:00
Brandon ThomasandClaude Opus 5.5 d1e6aa2e85 clippy: needless borrows at the context_menu calls
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-12 04:28:59 -04:00
Brandon ThomasandClaude Opus 5.5 6baff9f5fe Integration fixes for the community batch
- Footage sources: the cancellable wrapper (#784) forwards frame_with (#752 float curves)
  and problem (#887); problem's default lives on the trait.
- Media: a called-off decode (#784) is not a footage problem (#887).
- Effect Controls rename (#953): Escape cancels (egui drops focus on Escape the same
  frame), the Rename item is translated; regression test.
- i18n (#873): drop the /out-i18n/ ignore rule and the note about an uncommitted script.
- Tests: text range selector caps (#926) re-borrow the layer; the RAM preview test (#793)
  sets the comp's own Resolution (#462).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-12 04:27:59 -04:00
Brandon Thomas ac37493026 Merge pull request #873 from pechnikov2026-star/i18n-ru-fr-de
i18n: add Russian, French and German menu catalogs
2026-10-12 04:24:29 -04:00
Brandon Thomas 5f386cc97c Merge #938 from nanox333/codex/fix-712-character-eyedropper (without the demo screenshot)
Add Character Fill and Stroke eyedroppers
2026-10-12 04:24:28 -04:00
Brandon ThomasandClaude Opus 5.5 37c4e98502 Character eyedroppers: the sampling hints go through the catalog
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-12 04:23:58 -04:00
Kristian Myram b6919500ee Character eyedropper test: a compact layout for the demo snapshot 2026-10-12 04:23:51 -04:00
Brandon Thomas f28901c6e3 Merge pull request #953 from Ni-zav/fix/944-rename-expression-control-s20261012T0915JKT
Fix: rename expression control
2026-10-12 04:23:20 -04:00
Brandon Thomas 50a89c48e9 Merge pull request #130 from storytold/fix/synthetic-modifiers
Control: ui.click / ui.drag hold their modifiers for the whole gesture

# Conflicts:
#	crates/ui-egui/src/lib.rs
2026-10-12 04:23:11 -04:00
Brandon Thomas 2ea7220e49 Merge pull request #916 from pravdomil/claude/composition-maximize-zoom-fit-86627e
Viewer: Fit up to 100% follows the panel size

# Conflicts:
#	crates/ui-egui/src/panels/viewer_tools.rs
#	crates/ui-egui/tests/ui_viewer.rs
2026-10-12 04:22:53 -04:00
Brandon Thomas 617412b555 Merge pull request #888 from vangel76/fix-882-viewer-pixel-exact
#882: pixel-exact Composition viewer at 100 % and above

# Conflicts:
#	crates/ui-egui/src/menus.rs
2026-10-12 04:22:01 -04:00
Brandon ThomasandClaude Opus 5.5 6dae51622f Dialogs: vertical-only modals (#937) on the modal_fit layout
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-12 04:21:37 -04:00
Brandon Thomas 6b69881826 Merge pull request #686 from vbasky/fix/659-text-effect-bounds
Effects: text and shape layers run their stack over the whole layer region (#659, #658)
2026-10-12 04:21:15 -04:00
Brandon Thomas b2d05582e0 Merge pull request #462 from storytold/fix/417-viewer-resolution
Viewer: each composition keeps its Resolution in the project, as in After Effects (#417)

# Conflicts:
#	crates/ui-egui/src/control.rs
#	crates/ui-egui/src/menus.rs
#	crates/ui-egui/src/panels/viewer_tools.rs
2026-10-12 04:21:14 -04:00
Brandon Thomas bb7f9b421f Merge pull request #980 from nanox333/codex/fix-978-project-settings-dialog
Fix #978: widen Project Settings dialog

# Conflicts:
#	crates/ui-egui/src/panels/forms.rs
2026-10-12 04:21:13 -04:00
Brandon Thomas fe439f6e9c Merge pull request #979 from nanox333/codex/fix-958-vector-context-menu
Fix #958: add vector conversion to layer context menus

# Conflicts:
#	crates/ui-egui/src/panels/timeline.rs
2026-10-12 04:21:11 -04:00
Brandon Thomas 8dc91891e9 Merge pull request #969 from webdevtodayjason/fix/nested-svg-viewport
SVG: percentages inside a nested <svg> resolve against its own viewport

# Conflicts:
#	contributors/people.toml
2026-10-12 04:21:10 -04:00
Brandon Thomas 6bbdd8cdcc Merge pull request #954 from SteamSmith/fix/file-urls
engine: build well-formed file:// URLs for Edit Original, Reveal and File.execute
2026-10-12 04:21:09 -04:00
Brandon Thomas 7864ea41ae Merge pull request #951 from HEOJUNFO/fix-939-noise-mask
Effects: Fractal and Turbulent Noise stay inside the layer's alpha (#939)
2026-10-12 04:21:08 -04:00
Brandon Thomas 8e6c3e0e68 Merge pull request #950 from Themolx/trim-selected-layers
Timeline: trim all selected layers together

# Conflicts:
#	crates/engine/src/tests_timeline.rs
2026-10-12 04:21:07 -04:00
Brandon Thomas bfb282d47c Merge pull request #937 from nanox333/codex/fix-828-gpu-info-dialog
Keep GPU Information dialog layout steady

# Conflicts:
#	crates/ui-egui/src/panels/dialogs.rs
#	crates/ui-egui/tests/ui_settings_info.rs
2026-10-12 04:21:06 -04:00
Brandon Thomas af374a924d Merge pull request #936 from nanox333/codex/fix-902-essential-graphics-context
Open Essential Graphics from blank Timeline context menu
2026-10-12 04:21:05 -04:00
Brandon Thomas 777b59a391 Merge pull request #935 from aniliashenko/comp-presets
Composition Settings: save and delete your own presets

# Conflicts:
#	crates/engine/src/commands/comp_more.rs
2026-10-12 04:21:04 -04:00
Brandon Thomas fbcb5b44b0 Merge pull request #934 from nanox333/codex/fix-910-fullscreen-shortcut
Fix full-screen shortcut shown on Windows
2026-10-12 04:21:03 -04:00
Brandon Thomas 0d6adb07bf Merge pull request #930 from aniliashenko/text-edit-from-timeline
#637: double-clicking a layer's bar acts like its name; text layers edit their text

# Conflicts:
#	crates/ui-egui/tests/ui_text_edit.rs
2026-10-12 04:21:02 -04:00
Brandon Thomas 9fa0036144 Merge pull request #927 from pravdomil/claude/view-go-to-time-fix-1e3c21
fix: View > Go to Time accepts the dialog's float frame [skip ci]

# Conflicts:
#	crates/engine/src/tests_timeline.rs
2026-10-12 04:21:01 -04:00
Brandon Thomas fa8a1376f9 Merge pull request #926 from MarekSpodBiedry/issue-908
Cap text animator range selector Start, End and Offset (#908)
2026-10-12 04:20:59 -04:00
Brandon Thomas 302da28fcc Merge pull request #925 from MarekSpodBiedry/issue-909
Interpret Footage: apply the Loop (times) value sent as a float (#909)
2026-10-12 04:20:58 -04:00
Brandon Thomas ce3e8f1a99 Merge pull request #924 from MarekSpodBiedry/issue-912
Resume an open mask path when the Pen clicks its last vertex (#912)
2026-10-12 04:20:57 -04:00
Brandon Thomas 6ace9f7b0e Merge pull request #923 from itrycodinganditsbad/rotating-log
Desktop: write log records to standard error and a rotating log file
2026-10-12 04:20:56 -04:00
Brandon Thomas cc45d65204 Merge pull request #922 from pravdomil/claude/dialog-focus-on-open
UI: dialogs open with their first text field focused and selected
2026-10-12 04:20:55 -04:00
Brandon Thomas e2db76e507 Merge pull request #921 from pravdomil/claude/alt-click-layer-toggles-b7a7a3
Timeline: Alt-click an A/V feature switches the other layers
2026-10-12 04:20:54 -04:00
Brandon Thomas 3e34dcb0d6 Merge pull request #919 from pravdomil/claude/unsaved-changes-cmd-backspace-b69a74
UI: keyboard shortcuts for dialog answers
2026-10-12 04:20:53 -04:00
Brandon Thomas 54d68a90a6 Merge pull request #913 from pravdomil/claude/selection-tool-glyph-fix-69364a
UI: draw concave icons as convex pieces (fixes Selection arrow, Speaker, Sparkle glyphs)
2026-10-12 04:20:52 -04:00
Brandon Thomas e0b770a9ea Merge pull request #907 from tylerjenningsw/enhance/toolbar-gradient-swatch
Shapes: the toolbar's gradient swatches open the Gradient Editor (#612)

# Conflicts:
#	docs/gaps.md
2026-10-12 04:20:51 -04:00