Commit Graph
898 Commits
Author SHA1 Message Date
Brandon Thomas c72e47b7dc Merge pull request #761 from vangel76/gap-variable-font-filter
#741: font menu filters to variable fonts
2026-10-12 03:03:28 -04:00
Brandon Thomas b14096c335 Merge pull request #744 from vangel76/fix-732-toolbar-fill-type
#732: toolbar Fill/Stroke Options change the selected shape layers' kind
2026-10-12 03:03:20 -04:00
Brandon Thomas cbaaf654d6 Merge pull request #743 from MarekSpodBiedry/issue-723
Graph Editor: Shift constrains Bezier handle drags to one axis (#723)
2026-10-12 03:03:19 -04:00
Brandon Thomas 25dcdcd2d8 Merge pull request #740 from vangel76/fix-303-mesh-warp-grid
#303: Mesh Warp's grid can be dragged in the Composition viewer
2026-10-12 03:03:16 -04:00
Brandon Thomas 8176c86043 Merge pull request #739 from vangel76
# Conflicts:
#	docs/gaps.md
2026-10-12 03:03:10 -04:00
Brandon Thomas e98788690c Merge pull request #737 from vangel76/gap-copy-frame-clipboard
#730: Composition ▸ Copy Frame to Clipboard
2026-10-12 03:02:59 -04:00
Brandon Thomas e5ff011296 Merge pull request #735 from vangel76/gap-stl-import
#729: import STL 3D models (binary and ASCII)
2026-10-12 03:02:58 -04:00
Brandon Thomas 4aa2c6ba8b Merge pull request #734 from vangel76/fix-678-psd-drop-dialog
#678: dropped Photoshop files show the Import Photoshop File dialog
2026-10-12 03:02:56 -04:00
Brandon Thomas a4a117c1f7 Merge pull request #731 from vangel76/fix-710-ruler-frames
#710: Timeline ruler labels frames when Time Display is Frames
2026-10-12 03:02:54 -04:00
Brandon Thomas 196dd80104 Merge pull request #709 from Ni-zav/fix/684-empty-viewer-project-drop-s20261011T035800Z-cf39
fix(viewer): create a composition when dropping footage onto an empty viewer
2026-10-12 03:02:47 -04:00
Brandon Thomas d7fe6d2e56 Merge pull request #705 from tylerjenningsw/enhance/custom-ui-scale
Settings: allow custom UI scale percentages (#682)
2026-10-12 03:02:46 -04:00
Brandon Thomas 162a2e2e01 Merge pull request #699 from didpublishing/fix/596-gpu-information
#596: GPU Information names the adapter, or why the GPU compositor is off
2026-10-12 03:02:43 -04:00
MarekSpodBiedry 25be439a0b Scale the timeline waveform by the layer's Audio Levels (#974) 2026-10-12 08:39:44 +02:00
MarekSpodBiedry 69d2b53892 Show the Continuously Rasterize switch on vector footage layers (#957) 2026-10-12 08:34:01 +02:00
Kristian Myram e0a23e8763 Fix #958: add vector conversion to layer context menus 2026-10-12 08:17:50 +02:00
Kristian Myram c644c5f7e9 Fix #978: widen Project Settings dialog 2026-10-12 08:02:34 +02:00
Nigel Ihza Firdausy cf61eba87a test(ui): cover renaming an expression control header 2026-10-12 09:19:28 +07:00
Nigel Ihza Firdausy 94f74075f9 fix(ui): let users rename effect instances in Effect Controls (#944) 2026-10-12 09:18:57 +07:00
ThemolxandClaude Opus 5.5 91b078777e Timeline: trim all selected layers together
Dragging the in or out edge of a selected layer's bar now trims every
selected layer by the same delta from its own in/out point, as in After
Effects. layer.timing gains relative inDelta/outDelta params (seconds,
frame-snapped), clamped to the comp start/end and to one frame of layer;
the drag stays one undo step via the merge key.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-12 03:16:06 +02:00
Kristian Myram b693a6286b Add Character fill and stroke eyedroppers 2026-10-12 01:49:59 +02:00
Kristian Myram 650ea35c18 Keep GPU information dialog layout steady 2026-10-12 01:30:55 +02:00
Kristian Myram 01c03fa8da Add Essential Graphics to blank Timeline context menu 2026-10-12 01:25:56 +02:00
Anton IliashenkoandClaude Opus 5.5 14b6b9c242 Composition Settings: save and delete your own presets
As in After Effects, the Preset menu in Composition Settings / New Composition gets a Save
button (asks for the name in a Choose Name window; an existing name of yours is replaced) and a
Delete button for the selected preset of yours. Your presets keep frame size, pixel aspect and
frame rate, are listed above the built-in ones and live in the settings (`compPresets`), so they
survive restarts and Reset All. Commands: `comp.savePreset`, `comp.deletePreset`, `comp.presets`.
A hand-edited settings file loses only its invalid presets.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-12 01:16:52 +02:00
Kristian Myram 1888f0aaf3 Fix full-screen shortcut shown on Windows 2026-10-12 01:15:23 +02:00
Anton IliashenkoandClaude Opus 5.5 e108f460c4 #637: double-clicking a layer's bar acts like its name; text layers edit their text
Double-clicking a text layer in the Timeline (its name or its bar) edits its text in the
Composition viewer with the whole text selected, as in After Effects; it used to open the rename
field (Enter still renames). The layer bar had no double-click at all: it now opens a precomp,
opens footage and solids in the Layer panel and edits text, like the name.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-12 00:35:23 +02:00
MarekSpodBiedry 050bc4723e Resume an open mask path when the Pen clicks its last vertex (#912) 2026-10-11 23:39:07 +02:00
pravdomilandClaude Opus 5.5 ffc481a4e4 UI: numeric forms open with their first number focused and selected
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-11 23:36:15 +02:00
pravdomilandClaude Opus 5.5 50eddc1207 UI: keyboard shortcuts for dialog answers
Unsaved Changes: Enter is Save, Cmd+Backspace is Don't Save.
Revert Project: Cmd+R is Revert (the button is now red).
Delete Items: Cmd+D is Delete.
Crash recovery: Enter is Open Auto-Save.
Marker: Enter is OK, Cmd+Backspace is Delete (from a focused text field too).

The macOS menu bar hands Cmd+D and Cmd+R back to the open prompt.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-11 23:35:37 +02:00
pravdomilandClaude Opus 5.5 4c5d775761 Timeline: Alt-click an A/V feature switches the other layers
Alt-click on a layer's Video, Audio, Solo or Lock switch sets that layer
apart: the other layers go off (or locked), and the next Alt-click brings
them back. Backed by layer.setSwitch {others: true}, one undo step.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-11 23:14:39 +02:00
pravdomilandClaude Opus 5.5 8e1d742a9d UI: dialogs open with their first text field focused and selected
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-11 23:13:53 +02:00
pravdomilandClaude Opus 5.5 a78961a346 Viewer: Fit up to 100% follows the panel size
Magnification ▸ Fit up to 100% stored the magnification of the moment it
was picked, so the comp kept that size when the panel was maximized or
resized. It is now a fit mode like Fit, capped at 100%.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-11 22:21:52 +02:00
pravdomilandClaude Opus 5.5 373f27d38d UI: draw concave icons as convex pieces (Selection arrow glyph)
The Selection tool's arrow is a concave outline, but icon fills go through
egui's convex-only polygon fill, which fanned slivers across its notches.
The arrow, and the likewise concave Speaker and Sparkle glyphs, are now drawn
as overlapping convex pieces.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-11 22:17:53 +02:00
tylerjenningsw f6d42e2d67 Text: formatting tabs keep the edit; keys after a click away skip it (#831)
Two follow-ups to ending text editing on a click in another panel.

A press anywhere in a panel group focused the group's shown panel, even
a press on another of its tabs. Opening Properties or Character behind
Effects & Presets (as in Undocked Panels) therefore ended the edit on
the press, before the tab's click focused the panel chosen, and later
formatting went to the whole layer instead of the selected characters
(an empty Type-tool layer was even removed). A press on another tab now
waits for that tab's click.

The click away is resolved after the frame's panels, so keys that came
after it in the same frame's input were still typed into the text. The
text keyboard handler now takes the frame's keys in order up to a press
outside the viewer: keys before the click are typed, keys after it are
neither typed nor run as shortcuts, and from the next frame they are
the app's.

Tests: opening_a_formatting_tab_keeps_the_text_selection (a real click
on the Properties tab keeps the edit and its selection; Faux Bold then
styles only "Hello") and keys_after_a_click_away_in_the_same_frame_skip_
the_text ("A", a click on a Timeline row, then "x", Space and Delete in
one frame: only "A" is typed, nothing is played or deleted; Space in the
next frame plays). Both fail on the previous commit.
2026-10-11 14:48:20 -04:00
tylerjenningsw 3d7f928465 Shapes: the toolbar's gradient swatches open the Gradient Editor (#612)
With Fill or Stroke set to Linear or Radial Gradient, clicking its
toolbar swatch opened Fill / Stroke Options, so the gradient's colours
couldn't be edited from the toolbar as in After Effects (reported on
Discord, EffectCraft 0.8.0 on Windows 11). The swatch now opens the
Gradient Editor (prop.editGradient) on the selected shape layer's first
Gradient Fill or Gradient Stroke Colors, in contents order through nested
groups; OK sets that property. With no shape layer selected, or none
with that gradient, the swatch opens the options as before (the kind new
shapes get: the toolbar keeps no gradient stops of its own yet). The
words still open the options, a Solid Color swatch the colour picker,
and Alt-click still steps through the kinds.

Tests (ui_toolbar_gradient): a Linear Fill swatch opens the editor on the
layer's Gradient Fill Colors and OK saves an added stop; a Radial Stroke
swatch edits the Gradient Stroke, not the fill; without a selected
gradient the options open; the words, Solid swatches and Alt-click are
unchanged. The two gradient-swatch tests fail without this change.
2026-10-11 14:46:45 -04:00
vangel76andClaude Sonnet 5.5 fa7ffb6d09 #670: each pane of a 2- or 4-view layout chooses its own view
Problem: the extra panes of View > Switch View Layout were fixed to Top, Front and Right, and the 3D View menu only changed the main view.

Fix: every extra pane has a view selector (Active Camera, Default, Front, Left, Top, Back, Right, Bottom, Custom View 1-3). The choice is kept per comp in Views3D::panes (serde default, so older editor states load with Top/Front/Right) and set by the new command view.setPaneView {pane 0-3, view}. The Active Camera pane renders through the comp camera.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-10-11 19:46:47 +02:00
tylerjenningsw 1b7ab07822 Text: stop capturing keyboard input after clicking away (#831)
After typing into a text layer, clicking another panel (a solid in the
Timeline, say) left the edit open, and the viewer took the keyboard back
as soon as nothing had the focus: typed characters went into the text
and Space added a space instead of playing.

A click in any panel other than the viewers and the panels that format
the selected characters (Character, Paragraph, Properties) now ends the
edit with text.endEdit, so the text is kept and an empty layer the Type
tool started is removed, and the viewer's text focus is surrendered. The
editor takes the keyboard back only after a click in the viewer or one
of those panels, no longer merely because nothing has the focus. A click
elsewhere in the viewer still commits, and with the Type tool still
starts new text.

Test: clicking_another_panel_stops_typing_into_text, with the Type tool
and with an edit started by command: Character > Faux Bold keeps the edit,
its selection and typing; clicking the solid's Timeline row ends it,
selects the solid, typed characters leave the text unchanged and Space
plays; an empty Type-tool layer is removed. Fails on main.
2026-10-11 13:01:36 -04:00
vangel76andClaude Opus 5.5 8ac8612ace #882: pixel-exact Composition viewer at 100 % and above
Problem: the viewer blurred hard edges even at Full resolution and 100 %
(reported on Discord). The frame rect was centred without snapping to
physical pixels, so bilinear sampling blended neighbouring pixels at 1:1
(worst at 125 %/150 % display scaling); More Accurate also magnified
bilinearly, so 200 %+ and lower resolutions were smoothed; and Zoom In /
Zoom Out stepped in points, so at 125 % scaling they never reached 100 %.

Fix: snap the frame origin (and the ViewerMap overlays use) to the
physical pixel grid; magnify with nearest in both Zoom Quality modes
(CPU texture options and the GPU frame sampler), keeping the averaged
minification below 100 % (#417); the snapshot texture follows the same
options; Zoom In / Out step through screen-pixel magnifications.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-11 18:50:53 +02:00
vangel76andClaude Sonnet 5.5 74b95b0a9d #886: say why footage the decoders can't read shows no picture
Problem: a movie whose profile the software decoders lack (H.264 High 4:2:2 / 10-bit)
probes fine, then every frame read fails; MediaPool logged the error per frame and returned
None, so the layer rendered black with no sign why in the viewer, Project panel or for agents.

Fix: MediaPool records the reason once per file (codec from the probe plus the decoder's text
without error wrappers; I/O errors stay with missing-footage handling), logs it once, and
exposes it through the new FootageSource::problem. The Composition viewer shows it on the
affected layer, the Project panel marks the item with a warning whose tooltip is the reason,
and project.summary / footage.info carry a "problem" field. Cleared when the file is
forgotten; only set when decoding really failed, so a hardware decoder that handles the file
shows nothing.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-10-11 18:49:54 +02:00
vangel76andClaude Opus 5.5 1b7f08198f #878: context menus act on the whole selection
Problem: with several layers selected, right-clicking one of them in the
Timeline (name row or layer bar) and choosing Pre-compose, Delete,
Duplicate, ... re-selected and acted on only the right-clicked layer.
Right-clicking an unselected layer did not select it. In the Project
panel, Move to Project Root moved only the right-clicked item.

Fix: as in After Effects, a right-click on a selected layer keeps the
selection and the menu's commands target every selected layer (in comp
order); a right-click on an unselected layer selects only it. Move to
Project Root uses the same selection targets as Delete and Label.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-11 18:42:42 +02:00
vangel76andClaude Opus 5.5 73404a2ad2 #881: Tab in the Project panel's rename field commits and keeps the keyboard
Problem: Tab in a Project panel rename (or comment) field committed the
edit and egui moved keyboard focus to the next widget, the row's label
swatch. While it held focus, Enter no longer renamed (it "clicked" the
swatch), the arrow keys moved between widgets and app shortcuts paused.

Fix: the field keeps Tab through its event filter (arrows as before);
Tab surrenders focus and commits like Enter, so nothing else takes the
keyboard and the next Enter renames again.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-11 18:41:17 +02:00
vangel76andClaude Opus 5.5 f19f3a8a39 #875: layout views draw camera and light wireframes
Problem: in a 2- or 4-view layout the Top / Front / Right views drew no
camera or light wireframes, so moving a camera showed nothing there
(reported on Discord).

Fix: draw_rigs takes the view camera explicitly and a pane name for its
automation ids; aux_views draws the wireframes of each extra view through
that view's camera, clipped to the pane, with ids
viewer.view.<view>.camera.<id> / .light.<id>.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-11 18:24:57 +02:00
sanches 826d82007d i18n: add Russian, French and German menu catalogs
Three new 618-entry menu catalogs (ru, fr, de) with the same
(command, English label) keys as the existing six, registered in
CATALOG_CODES and the Settings language registry. Following the
Spanish/Portuguese precedent these are menu-only catalogs: panels keep
English for now.
2026-10-11 19:06:04 +03:00
tylerjenningsw f4c5015b35 Settings: keep action buttons visible at high UI scales
At 200 % in a 1600x1000 window, Previous / Next / Cancel / OK were cut
off. Settings sized its pages from the window height less a fixed 170,
and the shared modal put everything, buttons included, in one more
scroll area, so a footer that didn't fit scrolled out of the dialog.

The modal helper gets a modal_fit variant without that scroll area: it
hands its body the height left under the title. Settings lays out its
buttons first, from the bottom up, and gives the page list and the page
what they leave; both scroll on their own and the buttons stay put. The
pages are a clipped child, so a wide page can't widen the dialog under
the buttons. Other dialogs keep modal as it was.

Tests: settings_buttons_stay_in_view_at_200_percent opens Settings at
200 % in 1600x1000 and checks that each button is inside the window and
painted unclipped (fails before this change: the scroll area clipped
them at the bottom). It scrolls the page to UI Scale without moving
them, then types 150 and clicks Cancel (200 % again, nothing saved) and
OK (150 % saved). The UI Scale test no longer needs a larger window and
clicks Cancel at 200 %.
2026-10-11 11:48:07 -04:00
vangel76andClaude Opus 5.5 4a3889270b #864: Track Matte menu: a mode without a matte layer takes the layer above
Picking Alpha / Alpha Inverted / Luma / Luma Inverted in a layer's Timeline
Track Matte menu only dispatched a command when the layer already had a
matte layer, so with "No Track Matte" the click closed the menu and did
nothing. The mode items now run layer.trackMatte (Layer > Track Matte),
which keeps an existing matte and otherwise takes the layer above, or
reports that the top layer has none. The menu ticks the current mode and
the cell's tooltip names the matte layer and the mode (the 104 px cell
has no room for both).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-11 17:46:05 +02:00
vangel76andClaude Opus 5.5 1226576a92 #866: Layer > New > Text starts typing into Source Text
Problem: Layer > New > Text (menu, Ctrl+Alt+Shift+T, Timeline context menus)
created a layer with the placeholder "Text" and no edit session, so typed keys
ran shortcuts; users then renamed the layer (Enter) and the name, not the
Source Text, got their text.

Fix: as in After Effects, the UI dispatch runs layer.newText with an empty
text and an edit session (insertion point in the comp centre); the name
follows the typed text. engine.execute keeps the headless default.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-11 17:46:01 +02:00
pravdomilandClaude Opus 5.5 01400f0a89 UI: draw the ▸ menu-path separator instead of a missing-glyph box
Inter and egui's built-in fallbacks have no glyph for ▸ (U+25B8), so the
command palette's "EffectCraft ▸ Settings... ▸ Appearance..." and every
"File ▸ Import" hint drew a box. JetBrains Mono, already bundled, has it:
register it as a symbol fallback for the non-monospace families.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-11 17:37:57 +02:00
pravdomilandClaude Opus 5.5 41c92d3856 Window menu: show check marks next to visible panels
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-11 17:25:58 +02:00
tylerjenningsw c39f29882c Shapes: drag gradient start and end points in the Composition viewer (#612)
With a shape layer's Gradient Fill or Gradient Stroke (or a property in
it) selected, its Start Point and End Point show in the viewer as
draggable crosshairs with a guide between them, as in After Effects. The
points are in the space of the shape group holding the gradient, so they
are mapped through the enclosing groups' transforms and the layer's
(shapes::item_matrix), and a drag converts back the same way. A drag is
one prop.set merge: one undo step, and on an animated point a keyframe at
the current time. The hook runs after the viewer's own gestures, like the
effect point controls, so a handle takes the press and the layer doesn't
move. They follow View ▸ Show Layer Controls.

Tests (ui_gradient_handles, only pre-existing APIs, all three fail without
this): dragging the End Point moves it by the drag in one undo step without
moving the layer; inside a moved, 200%-scaled group the handle sits where
the group draws the point and a drag converts to group space; no handles
unless the gradient or a property in it is selected, or with layer
controls off. ui_effect_controls still passes.
2026-10-11 11:12:05 -04:00
pravdomilandClaude Opus 5.5 c81a9f1061 Timeline: U and UU reveal Time Remap
anim.reveal only walked the layer's top-level groups, so Time Remap, which
sits at the root of the layer's property tree, was never revealed. Enabled
time remapping counts as a modification in itself.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-11 17:02:10 +02:00
pravdomilandClaude Opus 5.5 afaa4bdeeb UI: leave no gap between the rows of a menu
The app's item spacing left 4 px between two menu entries where neither
highlighted and a click did nothing. Menus (context menus, the menu bar,
menu buttons and their submenus) now use a menu style with no row gap and
rows taller by that gap, so they keep their size.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-11 17:02:09 +02:00