Files
DarkRoom/ui/dr-ui/src/gesture_book.rs
dtourolle e957d483fc Give the film list a scrollbar on the desktop
A list cut off at its edge looks, to a mouse, like a list that ends
there. The open film list shows ten rows of twenty-eight, and nothing
said there were more. The user asked for visible scrollbars on every
platform but Android.

ScrollBar (widgets.slint) is a vertical bar drawn over a Flickable's
right-hand edge. It shows the share on screen and the position, it can
be dragged by the thumb from wherever it was grabbed, a click on the
track moves a page toward the click, and the wheel over it scrolls. It
is the Flickable's sibling rather than a wrapper, bound to
`viewport-y <=> flick.viewport-y` and the two heights, so a scroller
keeps its own sizing. It is drawn over the content rather than beside
it, so the mandated column widths are not reduced. With nothing to
scroll it is not drawn and takes no input.

Whether to draw it is Scrolling.bars, which Rust sets from
dr_plat::is_touch_first(). That is the same function that puts the
develop groups in the rail, and it answers the same question: what is
the user pointing with? On Android, lists still scroll by flick only.
Placing the bar inside another scroller would put it back in that
scroller's arbitration. The film list can have one because it is now a
popup.
2026-09-26 07:24:45 -04:00

636 lines
24 KiB
Rust
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
// @generated by `cargo run -p traceability -- gestures`. Do not edit.
//
// TRACES: FR-UI-4
//! The gesture vocabulary, as the application states it.
//!
//! Extracted from the tagged comments beside the code that implements each
//! one, so the help sheet cannot describe a gesture the application does not
//! have. Edit the comment beside the implementation, then regenerate with
//! `cargo run -p traceability -- gestures`.
/// One documented interaction, as drawn.
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub struct Gesture {
pub title: &'static str,
/// The place it applies, and the heading it is grouped under.
pub section: &'static str,
/// Empty where the gesture has no counterpart in that modality.
pub touch: &'static str,
pub pointer: &'static str,
pub keys: &'static str,
/// The manual section that shows it, a heading anchor; empty for none.
pub manual: &'static str,
}
/// Every gesture, in the order the sections were first seen in the source.
pub const GESTURES: &[Gesture] = &[
Gesture {
title: "Set the white balance from the photograph",
section: "Develop",
touch: "Press \"pick\" in the group's heading, then tap something neutral in the picture",
pointer: "Press \"pick\", then click something neutral",
keys: "",
manual: "white-balance-from-the-photograph",
},
Gesture {
title: "Choose a film stock from the keyboard",
section: "Develop",
touch: "Tap the Film row, flick the list, tap a stock",
pointer: "Click the Film row, then a stock; the wheel or a drag scrolls the list",
keys: "With the list open, ↑ and ↓ move along it, Enter chooses, and Escape or Back closes it unchanged",
manual: "film",
},
Gesture {
title: "Magnify the photograph by any amount",
section: "Develop",
touch: "Pinch it with two fingers",
pointer: "The scroll wheel over it",
keys: "Ctrl+= or Ctrl+Plus in, Ctrl+- out, about the middle of the view",
manual: "looking-closer",
},
Gesture {
title: "Move a magnified photograph about",
section: "Develop",
touch: "Drag it",
pointer: "Drag it",
keys: "Shift+←, Shift+→, Shift+↑ and Shift+↓, a fifth of the view at a time",
manual: "looking-closer",
},
Gesture {
title: "Paint a mask by hand",
section: "Develop",
touch: "Choose Paint or Erase, then drag on the photograph",
pointer: "Choose Paint or Erase, then drag",
keys: "",
manual: "local-adjustments",
},
Gesture {
title: "Open this list",
section: "Develop",
touch: "Press \"?\" in the top bar, beside Settings, and Done to put it away",
pointer: "Press \"?\" in the top bar, beside Settings, and Done to put it away",
keys: "F1; the key that closes any sheet puts it away",
manual: "",
},
Gesture {
title: "Take back the last change",
section: "Develop",
touch: "Tap the step above the current one in the History list",
pointer: "Click it, or press Undo in the History header",
keys: "Ctrl+Z",
manual: "history-snapshots-presets",
},
Gesture {
title: "Do it again after taking it back",
section: "Develop",
touch: "Tap the step below the current one in the History list",
pointer: "Click it, or press Redo in the History header",
keys: "Ctrl+Shift+Z, or Ctrl+Y",
manual: "history-snapshots-presets",
},
Gesture {
title: "Remove a repair",
section: "Develop",
touch: "Tap it, then Delete Repair",
pointer: "Click it, then Delete Repair",
keys: "Delete or Backspace, while repairing",
manual: "",
},
Gesture {
title: "Copy the settings from this photograph",
section: "Develop",
touch: "Press Copy in the top bar",
pointer: "Press Copy in the top bar",
keys: "Ctrl+C",
manual: "copying-settings",
},
Gesture {
title: "Paste the settings onto this photograph",
section: "Develop",
touch: "Press Paste in the top bar",
pointer: "Press Paste in the top bar",
keys: "Ctrl+V",
manual: "copying-settings",
},
Gesture {
title: "Choose which kinds of edit a copy carries",
section: "Develop",
touch: "Open Presets and toggle the kinds",
pointer: "Open Presets and toggle the kinds",
keys: "Ctrl+Shift+C, which offers Copy beside them",
manual: "copying-settings",
},
Gesture {
title: "Export this photograph as the last one was",
section: "Develop",
touch: "Press Export in the top bar",
pointer: "Press Export in the top bar",
keys: "Ctrl+Shift+E",
manual: "export",
},
Gesture {
title: "Choose how to export, then export",
section: "Develop",
touch: "Open Settings, then Export defaults",
pointer: "Open Settings, then Export defaults",
keys: "Ctrl+E",
manual: "export",
},
Gesture {
title: "Keep a crop that leaves a mask outside",
section: "Develop",
touch: "Press \"Keep crop\" on the notice, or \"Undo crop\" to take it back",
pointer: "Press \"Keep crop\" on the notice, or \"Undo crop\" to take it back",
keys: "Enter keeps it; Ctrl+Z takes the crop back, like any other step",
manual: "",
},
Gesture {
title: "Go back to the grid",
section: "Develop",
touch: "Press \"‹ Library\" in the top bar",
pointer: "Press \"‹ Library\" in the top bar",
keys: "G",
manual: "",
},
Gesture {
title: "Nudge the control last moved",
section: "Develop",
touch: "Drag its track",
pointer: "Drag its track",
keys: "= or Plus up and - down, a hundredth of its travel at a time; hold for more",
manual: "",
},
Gesture {
title: "Change which group of adjustments is on screen",
section: "Develop",
touch: "Tap a group in the rail down the left",
pointer: "Click a group in the strip above the develop column",
keys: "[ and ] step through them, wrapping round through \"everything\"",
manual: "developing-a-photograph",
},
Gesture {
title: "Look at the photograph at 1:1",
section: "Develop",
touch: "Double-tap the photograph",
pointer: "Double-click it, or press the zoom readout floating over the canvas",
keys: "Z goes in and back out; Ctrl+1 goes to 1:1 and Ctrl+0 back to the whole frame",
manual: "looking-closer",
},
Gesture {
title: "Rate this photograph",
section: "Develop",
touch: "Tap a star in the top bar",
pointer: "Click a star in the top bar",
keys: "0–5",
manual: "",
},
Gesture {
title: "Pick or reject this photograph",
section: "Develop",
touch: "Press Pick or Reject in the top bar; again to take the flag off",
pointer: "Press Pick or Reject in the top bar; again to take the flag off",
keys: "P picks, X rejects and U takes the flag off",
manual: "",
},
Gesture {
title: "Give this photograph a colour label",
section: "Develop",
touch: "Tap Label in the top bar, then a colour",
pointer: "Click Label in the top bar, then a colour",
keys: "6 red, 7 yellow, 8 green, 9 blue; the same key again takes it off",
manual: "rating-and-flagging",
},
Gesture {
title: "Move to the next or previous photograph",
section: "Develop",
touch: "Tap a frame in the roll along the foot of the canvas",
pointer: "Click a frame in the roll",
keys: "→, D or Space for the next; ← or A for the one before",
manual: "moving-between-photographs",
},
Gesture {
title: "See the photograph before you edited it",
section: "Develop",
touch: "Press and hold \"Before\"",
pointer: "Press and hold \"Before\"",
keys: "Hold \\",
manual: "light",
},
Gesture {
title: "Put one control back to its default",
section: "Develop",
touch: "Double-tap its track",
pointer: "Double-click its track, or right-click it",
keys: "R, for the control last moved",
manual: "",
},
Gesture {
title: "See the photograph as a snapshot had it",
section: "Develop",
touch: "Press and hold the eye beside the snapshot",
pointer: "Press and hold the eye beside the snapshot",
keys: "",
manual: "history-snapshots-presets",
},
Gesture {
title: "Keep the photograph as it is now, under a name",
section: "Develop",
touch: "Type a name in the History panel and press Snapshot",
pointer: "Type a name in the History panel and press Snapshot",
keys: "",
manual: "history-snapshots-presets",
},
Gesture {
title: "Show or hide one mask layer",
section: "Develop",
touch: "Tap the ring at the head of its row",
pointer: "Click the ring at the head of its row",
keys: "H, for the selected layer",
manual: "local-adjustments",
},
Gesture {
title: "Show or hide one mask on the photograph",
section: "Develop",
touch: "Tap the eye on its row",
pointer: "Click the eye on its row",
keys: "",
manual: "local-adjustments",
},
Gesture {
title: "Change how a part joins its mask",
section: "Develop",
touch: "Tap the + / − / ∩ chip on the part's row",
pointer: "Click the + / − / ∩ chip on the part's row",
keys: "J turns the selected part's chip, while masking",
manual: "local-adjustments",
},
Gesture {
title: "Leave one part out of a mask, and put it back",
section: "Develop",
touch: "Tap the ring on the part's row",
pointer: "Click the ring on the part's row",
keys: "",
manual: "local-adjustments",
},
Gesture {
title: "Close what is open, or go back a step",
section: "Everywhere",
touch: "The system Back gesture, or the Back button",
pointer: "The Close or Back button on whatever is open",
keys: "Escape, or Back where the device has one",
manual: "",
},
Gesture {
title: "Do what a sheet offers",
section: "Everywhere",
touch: "Press its button — Export, or Copy",
pointer: "Press its button — Export, or Copy",
keys: "Enter, on the export and copy sheets",
manual: "",
},
Gesture {
title: "Scroll by the scrollbar",
section: "Everywhere",
touch: "",
pointer: "Drag the bar along the right-hand edge of a list, or click the track above or below it to move by a page",
keys: "",
manual: "",
},
Gesture {
title: "Pick a collection up to rearrange the tree",
section: "Collections sidebar",
touch: "Press and hold it until it lifts, then drag it",
pointer: "Drag it, or hold it until it lifts and then drag",
keys: "",
manual: "collections",
},
Gesture {
title: "Act on a collection — rename, nest, un-nest, delete",
section: "Collections sidebar",
touch: "Press and hold the collection, then let go without moving",
pointer: "Right-click it",
keys: "",
manual: "collections",
},
Gesture {
title: "Take a collection back out of the one it is nested in",
section: "Collections sidebar",
touch: "Hold it, then drag it onto \"All photographs\" — or let go and choose \"Move to top level\"",
pointer: "Drag it onto \"All photographs\", or right-click it and choose \"Move to top level\"",
keys: "",
manual: "collections",
},
Gesture {
title: "Rename a collection",
section: "Collections sidebar",
touch: "Hold the collection, then \"Rename\"",
pointer: "Double-click its name, or right-click it and choose \"Rename\"",
keys: "Type the name and press Enter; Escape abandons it",
manual: "collections",
},
Gesture {
title: "Review duplicate originals",
section: "Collections sidebar",
touch: "Tap \"Duplicate originals\" under the trash",
pointer: "Click \"Duplicate originals\" under the trash",
keys: "",
manual: "duplicate-originals",
},
Gesture {
title: "Check duplicate originals are the same file",
section: "Duplicate originals",
touch: "Tap \"Check\"",
pointer: "Click \"Check\"",
keys: "",
manual: "duplicate-originals",
},
Gesture {
title: "Move the spare copies to the trash",
section: "Duplicate originals",
touch: "Tap \"Move N copies to trash\"",
pointer: "Click \"Move N copies to trash\"",
keys: "",
manual: "duplicate-originals",
},
Gesture {
title: "Choose which copy of a duplicate stays",
section: "Duplicate originals",
touch: "Tap the copy's path",
pointer: "Click the copy's path",
keys: "",
manual: "duplicate-originals",
},
Gesture {
title: "Leave a duplicate group as it is",
section: "Duplicate originals",
touch: "Untick \"Include\" on the group",
pointer: "Untick \"Include\" on the group",
keys: "",
manual: "duplicate-originals",
},
Gesture {
title: "Pull a face out of the wrong person",
section: "People",
touch: "Tap the faces that do not belong, then \"Split off\"",
pointer: "Click the faces that do not belong, then \"Split off\"",
keys: "",
manual: "people",
},
Gesture {
title: "Rule on a suggested face",
section: "People",
touch: "Tick to confirm it, cross to reject it",
pointer: "Tick to confirm it, cross to reject it",
keys: "",
manual: "people",
},
Gesture {
title: "Move between people",
section: "People",
touch: "Tap a person on the rail",
pointer: "Click a person on the rail",
keys: "↑ and ↓, along the rail",
manual: "",
},
Gesture {
title: "Name a person",
section: "People",
touch: "Tap the name field over their faces, type, and press Enter",
pointer: "Click the name field over their faces, type, and press Enter",
keys: "F2 puts the name field under the keys",
manual: "",
},
Gesture {
title: "See a person's photographs",
section: "People",
touch: "Choose them in the rail, then \"Show photos\"",
pointer: "Choose them in the rail, then \"Show photos\"",
keys: "",
manual: "people",
},
Gesture {
title: "Change how faces are grouped",
section: "People",
touch: "\"Grouping…\", move the dials, then Regroup",
pointer: "\"Grouping…\", move the dials, then Regroup",
keys: "",
manual: "people",
},
Gesture {
title: "Start selecting several photographs",
section: "Library grid",
touch: "Press and hold a photograph, or press Select in the header",
pointer: "Ctrl-click, or press Select in the header",
keys: "",
manual: "selecting-several",
},
Gesture {
title: "Add or remove one photograph",
section: "Library grid",
touch: "While selecting, tap it",
pointer: "Ctrl-click it",
keys: "",
manual: "selecting-several",
},
Gesture {
title: "Leave selecting",
section: "Library grid",
touch: "Press Done in the header",
pointer: "Press Done in the header",
keys: "Escape, or Back; an open sheet closes first",
manual: "selecting-several",
},
Gesture {
title: "Pick a photograph up to drag it",
section: "Library grid",
touch: "Press and hold it until a ring opens around it, then drag",
pointer: "Drag it",
keys: "",
manual: "collections",
},
Gesture {
title: "Select a range",
section: "Library grid",
touch: "While selecting, press \"Select to…\", then tap the last photograph of the run",
pointer: "Shift-click the last photograph of the run",
keys: "Shift with any key that walks the grid — Shift+←, Shift+→, Shift+↑, Shift+↓, Shift+Page Up, Shift+Page Down, Shift+Home, Shift+End",
manual: "selecting-several",
},
Gesture {
title: "Take the blinks out of a burst",
section: "Library grid",
touch: "Narrow to a person, then tap \"Eyes open\" beside their name on the filter bar",
pointer: "Narrow to a person, then click \"Eyes open\" beside their name on the filter bar",
keys: "",
manual: "bursts",
},
Gesture {
title: "Find photographs with two people in them",
section: "Library grid",
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\"",
keys: "",
manual: "people",
},
Gesture {
title: "Show only photographs with one colour label",
section: "Library grid",
touch: "Tap its chip in the filter bar",
pointer: "Click its chip in the filter bar",
keys: "",
manual: "rating-and-flagging",
},
Gesture {
title: "Export the selection as the last export was",
section: "Library grid",
touch: "Select them, then Export in the selection bar",
pointer: "Select them, then Export in the selection bar",
keys: "Ctrl+Shift+E, or Ctrl+E to see the export settings first",
manual: "export",
},
Gesture {
title: "Paste copied settings onto the selection",
section: "Library grid",
touch: "Select them, then \"Paste to N\" in the selection bar",
pointer: "Select them, then \"Paste to N\"",
keys: "Ctrl+V",
manual: "copying-settings",
},
Gesture {
title: "Keyword the selection",
section: "Library grid",
touch: "Select them, then Keywords in the selection bar",
pointer: "Select them, then Keywords in the selection bar",
keys: "Ctrl+K",
manual: "",
},
Gesture {
title: "Show only photographs with some number of stars",
section: "Library grid",
touch: "Tap a star chip in the filter bar",
pointer: "Click a star chip in the filter bar",
keys: "Hold F and tap a digit, 0–5, for exactly that many stars, or two digits for everything between them; tap F alone to show every rating again",
manual: "rating-and-flagging",
},
Gesture {
title: "Give photographs a colour label",
section: "Library grid",
touch: "Select them, then Label in the selection bar and tap a colour",
pointer: "Select them, then Label in the selection bar and click a colour",
keys: "6 red, 7 yellow, 8 green, 9 blue, with the pointer over it or on the selection; the same key again takes the label off",
manual: "rating-and-flagging",
},
Gesture {
title: "Pick or reject a photograph",
section: "Library grid",
touch: "Select them, then Flag in the selection bar and Pick, Reject or No flag",
pointer: "Select them, then Flag in the selection bar and Pick, Reject or No flag",
keys: "P picks, X rejects and U takes the flag off, with the pointer over it or on the selection",
manual: "",
},
Gesture {
title: "Move photographs to the trash",
section: "Library grid",
touch: "Tap the bin at the start of a cell's stars",
pointer: "Hover the cell and click the bin before its stars",
keys: "Delete or Backspace, on the selection",
manual: "",
},
Gesture {
title: "Open this list",
section: "Library grid",
touch: "Press Help in the header, and Done to put it away",
pointer: "Press Help in the header, and Done to put it away",
keys: "F1, and Escape to put it away",
manual: "",
},
Gesture {
title: "Rename the collection the grid is showing",
section: "Library grid",
touch: "Hold it in the sidebar, then \"Rename\"",
pointer: "Double-click it in the sidebar",
keys: "F2",
manual: "",
},
Gesture {
title: "Move through the grid",
section: "Library grid",
touch: "Scroll, and tap a photograph",
pointer: "Scroll, and click a photograph",
keys: "←, →, ↑ and ↓ move one photograph; Page Up and Page Down a screenful; Home and End to the first and the last",
manual: "",
},
Gesture {
title: "Resize the thumbnails",
section: "Library grid",
touch: "Pinch the grid with two fingers",
pointer: "Ctrl and the scroll wheel",
keys: "= or Plus for larger, - for smaller",
manual: "getting-about",
},
Gesture {
title: "File photographs in a collection",
section: "Library grid",
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",
keys: "",
manual: "collections",
},
Gesture {
title: "Open a photograph",
section: "Library grid",
touch: "Tap it — a single tap, any length",
pointer: "Click it",
keys: "Enter, on the photograph the arrow keys have walked to",
manual: "developing-a-photograph",
},
Gesture {
title: "Rate a photograph without opening it",
section: "Library grid",
touch: "Tap a star on the cell",
pointer: "Hover the cell, then click a star",
keys: "0–5 with the pointer over it, or on the selection",
manual: "rating-and-flagging",
},
Gesture {
title: "Choose the frame a folded burst shows",
section: "Library grid",
touch: "Open the burst, then tap the ring on the frame you want",
pointer: "Open the burst, then click the ring on the frame you want",
keys: "",
manual: "bursts",
},
Gesture {
title: "Drop the selection but keep selecting",
section: "Library grid",
touch: "Press Clear in the selection strip",
pointer: "Press Clear in the selection strip",
keys: "Ctrl+D or Ctrl+Shift+A",
manual: "selecting-several",
},
Gesture {
title: "Select everything the grid is showing",
section: "Library grid",
touch: "While selecting, press \"Select all\"",
pointer: "While selecting, press \"Select all\"",
keys: "Ctrl+A",
manual: "selecting-several",
},
Gesture {
title: "Take photographs out of a collection",
section: "Library grid",
touch: "Select them, then \"Collections…\" in the selection bar",
pointer: "Select them, then \"Collections…\" in the selection bar",
keys: "",
manual: "collections",
},
Gesture {
title: "Review duplicate originals",
section: "Settings",
touch: "Tap \"Review duplicate originals\"",
pointer: "Click \"Review duplicate originals\"",
keys: "",
manual: "duplicate-originals",
},
];