Commit Graph
3227 Commits
Author SHA1 Message Date
aiongg d598092f6a Merge PR #2349: LRC-LIB-LIBFOLDERS: the sidebar trees narrow their indent step before names are cut (#2298)
docs/parity-checklist.md: header and revision rows from both sides
2026-10-22 02:40:59 +00:00
aiongg b05bb535e6 Merge PR #2271: Analyse a photo listed twice once in Assisted Culling 2026-10-22 02:40:53 +00:00
aiongg 61ad2ff853 Merge PR #2054: LR-VIEW-PHOTOGRID: the grid reads only the photos an import batch or an edit touched
crates/ui-egui/src/tests_grid.rs: both sides' tests

docs/whats-new.md: both entries under one 2026-10-16 heading

docs/parity-checklist.md: header and revision rows from both sides
2026-10-22 02:40:53 +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 792b2517e5 Merge PR #1468: Issue #1449: Search Photos finds named people, and quotes keep a name together (steps 1 and 2) 2026-10-22 02:40:15 +00:00
aiongg df319373cc Merge PR #2450: LRC-LIB-COMPARE: the Info panel labels the active photo while culling…
crates/ui-egui/src/tests_compare.rs: both sides' tests

docs/parity-checklist.md: header and revision rows from both sides
2026-10-22 02:40:11 +00:00
aiongg d0583f77ee Merge PR #1173: LRC-LIB-REFVIEW: fix Escape and catalog-local reference lifecycle
docs/parity-checklist.md: header and revision rows from both sides
2026-10-22 02:39:58 +00:00
aiongg fdb93026b4 Merge PR #2456: Fix/strict ids params 2026-10-22 02:39:38 +00:00
aiongg b81b6d9f3d Merge PR #2300: LR-LIB-STACK: the filmstrip stack badge expands/collapses the stack; badges work on unselected stacks
crates/ui-egui/src/panels/grid.rs: badge keeps main's double-click guard and calls #2300's toggle_stack

crates/ui-egui/src/tests_grid.rs: both sides' badge tests

docs/parity-checklist.md: header and revision rows from both sides; rows take both changes
2026-10-22 02:39:32 +00:00
aiongg 9d9df1cbe2 Integration: #2304 use Renderer.requests from #1913 in place of request_ids 2026-10-22 02:39:00 +00:00
aiongg 0c659d5576 Merge PR #2304: LR-VIEW-PHOTOGRID: preserve embedded previews through priority changes and Undo 2026-10-22 02:38:46 +00:00
aiongg 72c34a1673 Merge PR #1913: fix(render): identify source files in render-failure logs 2026-10-22 02:38:45 +00:00
aiongg a4335731aa Merge PR #1965: LRC-DEV-VIEWOPTIONS: View Options (Cmd+J) chooses the lines of the loupe's Info 1 and Info 2
crates/ui-egui/src/panels/detail.rs: #2317's split (info_overlay / info_overlay_lines / info_overlay_extent) kept; info_overlay_lines builds its lines from #1965's View Options fields (info_line) and returns None when off or when no line is left

crates/ui-egui/src/panels/dialogs.rs: only_shows keeps Dialog::ViewOptions and the up-to-date Synchronize Folder case

crates/ui-egui/locales/it.json: union of keys
2026-10-22 02:38:41 +00:00
aiongg feaf1aa5bb Merge PR #2317: #2267: the Before label stays in view when zoomed in (stacked on #2274)
crates/ui-egui/src/tests_zoom.rs: both new Before-label tests, with #1968's comment wording on the crop test

docs/whats-new.md: both entries under 2026-10-19
2026-10-22 02:37:40 +00:00
aiongg 51bf538f27 Merge PR #1968: crop.set refuses a crop smaller than the crop tool allows, instead of exporting 1×1 2026-10-22 02:37:19 +00:00
aiongg 166380630b Merge PR #2366: LRC-LIB-LIBFOLDERS: Synchronize Folder says a folder is up to date, with one Close
docs/parity-checklist.md: header and revision rows from both sides; LRC-LIB-LIBFOLDERS row takes both wording changes
2026-10-22 02:37:19 +00:00
aiongg 214c595794 Merge PR #2049: LRC-LIB-LIBFOLDERS: Synchronize Folder says it is listing the folder instead of sitting at "0 of N" 2026-10-22 02:36:15 +00:00
Dylan M. Taylor bfb23db2ca Use chrono instead of hand-rolled UTC conversion (#2457)
* Use chrono for UTC/calendar conversion instead of hand-rolled copies

Replaces the hand-rolled Howard Hinnant civil/days-from-civil copies and the
leap-year/days-in-month table with chrono as a workspace dependency:
- apps/lightcraft/src/logging.rs: timestamp (log line time)
- crates/catalog/src/dates.rs: civil + weekday
- crates/catalog/src/stacks.rs: iso_seconds (date -> seconds)
- crates/engine/src/cmd/face_recognize.rs: capture_secs (native only)
- crates/meta/src/datetime.rs: DateTime::unix_seconds and the valid() day check
Output formats and semantics are unchanged (pre-epoch clamp, day rollover that
normalize_iso relies on, leap-second tolerance, EXIF/XMP parsing). chrono uses
only std, so wasm stays safe. AGENTS.md/CLAUDE.md now say time goes through chrono.

Follow-up to storytold/cadcraft#1785

* Never panic on a clock outside chrono's range; keep 5-digit years unprefixed

chrono's From<SystemTime> unwraps, so a clock past year 262143 panicked
inside the logger. timestamp now uses the fallible DateTime::from_timestamp
and reads such a clock as the epoch, keeping the old pre-epoch clamp.

timestamp and catalog's civil write years past 9999 with {:04} like the old
{y:04} did, because %Y would add a '+'. Tests cover the out-of-range and
5-digit-year cases.

* Don't build an unrepresentable SystemTime in the far-future test

UNIX_EPOCH + Duration::from_secs(u64::MAX / 2) overflows Windows'
SystemTime and panicked before timestamp() ran, failing the Windows
test job. Build it with checked_add and only assert where it exists.

* time: preserve old out-of-range date conversion (no epoch fallback)

`DateTime::from_timestamp(...).unwrap_or_default()` silently reset any instant
past chrono's year range to 1970-01-01, changing output the old hand-rolled
Howard-Hinnant code converted exactly (e.g. 10_000_000_000_000 s was
318857-05-20 17:46:40, not the epoch). Restore the old conversion domain with a
cycle-based helper that routes the calendar through chrono (the calendar
repeats every 400 years = 146_097 days, so month/day/time come from chrono and
only the year is carried in i128, keeping every i64 exact).

- apps/lightcraft/src/logging.rs: `timestamp` via `utc_parts`; keep the
  pre-1970 epoch clamp; u64 secs past i64::MAX saturate, not epoch.
- crates/catalog/src/dates.rs: `civil` cycle-based (the callers stay inside
  0000-9999, but a far clock no longer resets to the epoch).

Pinned old outputs in tests:
  logging u64::MAX/2 s -> 292277026596-12-04T15:30:07.000Z (was epoch),
          10_000_000_000_000 s -> 318857-05-20T17:46:40.000Z
  civil 10_000_000_000_000 -> 318857-05-20T17:46:40,
        -10_000_000_000_000 -> -314918-08-13T06:13:20, i64 extremes

* Don't build a year-318857 SystemTime unchecked in the logging test

Windows' SystemTime only reaches about year 30828, so
UNIX_EPOCH + Duration::from_secs(10_000_000_000_000) panicked before
timestamp() ran and failed the Windows test job. Build it with
checked_add and assert where the platform can hold it. The year-10000
case fits everywhere and stays unconditional.

* Name the 400-year range extension as the one exception to the time rule

The rule said never to hand-roll calendar math, but the range fix
(shifting by whole 400-year Gregorian cycles so dates past chrono's year
range keep their old output) is cycle arithmetic, so the rule and the code
disagreed. The rule now names that exception: the library still computes
month, day and time, and only whole cycles are carried in the year.

* Say the library computes month and day; time-of-day is plain arithmetic

Narrows the range-extension wording: the date library computes the
calendar fields, and splitting seconds into hours, minutes and seconds
is ordinary arithmetic, which is what the code does.
2026-10-21 19:36:36 -04:00
Dylan M. Taylor d79b1f33e3 security: enforce HTTPS on curl downloads (SonarCloud S6506) (#2493)
Add --proto '=https' to curl invocations so redirects cannot downgrade to
plaintext HTTP. Resolves SonarCloud S6506 (shell/docker/githubactions).
2026-10-21 19:35:59 -04:00
Bruno-Alumn f32116bee1 Merge remote-tracking branch 'upstream/main' into fix/strict-ids-params
# Conflicts:
#	crates/engine/src/cmd/mask_effects.rs
#	crates/engine/src/cmd/masks.rs
#	crates/ui-egui/src/control.rs
2026-10-21 22:48:03 +00:00
Bruno-Alumn c733daf1c2 Merge remote-tracking branch 'upstream/main' into fix/cull-color-label
# Conflicts:
#	docs/parity-checklist.md
2026-10-21 22:42:17 +00:00
Dylan M. Taylor 3dc3b955df ci: add sonar-project.properties for CI-based analysis
Marks the project ineligible for SonarCloud Automatic Analysis, resolving the
CI-vs-automatic-analysis conflict so the SonarCloud workflow succeeds.
2026-10-21 16:00:43 -04:00
Claude bfe3ab3d58 #2267: the Before label sits below the info overlay too
Review follow-up (CodeRabbit): zoomed in, the badge moves to the canvas'
top-left corner, where the info overlay draws its lines; with the overlay
on, the label was painted under its first line. The badge's top inset
now takes the overlay's extent as well as the filter pill's. The overlay
is split into its lines and an extent helper, laid out with the same
fonts, so the two can't disagree.

Test: zoomed_in_the_before_label_keeps_clear_of_the_info_overlay.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01AbegtYaPuwqZ81pGfELsFK
2026-10-21 19:50:05 +00:00
Dylan M. Taylor 511908ab06 ci: add SonarCloud scan via shared reusable workflow
Calls storytold/craft-common-actions/.github/workflows/sonarcloud.yml@main
with secrets: inherit. Adds SonarCloud badge to README where missing and
removes the redundant sonar-project.properties (config now passed by the
reusable workflow).
2026-10-21 15:47:01 -04:00
Haocheng FangandClaude Opus 5.5 33585c93ef LRC-LIB-REFVIEW: release both Reference panes when the pin is not live
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-21 13:40:24 -05: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
Nathaniel Ledford 9116cc1615 docs: one 2026-10-19 heading in What's New 2026-10-21 14:29:53 -04:00
Haocheng FangandClaude Opus 5.5 6318364ce7 #323: keep the default_is_automatic regression test
The PR branch dropped it along with the PREVIEW_LIMITS import; nothing
here changes the default preview limit.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-21 13:16:29 -05:00
Brandon Thomas ec0cda9a6f Merge pull request #2486 from storytold/release-0.11.0
Release 0.11.0
v0.11.0
2026-10-21 14:05:52 -04:00
Brandon ThomasandClaude Opus 5.5 79d916c149 Release 0.11.0
The web release now builds with craft-fonts too (web-craft-fonts), as VectorCraft's
does, so the published web app ships the Chinese and Japanese faces docs/releasing.md
promises.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-21 14:05:43 -04:00
skybluu ad0b27c036 LRC-LIB-REFVIEW: fix Escape and catalog-local reference pins 2026-10-21 12:35:33 -05:00
Claude 1df76a12da Merge upstream main into fix/issue-2267-before-label-in-view
#2274 landed with #2470; What's New keeps both entries.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01AbegtYaPuwqZ81pGfELsFK
2026-10-21 17:25:17 +00:00
Nathaniel LedfordandClaude Opus 5.5 53ee38431d LR-VIEW-PHOTOGRID: follow test over five seeds; comment the mode switch and the names
The random-edit test now runs five seeds instead of one. A grid-mode change
re-reading every photo, and the group names growing unpruned, are now said in
the comments (the "a day or two at most" claim was wrong for capture-time edits).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-21 13:17:39 -04:00
Nathaniel LedfordandClaude d184b3ef50 LR-VIEW-PHOTOGRID: the grid reads only the photos an import batch or an edit touched
Every catalog change gave the grid a new list of photos, and it read every
photo of it again: each one's date group (a lookup, a date parse and a
string) and its cell's shape. At 180,000 photos that was a 100 ms frame for
every batch an import added.

- catalog: Catalog::date_runs is split into date_group (one photo's own
  group) and date_runs_of (the stack rule and the runs), which the grid
  uses too.
- ui: GridCache keeps what it read of each photo of the list, position by
  position. A new list that differs by the photos the catalog says an edit
  touched is read again only for those; anything else (another view,
  order or grouping, a stack) is read whole. The square grid reads no
  shapes. A 16-photo batch at 181,749 photos: 101 ms -> 7 ms.

Co-Authored-By: Claude <noreply@anthropic.com>
2026-10-21 13:17:39 -04:00
Nathaniel LedfordandClaude Opus 5.5 df1e6b4426 LRC-LIB-LIBFOLDERS: a scan cancelled while it goes through the files stops checking the cached probes against the disk
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-21 13:17:05 -04:00
Nathaniel LedfordandClaude Opus 5.5 fd7fbe59e4 LRC-LIB-LIBFOLDERS: a scan cancelled during its listing asks the disk nothing more
The cancelled result is never used, but scan_files still checked each listed file's cached probe against the file.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-21 13:17:05 -04:00
Nathaniel LedfordandClaude Opus 5.5 d1d3dbbb0e LRC-LIB-LIBFOLDERS: the sync module docs say the walk stops when the scan is cancelled
439ab04c2 fixed the checklist row but missed the module docs.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-21 13:17:05 -04:00
Nathaniel LedfordandClaude Opus 5.5 8ca082ba6a LRC-LIB-LIBFOLDERS: The docs say the walk for new files stops when the scan is cancelled
The module docs and the parity checklist still said it is not cancelled midway.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-21 13:17:05 -04:00
Nathaniel LedfordandClaude Opus 5.5 80fcab83b0 LRC-LIB-LIBFOLDERS: The listing row counts folders and files as labels, so one reads right
The row read "1 folders, 1 files"; it now reads "folders: 1, files: 1" (all 13 catalogs).
`listed` is stored with Release and loaded with Acquire, so a reader that sees the listing over also sees what was stored before it.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-21 13:17:05 -04:00
Nathaniel LedfordandClaude 3bb084762d LRC-LIB-LIBFOLDERS: Synchronize Folder says it is listing the folder instead of sitting at "0 of N"
The scan lists the whole folder tree before it checks a photo. On a large
folder on a network share that takes minutes, and the scan's row showed
"0 of 64085" with an empty bar all that while: it looked frozen. ✕ did
not stop the listing either.

- engine: SyncProgress counts the folders and files the walk listed and
  says when the listing is over; a folder note (walk::NoteFolder) now
  answers whether to go on, and a cancelled scan answers no.
- ui: while the folder is listed, the row has an indeterminate bar and
  reads "Listing folders: N folders, M files · folder" (all 13
  catalogs); the dialog says the same; then the photos checked are
  counted as before.

Co-Authored-By: Claude <noreply@anthropic.com>
2026-10-21 13:17:04 -04:00
Nathaniel LedfordandClaude 35cc05ef64 LRC-LIB-LIBFOLDERS: Synchronize Folder says a folder is up to date, with one Close
When the scan finds nothing to import, relink, remove or read, the dialog
showed four greyed choices (two still ticked) and a Synchronize button
that started an empty job with an activity row. It now shows the folder,
"The library is up to date with this folder." and any Skipped lines, with
one Close and no Cancel (`only_shows`). `sync::confirm` answers
`{"upToDate": true}` and starts nothing, so `ui.dialog.confirm` and agents
get the same result.

Co-Authored-By: Claude <noreply@anthropic.com>
2026-10-21 13:17:02 -04:00
helgehelge123 c631d4baed Merge branch 'main' of https://github.com/storytold/lightcraft into sidebar-adaptive-indent
# Conflicts:
#	docs/parity-checklist.md
2026-10-21 19:05:56 +02:00
aiongg e142e2ffa4 Merge PR #2470: integration of 43 reviewed PRs (round 1) 2026-10-21 12:59:32 -04:00
aiongg 22ae8bc9a8 Integration: #2280 drop a clone of the Copy crop in its test 2026-10-21 15:04:38 +00:00
aiongg 21903294bf Merge track r1-rawcat into next
crates/ui-egui/locales/{cs,it,pl}-formats.json: kept the translations and added the track's new keys.
docs/parity-checklist.md: newer header line; revision rows from both sides.
docs/whats-new.md: both tracks' 2026-10-15 entries.
2026-10-21 14:58:55 +00:00
aiongg 69fcc25535 Revert "Merge PR #995: LR-VIEW-CLIPPING: ⌥-drag previews for Blacks, Whites, Exposure, Sharpening and NR (#937)"
Held for the owner: #995 and #999 overlap, and #995's author offered on 10-12 to
close #995 once his commit was in #999. docs/parity-checklist.md: header keeps the
#1485 note and drops the #995 part.
2026-10-21 14:56:17 +00:00
aiongg a1455fa7cd Merge PR #1988: #1507: web start-up treats only NotFoundError as a missing file
apps/lightcraft-web/src/files.rs: keeps #1987's and #1988's tests
docs/whats-new.md: keeps both 2026-10-15 entries
2026-10-21 14:56:12 +00:00
aiongg e9e44643a5 Revert "Integration: #995 time drag drafts only while the GPU draws the view"
This reverts commit 5aa5c6681f.
2026-10-21 14:55:59 +00:00
aiongg 697d201e97 Merge PR #1987: #1508: web backup refuses to start while changes are unsaved 2026-10-21 14:55:55 +00:00
aiongg 047e9bb962 Integration: #1924 a fresh re-import keeps its own stem sidecar 2026-10-21 14:55:45 +00:00