Remember where the photographer was
Opening the application was always a fresh arrival at the beginning of the library, whatever you had been doing when you closed it. What is written down is the view, the scope, the rating filter and the photograph on screen -- the open one in develop, the first visible one in the grid. Not just a scroll position: a position without the filter that produced it names a row of a list that no longer exists. Restoring them has an order for the same reason -- scope, then filter, then position, then the view -- because each step changes what an ordinal *means*. Addressed by remote path and collection UUID, never by an ordinal or a row id. `images.id` and `collections.id` are local to one catalog, and a grid ordinal is local to one ordering; a record naming either would land somewhere arbitrary on a second device and after any filter change on this one. Where the ordinal is needed, `library::ordinal_of_path` computes it through the grid's own `ORDER BY`, taken verbatim by a window function rather than spelled a second time as an inequality -- which is the mistake `grid_order_for` already warns about, and which a manually ordered collection would make unreadable. Every failure degrades rather than reports. A collection this device has not merged leaves the scope at the whole library; a photograph that has since been deleted falls back to when it was taken, which puts the grid in the right week; a torn file yields no place and the library opens at the top. Reopening develop is the one thing that requires an exact match, because a canvas on a path that no longer resolves is a filename over an empty frame. The record lives in `dr-types` beside `Settings` and the store lives here beside `SettingsStore`, for the reason `dr-types`' manifest gives: a JSON serialiser in `core/` would be paid for by every crate there. Two files and two lifetimes, though -- resetting preferences must not forget where you were. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -540,6 +540,30 @@ gradient placement, brush strokes (`WidgetKind` in FR-DEV-3a) — size their int
|
||||
the active modality while rendering identically. A crop handle drawn at 8px may carry a 44pt touch
|
||||
region.
|
||||
|
||||
**FR-UI-8 — Resumed place.** The application shall remember where the photographer was and return
|
||||
them to it. "Where" is the view (grid or develop), the scope (whole library, a collection, or the
|
||||
trash), the rating filter narrowing it, and the photograph on screen — the open one in develop, the
|
||||
first visible one in the grid. It shall be restored on launch, and preserved across every transition
|
||||
between screens within a session: leaving the grid for Settings, Import, People or the develop view
|
||||
and returning shall land where it was left, never at the top of the library.
|
||||
|
||||
*A place is addressed by what every device agrees on.* The photograph by its remote path, the
|
||||
collection by its UUID; never by a grid ordinal, `images.id` or `collections.id`, all of which are
|
||||
local to one catalog and to one ordering. Where the ordinal is needed it shall be computed through
|
||||
the same ordering the grid draws with, so that a restored position names the photograph the
|
||||
photographer actually left. Capture time is the permitted fallback when the photograph is gone.
|
||||
|
||||
*A place travels.* One record per library is exchanged through the same derived folder as the
|
||||
thumbnail shards and the catalog snapshot (FR-NC-3), so that a session begun on one device can be
|
||||
continued on another. The newer of two records wins; there is nothing to merge, because two devices
|
||||
cannot both be where the photographer is.
|
||||
|
||||
*And it is always advisory.* A place that cannot be read, names a collection this device has not
|
||||
merged, or points at a photograph that has since been deleted shall degrade to the nearest sensible
|
||||
position and never to an error, an empty view, or a refusal to start. A record arriving from another
|
||||
device shall not be applied once the photographer has begun working in this session — it is a
|
||||
handover, not an interruption.
|
||||
|
||||
### 3.6 Export
|
||||
|
||||
**FR-EXP-1 — Formats.** Export to JPEG, PNG, and TIFF (8 and 16-bit). Quality, chroma subsampling,
|
||||
|
||||
Reference in New Issue
Block a user