Three holes, all found by the gate catching itself out. **Prose that mentions the tag was read as a tag.** `dr-ui`'s module list carries a comment saying where the generated table comes from, and it names `GESTURE:` in passing; the scan extracted that sentence fragment as a gesture with no place and no way to perform it. A tag must now *open* its comment. A line that merely mentions it is describing the mechanism, not declaring a member of it, and position is the only thing that tells the two apart — which also makes the string-literal guard fall out for free rather than being a special case. **Neither artefact was regenerated on commit.** They cite line numbers, so they go stale on anything that moves a line — the sheet commit made the document wrong about every gesture in `library.slint` without touching a single one. The pre-commit hook that already keeps the matrix in step now keeps these too, and unlike the matrix it *fails* rather than shrugging when the scan does: a matrix that will not build leaves a stale one in place, where a malformed gesture block means a user about to be told the wrong thing. **CI did not check them at all.** It does now, blocking. The matrix is read; the gesture table is *shown to somebody using the application*, and a stale one tells them to perform a gesture that no longer exists — from which they will conclude the application is broken rather than the page. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
6.1 KiB
How the application is driven
Every entry here is extracted from the comment beside the code that implements it, so this file cannot describe a gesture the application does not have. Add one by writing a GESTURE: block next to the implementation; there is nowhere else to write it.
15 gestures, in 2 places.
People
Pull a face out of the wrong person
- Touch — Tap the faces that do not belong, then "Split off"
- Pointer — Click the faces that do not belong, then "Split off"
Grouping over-merges on siblings, on parents and children, and on the same person a decade apart, so splitting is as prominent as merging. A tool that can only merge makes its own errors permanent.
ui/dr-ui/ui/identity.slint:130
Rule on a suggested face
- Touch — Tick to confirm it, cross to reject it
- Pointer — Tick to confirm it, cross to reject it
A face is either the system's guess or the user's judgement, and the two are never conflated. A rejection is remembered, so the face is not suggested for that person again.
ui/dr-ui/ui/identity.slint:150
See a person's photographs
- Touch — Choose them in the rail, then "Show photos"
- Pointer — Choose them in the rail, then "Show photos"
This is the point of having identified anybody. Without it the screen is a filing cabinet with no drawer handles.
ui/dr-ui/ui/identity.slint:545
Change how faces are grouped
- Touch — "Grouping…", move the dials, then Regroup
- Pointer — "Grouping…", move the dials, then Regroup
The right match confidence is a property of your library, not of the model. "What would this do?" answers for this library without writing anything; names, confirmations and the groups you have set aside are kept whatever the dials say.
ui/dr-ui/ui/identity.slint:582
Library grid
Start selecting several photographs
- Touch — Press and hold a photograph, or press Select in the header
- Pointer — Ctrl-click, or press Select in the header
Touch has no ctrl, so without a mode there is no way to select a second photograph — the first tap would open it. The hold is the fast way in and the button is the one that can be found.
ui/dr-ui/ui/library.slint:1282
Add or remove one photograph
- Touch — While selecting, tap it
- Pointer — Ctrl-click it
While selecting, a tap never opens. That is the whole point of the mode: one meaning per gesture at a time. Press Done to get tap-to-open back.
ui/dr-ui/ui/library.slint:1291
Leave selecting
- Touch — Press Done in the header
- Pointer — Press Done in the header
- Keyboard — Escape
ui/dr-ui/ui/library.slint:1299
Select a range
- Touch — While selecting, press "Select to…", then tap the last photograph of the run
- Pointer — Shift-click the last photograph of the run
This replaced a double tap, which had no visible state and could take forty photographs by accident. The run is resolved by the catalog rather than by what is on screen, so the grid can scroll between the two taps — the ranges that hurt on a tablet are longer than a screenful, which is exactly where a finger sweep runs out.
ui/dr-ui/ui/library.slint:1360
Find photographs with two people in them
- Touch — Open the People chip on the filter bar, tap each name, then switch the chip beside them to "all of them"
- Pointer — Open the People chip on the filter bar, click each name, then switch the chip beside them to "all of them"
"Any of them" is a union and "all of them" is an intersection. The tray is where both terms and the choice between them live, because a filter belongs on the filter bar.
ui/dr-ui/ui/library.slint:2101
Drop the selection but keep selecting
- Touch — Press Clear in the selection strip
- Pointer — Press Clear in the selection strip
Distinct from Done, which leaves the mode entirely. Clearing keeps it, so the next selection can start straight away.
ui/dr-ui/ui/library.slint:2392
Select everything the grid is showing
- Touch — While selecting, press "Select all"
- Pointer — While selecting, press "Select all"
A scoped grid of two hundred frames is two hundred taps otherwise, and "all of them, except those three" is a far more common shape than the taps it took to say it.
ui/dr-ui/ui/library.slint:2409
Resize the thumbnails
- Touch — Pinch the grid with two fingers
- Pointer — Ctrl and the scroll wheel
There is no wheel on a tablet, so without the pinch the cell size could only be changed by a control a finger cannot reach.
ui/dr-ui/ui/library.slint:2850
File photographs in a collection
- Touch — Drag a photograph — or a whole selection — onto a collection in the sidebar. Starting a drag stops the press becoming a hold, so it cannot leave you in selection mode.
- Pointer — Drag a photograph — or a whole selection — onto a collection in the sidebar
The selection is what the drag carries, which is why selecting several is worth the mode: forty photographs file in one gesture.
ui/dr-ui/ui/library.slint:2999
Open a photograph
- Touch — Tap it — a single tap, any length
- Pointer — Click it
A tap opens; a tap that moved does not. Travel is what separates a deliberate tap from a hand brushing past, and it is the only thing that does: the two are the same length. An earlier version required the finger to dwell 120 ms instead, and that rejected ordinary taps — a real tap is often quicker than a brush.
ui/dr-ui/ui/library.slint:3229
Rate a photograph without opening it
- Touch — Tap a star on the cell
- Pointer — Hover the cell, then click a star
- Keyboard — 0 to 5 on the selection
A star has to take the press without it also reaching the cell, or every rating throws the user into develop.
ui/dr-ui/ui/library.slint:3341