Add the Identity screen

A third top-level screen beside the library and develop, because naming a
cluster and pulling a stranger out of it are tasks with their own rhythm
and need the whole window.

The screen is designed around the clustering being wrong, which is
FR-CULL-10 rather than pessimism: grouping over-merges on siblings, on
parents and children, and on the same person a decade apart. So Split off
sits next to Confirm all rather than behind a menu, the confirm/reject
pair is on the face itself, and a group the system found is drawn
differently from a person the user has vouched for.

Splitting rejects before it confirms. Without that the next clustering
pass suggests the face straight back and the user's correction becomes an
argument they keep having.

Face crops come from the proxies the grid already built, one decode per
image rather than per face -- a group photograph holding six faces of one
family is one JPEG.

Where the calibration is not fitted the screen says confidence is
unavailable instead of printing a percentage that looks measured, which
is FR-CULL-9's rule at the point it becomes visible.

The verdict controls use drawn icons, not tick and cross characters:
ui/icons.slint exists because those render as tofu on Android.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-08-26 21:05:41 +02:00
co-authored by Claude Opus 5
parent 2ac069a6b3
commit 10b10569e2
8 changed files with 1647 additions and 42 deletions
+12
View File
@@ -866,6 +866,7 @@ component HeaderActions inherits HorizontalLayout {
callback rescan();
callback open-import();
callback open-settings();
callback open-people();
spacing: Theme.gap;
@@ -1016,6 +1017,14 @@ component HeaderActions inherits HorizontalLayout {
clicked => { root.open-import(); }
}
// A library action rather than a setting, so it sits with the others and
// ahead of Settings, which the comment below keeps last.
Button {
text: "People";
y: root.centred ? (root.row-height - self.height) / 2 : 0;
clicked => { root.open-people(); }
}
// Last in the row, and unconditional. The buttons before it come and go
// with what the grid is showing; settings is always reachable, and a
// control that moved as its neighbours appeared would be hunted for each
@@ -1165,6 +1174,7 @@ export component LibraryGrid inherits Rectangle {
callback open-import();
callback open-settings();
callback open-people();
// --- selection and drag ---
//
@@ -1701,6 +1711,7 @@ export component LibraryGrid inherits Rectangle {
rescan => { root.rescan(); }
open-import => { root.open-import(); }
open-settings => { root.open-settings(); }
open-people => { root.open-people(); }
}
// Compact: one button in place of six. Labelled rather than a
@@ -1785,6 +1796,7 @@ export component LibraryGrid inherits Rectangle {
rescan => { root.rescan(); }
open-import => { root.open-import(); }
open-settings => { root.open-settings(); }
open-people => { root.open-people(); }
}
}
}