Commit Graph
212 Commits
Author SHA1 Message Date
Brandon Thomas 1879a30db8 Merge pull request #615 from ReReddo/feat/clipboard-paste
timeline, project panel: paste images and copied files from the system clipboard
2026-10-10 14:53:02 -04:00
Brandon Thomas 539759ef18 Merge pull request #595 from MarekSpodBiedry/issue-476
Reject unknown mcp options instead of silently ignoring them (#476)
2026-10-10 14:52:19 -04:00
vangel76andClaude Opus 5.5 bc5965e42b #710: --version works after global options
Problem: `filmcraft-cli --demo --version` (or `--compact -V`, `--data-dir d
--version`) failed with "missing subcommand" and exit 2. The version check only
looked at the very first argument, so a preceding global option left
`--version` to the option parser and no subcommand behind.

Fix: parse the arguments first and treat `--version` anywhere, or `-V` in the
subcommand position, as a version query (`Args::wants_version`), still before
the hardware decoders are registered. `--help` keeps priority.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-10 20:22:46 +02:00
vangel76andClaude Opus 5.5 62928e9db2 #709: --gpu-rendering takes a space-separated value
Problem: `--gpu-rendering` was missing from the CLI's list of
value-taking options, so `export --gpu-rendering off out.wav` stored the
option without a value and turned `off` into the output path (or dropped
the setting silently when the option came after the filename).

Fix: list `--gpu-rendering` among the valued options, as documented in
the CLI help.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-10 20:11:00 +02:00
vangel76andClaude Opus 5.5 b24225afd3 #642: open Help/About links in the system browser on the desktop
Problem: every link (Help menu, About dialog, header Discord button, Import
screen, Settings and Keyboard help) went through egui's `ctx.open_url`. The
workspace builds eframe without its `links` feature, so egui-winit only logs
"Cannot open url - feature links not enabled" and nothing opens on Linux,
Windows or macOS.

Fix: add a `HostHooks::open_url` hook, as PhotoCraft does. `links::open` now
takes the app and calls the hook, falling back to `ctx.open_url` when it is
unset or fails (the web build keeps opening a new tab). The desktop app sets
it to `open::that_detached` (open 5, MIT), which does not block the UI
thread. Test: every Help link reaches the hook, and a failing hook falls
back to `ctx.open_url`.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-10 16:58:26 +02:00
MrCloudy2andClaude Opus 5.5 7d6c53d03d Merge origin/main into #260; Chinese and Japanese for "A file dialog is already open"
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-10 15:23:08 +02:00
Lukas KellerandClaude Opus 5.5 09165a383d i18n: German (de) joins Edit > Language
Language::De is persisted as `de` and translated through a new de.tsv
catalog that covers every menu label and the native macOS Settings menu,
written from the plain meaning of the English labels with informal "du"
and infinitive commands. The new app.language.german command checks,
switches and restores the language like the others, the native macOS
menu maps it back, Settings > General offers Deutsch, and System Language
picks German for any de-* locale (de-DE, de-AT, de-CH ...).

A new test, built like the Ukrainian one, fails when German misses a core
menu label (the Brazilian Portuguese entries, the top-level menus, the
macOS Settings menu) or keeps an entry that is no longer a menu label;
menu labels added later use English until they are translated. The
System Language test no longer uses `de` as an unsupported example.

Closes #490

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-10 14:35:14 +02:00
ReReddo 06b835d5a8 timeline, project panel: paste images and copied files from the system clipboard (#611)
Ctrl+V with a screenshot or an image copied in another app, or with files
copied in Explorer / Finder, now pastes them. In the Timeline they are
imported and placed at the playhead, end to end, without overwriting
anything: each clip goes on the first free track from the targeted one
outward (up for video, down for audio), and a track is added when every
track is busy there. Ctrl+Shift+V inserts them on the targeted tracks, as
Paste Insert does. In the Project panel Ctrl+V imports into the shown bin.
One undo step takes the paste back.

Copying clips already puts their names on the system clipboard as text, so
media on the clipboard was copied after them; without media, Paste pastes
the copied clips as before.

- engine: edit.pasteMedia {paths, insert, place, bin}; paste_media::
  save_pasted_image writes "Pasted Image <n>.png" where voice-over takes and
  narrations go (voiceover::media_dir: Scratch Disks > Captured Audio and
  Video, else next to the project, else the data directory), trying a
  bounded number of names as voiceover::unique_wav_path does.
  timeline.place's default length moves to commands::full_duration so both
  share it.
- ui-egui: HostHooks::clipboard_media reads the clipboard (ui-egui stays
  OS-independent); menus::invoke turns edit.paste / edit.pasteInsert into a
  media paste when the Timeline or Project panel has focus. egui-winit drops
  the Ctrl+V press when the clipboard holds no text but passes the release,
  so a V release without its press puts the press back. That also makes
  Ctrl+V paste copied clips when the system clipboard is empty.
- filmcraft (desktop): the hook, with arboard (already in the tree through
  egui): copied files first, else an image.

Not covered: the web build, whose browser clipboard works differently.

Tests: paste_media_tests (5: image above the footage with nothing
overwritten and one undo step, tracks added when every track is busy,
Paste Insert, import only, saved image names) and clipboard_paste_ui (4:
an image pasted from a key release with no text, copied files and Paste
Insert, the Project panel imports, copied clips still paste and a plain V
pastes nothing).
2026-10-10 15:34:47 +03:00
Brandon ThomasandClaude Opus 5.5 58f768c472 Merge origin/main into gpu-rendering
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-10 08:27:57 -04:00
Brandon ThomasandClaude Opus 5.5 c030f78762 Merge origin/main into tts-narration
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-10 08:13:05 -04:00
Brandon ThomasandClaude Opus 5.5 be498865c3 Merge origin/main into fix/linux-dev-desktop-icon
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-10 08:12:41 -04:00
Brandon Thomas d01440d950 Merge pull request #254 from ahmedhosnypro/fix/alsa-default-fallback-23
Playback: fall back to a working output device when the ALSA default cannot be opened
2026-10-10 08:10:09 -04:00
Brandon Thomas 9847a5cbf1 Merge pull request #357 from jnohclee-rgb/dharma/filmcraft-344-help
cli: make --help print usage successfully
2026-10-10 08:09:57 -04:00
Brandon Thomas 7f81d6b063 Merge pull request #390 from txiki739/fix/linux-file-dialog-extensions
#262: file dialogs list extensions in any capitalisation on Linux
2026-10-10 08:09:51 -04:00
MarekSpodBiedry b81792c453 Space out browser downloads so image-sequence exports are not dropped (#378) 2026-10-10 14:06:01 +02:00
Brandon ThomasandClaude Opus 5.5 c9e803ff3b Merge origin/main
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-10 07:24:39 -04:00
Brandon ThomasandClaude Opus 5.5 762344769b Merge origin/main
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-10 07:21:39 -04:00
Brandon ThomasandClaude Opus 5.5 4304cd9382 Merge origin/main into #421; GPU export opt-in, wgpu error handler, drop panicked renderers
- GpuRendering defaults to Off (opt-in per export) until measured on Windows and macOS;
  docs and ROADMAP say so.
- The shared export device installs an uncaptured-error handler and a device-lost callback
  that log once and retire GPU export for the session (frames go to the CPU) instead of
  wgpu's default panic.
- RendererPool drops a renderer that panicked and retires the pool, so the rest of the
  export renders on the CPU (regression test in gpu_hook_scenarios); the duplicate
  hostile-size test that raced on the global registry is folded into it.
- Rebased onto main's render_plan/transitions: render_export_prepared reads the linear
  accumulator after render_plan; transition (Composite) plans fall back to the CPU.
- es/ja rows for the new Export strings; web_time::Instant in the export pipeline.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-10 07:21:38 -04:00
grib_job 1b83994c93 feat: Add Russian (ru) localization (updated) 2026-10-10 14:14:11 +03:00
Brandon ThomasandClaude Opus 5.5 1bf590c73c Timeline file drops: merge origin/main; document the platform cursor exception and mixed-DPI limit
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-10 07:11:18 -04:00
Brandon Thomas 1ace90d191 Merge remote-tracking branch 'origin/main' into fix-505 2026-10-10 07:05:06 -04:00
Brandon Thomas df3df9d352 Merge pull request #550 from hadmark/main
Add Simplified Chinese (zh) translation
2026-10-10 07:04:58 -04:00
Brandon ThomasandClaude Opus 5.5 664c13efeb Merge origin/main into #278; schema v14, neural-voices off by default, review fixes
- Narrations take schema v14 (main's v13 is audio streams): v13_to_v14, docs updated.
- neural-voices is off by default in the desktop app, like whisper; the model download stays
  an explicit, confirmed job.
- Removed the debug probe2 test module from tts-text.
- project_subset prunes narrations of items it drops.
- unique_wav_path is bounded (99 999 names) and returns an error instead of looping.
- narration.rs uses web_time::Instant (wasm clock test); tts.* commands get the
  "Text to Speech" shortcut category, with es/ja rows for it and Edit Narration.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-10 06:55:59 -04:00
Brandon Thomas 5c4a07b148 Merge remote-tracking branch 'origin/main' into fix-505 2026-10-10 06:48:09 -04:00
8e9b805952 #550: merge origin/main; Simplified Chinese as zh-cn with #389's plumbing
- One code everywhere: Language::ZhCn, persisted as `zh-cn`, catalog zh-cn.tsv.
- general.interfaceLanguage accepts and lists zh-cn (Settings > General).
- macOS native menu follows app.language.chinese.
- System Language picks Simplified Chinese only for zh, zh-CN, zh-SG and zh-Hans
  (not zh-TW / zh-HK / zh-MO / zh-Hant).
- Drop the second CJK font loader: cjk.rs already installs the Chinese fallback,
  so switching needs only cjk::available(); without a face the switch is refused
  and a saved zh-cn preference falls back to English at startup, like Japanese.
- Remove the fork's build-zh.yml workflow.
- Tests: Chinese covers every menu label and tl! literal; switching persists or is
  refused without a font; locale mapping. New strings get es/ja/zh rows.

Plumbing from #389 by @demon820308.

Co-authored-by: demon820308 <zwbigi@gmail.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-10 06:45:45 -04:00
Brandon ThomasandClaude Opus 5.5 e19eaa760b Merge origin/main into #246; dev desktop entry is opt-in, icons not embedded
- Nothing is written unless FILMCRAFT_DEV_DESKTOP_ENTRY=1 (debug builds no longer write into
  ~/.local/share on every cargo run).
- The 256/512 PNGs are copied from this checkout's assets/app-icon at runtime instead of
  include_bytes! into every Linux binary; a missing icon is logged and skipped.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-10 06:22:16 -04:00
Brandon Thomas 4181a50c58 Merge remote-tracking branch 'origin/main' into fix-549 2026-10-10 06:21:46 -04:00
Brandon Thomas e2ebbe715e Merge remote-tracking branch 'origin/main' into fix-246 2026-10-10 06:18:20 -04:00
Brandon ThomasandClaude Opus 5.5 19c756c252 Merge origin/main into #254; prefer pipewire/pulse, cache the fallback, translate notes
- When the default output cannot be opened, probe pipewire/pulse first and raw hw:/plughw:
  last (those take the card exclusively).
- The fallback list is probed only after the default fails, and the pick is cached per host,
  so devices()/configure() no longer open every PCM.
- Status-bar notes go through i18n::t/fmt.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-10 06:18:12 -04:00
Brandon Thomas e63fecfc06 Merge remote-tracking branch 'origin/main' into fix-254 2026-10-10 06:04:51 -04:00
Brandon ThomasandClaude Opus 5.5 54f27f1f05 Merge origin/main
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-10 05:57:23 -04:00
Brandon ThomasandClaude Opus 5.5 e3a00c3a25 Merge origin/main into #357; check --help after Args::parse in cli()
Rebased onto main's cli()/out! refactor: `--help` is checked as a parsed flag, so
`filmcraft-cli export --help` prints the reference too (test extended).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-10 05:57:22 -04:00
MrCloudy2andClaude Opus 5.5 059376af1c #260: file dialogs on Linux no longer stop the app
Native file dialogs are requested with a continuation (FilmcraftApp::pick for
commands, pick_ui for panel buttons). On Linux the desktop host shows the rfd
dialog on a worker thread (HostHooks::run_dialog) and the result is applied
when it arrives, so the frame loop, playback and the control channel keep
running and GNOME no longer offers to force-quit the window. One dialog at a
time; a path for a dialog closed meanwhile goes nowhere. macOS / Windows keep
their synchronous pickers.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-10 11:52:07 +02:00
Brandon ThomasandClaude Opus 5.5 634d6cf359 Merge origin/main into #390; case-insensitive filters on main's translated dialog labels
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-10 05:46:50 -04:00
MarekSpodBiedry dcf2d7f423 Reject unknown mcp options instead of silently ignoring them (#476) 2026-10-10 11:42:50 +02:00
Luniiya 9e3c9c9b65 Merge remote-tracking branch 'upstream/main' into feat/system-appearance
# Conflicts:
#	crates/ui-egui/src/i18n/es.tsv
#	crates/ui-egui/src/i18n/ja.tsv
#	crates/ui-egui/src/icons.rs
2026-10-10 11:32:04 +02:00
SilentYetiandClaude Opus 5.5 3df0b9bb36 Merge remote-tracking branch 'origin/main' into nvdec-linux
tests/setting.rs: keep the check against the backend register() reported
(main's fix expects VA-API on Linux, which NVDEC now sits in front of).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-10 02:30:22 -07:00
Dmytro MatviichukandCodex 2c2e651eba i18n: add Ukrainian (uk) interface translation (#405)
Translate all 347 Spanish/Portuguese menu keys plus Clip, Audio and Settings.
Add the Ukrainian language command, serialized UI state, native macOS
menu updates, and coverage and Cyrillic glyph tests.

Co-Authored-By: Codex <noreply@openai.com>
2026-10-10 11:26:42 +02:00
Brandon ThomasandClaude Opus 5.5 14d2171282 Merge origin/main into issue-539 (keep both CLI helpers)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-10 05:11:01 -04:00
Brandon Thomas a790ca05ee Merge pull request #568 from MarekSpodBiedry/issue-538
CLI export: forward a lone --start or --end so the engine reports the missing bound (#538)
2026-10-10 04:42:20 -04:00
MarekSpodBiedry 64007e93b6 CLI: a closed stderr no longer panics with exit 101 (#537) 2026-10-10 09:15:24 +02:00
MarekSpodBiedry ffbe2622da CLI render: report the real reason for an invalid scale instead of no sequence (#539) 2026-10-10 09:14:50 +02:00
MarekSpodBiedry 8ee37150e4 CLI export: forward a lone --start or --end so the engine reports the missing bound (#538) 2026-10-10 09:13:54 +02:00
SilentYetiandClaude Opus 5.5 03a840d28b Linux: NVDEC hardware decoding for H.264 and HEVC
Adds a second Linux decoder backend, crates/platform/src/nvdec, that talks to
NVIDIA's driver directly (libnvcuvid + the CUDA driver, both loaded at run
time). It is registered in front of VA-API: what NVDEC declines still reaches
VA-API, then the software decoders. H.264 8-bit and HEVC 8/10-bit, 4:2:0
progressive.

NVIDIA's parser takes Annex B access units, so there is no host-side DPB.
Pictures are read back as NV12 / P016 through the existing biplanar path and
are bit-exact with the software decoders. The CUDA context is the one
nvenc::device already retains; it gains push/pop and copy-to-host. A seek
recreates the parser and keeps the decoder.

Also fixes tests/setting.rs, which expected the Media Foundation backend name
on Linux, and updates the Hardware decoding tooltip and its Spanish row.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-09 23:17:11 -07:00
MitchandClaude Sonnet 5.5 b630643ec9 #171: read the OS cursor for drops from the file manager
winit on Windows sends no cursor events while files are dragged in, so the
pointer was stale and the drop was never placed on the timeline. The desktop
app now passes a host hook that reads the cursor from the OS (GetCursorPos),
which the UI maps into window points.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-10-10 14:21:49 +11:00
Luniiya 77fa159f49 ui: standardise system appearance modes and theme previews 2026-10-10 02:14:55 +02:00
user.email 5b3d2c2a0b linux: cargo fmt the dev-icon BadExecPath arm
The to_str() refinement landed unformatted: rustfmt wants the long
error arm braced.

🤖 Generated with [Kimi Code](https://github.com/storyteller/kimi-code)
Co-Authored-By: Kimi <noreply@storyteller.dev>
2026-10-10 01:00:30 +03:00
user.email 4955515bcd linux: dev desktop entry only for source-tree runs; both Exec layers; exact Exec match
Review feedback on #246:

- Gate the install to dev runs: a debug build, or a release run with
  FILMCRAFT_DEV_DESKTOP_ENTRY set (the documented cargo run --release flow);
  never when APPIMAGE or FLATPAK_ID is set — an AppImage mounts at a fresh
  /tmp/.mount_* each launch, so its Exec path changes every time, and packaged
  installs ship their own entry and must not write into the profile.
- Escape Exec for both desktop-entry layers exactly like
  packaging/linux/install.sh: shell layer first (` " $ \ get a backslash),
  then the file-value layer (every backslash doubled), always double-quoted.
  Binary paths with =, % or control characters are rejected instead of written
  (install.sh rejects them for the same reason).
- Compare the Exec path exactly: parse the first Exec argument through both
  layers instead of a substring contains, so /a/filmcraft-old no longer
  counts as ours and a stale entry is rewritten.
- eprintln -> log::warn for the skip message (the logging module landed meanwhile).

🤖 Generated with [Kimi Code](https://github.com/storyteller/kimi-code)
Co-Authored-By: Kimi <noreply@storyteller.dev>
2026-10-10 00:41:44 +03:00
user.email d8ef953f16 Merge branch 'main' into fix/linux-dev-desktop-icon 2026-10-09 23:08:04 +03:00
Brandon Thomas b32d1cd5ed Merge remote-tracking branch 'origin/main' into fix-361 2026-10-09 10:17:58 -04:00