Commit Graph
4107 Commits
Author SHA1 Message Date
helgehelge123andClaude Opus 5.5 084cd3ddd3 Stack badges: filmstrip badge expands/collapses, badges work on unselected stacks
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-19 10:11:00 +02:00
sanyamsingh001andCodex 089172137b test(ui): wait for menu registration and visible sync rows
Wait for the registered Edit title before the existing one-click test. Reveal the Sync folder row only when needed, click its visible intersection, and keep geometry in failing assertions. Preserve the original scenarios and pointer interactions.

Co-authored-by: Codex <codex@openai.com>
2026-10-19 17:12:31 +10:00
Matthew James SivakandClaude Opus 5.5 0360f940e3 Merge main into lightroom-jxl-dng
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-19 08:33:20 +02:00
Reva Doni AprilioandClaude Opus 5.5 61402815b5 docs: gaps header for gap 21; Indonesian parity counts messages only
Address review: gaps.md's header and history record the 2026-10-19 gap 21
change, and the Indonesian parity row counts the 2,555 catalog messages,
with the 69 command labels noted separately.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-19 13:26:32 +07:00
Reva Doni AprilioandClaude Opus 5.5 822c6ed101 docs: Indonesian in the key-languages tables and the localization headline numbers
Address review: the twelve-key-languages row for Indonesian still read 0%
while the shipped table listed it, and ROADMAP repeated it under Also
shipped. Indonesian is a key language, so it moves to its row (100% but
What's New) and out of the other-languages table (back to 4). Localization
mean of the 12 key languages ~55% -> ~64%, 8 of 12 present; the new-script
estimate drops Indonesian (135-239 h); the full-target weighted sum moves
61.2% -> 61.5% (still ~61%).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-19 13:07:58 +07:00
sanyamsingh001andCodex fe6f431a03 LRC-DEV-AUTOSYNC: separate UI fixture changes
Restore the original UI tests so this PR contains only the camera local-tone Auto Sync fix and its two engine regressions. Keep the independently prepared fixture correction in its separate review scope.

Co-authored-by: Codex <codex@openai.com>
2026-10-19 15:47:16 +10:00
Reva Doni AprilioandClaude Opus 5.5 816a1112e3 i18n: Indonesian (id) interface language
Adds crates/ui-egui/locales/id.json and id-formats.json: every plain
(2,258) and formats (297) message any catalog has, plus 69 command
labels no catalog translated yet. What's New stays in English.

Indonesian keeps a noun unchanged after a count, so English plural
suffixes are consumed with {:.0}; dates read "Minggu, 20/09/2026".
Menu triangles use → and ⌄ like the other catalogs. 356 labels reuse
the sibling apps' Indonesian wording (PhotoCraft, VectorCraft,
FilmCraft, FigCraft) so the suite reads the same; credited in
ATTRIBUTION.md.

Registers Locale::Id ("Bahasa Indonesia", Latn), the
app.language.indonesian command, the keyword-list catalog check and
an Indonesian switch/persist/format/date test. Docs: localization.md,
localization-id.md, localization-parity.md, ROADMAP.md.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-19 12:17:59 +07:00
NetterSilverandClaude Haiku 5.5 a3d00301cf Write ISOSpeed extension tag for ISO above 65534 in write_exif
Found while testing crates/meta/src/exif.rs:455 (write_exif)

Co-Authored-By: Claude Haiku 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-10-19 05:16:03 +00:00
helgehelge123andClaude Opus 5.5 23feaa4760 LR-LIB-CULL: gap sliders read back a translated "1 day" (#2275)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-19 02:33:20 +02:00
chordpli de98d3a1ba LR-LIB-STACK: the badge double-click test checks the second click lands on the badge (#2233) 2026-10-19 09:28:31 +09:00
树洋 陈 794e307c67 Address review: fail the screenshot example if a mask command errors 2026-10-19 08:18:54 +08:00
helgehelge123andClaude Opus 5.5 b8c41ecc4e LR-LIB-CULL: gap sliders read back the text they show (#2275)
The Assisted Culling and Auto-Stack gap sliders showed "1 min 30 s" but
their parser only took plain seconds. parse_gap reads s / min / h / day
units (and plain numbers) for both.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-19 02:05:51 +02:00
chordpli 266e668376 LR-LIB-STACK: a double-click on a stack badge toggles the stack once (#2233)
A click on a grid stack badge expands or collapses the stack. A double-click,
as in Lightroom, toggled it twice: the second click undid the first and the
stack stayed as it was. The badge now ignores the second click of a
double-click.
2026-10-19 09:05:04 +09:00
树洋 陈 195a519c07 Address review: regression tests and overlay outline parity
- Add two regression tests in tests_masking.rs (next to mask_overlay_keys_and_pins)
  covering #2210: every visible mask is outlined under the all-masks overlay while
  only the selected mask registers maskHandle: widgets, and an unselected mask's
  outline is painted on screen.
- Match the outline condition to the painted region: only outline masks with
  components, like view_overlay already does.
- Add examples/mask_overlay_shot.rs (+ dev-dep png) to render a screenshot of the
  overlay for the PR.
- Revert the earlier standalone test in headless.rs; make mask_overlay and
  CanvasMap::new pub(crate) so the masking tests can reach them.
2026-10-19 07:57:25 +08:00
helgehelge123andClaude Opus 5.5 7f2375458c LR-LIB-CULL: adjustable burst gap and similarity in Assisted Culling (#2275)
photo.analyze takes burstGap (seconds, 0..86400, default 10) and
similarity (0..1, default 0.93); values out of range are refused before
anything is measured. The Assisted Culling dialog gets both sliders and
remembers them for the session.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-19 01:06:56 +02:00
FrancoisandClaude d999e382ba #1949: pt-BR for Include selected photos and the mask overlay modes (#2033)
Claude-Session: https://claude.ai/code/session_01AbegtYaPuwqZ81pGfELsFK

Co-authored-by: Claude <noreply@anthropic.com>
2026-10-18 16:59:33 -06:00
Claude 81f02a6947 #2253: crop ratios keep the orientation asked for
set_aspect always turned the ratio to the image's orientation, so a Custom
ratio taller than wide came out landscape on a landscape photo, and a
ratio picked after X (crop.rotateAspect) turned the crop back. A named
ratio now takes the crop's present orientation (landscape, or portrait
after X; a square crop follows the image), a custom [w, h] is used as
given, and crop.aspect takes orientation: "crop" | "given" to choose.
The window reapplies the remembered ratio to an untouched photo with
orientation "crop", as before.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01AbegtYaPuwqZ81pGfELsFK
2026-10-18 22:48:56 +00:00
MarekSpodBiedry 15e9a24891 Draw the Before label on a dark pill so it reads on light photos (#2247) 2026-10-18 23:36:52 +02:00
witkowski01 f140629bfd i18n(pl): translate the mask effect import and removed keyword messages 2026-10-18 22:53:56 +02:00
NetterSilverandClaude Haiku 5.5 1358ea61e1 Analyse a photo listed twice once in Assisted Culling
Found while testing crates/engine/src/cmd/cull.rs:23 (analyze: ids come from Session::targets, crates/engine/src/lib.rs:1205, which does not de-duplicate)

Co-Authored-By: Claude Haiku 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-10-18 20:36:00 +00:00
Claude 55b7b47925 #2242: reverseGeocode maxDistance, and the 15 000-people limit is documented
GeoNames cities15000 holds towns of 15 000 people or more, so a photo in a
smaller town got the nearest larger one in City (Portofino → Rapallo,
5.3 km), another municipality. metadata.reverseGeocode takes maxDistance
(metres): past it, City and Sublocation stay empty, State and Country
still fill, and the reply names the town as nearestCity. Hostile values
are refused. The command help, the Fill Location tooltip and the parity
row say what the list holds. Default unchanged.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01AbegtYaPuwqZ81pGfELsFK
2026-10-18 20:13:25 +00:00
witkowski01 6bb4517d77 i18n(pl): Apple Photos Imports describes adding to Photos, not importing from it 2026-10-18 22:06:21 +02:00
nevicia2010-hub bceea7a759 EXPORT-AUDIT: reconcile export fixes with current upstream
Preserve upstream opaque RGB exports and real transparency while retaining watermark orientation/aspect and HDR JPEG size limits. Full local xtask ci passes.
2026-10-18 21:45:15 +02:00
Matthew James SivakandClaude Opus 5.5 1ed76d851d Merge main into alt-clipping-preview
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-18 21:39:24 +02:00
Matthew James SivakandClaude Opus 5.5 349c27917b Merge main into fix/330-drag-scale-followups
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-18 21:38:09 +02:00
Claude 00f55ef352 #2266: a presets.json that can't be written counts as unsaved
Preset commands change the preset list outside pending_log, and a failed
presets.json write was only logged: unsaved() stayed None, so nothing
warned and the web backup (#1987) would zip a stale presets.json; on
desktop a full disk lost the preset silently. The failure is now kept
(presets_error), counted by unsaved() (plus one change), retried by
persist_if_dirty with the same back-off as failed appends, and cleared
once the write succeeds.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01AbegtYaPuwqZ81pGfELsFK
2026-10-18 19:28:49 +00:00
Dylan M. Taylor fb7ac08b9a ci: configure Dependabot for Cargo and GitHub Actions
Co-authored-by: Dylan M. Taylor <dylan@dylanmtaylor.com>
2026-10-18 12:31:40 -06:00
Carlos VillanuevaandClaude Opus 5.5 16417e2eca Lightroom import: document the functions this change touches
CodeRabbit's docstring check counted the touched functions without doc
comments (read_with_progress, apply_prepared, inspect_report, result_dialog
and a test helper). Comments only.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01RhZLBHaSnSko1eMByPibfh
2026-10-18 18:04:34 +00:00
Matthew James SivakandClaude Opus 5.5 5b5cdb646e LR-BEHAV-BG-TASKS: background Reload names itself in bad-ids errors; a stopped Reload doesn't say the raw still can't be decoded
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-18 19:57:32 +02:00
Marco Arnulfo 0c932b6958 LRC-DEV-VIEWOPTIONS: View Options (Cmd+J) chooses the lines of the loupe's Info 1 and Info 2 2026-10-18 19:41:59 +02:00
Carlos VillanuevaandClaude Opus 5.5 9eec26804d Lightroom import: report skipped images as data and say so in the UI language
Review of #2230: the skipped-image warnings were English text shown as is
in the result window. Skipped images are now data in the import and inspect
reports (`skipped`: image id and reason: missingFile, missingFolder,
missingRoot, incompletePath, masterSkipped) instead of warnings, and the
result window adds one line counting them through tr_format!, translated in
every UI language; the eight-warning cap is unchanged.

Reader-level tests now cover a missing folder and root record and a virtual
copy of a skipped master read from a catalog file.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01RhZLBHaSnSko1eMByPibfh
2026-10-18 17:21:36 +00:00
Matthew James SivakandClaude Opus 5.5 7b2d7b25ea LR-BEHAV-BG-TASKS: an older Reload can't overwrite a newer one; background Reload auto-writes sidecars
Review of #1998. Each reload plan takes a ticket; apply skips a photo a
later-started reload has already been applied to, so an older read that
finishes last no longer restores the previous dimensions and content hash.
The app's background completion now commits through Session::execute_fn,
so the XMP sidecar auto-write (and the save) happen as for the command.
Regression tests: an_older_reload_does_not_replace_a_newer_one,
a_background_reload_writes_the_sidecar_with_auto_write_on.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-18 19:07:40 +02:00
Carlos VillanuevaandClaude Opus 5.5 bb9fe91bf2 Merge storytold/lightcraft main into lightroom-import-skip-orphan-images
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01RhZLBHaSnSko1eMByPibfh
2026-10-18 17:07:17 +00:00
LosminekandClaude Opus 5.5 a6c05ea0d9 i18n(cs): review fixes and updated counts in localization-cs.md
Independent AI review of the catalog catch-up (not a native speaker):
reflexive-possessive fix in the raw recheck messages, crash dialog
wording aligned with the existing startup failure message, Solo Mode
named after Edit Sections, bracket set term unified with the existing
catalog, Favorite star tooltip as a neutral state label, and smaller
wording fixes. The counts in docs/localization-cs.md now match the
catalogs (2 394 messages, 297 format templates).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-18 19:05:43 +02:00
Marco Arnulfo 7b6eff73b3 KEYC-RATING: backslash keeps Show Original in the full-screen preview 2026-10-18 19:05:05 +02:00
Marco Arnulfo d5de74f6cd KEYC-RATING: backslash shows and hides the Filter Bar in the grids 2026-10-18 19:05:05 +02:00
Val EnfysandClaude Opus 5.5 acdc873075 Contributors: add my name for the About window
Credit @valenfys by their public GitHub profile name (sync_github_name).
First contribution: #974.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-18 17:57:59 +01:00
LosminekandClaude Opus 5.5 c495ac8e09 i18n(cs): bring the Czech catalog up to date
Add 329 UI messages: the 175 that German, Spanish and French already
translate, 18 more that other catalogs have, and 136 that code looks up
but no catalog had yet (slideshow templates and export, print layout,
mask effect presets, focus points, face models, menu commands). Translate
the 44 format templates that were still English placeholders.

Every added key has a production lookup; "Click to type a value" (no
longer used) is left out. Release-note lines stay in English, as
docs/localization-cs.md describes. AI-assisted; not yet proofread by a
native speaker.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-18 18:53:35 +02:00
Claude debfa644ec #1927: a slider drag and unrelated section eyes don't misplace crops
Two more cases from the review of #1990: the end of a slider drag replayed
the crop Constrain Crop had fitted during the drag, so Auto Sync still
copied the active photo's fitted crop to the others; the end of an
interaction now starts again from the original crop when the drag didn't
edit the crop. And any section eye counted as a warp change, so turning
Light off could refit a hand-drawn crop: only the Geometry and Optics
eyes do now.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01AbegtYaPuwqZ81pGfELsFK
2026-10-18 16:48:52 +00:00
Matthew James SivakandClaude Opus 5.5 7f97bdbb5f LR-IMP-PREVIEW-READ: thumbnails of Lightroom HDR/panorama DNGs develop from the file's reduced raw copies
A DNG that keeps reduced-resolution copies of its LinearRaw image (Lightroom merges keep 256, 512 and
2048 px ones) now develops a thumbnail or preview from the smallest copy that covers it, with the main
image's levels and colour and its crop scaled. A 23836 x 7078 drone panorama's 512 px render went from
38 s to 1.1 s. Copies are skipped when the main image has opcode lists, a linearization table or
black-level deltas, and for denoised photos.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-18 18:47:23 +02:00
nerdislbandClaude Opus 5.5 cb61588e7d LR-EDIT-OPTICS-PROFILE: find the profile named by a lens specification behind a tie
Another maker's lens with the same specification ("Otherco 18-55mm f/3.5-5.6")
scores as high as the profile aliased "18-55mm f/3.5-5.6"; when it came first,
find_lens kept it and the exact-name check then refused it, so the alias was
never used. LensDb::find_lens_named ranks only the profiles named exactly so,
with the same maker and mount preferences (review on #2217).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-18 18:42:50 +02:00
nerdislbandClaude Opus 5.5 067f4fdf1e LR-EDIT-OPTICS-PROFILE: look up Nikon DSLR lenses by their lens specification
Nikon DSLRs write no Exif LensModel, only the lens specification (maker note
0x0084, read into Metadata::lens_spec), so the lensfun-format lens database never
corrected their raws. A raw without a lens model is now looked up by a name built
from its specification ("24-70mm f/2.8", lightcraft_lensdb::spec_name), and a
profile is used only when one of its names is exactly that
(Profile::names_exactly): the specification fits every maker's lens with that
range, so a partial match or a maker-named entry is never taken. lensfun's own
database has no such names; a user aliases the one lens they own.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-18 18:42:50 +02:00
Davit MatchakhelidzeandClaude Opus 5.5 18cfda0ee9 Release: build the web version with craft-fonts too (web-craft-fonts)
The shared release workflow builds the web release without CRAFT_FONTS_DIR unless web-craft-fonts
is set, so the web version would still have no Georgian face (CodeRabbit on vectorcraft#2934).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01YMTAbGNRxnMEzRvYnQGphF
2026-10-18 20:25:24 +04:00
Matthew James SivakandClaude Opus 5.5 38b247e394 LR-META-XMP: Lightroom's profile and version bookkeeping is not reported as unimported XMP
CompatibleVersion, the profile digests, the lens profile's identity and its
default-strength scales, and CropConstrainToUnitSquare don't change the
rendering; a Lightroom raw sidecar listed all of them for every photo.
Look and unknown fields are still reported.

Split out of #2008.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-18 18:21:53 +02:00
Matthew James Sivak bf6e10fb06 Merge origin/main into reload-from-disk-background 2026-10-18 18:07:13 +02:00
NetterSilverandClaude Haiku 5.5 eb009d1bd6 fix: give Find Similar an explicit empty-result filter state and clamp similarity
Co-Authored-By: Claude Haiku 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-10-18 15:59:53 +00:00
wstock ef4322b2ff docs(user): the export guide keeps describing v0.9.1 (#1620)
docs/user/AGENTS.md: pages describe the latest release, not unreleased code on
main. Width & Height and the Dimensions rename are not in v0.9.1, so the
guide's size step goes back to the released dialog; it is updated once a
release ships the box.
2026-10-18 15:46:45 +00:00
wstockandClaude Fable 5.1 780476de1c LR-EXP-DIM: Width & Height limits each edge to its own number (#1620)
Lightroom's Resize to Fit has two boxes: Dimensions (the larger number to
the long edge, whichever way round the photo is) and Width & Height (the
width limited to W and the height to H as the photo stands). LightCraft
had only the first, labelled "Width × Height". Add `ResizeMode::WidthHeight`,
`fit: widthHeight` beside `width` + `height` in app.export, the mode in the
Export dialog (the old one is now called Dimensions), and the docs.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_011K1peyrh5MdZ6ttHkVq8Gh
2026-10-18 15:22:09 +00:00
Michael Anderson ff663469d7 Merge upstream/main into fix/local-browse-stamps 2026-10-18 09:42:34 -05:00
Dylan M. Taylor 31a677fe3d docs: drop references to competing commercial software (#2213) 2026-10-18 10:41:49 -04:00