Commit Graph

1731 Commits

Author SHA1 Message Date
Brandon Thomas 520e32d893 Merge main into #2452 (resolve append conflicts)
# Conflicts:
#	crates/ui-egui/src/i18n/es.tsv
#	crates/ui-egui/src/i18n/fr.tsv
#	crates/ui-egui/src/i18n/id.tsv
#	crates/ui-egui/src/i18n/it.tsv
#	crates/ui-egui/src/i18n/ja.tsv
#	crates/ui-egui/src/i18n/ko.tsv
#	crates/ui-egui/src/i18n/pt-br.tsv
#	crates/ui-egui/src/i18n/zh-cn.tsv
#	crates/ui-egui/tests/graphics_ui.rs
2026-10-19 12:54:10 -04:00
Brandon Thomas 837835f81f Merge main into #2451 (resolve append conflicts)
# Conflicts:
#	crates/ui-egui/src/i18n/es.tsv
#	crates/ui-egui/src/i18n/fr.tsv
#	crates/ui-egui/src/i18n/id.tsv
#	crates/ui-egui/src/i18n/it.tsv
#	crates/ui-egui/src/i18n/ja.tsv
#	crates/ui-egui/src/i18n/ko.tsv
#	crates/ui-egui/src/i18n/pt-br.tsv
#	crates/ui-egui/src/i18n/zh-cn.tsv
2026-10-19 12:53:57 -04:00
Brandon Thomas 4922e5328c Merge main into #2459 (resolve append conflicts)
# Conflicts:
#	crates/ui-egui/tests/graphics_ui.rs
2026-10-19 12:53:46 -04:00
Brandon Thomas d90538d094 Merge main into #2472 (resolve append conflicts)
# Conflicts:
#	crates/time/src/lib.rs
2026-10-19 12:53:33 -04:00
Brandon Thomas 94eb3df3e5 Merge pull request #2482 from Felix-Helleckes/fix/1985-floating-panel-reopens-floating
#1985: a panel closed while floating opens again floating where it was
2026-10-19 12:52:18 -04:00
Brandon Thomas 48e4ab8456 Merge pull request #2462 from Felix-Helleckes/i18n/german-complete
i18n: German (de) covers the whole interface
2026-10-19 12:52:14 -04:00
Brandon Thomas 0fd5c33303 Merge pull request #2440 from Felix-Helleckes/fix/1682-cap-thumbnail-textures
#1682: thumbnail textures are capped, least recently used freed first
2026-10-19 12:52:10 -04:00
Brandon Thomas 7e3060d185 Merge pull request #2450 from Felix-Helleckes/fix/2329-indent-effects
#2329: the Effects panel indents what a folder holds under it
2026-10-19 12:52:06 -04:00
Brandon Thomas d61f23c7c9 Merge pull request #2457 from Felix-Helleckes/feat/2325-ui-animations-toggle
#2325: Settings > Appearance can turn the interface animations off
2026-10-19 12:52:02 -04:00
Brandon Thomas bb5fa3a740 Merge pull request #2478 from Felix-Helleckes/fix/1362-multicam-from-timeline
#1362: Create Multi-Camera Source Sequence and Merge Clips work on Timeline selections
2026-10-19 12:51:58 -04:00
Brandon Thomas 666c8d1bdc Merge pull request #2480 from MichaelMuClaude/fix/doc-inspect-sequence-race-1477
fix(mcp): pin doc_inspect's sequence to the reported active id (#1477)
2026-10-19 12:51:53 -04:00
Brandon Thomas fec702eca4 Merge pull request #2481 from Felix-Helleckes/fix/2253-reversible-ui-zoom
#2253: Ctrl+Plus no longer scales the interface one way only; View > Reset Interface Zoom
2026-10-19 12:51:48 -04:00
Brandon Thomas 045e694204 Merge pull request #2499 from jackcanon/jackcanon/font-size-controls
Properties: selected-character drags undo as one gesture
2026-10-19 12:51:44 -04:00
Brandon Thomas f4b7486b3e Merge pull request #2436 from Felix-Helleckes/fix/2185-stream-preview-files
#2185: preview files are read in place, not loaded whole
2026-10-19 12:51:40 -04:00
Brandon Thomas 70b6539aa9 Merge pull request #2477 from Felix-Helleckes/fix/2430-click-moves-caret
#2430: a click in the text being edited on the monitor moves the caret
2026-10-19 12:51:35 -04:00
Brandon Thomas 6811d4141a Merge pull request #2458 from Felix-Helleckes/feat/2328-effect-controls-divider
#2328: Effect Controls draws a line between the fixed and the added effects
2026-10-19 12:51:30 -04:00
Brandon Thomas 21e8636bd4 Merge pull request #2467 from Silvertree2010/fix/h546-cube-with-both-a-1d-and-a-3d-tab
Preserve per-channel shaper domain in .cube round trip
2026-10-19 12:51:26 -04:00
irgendwasmitfelix 9ade822e64 #1985: a refused refloat keeps the panel's floating place
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-19 18:18:58 +02:00
jackcanon 204505bcf5 FONT-UNDO-001: merge selected-character property drags
Use the existing begin/merge history contract for character styles, isolating clip, layer and selected ranges. Cover actual pointer gestures, undo/redo, fresh gestures and invalid targets.
2026-10-19 08:23:19 -07:00
irgendwasmitfelix 18f0cfe404 #1985: a Timeline closed while floating floats again too
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-19 17:11:14 +02:00
irgendwasmitfelix af3263cd9b #2253: Reset Interface Zoom replies with the zoom it set
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-19 17:04:46 +02:00
irgendwasmitfelix 37ec175ced #1362: test Merge Clips from a Timeline selection it can merge, and its explanation for one it can't
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-19 16:57:33 +02:00
irgendwasmitfelix 5510a52a06 #1985: a panel closed while floating opens again floating where it was
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-19 14:51:33 +02:00
Michael ce8c699fe8 fix(mcp): read activeSequence as u64, not i64 (review)
ItemId wraps a u64 (item_p parses the `item` param with u64_p), so
reading activeSequence with as_i64 would silently return None for
any id above i64::MAX and make document()'s sequence go null instead
of inspecting the valid id project.inspect reported. Switches to
as_u64 and adds a regression test for that boundary (proven to fail
against as_i64 first).

Addresses a CodeRabbit review comment on #2480.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-10-19 20:49:45 +08:00
irgendwasmitfelix 6a2516f4fa #2253: Ctrl+Plus goes where Ctrl+= goes, and View > Reset Interface Zoom undoes a session zoom
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-19 14:44:21 +02:00
Michael 27b327ab65 fix(mcp): pin doc_inspect's sequence to the reported active id (#1477)
document() composed project.inspect and sequence.inspect as two
separate round trips to the app (two lock scopes in headless mode,
two TCP round trips in bridge mode). sequence.inspect with no `item`
answers for whichever sequence is active *now*, not the one
project.inspect just reported, so if the active sequence changes in
that window (another client, or the app's own UI, switching tabs)
the pair comes back inconsistent: project.activeSequence names one
sequence while sequence describes another.

Reproduced against a running bridge-mode app: a real MCP client
hammering doc_inspect while an independent connection flipped
sequence.open between two sequences mismatched on ~300/300 calls, so
this is a wide window, not a rare edge case.

Fix: read project.inspect's activeSequence id first, then pass it
explicitly as sequence.inspect's `item`, so the second call always
describes the sequence the first one named, regardless of what
becomes active afterward.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-10-19 20:39:03 +08:00
NetterSilver 405619b417 Fix "-0.000" in Seconds time display for tiny negative times
Found while testing crates/time/src/lib.rs:423 (format_time, TimeDisplay::Seconds)

Co-Authored-By: Claude Haiku 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-10-19 12:18:13 +00:00
irgendwasmitfelix 838a919663 i18n: German needs only the core menus, like French and Korean; later strings may stay English
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-19 14:16:49 +02:00
irgendwasmitfelix 52e3c5b9c4 #1362: Create Multi-Camera Source Sequence and Merge Clips work on clips selected in the Timeline
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-19 13:59:29 +02:00
irgendwasmitfelix 63a5a6bb38 #2430: a click in the text being edited on the monitor moves the caret
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-19 13:48:47 +02:00
NetterSilver 9a93d175a4 Fix AudioSamples time display for negative times
Found while testing crates/time/src/lib.rs:418 (format_time, TimeDisplay::AudioSamples)

Co-Authored-By: Claude Haiku 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-10-19 11:27:22 +00:00
irgendwasmitfelix 9e778e3693 #2358: the Tracking test checks where the keyframes land
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-19 13:24:12 +02:00
NetterSilver e9f4a9ff6b Preserve per-channel shaper domain in .cube round trip
Found while testing crates/color/src/lut.rs:290 (Lut::to_cube, the `both` branch)

Co-Authored-By: Claude Haiku 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-10-19 10:42:03 +00:00
irgendwasmitfelix 1d7e2238b0 i18n: German has every Spanish entry; scope the coverage claims
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-19 12:32:36 +02:00
irgendwasmitfelix aa918e739f #2358: "mask": null counts as no mask when creating a missing parameter
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-19 12:27:28 +02:00
irgendwasmitfelix 3d16f9323f #1487: a Graphics tab edit writes keyframed text where it is shown
With the playhead outside a clip the tab shows the clip's text at its
start, but the edit went to graphics.set without a time, which writes at
the playhead clamped into the clip (its last frame). For keyframed text
the shown value stayed and another keyframe changed. Each row now keeps
the time it read its text at and the edit is written there; a new test
covers keyframed text with the playhead past the clip.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-19 11:15:40 +02:00
irgendwasmitfelix c59917baf9 #2358: Toggle Animation creates a parameter an older instance lacks
The new stopwatches show for every animatable parameter of the layer's
definition, but effects.toggleAnimation only found parameters stored in
the instance, so a layer saved before a parameter existed answered "no
such param". The parameter is now created from its default first (an
existing one and its keyframes are left alone). Engine test included.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-19 11:06:53 +02:00
irgendwasmitfelix 142428048a #2329: the Effects panel indents what a folder holds under it
An effect in a sub-folder was drawn left of that sub-folder's label (Gaussian Blur at 47 points,
Blur & Sharpen at 55), so folders and effects read as one level. Rows now follow one rule,
`tree_x(depth)`: an effect sits one level deeper than its folder (sub-folder or, for loose
effects, the top folder), with its icon and label where a folder at that depth has them; user and
built-in presets and Lumetri presets the same.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01L8DvNHjchh5Gf2q24UsWQn
2026-10-19 09:48:33 +02:00
irgendwasmitfelix ca7c56238d #2328: Effect Controls draws a line between the fixed and the added effects
The first effect added from the library after a clip's fixed effects (Motion, Opacity, Time
Remapping; Volume, Channel Volume, Panner on audio) gets an accent-coloured line on its top edge.
It is drawn on the row's edge, so no row moves; with only fixed effects there is none.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01L8DvNHjchh5Gf2q24UsWQn
2026-10-19 09:41:57 +02:00
Claude f4b1bee71f i18n: German (de) covers the whole interface
#630 shipped German for the menus. This adds the other 3,213 strings, so
de.tsv has every entry of the Spanish catalog (3,590): panels, dialogs,
effects and their parameters, transitions, presets, Settings, shortcut
commands, export presets, tooltips and status messages. Same style as the
menus (du, infinitives, placeholders, ellipses and escapes kept); the
glossary in the header is extended. The 377 menu entries are unchanged.

german_entries_cover_the_original_menu_catalog required every entry to be
a menu label. It becomes german_covers_the_menus_and_has_no_dead_entries,
like the French and Italian tests: every entry needs a Spanish counterpart,
the core menus and the native macOS app menu are required, later strings
may stay English. german_renders_with_bundled_fonts checks the umlauts,
ß and German quotation marks against the bundled fonts.

Docs: ROADMAP.md, docs/localization-parity.md, docs/gaps.md, ui-egui README.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01KJhvSJ5odpWzFw9HhPzAix
2026-10-19 09:41:57 +02:00
irgendwasmitfelix a0a75e728e #2358: stopwatches in the Essential Graphics panel animate layer properties
Letter spacing (Tracking) does animate in the engine — keyframes on the text
layer interpolate and the rendered width follows them — but the Essential
Graphics panel had no way to start that: its number and point rows had no
stopwatch, so a change there always set the value for the whole clip.

Every animatable number/point row in the panel (Tracking, Leading, Font
Size, Baseline Shift, Position, Anchor, Scale, Rotation, Opacity…) now has
the same stopwatch as Effect Controls. It calls `effects.toggleAnimation` on
the layer; once a property animates, a change in the panel adds or updates a
keyframe at the playhead (graphics.set was already keyframe-aware). A
Type-tool character selection edits character styles, which have no
keyframes, so those rows show no stopwatch while it is active.

Automation id: `graphics.prop.<id>.stopwatch`.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01L8DvNHjchh5Gf2q24UsWQn
2026-10-19 09:41:57 +02:00
irgendwasmitfelix 7ac0269d2c Timeline: colour labels for tracks (#1186)
A track can carry a colour label, as many NLEs offer. The strip at the
left edge of a track header opens a menu with None and the 16 labels
(with the user's label names and colours, as in Edit > Label). The label
tints the header and the lane.

- `Track.label: Option<Label>`, serde default and skipped when None, so
  older projects load and plain tracks save as before
- `timeline.setTrack {label}` (a label name; "" / "None" / null clears),
  an undoable Track Settings step; unknown names are refused
- `sequence.inspect` reports each track's `label`
- automation ids `timeline.track.<V1|A1…>.color` and `.color.<Label>`

Renaming, adding and deleting tracks from the header are covered by the
open PRs for #654 and #1630, so this only adds the colour.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01L8DvNHjchh5Gf2q24UsWQn
2026-10-19 09:41:56 +02:00
irgendwasmitfelix 35076281b3 #2325: Settings > Appearance can turn the interface animations off
"Animate zoom, scrolling and menus" (appearance.animations, on by default). Off, the Timeline
zooms and scrolls in one step instead of easing, and egui's fades and slides (menus, collapsing
sections, tooltips) are instant. The style is checked every frame, because a theme or font change
installs it again. Translated in the catalogs that cover the Settings rows.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01L8DvNHjchh5Gf2q24UsWQn
2026-10-19 09:41:56 +02:00
irgendwasmitfelix dcbb001948 #1487: the Text panel's Graphics tab lists and edits the sequence's graphic text
The Graphics tab of the Text panel was a placeholder ("Graphics text search
arrives with M10.1–M10.2"), so text in graphics never showed up there.

It now lists the text of every text layer of every graphic clip in the
active sequence, as Premiere's does: in timeline order (then lower tracks
first, then paint order), each entry with its clip's start timecode and
track (and the layer's name when it has one). A search filters by text or
name. The timecode moves the playhead to the clip and selects the clip and
the layer (so Essential Graphics and the Program monitor's handles follow);
the text edits in place and is committed with `graphics.set` when the field
loses focus — one undo step, per-character styles kept as for any text edit.
Text that is keyframed shows its value at the playhead when the playhead is
in the clip.

Automation ids: `text.graphics.search`, `text.graphics.<clip>.<layer>.row`,
`.goto`, `.text`. The three new messages are translated in the catalogs the
coverage test requires.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01L8DvNHjchh5Gf2q24UsWQn
2026-10-19 09:41:56 +02:00
irgendwasmitfelix eff5f024e5 #2185: the not-read-whole assertion applies where previews stream
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-19 09:22:03 +02:00
irgendwasmitfelix 1968616c3f #1682: thumbnail textures are capped, least recently used freed first
Every frame shown as a timeline tile or a Project panel hover scrub got a
texture of its own (thumb-<item>-<frame>-<width>) that was kept until the
project was replaced, so scrolling, zooming and scrubbing grew GPU (on
integrated GPUs, system) memory without bound. Beyond 512 thumbnail
textures the least recently used are freed, never one drawn in the
current pass.

Refs #1682

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-19 07:18:36 +02:00
irgendwasmitfelix 49b300f2f2 #2185: preview files are read in place, not loaded whole
Rendered previews are full-resolution ProRes (gigabytes a minute), and
PreviewStore::open read each file whole into memory, keeping up to six
open; the render also opened every finished segment right away. Rendering
previews and playing them back filled memory until the OS killed the
app. Native builds now open preview files through a file reader (the
container's index now, frames on demand), refusing any whole-file read,
and a finished segment is opened when it is first played.

Fixes #2185

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-18 23:21:56 +02:00
Brandon Thomas 48088e3a8e Merge pull request #1927 from marcoarnulfo/fix/clip-mixer-strips-fit
#1922: Audio Clip Mixer strips narrow to fit the panel, and scroll when they cannot
2026-10-18 03:21:32 -04:00
Brandon Thomas 4dc802170d Merge pull request #1655 from notdezzi/fix/1542-caption-margin
captions: pin the setStyle margin contract with a regression test; clearer track error (#1542)
2026-10-18 03:21:28 -04:00
Brandon Thomas 9bc4b6b266 Merge pull request #2125 from 00xJS/fix/1544-export-job-poll
#1544: an export started without wait says where to follow it (jobs.list, jobs.cancel)
2026-10-18 03:21:23 -04:00