Commit Graph
60 Commits
Author SHA1 Message Date
aiongg 56c842d8fe Merge track r3-t09
# Conflicts:
#	docs/parity-checklist.md
#	docs/raw-parity.md
#	docs/ui-parity.md
#	docs/whats-new.md
2026-10-31 02:31:25 +00:00
aiongg 46982a5c4f Merge track r3-t02
# Conflicts:
#	docs/gaps.md
#	docs/parity-checklist.md
#	docs/whats-new.md
2026-10-31 02:29:22 +00:00
aiongg 1b32dab094 Merge PR #999: Alt/Option-drag previews for clipping and sharpening (#937)
Conflicts resolved:
- crates/engine/src/media.rs: main split it; the render and display-profile hunks are ported into media/render.rs
- crates/ui-egui/src/lib.rs, panels/detail.rs: main split them; alt_held is set in app/frame.rs, view_overlay and overlay_supports_window ported (panels/detail/window.rs)
- crates/ui-egui/src/tests_alt_preview.rs moved to tests/alt_preview.rs
- crates/pipeline/src/finish.rs, local.rs: main's code kept, sharpen_mask_weight and texture_sigma applied to it
- docs: both sides kept; summary counts from main (regenerated later)
2026-10-31 02:08:19 +00:00
aiongg 8cbd95ef89 Merge PR #2991: KEYC-METADATA: Cmd+Alt+Shift+K / Ctrl+Alt+Shift+K sets the keyword shortcut, and Shift+K adds or removes it
docs/parity-checklist.md, docs/ui-parity.md: headers, the KEYC-METADATA and LRC-LIB-KEYWORDS rows carry both sides' changes; revision rows kept from both.
2026-10-31 02:07:47 +00:00
aiongg 1167de60d7 Merge PR #2879: KEYC-METADATA: Cmd+Shift+K / Ctrl+Shift+K edits the keyword picked in the Keyword List
docs/parity-checklist.md, docs/ui-parity.md: header lines and the KEYC-METADATA row carry both sides' changes; revision rows kept from both.
2026-10-31 02:07:10 +00:00
dotCooCoo b5c36b53aa Merge main into feat/keyword-shortcut-keys
Follows main's split of menus.rs into menus/ and of the keyword tests into
keywords/tests.rs: Set Keyword Shortcut moves to menus/ui_commands.rs and
menus/run.rs, its catalog test to keywords/tests.rs, and the docs name the
moved test files.
2026-10-28 14:29:26 -07:00
dotCooCoo 95d2faf53d Merge commit 'refs/check/mw-lightcraft-main' into feat/edit-keywords-key
# Conflicts:
#	crates/ui-egui/src/menus.rs
#	docs/parity-checklist.md
2026-10-28 01:06:33 -07:00
dotCooCoo f81d2d1ef8 Preserve the keyword painter shortcut with current main
Keep Enable Painting in the extracted menu modules and share the painter
box text with the keyword panel. Open the folded Keywords section when
the shortcut is pressed with an empty painter box.
2026-10-26 22:49:49 -07:00
helgehelge123 840e33a311 Merge branch 'main' of https://github.com/storytold/lightcraft into space-hold-pan
# Conflicts:
#	crates/ui-egui/src/lib.rs
2026-10-27 02:49:16 +01:00
aiongg 69048937d0 docs: update source paths after the layout moves 2026-10-26 21:39:56 +00:00
dotCooCoo 9c191681c5 Merge main into feat/edit-keywords-key 2026-10-26 04:23:22 -07:00
helgehelge123 bb59018de6 Merge remote-tracking branch 'origin/main' into space-hold-pan
# Conflicts:
#	crates/ui-egui/src/control.rs
#	docs/control-protocol.md
2026-10-25 23:48:05 +01:00
dotCooCoo 3c3d83031f KEYC-METADATA: Cmd+Alt+Shift+K sets the keyword shortcut and Shift+K adds or removes it
Lightroom Classic's keyboard shortcut page lists Command+Option+Shift+K
(Ctrl+Alt+Shift+K on Windows) for Set a keyword shortcut and Shift+K
for adding or removing the keyword shortcut on the selected photos.
LightCraft had no keyword shortcut.

Set Keyword Shortcut... (dialog.keywordShortcut, Cmd+Alt+Shift+K) asks
for one or more keywords with commas between them and shows the ones
set before. A new name goes inside the default parent, as in the
Keywording box. A keyword's Use This as Keyword Shortcut in the Keyword
List sets that keyword alone, and the list shows a + after each keyword
of the keyword shortcut. Shift+K (keyword.toggleShortcut) adds the
keywords to the selected photos, or removes them when every selected
photo has them all. The help pages do not say what Shift+K does when
only some selected photos have the keywords; adding them unless every
photo has them all is LightCraft's own rule. A photo's context menu
offers Add Keyword with the keyword shortcut's keywords.

The keyword shortcut is a mark on its keywords in the catalog's keyword
list (KeywordInfo::keyword_shortcut), as Put New Keywords Inside This
Keyword is: a new name is listed, the mark moves with a renamed, moved
or merged keyword and goes with a deleted one, and setting it
(keyword.setShortcut) is one undo step.

The new labels have rows in every catalog. The KEYC-METADATA and
LRC-LIB-KEYWORDS rows, docs/ui-parity.md and docs/library-shortcuts.md
list the keys.
2026-10-25 13:44:28 -07:00
dotCooCoo 2ff14c9828 Merge main into feat/enable-painting-key 2026-10-25 08:36:21 -07:00
aiongg 77196373a9 Merge PR #2870: KEYC-METADATA: Cmd+K / Ctrl+K puts the cursor in the Add keyword box 2026-10-25 02:24:29 +00:00
dotCooCoo e3102ab2e5 KEYC-METADATA: Cmd+Shift+K / Ctrl+Shift+K edits the keyword picked in the Keyword List
Lightroom Classic's keyboard shortcut page lists Command+Shift+K
(Ctrl+Shift+K on Windows) for Edit keywords, and its keyword help page
describes editing a keyword in Edit Keyword Tag from the Keyword List.
LightCraft had no key for it.

Edit Keywords (panel.editKeywords, Cmd+Shift+K) shows the Keywords
panel, opens its Keyword List when it is folded shut, and opens the
keyword picked in the list in Edit Keyword Tag. With no keyword picked,
or with the picked keyword deleted, it opens no dialog.

The command label has a row in every catalog. The KEYC-METADATA row,
docs/ui-parity.md and docs/library-shortcuts.md list the key. The
KEYC-METADATA row also lists the existing Alt+1 to Alt+9 keyword set
keys in place of "no keyword sets".
2026-10-24 19:24:23 -07:00
aiongg 122859d269 Merge PR #2846: KEYC-METADATA: Alt+0 / Alt+Shift+0 go to the next / previous keyword set 2026-10-25 02:24:03 +00:00
dotCooCoo beb42abb25 KEYC-METADATA: Cmd+K / Ctrl+K puts the cursor in the Add keyword box
Lightroom Classic's keyboard shortcut page lists Command+K (Ctrl+K on
Windows) for Add keywords. LightCraft had no key for it.

Add Keywords (panel.addKeywords, Cmd+K) shows the Keywords panel,
opens its Keywording section when it is folded shut, and puts the
cursor in the Add keyword box, so the next keywords typed go to the
selected photos. Pressed again, it leaves the panel open. With no photo
selected the panel shows its note, and selecting photos later does not
move the cursor into the box.

The command label has a row in every catalog. The KEYC-METADATA row,
docs/ui-parity.md and docs/library-shortcuts.md list the key. The
KEYC-METADATA row also lists the existing Alt+1 to Alt+9 keyword set
keys in place of "no keyword sets".
2026-10-24 16:48:57 -07:00
dotCooCoo 105dfa84d9 KEYC-METADATA: Cmd+Alt+K / Ctrl+Alt+K turns on keyword painting
Lightroom Classic's keyboard shortcut page lists Command+Option+K
(Ctrl+Alt+K on Windows) for Enable painting; LightCraft had no key for
it, and painting started only from the Keywords panel's painter box
(Paint, or Return in the box).
Photo > Enable Painting (tool.enablePainting, Cmd+Alt+K) paints the
keyword typed in the painter box. Pressed again while painting, it
stops painting, as Esc does. With the box empty it opens the Keywords
panel and asks for a keyword to paint.

The painter box's text is kept in the UI state (keyword_painter_text)
instead of egui's temporary data, so the command can read it, and the
box shows the keyword that tool.keywordPainter paints.

The command label and the new message have rows in every catalog. The
KEYC-METADATA and LRC-LIB-KEYWORDS rows, docs/ui-parity.md and
docs/library-shortcuts.md list the key.
2026-10-24 15:04:57 -07:00
dotCooCoo b572dee19f KEYC-METADATA: Alt+0 / Alt+Shift+0 go to the next / previous keyword set
Lightroom Classic's keyboard shortcut page lists Option+0 / Option+Shift+0
(Alt+0 / Alt+Shift+0 on Windows) for cycling forward and backward through
the keyword sets; LightCraft had no key or command for it. Next Keyword
Set (keyword.nextSet, Alt+0) and Previous Keyword Set
(keyword.previousSet, Alt+Shift+0) make the set after or before the
current one current, in the Keyword Set menu's order: Recent Keywords,
then the saved sets. The keys wrap around at either end, and Alt+1 to
Alt+9 then apply the new set's keywords.

The two command labels have rows in every catalog. The KEYC-METADATA and
LRC-LIB-KEYWORDS rows, docs/ui-parity.md and docs/library-shortcuts.md
list the keys.
2026-10-24 12:55:46 -07:00
dotCooCoo cc557e189d KEYC-METADATA: Cmd+Alt+Shift+C / V copy and paste metadata
Copy Metadata and Paste Metadata had no shortcut. They now use
Cmd+Option+Shift+C and Cmd+Option+Shift+V on macOS and
Ctrl+Alt+Shift+C and Ctrl+Alt+Shift+V on Windows and Linux, the keys
Lightroom Classic's keyboard shortcut page lists for copying and
pasting metadata in the Library module. Both keys also work when
Windows and Linux deliver them as clipboard events. The KEYC-METADATA
row now lists the keys LightCraft binds (Cmd+S, the two new keys and
Alt+1 to Alt+9 for keyword sets) and every other key of that table
that is still missing. Gap 28 in docs/gaps.md and the Library keys in
docs/ui-parity.md list the two new keys.
2026-10-24 09:13:54 -07:00
helgehelge123andClaude Opus 5.5 abf0caf201 KEY-TOGGLEZOOM: hold Space over a tool to pan and click-zoom (#1895)
With Crop, Masking, Remove, Red Eye or a picker on the photo, a held
Space lends the pointer to the view until the key is up, as Lightroom's
temporary Hand / Zoom: a click zooms to the click-zoom ratio at the
point clicked (or back to Fit), a drag pans the zoomed photo, and the
tool gets neither. A tap (under 0.4 s, no click) still toggles the zoom,
on its release. Space's auto-repeat no longer toggles the zoom again.

ui.key takes action press|down|up so a script can hold a key over a
ui.pointer drag.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-24 16:08:51 +02:00
francoisgnandClaude Opus 5.5 144d900c21 Merge upstream/main (integration batch 43, #2729, #2737, #2412) into round3a-integration
Conflicts:
- apps/lightcraft/src/native_menu.rs: upstream's item swapping (macOS keys
  given up for real, Help menu not swapped, Settings / Quit tracked) with
  KEY-GRID's keymap-aware rows. `Item.label` stays the text the row shows
  (native_item_presentation), so `Item::native_label` reuses it instead of
  formatting it again; Settings / Quit store theirs through
  display_item_label, as upstream's native_label did. No early return after
  a rebuild (upstream).
- crates/ui-egui/src/i18n.rs: upstream's tests (#2729: one test per check
  across languages, gaps reported, never a failure) plus the batch's two new
  ones (dropped-photos notice, Polish counts); production code as merged.
- grid.rs, keyword_list.rs, masking.rs: the translation tests #2729 removed
  stay removed; the batch's new keyword and segmenter tests stay.
- cmd/library.rs, ui-egui/src/lib.rs: both test modules, each with its
  #[cfg(test)].
- xtask/src/main.rs: #2302's test_selected and upstream's translation_gaps.
- docs: tracker / gap rows take both sides' edits, headers list both sides'
  changes, history rows of both sides newest-first. What's New: one section
  per date, newest first (the batch had 10-22 above 10-23, and second 10-21
  and 10-19 sections); no line lost.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-24 02:26:48 +03:00
Brandon Thomas 4d9914d4db Merge PR #2709 2026-10-23 17:21:16 -04:00
francoisgnandClaude Opus 5.5 f74178cdae Merge upstream/main (#2710 one test binary per crate, #2713) into round3a-integration
Conflicts:
- xtask/src/main.rs: upstream's runners (cargo test or nextest, no
  examples, doctests apart, one wasm `cargo check --keep-going`) with
  #2302's `ci --quick` on top: test_selected builds the same targets
  (--lib --bins --tests), the wasm check takes the changed crates in one
  call, the full test step is upstream's.
- apps/lightcraft/src/control_server.rs: upstream's `before` closure, with
  the batch's no-delay sockets kept.
- docs/parity-checklist.md: LR-BEHAV-ACCESS from main (tests/it path),
  LR-BEHAV-LOCALE / LR-BEHAV-LOCALIZE from the batch (Polish).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-23 21:06:33 +03:00
aiongg f3bb7a9f30 CI: one test binary per crate, line tables only, one WASM check (#2710)
* CI: dev profile keeps line tables for workspace crates and no debug info for dependencies

* Control server tests: persistent_requests_and_slow_replies_outlive_the_idle_read_timeout no longer races the idle timeout

Each request (and the closing half-shutdown) reaches the socket before the
worker reads, so on a slow machine only the reply waits outlast the 100 ms
idle timeout, as the test intends. The idle test sends its input the same
way, and the no-frames test allows 5 s instead of 2 s to give up.

* CI: one integration-test binary per crate

Each crate's tests/*.rs become modules of tests/it/main.rs (51 test files
into 13 binaries, plus 6 that stay their own). Inner #![cfg] attributes
move to the mod lines. Files that change state for the whole process keep
a binary of their own: codecs jxl_tail_heap and raw sr2_heap (dhat global
allocator), gpu shutdown, shutdown_first and memory, ui-egui shutdown.
Docs, comments and the GPU probe name the new paths and targets
(--test it <module>::); the CI report names an it binary's skips after
the crate.

* CI: tests under nextest, doctests apart, one wasm check

xtask ci runs the tests with cargo nextest run --lib --bins --tests when
cargo-nextest is installed, else cargo test with the same targets and a
one-line notice; doctests run after them with cargo test --workspace --doc.
The heif and hardware GPU steps use the same runner. Examples stay out of
the test build (clippy --all-targets still checks them). Concurrent tests
under nextest follow the RUST_TEST_THREADS cap (NEXTEST_TEST_THREADS).
The wasm check is one cargo check --keep-going over the same crates, and
clippy runs with --keep-going.

* CI: tests run under cargo test by default, nextest with LIGHTCRAFT_NEXTEST=1 (per-process scene cache)
2026-10-23 13:34:30 -04:00
Marco Arnulfo 6c55a76e95 LR-LIB-FILTER: Cmd+L / Ctrl+L (View > Enable Filters) switches the library filter off and on again as it was 2026-10-23 17:38:34 +02:00
francoisgn b32b4383f5 Merge PR #1074: LR-VIEW-ZOOM: diagnostic overlays render zoom windows; soft
# Conflicts:
#	docs/gaps.md
#	docs/parity-checklist.md
#	docs/ui-parity.md
2026-10-22 22:28:28 +03:00
aiongg 727e66babe Merge track r2-t03 into next
# Conflicts:
#	docs/gaps.md
#	docs/parity-checklist.md
#	docs/ui-parity.md
#	docs/whats-new.md
2026-10-22 02:53:00 +00:00
aiongg d158d75b59 Merge PR #1917: KEYC-RATING: backslash shows and hides the Filter Bar in the grids
docs/parity-checklist.md: header and revision rows from both sides

docs/ui-parity.md: header keeps the newer dates and both change notes
2026-10-22 02:40:33 +00:00
aiongg d27b56447b Merge PR #2454: KEYC-PANELS: F8 shows and hides the right panel
docs/parity-checklist.md: header and generated summary from HEAD (summary is regenerated later); both revision rows, newest first.
2026-10-22 02:38:23 +00:00
Haocheng FangandClaude Opus 5.5 bb5d68978b LRC-LIB-REFVIEW: refuse malformed and deleted references clearly; release a dead pane
Review follow-ups for the Reference lifecycle fix:
- photo.setReference refuses an id that is not a photo id instead of
  pinning the active photo; only an absent or null id means the active one.
- A Recently Deleted photo is refused with a message that says to restore
  it (setReference and view.reference); the grid menu item is disabled for
  it and any refusal is shown as a toast, not dropped.
- Reference view with no live pin releases its panes (windows, region and
  pane textures, full capacity) like other views.
- A successful library switch leaves Reference for the grid; the Compare
  pair is now cleared only on success, like the reference pin.
- One compare::live helper replaces four copies of the "exists and not
  deleted" check.
- whats-new entry moved to 2026-10-21; checklist and ui-parity dates bumped.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-21 13:31:05 -05:00
skybluu ad0b27c036 LRC-LIB-REFVIEW: fix Escape and catalog-local reference pins 2026-10-21 12:35:33 -05:00
Bruno-Alumn 7ab5b150f3 KEYC-PANELS: F8 shows and hides the right panel
Lightroom Classic's F8 hides the right panel; F6 and F7 (filmstrip, left
panel) were bound but F8 did nothing. View > Right Panel (view.rightPanel,
F8 as a secondary key like F6 / F7) hides the right panel and shows the
same one again next time, or Edit when none was hidden. Hiding a tool
ends it, as closing its panel does.

Gap 28 listed rating [ ], flag cycling and F1 help as missing; they are
bound, so the entry now lists only filter-bar keys, Tab / Shift+Tab and F5.
2026-10-21 00:39:53 +00:00
Andrew FrahnandClaude Sonnet 5.5 6b4c192195 Strict proof equivalence check without warnings, tolerant warned count; fix zoom docs
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-10-20 12:06:07 +11:00
Andrew FrahnandClaude Sonnet 5.5 131de8cccd Merge upstream/main into pr/overlay-windows (#1027 landed)
GPU handles(): only output-device proofs stay on the CPU; Show All Masks now renders zoom windows (upstream); proof-boundary tolerance in the GPU equivalence test; device-profile draft test.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-10-20 10:57:07 +11:00
Marco Arnulfo d5de74f6cd KEYC-RATING: backslash shows and hides the Filter Bar in the grids 2026-10-18 19:05:05 +02:00
Martin KurnothandClaude Fable 5.1 0f819854c0 Context menus: a right-click elsewhere on the same widget moves its open menu (#1877)
A right-click on a photo (or any widget) while its own context menu was open
flashed the menu at the new spot and closed it again on the same frame. egui's
`Popup::show` judges "was open last frame" by the popup's id, so the click that
reopened the menu at the pointer also counted as a click while open and closed
it under `CloseOnClick`. A right-click on a different widget was fine.

`widgets::context_menu` wraps `Popup::context_menu` and ignores clicks on the
frame of the right-click that opens or moves the menu; every context menu
(30 sites) goes through it, and `TextField` applies the same rule to its
close-on-click-outside menu (`widgets::context_menu_close`).

Tests: `right_clicking_elsewhere_moves_the_context_menu` (headless grid; failed
at the second frame before the fix) and `right_clicking_again_moves_the_menu`
(text field). docs/ui-parity.md: Context menus row and revision history.

Fixes #1877

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-10-15 20:01:23 +02:00
Brandon Thomas 5e9f7f1a65 Merge PR #1027 (rebased)
# Conflicts:
#	ROADMAP.md
#	docs/gaps.md
#	docs/parity-checklist.md
#	docs/target-app-parity.md
2026-10-15 03:40:37 -04:00
Brandon ThomasandClaude Opus 5.5 1d7699056e Merge PR #1027
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-15 03:36:18 -04:00
Brandon ThomasandClaude Opus 5.5 851aedc64d Batch 36: tests and tracker after the merges
- Visualize HDR (#1555) has no default key: ⇧H cycles the Tool Overlay (#1473, issue #224)
- CR3 tests (#1461, #1462) accept adaptive QP 131–175, as #1694 decodes; cr3.md says the R6 Mark II files decode
- English fallbacks in the Czech and Polish catalogs use → for the menu triangle; Polish in the keyword-label test
- canvas handle tests show pins (Tool Overlay Always); a focused handle keeps its pins shown in Auto
- the model-install test and demo deadlock guards wait on deadlines long enough for a busy machine

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-14 23:25:29 -04:00
Brandon Thomas 4d4a537079 Merge PR #1555
# Conflicts:
#	docs/gaps.md
#	docs/library-shortcuts.md
#	docs/parity-checklist.md
#	docs/ui-parity.md
2026-10-14 22:33:11 -04:00
Brandon Thomas 56cff6b11c Merge PR #1491
# Conflicts:
#	crates/ui-egui/src/menus.rs
#	docs/parity-checklist.md
#	docs/ui-parity.md
2026-10-14 22:33:08 -04:00
Brandon Thomas 18db8588b9 Merge PR #1490
# Conflicts:
#	docs/parity-checklist.md
#	docs/ui-parity.md
2026-10-14 22:32:25 -04:00
Brandon Thomas 5d1fade3d0 Merge PR #1473
# Conflicts:
#	crates/ui-egui/src/menubar.rs
#	docs/parity-checklist.md
#	docs/ui-parity.md
2026-10-14 22:32:17 -04:00
Fabio Lussi 1a8b27c3df Merge remote-tracking branch 'origin/main' into lc-937
# Conflicts:
#	crates/gpu/src/render.rs
#	crates/pipeline/src/spots.rs
#	crates/pipeline/src/visualize.rs
#	crates/ui-egui/src/panels/detail.rs
#	crates/ui-egui/src/tests_panels.rs
#	docs/parity-checklist.md
#	docs/ui-parity.md
2026-10-13 23:39:22 +02:00
Andrew FrahnandClaude Opus 5.5 c594c7fdc1 Merge pr/zoom-detail into pr/overlay-windows
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
2026-10-14 08:03:06 +11:00
Andrew FrahnandClaude Opus 5.5 80a8acaa30 Merge upstream/main into pr/zoom-detail
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
2026-10-14 07:52:45 +11:00
eliets2 939d422ff6 Docs: grid navigation keys, Cmd+O and Shift+H
Describe the new keys in the library shortcuts page, update the rows they
touch in the parity checklist and the UI parity page, and stop listing F6
and F7 as missing in the small-shortcuts gap now that they are bound.
2026-10-13 15:16:51 +03:00
Atmik Shetty 25e832b404 KEYC-COMPARE: = and - make the grid thumbnails larger and smaller
View ▸ Increase / Decrease Grid Thumbnail Size (view.thumbSizeUp / view.thumbSizeDown)
step the bottom-bar slider by 30 pt within its 90–480 range in Photo Grid, Square
Grid and People, as Lightroom Classic's Library Grid keys do; + also enlarges.
Detail, Compare, Survey and Reference ignore the keys, text fields keep them, and
⌘= / ⌘− still zoom the photo. The slider's range is now shared constants.
2026-10-13 16:11:47 +05:30