Commit Graph
4107 Commits
Author SHA1 Message Date
Nathaniel Ledford 66a4cf8a5c MENU-BAR: drop the two renamed menu labels the cs, it and pl catalogs still carry 2026-10-22 10:48:11 -04:00
midasdf 867284656e Merge origin/main into #2468: keep main's work and the Japanese paper sizes
Both sides' revision-history rows and change lines are kept (newest first);
print_view.rs auto-merged, so main's shared context_menu call sits beside the
PR's current_paper()/paper_name() punctuation and alias fixes.

# Conflicts:
#	ROADMAP.md
#	docs/gaps.md
#	docs/parity-checklist.md
2026-10-22 23:37:29 +09:00
midasdf 6b0c891333 Print: match paper names past punctuation and resolve aliases
The paper-name normalisation promised punctuation-insensitive names but
dropped only whitespace, hyphens, underscores and parentheses, so `L判。`
did not resolve; keep letters and digits only instead. The Print dialog
also lower-cased the stored name without resolving it to a canonical
paper, so a paper set through an alias (`はがき`) showed `はがき in` and
selected no option; add `paper_name` and use it for the selector's
current value and option comparison.

Tests: the layout aliases test covers periods and Japanese punctuation,
and the Print view test covers the resolved current paper.
2026-10-22 23:24:53 +09:00
ronibalthazar d18fb06aa8 Fail closed on malformed PSD EXIF during extraction 2026-10-22 14:59:39 +01:00
ronibalthazar c8390afbd2 Fail closed on malformed PSD metadata during original export 2026-10-22 14:21:32 +01:00
mahmatias 206d73e898 test(keymap): the aspect-lock test reads the tool's own lock
The integration brought #1864: a fresh crop keeps the raw develop
aspect untouched, and the first toggle only records "free" for the
tool (lib.rs interceptor), so reading develop.crop.aspect never
changes on an untouched photo. The lock the row controls is the
effective one - crop_tool_aspect(), which now starts engaged on
"original" - and that is what the test asserts, like main's own
crop_keys. The feature behavior was already right; only the test's
observation point was stale.

1139/1139 ui-egui lib; fmt clean.
2026-10-22 10:05:28 -03:00
mahmatias acbf7c70f2 fix(shortcuts): exempt contextual pairs in the ui-conflicts test 2026-10-22 10:05:28 -03:00
mahmatias d1ccdc4775 docs(parity): LR-CROP-ASPECT notes crop.lockAspect as its own A row 2026-10-22 10:05:28 -03:00
mahmatias 0d60d824a0 feat(shortcuts): Lock Aspect Ratio becomes a row on A
crop.lockAspect is declared like any other command (label Lock Aspect Ratio, default A, both keymap profiles) and lists in Help - Keyboard Shortcuts, editable like the rest. The hidden remapping that turned view.visualizeSpots into crop.aspect while the Crop panel was open is gone: the two now share A as a contextual pair - Visualize Spots fires everywhere except under the Crop panel, where the aspect lock takes the key - so A no longer steals the Remove panel from Crop or runs both commands at once (the old remap plus a direct binding would double-toggle). tests_keymap 28/28.
2026-10-22 10:01:47 -03:00
tylerphotosandCodex 6677edd107 KEY-GRID: reconcile grid shortcut hints with current main
Preserve upstream menu additions and progress documentation while retaining
the focused grid shortcut and native ownership fix. All eight CI gates, five
Windows regressions and native acceptance passed on this exact merged tree.

Co-Authored-By: Codex <noreply@openai.com>
2026-10-22 07:35:20 -05:00
Nathaniel Ledford 2525613e3e LR-PREF-GENERAL: the slide preview stays above the Slideshow page while the templates are browsed 2026-10-22 08:26:54 -04:00
tylerphotosandCodex 01cbf8f2eb KEY-GRID: refresh native handles when shortcut ownership changes
Include effective accelerators in the shared native menu cache key,
with a regression for same-text direct-to-cycle key transfer.
Document the touched menu helpers.

Co-Authored-By: Codex <noreply@openai.com>
2026-10-22 07:13:14 -05:00
Claude c21714a379 #2504: the dehaze regression test also fails when the whole dark field renders black
Review follow-up (CodeRabbit): an all-black field made every comparison pass, so the field's own level must stay visible first.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01AbegtYaPuwqZ81pGfELsFK
2026-10-22 11:42:59 +00:00
Nathaniel Ledford 193d294822 LRC-LIB-KEYWORDS: a blank line sets the new What's New heading apart 2026-10-22 07:29:52 -04:00
Nathaniel Ledford d431579f52 LRC-LIB-KEYWORDS: the checklist's dot-indicator sentence stands outside the "Not yet" list 2026-10-22 07:28:31 -04:00
Alex Chambers 0cfc70b2fa Issue #2052: merge main and limit export fallback to Thai
Keep the existing Inter and CJK export order and the UI font chain.
Defer Arabic export faces until joining and bidirectional ordering exist.
Restore main's headline documents and record remaining text-layout limits.
2026-10-22 13:27:10 +02:00
Matt MarkhamandCopilot App 9122443f22 pipeline: bound dehaze veil by the pixel's own minimum channel (#2504)
The dark channel is a Gaussian blur, not a patch minimum, so near a
bright neighbour it can credit a dark pixel with more veil than its own
minimum channel holds; (c - air*(1-t))/t then went negative and was
clamped to black - the blotches on CR3 raws. Bound the credited veil by
the pixel's own minimum channel (d = min(dark/air_pre, c_min/air)),
which provably keeps every channel non-negative for any gain, airlight
estimate or windowed fixed_air, in both the CPU and GPU paths. Also
zero-guards the divisions, fixing a 0/0 NaN on an all-black frame.

Regression test: a uniform dark field beside a bright haze must render
uniformly; pre-fix the bleed zone crushed to black.

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
2026-10-22 11:21:40 +00:00
Nathaniel Ledford f76680dc3b LR-LIB-RATING: a test paints the hover state through Rating::show 2026-10-22 07:17:57 -04:00
Nathaniel LedfordandClaude Opus 5.5 102f605959 LRC-LIB-KEYWORDS: the Keyword List's new test sits with the other tests of the list
At the end of the file it would have met the tests #1166 adds there. No
change to the test.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-22 07:08:41 -04:00
Nathaniel LedfordandClaude Opus 5.5 40892944a5 LRC-LIB-KEYWORDS: the new message sits beside the Keyword List's own in the catalogs
It was put after `+{n} more`, where #1166 puts its messages too: the two
would have met there. No text changes.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-22 07:08:41 -04:00
Nathaniel LedfordandClaude Opus 5.5 c2145d176e LRC-LIB-KEYWORDS: the Keyword List marks a keyword that has an applied keyword inside it
With `Places|Italy|Rome` on the selected photos, the boxes of `Places`
and `Italy` were empty: a folded keyword gave no sign that something in
it was applied.

A keyword whose own box is empty now carries a dot in it when the
selection has a keyword inside it, at any depth, and the box's tooltip
names what is inside ("Inside: Rome, Venice", four by name, then a
count). The tick and the dash stay about the keyword itself and come
first: a keyword the photos have themselves shows that, not the dot. A
click on the box does what it did.

What is inside each keyword is worked out with the ticks, once per
selection (`Ticks::inside`), not per row and frame.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-22 07:08:40 -04:00
BFlat c66014e65f Merge pull request #2548 from storytold/readme/app-icon
README: the app icon above the title
2026-10-22 18:02:01 +07:00
bflatastic c810a51047 README: the app icon above the title 2026-10-22 17:58:01 +07:00
ronibalthazar 6413bccbfd #2519: read PSD and PSB metadata 2026-10-22 11:20:53 +01:00
NetterSilverandClaude Opus 5.5 9458e2c59a Take photos removed by Synchronize Folder out of their stacks
Found while testing crates/engine/src/sync.rs:851 (SyncStep::Remove; compare mark_deleted in crates/engine/src/cmd/library.rs:168)

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-22 11:41:53 +02:00
NetterSilverandClaude Opus 5.5 0cdbc6c15a Write exact 1/N EXIF ExposureTime for fast shutter speeds
Found while testing crates/meta/src/exif.rs:483 (write_exif, the `r` helper; via lightcraft_tiff::writer::rational at crates/tiff/src/writer.rs:261)

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-22 09:25:00 +00:00
Alex ChambersandGPT-6 Astra ff101914bf freebsd-control-timeout: remove client scheduling races from tests
Queue fixture input before the server's next idle read. Half-close writes
before the final reply and join the worker before reading that reply.
Keep slow-work timing, ordered exact replies, empty EOF and slot checks.
Production code is unchanged. The hosted FreeBSD trigger is unproved.

Validation: cargo xtask ci passed all eight gates on macOS arm64.

Co-Authored-By: GPT-6 Astra <noreply@openai.com>
2026-10-22 08:58:10 +02:00
Nathaniel Ledford d005ff76bc LR-PREF-GENERAL: the smart previews note test reaches the fix 2026-10-22 02:07:32 -04:00
Nathaniel LedfordandClaude Opus 5.5 5d1f9da46c LR-LIB-RATING: say which surfaces share the star row
The parity row and the What's New heading said one star rating 'everywhere', but the
Set Rating / Select By Rating menu rows and the grid context menu are separate menu
items with star text and are unchanged. Name the real scope.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-22 02:03:25 -04:00
Nathaniel LedfordandClaude Opus 5.5 5947667c6c LR-LIB-RATING: focus follows the Tab stop when the rating changes elsewhere
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-22 02:03:17 -04:00
Nathaniel LedfordandClaude Opus 5.5 0885ba5fd2 LR-LIB-RATING: format
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-22 02:03:17 -04:00
Nathaniel LedfordandClaude Opus 5.5 8720bbcfef LR-LIB-RATING: one Tab stop per rating row, visible-only favourite registration, true docs
The star row is a single Tab stop (the current rating's star, or the first) with the arrow keys
stepping inside it and the focus following. favorite_button registers its automation id only while
on screen again. The module and test docs no longer mention a size/read-only API that doesn't exist.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-22 02:03:17 -04:00
Nathaniel LedfordandClaude e161744d70 LR-LIB-RATING: first arrow after Tab steps the rating
egui picks the neighbour to focus from the arrow key in begin_pass,
before a widget can set a focus lock for the frame it just gained
focus (set_focus_lock_filter needs a frame of focus first). A focused
star that consumes an arrow now cancels that pending focus move. The
favourite toggle is one interact-height line square again, so Manage
Effect Presets rows keep their height.

Co-Authored-By: Claude <noreply@anthropic.com>
2026-10-22 02:03:17 -04:00
Nathaniel LedfordandClaude 0e04000f60 LR-LIB-RATING: keep arrow keys on a focused star, draw its ring
Left/right moved egui focus to the neighbouring widget after one or
two steps. A focused star now locks horizontal arrows (as the slider
does) and draws the accent focus ring. Rating drops the options no
caller uses (size, read_only, enabled). The mask-effect favourite
stars use paint_star and a shared favorite_button instead of a raw
egui::Button and a "★" glyph.

Co-Authored-By: Claude <noreply@anthropic.com>
2026-10-22 02:03:17 -04:00
Nathaniel LedfordandClaude d04633d308 LR-LIB-RATING: one shared star rating component
The bottom bar, the Info panel and the filter bar each drew their own
row of stars, and the grid badge, filmstrip badges and compare caption
had private painter loops. They now share rating::Rating (a clickable
row: hover previews, clicking the current rating clears it, read-only
and disabled states, left/right arrows on a focused star) and
rating::paint_rating / paint_star for painter-only contexts.

Existing automation ids (star:bottom:n, star:info:n, filter:starN) are
unchanged. The preset, profile and theme favourite stars use
paint_star too, so Icon::Star lives only in rating.rs.

Co-Authored-By: Claude <noreply@anthropic.com>
2026-10-22 02:03:17 -04:00
Nathaniel Ledford f36abff3e1 LR-BEHAV-BG-TASKS: a detail pass counts as the segmenter working 2026-10-22 02:02:48 -04:00
Nathaniel Ledford 1e65f52e79 LR-BEHAV-BG-TASKS: the SAM download bar keeps its name while the size is unknown 2026-10-22 02:02:48 -04:00
Nathaniel Ledford ee2559c60f LR-BEHAV-BG-TASKS: unknown totals sweep, denoise bars keep their widths, Enter waits for the segmenter 2026-10-22 02:02:48 -04:00
Nathaniel LedfordandClaude Opus 5.5 316f82dbd2 LR-BEHAV-BG-TASKS: name the failed filmstrip thumbnail, firmer light placeholders, paper print cells
A failed thumbnail in the detail view's filmstrip is announced with the
file name and "This photo can't be opened" (the painted ! had no name).
The skeleton placeholder is set further off the surfaces in Silver and
Paper (1.3 / 1.2 : 1 on the grid before, about 1.7 / 1.6 after) and the
test floor for the light themes is 1.15. The print preview's empty and
loading cells go back to fixed greys: its page is paper in every theme.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-22 02:02:48 -04:00
Nathaniel LedfordandClaude 3de9654e39 LR-BEHAV-BG-TASKS: review fixes for progress and busy buttons
Model-row bars keep Cancel in its place, a busy button stays focusable
and draws its spinner only when visible, the skeleton colour stands
apart from selected cells too, the filmstrip shows the failed-thumbnail
mark, and more placeholders and waits use the skeleton token and the
spinner.

Co-Authored-By: Claude <noreply@anthropic.com>
2026-10-22 02:02:48 -04:00
Nathaniel LedfordandClaude 05b653995b LR-BEHAV-BG-TASKS: busy buttons where work starts
Install from file… (denoise) shows busy while the model installs, and
the describe-mask Select button while the AI works.

Co-Authored-By: Claude <noreply@anthropic.com>
2026-10-22 02:02:48 -04:00
Nathaniel LedfordandClaude bbd9a35237 LR-BEHAV-BG-TASKS: a busy text button keeps its padding
The spinner in a text-only busy button is smaller and sits closer to the
text, so the text no longer touches the button's border while the width
stays the same.

Co-Authored-By: Claude <noreply@anthropic.com>
2026-10-22 02:02:48 -04:00
Nathaniel LedfordandClaude b0f184da33 LR-BEHAV-BG-TASKS: one progress bar, spinner and busy button
Progress bars were five raw egui::ProgressBar calls with fixed widths
(240, 260, 380), one hand-drawn bar in the activity stack, and a stock
spinner; text-only waits had no sign of life. progress.rs now has
Progress (a clamped, NaN-safe fraction or a gentle sweep when unknown,
fills the layout's width, announced as a progress indicator with its
percentage and registered by id) and a vector-arc spinner. Button::busy
shows the spinner in the icon's place, keeps the width, ignores clicks
and is announced busy.

Thumbnails still being made draw a themed skeleton colour (a Tokens
field, static) in the grid, the filmstrip and Compare, instead of a
literal grey that was nearly black on the light themes.

Co-Authored-By: Claude <noreply@anthropic.com>
2026-10-22 02:02:47 -04:00
Nathaniel Ledford 870106a6df MENU-BAR: the new fi, id, sv and vi catalogs carry the renamed menu entries; Parity checklist header names the rename 2026-10-22 02:01:37 -04:00
Nathaniel LedfordandClaude Opus 5.5 5b4f120e8d MENU-BAR: edit-a-photo guide names the view Detail View
Step 1 now uses the current menu label. verified stays 0.7.1 until a release
contains the renamed labels (docs/user/AGENTS.md).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-22 02:00:58 -04:00
Nathaniel LedfordandClaude 9073cec3a2 MENU-BAR: Settings calls the view Detail View too; translation fixes from review
zh-hant used 詳細檢視 for both the Detail section and the view: the section is
細節 now, and Settings' Open in choice and heading use Detail View. Also
zh-hans 详细视图, consistent fr/ja/uk All Mask Overlays, de/it Clipping.

Co-Authored-By: Claude <noreply@anthropic.com>
2026-10-22 02:00:58 -04:00
Nathaniel LedfordandClaude 434da7ae68 MENU-BAR: menu switches are named for what they show, and no two commands share a name
Switches read "Show Focus Point ✓" next to "Filmstrip ✓"; now every switch
is named for the thing and the check mark says whether it is on (Focus
Point, Clipping, Photo Counts, Mask Overlay, All Mask Overlays, Mask Pins,
Layout Image). Show Original stays: it is a view, not a switch.

Names that meant two things: View ▸ Detail and the Edit section Detail
(Detail View now, like Reference View), Window ▸ Edit and the Edit menu
(Edit Panel), Compare and Compare Before and After (Before/After Side by
Side, next to Split and Top/Bottom), and Clear/Discard Preview Cache (one
command, now Discard Preview Cache everywhere). New labels in all 13
catalogs. Tests: no "Show …" switch; no two menu commands share a label or
a menu's name.

Co-Authored-By: Claude <noreply@anthropic.com>
2026-10-22 02:00:54 -04:00
Nathaniel Ledford 17105388bf LR-IMP-DRAGDROP: the new fi, id, sv and vi catalogs carry the file drop strings 2026-10-22 01:59:15 -04:00
Nathaniel LedfordandClaude Opus 5.5 d4753ae787 LR-IMP-DRAGDROP: the web drop notice is made from the import report, with a test of the mapping
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-22 01:58:51 -04:00
Nathaniel LedfordandClaude Opus 5.5 6881a8c585 LR-IMP-DRAGDROP: the web drop's notice names every outcome of the drop
Review fix: a drop that adds some photos and fails others showed only the first outcome.
`i18n::dropped_photos_outcome` joins the translated added, restored and not-readable parts with a
plain " · " and returns nothing for a drop that only found duplicates.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-22 01:58:51 -04:00