Sync develop presets through the library

Presets were the one piece of the photographer's work that never left
the device: faces, sidecars, albums, collections, keywords and camera
profiles all travel with the sync pass, the preset library did not.

It now goes to <derived>/presets/library.drpl. PresetLibrary::merge
decides each name against the base the last exchange left (kept per
library beside place.json), so presets added on two devices both
survive, a deletion reaches the other device instead of being restored
by it, and an edit outlives a deletion made elsewhere. The upload is
If-Match / If-None-Match on the server's copy, and a 412 reads and
merges again, so two devices exchanging at once cannot save over each
other. A server copy that will not parse (a newer build's) is left
alone, and a local file that will not read stops the exchange rather
than being taken for an empty library.

The develop view's save merges with the file when the sync changed it
since the view read it, and a sync that brought presets reloads and
redraws the list.

Also corrects the register, which still said camera profiles do not
sync.
This commit is contained in:
2026-10-04 00:50:09 -04:00
parent 26e50ae723
commit 83f0461ce7
9 changed files with 597 additions and 55 deletions
+8 -1
View File
@@ -605,6 +605,12 @@ until deleted or renamed. Shipped and imported presets change only the operation
name, so a look applied to a corrected photograph keeps the correction; a copy or a saved
edit replaces everything in scope.
The user's presets sync between devices through each library they open, as one file beside the
camera profiles. Each name merges on its own against what the last exchange left both sides
holding, so presets added on two devices both survive, a deletion on one reaches the other rather
than being restored by it, and an edit outlives a deletion made elsewhere. The write is
conditional on the server's copy, so two devices exchanging at once cannot save over each other.
**FR-DEV-7 — Before/after.** Compare current edit state against the unedited original or against
a chosen history state.
@@ -2771,7 +2777,8 @@ every render path would have to remember to call it. They travel with the decode
matrix does.
*What it costs.* Every DNG with an embedded profile renders differently; previews refresh only when
rendered again; tablet and desktop release together. The profiles directory does not sync yet.
rendered again; tablet and desktop release together. The profiles directory syncs through the
library's derived folder (camera-profiles.md §13).
### D21 — DNG reference tone for raws · **DECIDED 2026-10-03**
File diff suppressed because one or more lines are too long