diff --git a/docs/dev/traceability.md b/docs/dev/traceability.md index dde716b..cc31788 100644 --- a/docs/dev/traceability.md +++ b/docs/dev/traceability.md @@ -42,12 +42,12 @@ _None._ | FR-CAT-15 | [`core/dr-catalog/src/schema.rs:1210`](../../core/dr-catalog/src/schema.rs#L1210), [`core/dr-catalog/src/trash.rs:1`](../../core/dr-catalog/src/trash.rs#L1), [`core/dr-sync-nextcloud/src/lib.rs:522`](../../core/dr-sync-nextcloud/src/lib.rs#L522), [`core/dr-sync/src/lib.rs:135`](../../core/dr-sync/src/lib.rs#L135), [`core/dr-sync/src/scan.rs:618`](../../core/dr-sync/src/scan.rs#L618), [`core/dr-sync/src/scan.rs:93`](../../core/dr-sync/src/scan.rs#L93), [`core/dr-thumbs/src/lib.rs:393`](../../core/dr-thumbs/src/lib.rs#L393), [`core/dr-types/src/place.rs:91`](../../core/dr-types/src/place.rs#L91), [`ui/dr-ui/src/collections_ui/trash.rs:84`](../../ui/dr-ui/src/collections_ui/trash.rs#L84), [`ui/dr-ui/src/collections_ui/wiring_grid.rs:819`](../../ui/dr-ui/src/collections_ui/wiring_grid.rs#L819), [`ui/dr-ui/src/library/cells.rs:158`](../../ui/dr-ui/src/library/cells.rs#L158), [`ui/dr-ui/src/library/cells.rs:192`](../../ui/dr-ui/src/library/cells.rs#L192), [`ui/dr-ui/src/library/filters.rs:12`](../../ui/dr-ui/src/library/filters.rs#L12), [`ui/dr-ui/src/library/filters.rs:29`](../../ui/dr-ui/src/library/filters.rs#L29), [`ui/dr-ui/src/library/filters.rs:59`](../../ui/dr-ui/src/library/filters.rs#L59), [`ui/dr-ui/src/library_ui/controller.rs:232`](../../ui/dr-ui/src/library_ui/controller.rs#L232), [`ui/dr-ui/src/library_ui/controller.rs:909`](../../ui/dr-ui/src/library_ui/controller.rs#L909), [`ui/dr-ui/src/trash.rs:1`](../../ui/dr-ui/src/trash.rs#L1), [`ui/dr-ui/ui/collections.slint:1182`](../../ui/dr-ui/ui/collections.slint#L1182), [`ui/dr-ui/ui/collections.slint:745`](../../ui/dr-ui/ui/collections.slint#L745) | | FR-CAT-1a | [`core/dr-catalog/src/walk.rs:1`](../../core/dr-catalog/src/walk.rs#L1), [`core/dr-types/src/lib.rs:56`](../../core/dr-types/src/lib.rs#L56), [`platform/dr-plat/src/storage.rs:1`](../../platform/dr-plat/src/storage.rs#L1), [`platform/dr-plat/src/storage.rs:216`](../../platform/dr-plat/src/storage.rs#L216), [`platform/dr-plat/src/storage.rs:46`](../../platform/dr-plat/src/storage.rs#L46) | | FR-CAT-2 | [`core/dr-catalog/src/lib.rs:1`](../../core/dr-catalog/src/lib.rs#L1), [`core/dr-catalog/src/schema.rs:1`](../../core/dr-catalog/src/schema.rs#L1) | -| FR-CAT-3 | [`core/dr-catalog/src/jobs.rs:1`](../../core/dr-catalog/src/jobs.rs#L1), [`core/dr-catalog/src/walk.rs:66`](../../core/dr-catalog/src/walk.rs#L66), [`core/dr-sync/src/scan.rs:105`](../../core/dr-sync/src/scan.rs#L105), [`core/dr-thumbs/src/codec.rs:1`](../../core/dr-thumbs/src/codec.rs#L1), [`core/dr-thumbs/src/lib.rs:1`](../../core/dr-thumbs/src/lib.rs#L1), [`ui/dr-ui/src/derived_sync.rs:1`](../../ui/dr-ui/src/derived_sync.rs#L1), [`ui/dr-ui/src/import.rs:474`](../../ui/dr-ui/src/import.rs#L474), [`ui/dr-ui/src/import.rs:504`](../../ui/dr-ui/src/import.rs#L504), [`ui/dr-ui/src/library/sweep.rs:562`](../../ui/dr-ui/src/library/sweep.rs#L562), [`ui/dr-ui/src/library_ui/controller.rs:171`](../../ui/dr-ui/src/library_ui/controller.rs#L171), [`ui/dr-ui/src/library_ui/grid.rs:478`](../../ui/dr-ui/src/library_ui/grid.rs#L478), [`ui/dr-ui/src/library_ui/sync.rs:385`](../../ui/dr-ui/src/library_ui/sync.rs#L385), [`ui/dr-ui/src/repairs.rs:1`](../../ui/dr-ui/src/repairs.rs#L1), [`ui/dr-ui/src/repairs.rs:695`](../../ui/dr-ui/src/repairs.rs#L695), [`ui/dr-ui/ui/library.slint:487`](../../ui/dr-ui/ui/library.slint#L487), [`ui/dr-ui/ui/library.slint:764`](../../ui/dr-ui/ui/library.slint#L764), [`ui/dr-ui/ui/settings.slint:366`](../../ui/dr-ui/ui/settings.slint#L366), [`ui/dr-ui/ui/settings.slint:74`](../../ui/dr-ui/ui/settings.slint#L74) | +| FR-CAT-3 | [`core/dr-catalog/src/jobs.rs:1`](../../core/dr-catalog/src/jobs.rs#L1), [`core/dr-catalog/src/walk.rs:66`](../../core/dr-catalog/src/walk.rs#L66), [`core/dr-sync/src/scan.rs:105`](../../core/dr-sync/src/scan.rs#L105), [`core/dr-thumbs/src/codec.rs:1`](../../core/dr-thumbs/src/codec.rs#L1), [`core/dr-thumbs/src/lib.rs:1`](../../core/dr-thumbs/src/lib.rs#L1), [`ui/dr-ui/src/derived_sync.rs:1`](../../ui/dr-ui/src/derived_sync.rs#L1), [`ui/dr-ui/src/import.rs:474`](../../ui/dr-ui/src/import.rs#L474), [`ui/dr-ui/src/import.rs:504`](../../ui/dr-ui/src/import.rs#L504), [`ui/dr-ui/src/library/sweep.rs:562`](../../ui/dr-ui/src/library/sweep.rs#L562), [`ui/dr-ui/src/library_ui/controller.rs:171`](../../ui/dr-ui/src/library_ui/controller.rs#L171), [`ui/dr-ui/src/library_ui/grid.rs:479`](../../ui/dr-ui/src/library_ui/grid.rs#L479), [`ui/dr-ui/src/library_ui/sync.rs:385`](../../ui/dr-ui/src/library_ui/sync.rs#L385), [`ui/dr-ui/src/repairs.rs:1`](../../ui/dr-ui/src/repairs.rs#L1), [`ui/dr-ui/src/repairs.rs:695`](../../ui/dr-ui/src/repairs.rs#L695), [`ui/dr-ui/ui/library.slint:487`](../../ui/dr-ui/ui/library.slint#L487), [`ui/dr-ui/ui/library.slint:764`](../../ui/dr-ui/ui/library.slint#L764), [`ui/dr-ui/ui/settings.slint:366`](../../ui/dr-ui/ui/settings.slint#L366), [`ui/dr-ui/ui/settings.slint:74`](../../ui/dr-ui/ui/settings.slint#L74) | | FR-CAT-4 | [`core/dr-catalog/src/lib.rs:1`](../../core/dr-catalog/src/lib.rs#L1), [`core/dr-catalog/src/query.rs:1`](../../core/dr-catalog/src/query.rs#L1), [`core/dr-catalog/src/schema.rs:564`](../../core/dr-catalog/src/schema.rs#L564), [`ui/dr-ui/src/library/filters.rs:39`](../../ui/dr-ui/src/library/filters.rs#L39), [`ui/dr-ui/src/library/mod.rs:1`](../../ui/dr-ui/src/library/mod.rs#L1), [`ui/dr-ui/src/library_ui/mod.rs:1`](../../ui/dr-ui/src/library_ui/mod.rs#L1), [`ui/dr-ui/ui/library.slint:487`](../../ui/dr-ui/ui/library.slint#L487) | | FR-CAT-5 | [`core/dr-catalog/src/keywords.rs:1`](../../core/dr-catalog/src/keywords.rs#L1), [`core/dr-catalog/src/merge.rs:1`](../../core/dr-catalog/src/merge.rs#L1), [`core/dr-catalog/src/rating.rs:1`](../../core/dr-catalog/src/rating.rs#L1), [`core/dr-catalog/src/rating.rs:396`](../../core/dr-catalog/src/rating.rs#L396), [`core/dr-catalog/src/rating.rs:411`](../../core/dr-catalog/src/rating.rs#L411), [`core/dr-catalog/src/rating.rs:422`](../../core/dr-catalog/src/rating.rs#L422), [`core/dr-catalog/src/rating.rs:449`](../../core/dr-catalog/src/rating.rs#L449), [`core/dr-catalog/src/rating.rs:52`](../../core/dr-catalog/src/rating.rs#L52), [`core/dr-catalog/src/rating.rs:782`](../../core/dr-catalog/src/rating.rs#L782), [`core/dr-catalog/src/rating.rs:806`](../../core/dr-catalog/src/rating.rs#L806), [`core/dr-catalog/src/rating.rs:825`](../../core/dr-catalog/src/rating.rs#L825), [`core/dr-catalog/src/schema.rs:1125`](../../core/dr-catalog/src/schema.rs#L1125), [`core/dr-catalog/src/schema.rs:1682`](../../core/dr-catalog/src/schema.rs#L1682), [`core/dr-decode/src/lib.rs:307`](../../core/dr-decode/src/lib.rs#L307), [`core/dr-decode/src/lib.rs:313`](../../core/dr-decode/src/lib.rs#L313), [`core/dr-decode/src/lib.rs:323`](../../core/dr-decode/src/lib.rs#L323), [`core/dr-decode/src/lib.rs:450`](../../core/dr-decode/src/lib.rs#L450), [`core/dr-export/src/dng.rs:308`](../../core/dr-export/src/dng.rs#L308), [`core/dr-pipeline/src/sidecar.rs:1093`](../../core/dr-pipeline/src/sidecar.rs#L1093), [`core/dr-pipeline/src/sidecar.rs:174`](../../core/dr-pipeline/src/sidecar.rs#L174), [`core/dr-pipeline/src/sidecar.rs:193`](../../core/dr-pipeline/src/sidecar.rs#L193), [`core/dr-pipeline/src/sidecar.rs:2874`](../../core/dr-pipeline/src/sidecar.rs#L2874), [`core/dr-pipeline/src/sidecar.rs:2892`](../../core/dr-pipeline/src/sidecar.rs#L2892), [`core/dr-pipeline/src/sidecar.rs:590`](../../core/dr-pipeline/src/sidecar.rs#L590), [`ui/dr-ui/src/collections_ui/controller.rs:16`](../../ui/dr-ui/src/collections_ui/controller.rs#L16), [`ui/dr-ui/src/collections_ui/controller.rs:204`](../../ui/dr-ui/src/collections_ui/controller.rs#L204), [`ui/dr-ui/src/collections_ui/controller.rs:413`](../../ui/dr-ui/src/collections_ui/controller.rs#L413), [`ui/dr-ui/src/collections_ui/wiring_grid.rs:150`](../../ui/dr-ui/src/collections_ui/wiring_grid.rs#L150), [`ui/dr-ui/src/collections_ui/wiring_grid.rs:264`](../../ui/dr-ui/src/collections_ui/wiring_grid.rs#L264), [`ui/dr-ui/src/collections_ui/wiring_grid.rs:323`](../../ui/dr-ui/src/collections_ui/wiring_grid.rs#L323), [`ui/dr-ui/src/decoder_seam.rs:184`](../../ui/dr-ui/src/decoder_seam.rs#L184), [`ui/dr-ui/src/library/cells.rs:206`](../../ui/dr-ui/src/library/cells.rs#L206), [`ui/dr-ui/src/library/scan.rs:525`](../../ui/dr-ui/src/library/scan.rs#L525), [`ui/dr-ui/src/library/scan.rs:915`](../../ui/dr-ui/src/library/scan.rs#L915), [`ui/dr-ui/src/library_ui/controller.rs:784`](../../ui/dr-ui/src/library_ui/controller.rs#L784), [`ui/dr-ui/src/library_ui/ratings_keywords.rs:1085`](../../ui/dr-ui/src/library_ui/ratings_keywords.rs#L1085), [`ui/dr-ui/src/library_ui/ratings_keywords.rs:1109`](../../ui/dr-ui/src/library_ui/ratings_keywords.rs#L1109), [`ui/dr-ui/src/library_ui/ratings_keywords.rs:1126`](../../ui/dr-ui/src/library_ui/ratings_keywords.rs#L1126), [`ui/dr-ui/src/library_ui/ratings_keywords.rs:118`](../../ui/dr-ui/src/library_ui/ratings_keywords.rs#L118), [`ui/dr-ui/src/library_ui/ratings_keywords.rs:1279`](../../ui/dr-ui/src/library_ui/ratings_keywords.rs#L1279), [`ui/dr-ui/src/library_ui/ratings_keywords.rs:1290`](../../ui/dr-ui/src/library_ui/ratings_keywords.rs#L1290), [`ui/dr-ui/src/library_ui/ratings_keywords.rs:1303`](../../ui/dr-ui/src/library_ui/ratings_keywords.rs#L1303), [`ui/dr-ui/src/library_ui/ratings_keywords.rs:1318`](../../ui/dr-ui/src/library_ui/ratings_keywords.rs#L1318), [`ui/dr-ui/src/library_ui/ratings_keywords.rs:1327`](../../ui/dr-ui/src/library_ui/ratings_keywords.rs#L1327), [`ui/dr-ui/src/library_ui/ratings_keywords.rs:97`](../../ui/dr-ui/src/library_ui/ratings_keywords.rs#L97), [`ui/dr-ui/tests/status_is_not_colour_alone.rs:177`](../../ui/dr-ui/tests/status_is_not_colour_alone.rs#L177), [`ui/dr-ui/tests/status_is_not_colour_alone.rs:215`](../../ui/dr-ui/tests/status_is_not_colour_alone.rs#L215), [`ui/dr-ui/ui/app.slint:1509`](../../ui/dr-ui/ui/app.slint#L1509), [`ui/dr-ui/ui/app.slint:2436`](../../ui/dr-ui/ui/app.slint#L2436), [`ui/dr-ui/ui/develop.slint:126`](../../ui/dr-ui/ui/develop.slint#L126), [`ui/dr-ui/ui/develop.slint:47`](../../ui/dr-ui/ui/develop.slint#L47), [`ui/dr-ui/ui/labels.slint:19`](../../ui/dr-ui/ui/labels.slint#L19), [`ui/dr-ui/ui/labels.slint:1`](../../ui/dr-ui/ui/labels.slint#L1), [`ui/dr-ui/ui/labels.slint:40`](../../ui/dr-ui/ui/labels.slint#L40), [`ui/dr-ui/ui/labels.slint:74`](../../ui/dr-ui/ui/labels.slint#L74), [`ui/dr-ui/ui/library.slint:1549`](../../ui/dr-ui/ui/library.slint#L1549), [`ui/dr-ui/ui/library.slint:1552`](../../ui/dr-ui/ui/library.slint#L1552), [`ui/dr-ui/ui/library.slint:1687`](../../ui/dr-ui/ui/library.slint#L1687), [`ui/dr-ui/ui/library.slint:1711`](../../ui/dr-ui/ui/library.slint#L1711), [`ui/dr-ui/ui/library.slint:1764`](../../ui/dr-ui/ui/library.slint#L1764), [`ui/dr-ui/ui/library.slint:20`](../../ui/dr-ui/ui/library.slint#L20), [`ui/dr-ui/ui/library.slint:3107`](../../ui/dr-ui/ui/library.slint#L3107), [`ui/dr-ui/ui/library.slint:3180`](../../ui/dr-ui/ui/library.slint#L3180), [`ui/dr-ui/ui/library.slint:3731`](../../ui/dr-ui/ui/library.slint#L3731), [`ui/dr-ui/ui/library.slint:466`](../../ui/dr-ui/ui/library.slint#L466), [`ui/dr-ui/ui/library.slint:4835`](../../ui/dr-ui/ui/library.slint#L4835), [`ui/dr-ui/ui/library.slint:4851`](../../ui/dr-ui/ui/library.slint#L4851), [`ui/dr-ui/ui/library.slint:487`](../../ui/dr-ui/ui/library.slint#L487), [`ui/dr-ui/ui/library.slint:509`](../../ui/dr-ui/ui/library.slint#L509), [`ui/dr-ui/ui/library.slint:608`](../../ui/dr-ui/ui/library.slint#L608), [`ui/dr-ui/ui/library.slint:648`](../../ui/dr-ui/ui/library.slint#L648), [`ui/dr-ui/ui/library.slint:654`](../../ui/dr-ui/ui/library.slint#L654), [`ui/dr-ui/ui/library.slint:658`](../../ui/dr-ui/ui/library.slint#L658) | | FR-CAT-6 | [`core/dr-catalog/src/collections.rs:1`](../../core/dr-catalog/src/collections.rs#L1), [`core/dr-catalog/src/keywords.rs:1`](../../core/dr-catalog/src/keywords.rs#L1), [`core/dr-catalog/src/lib.rs:1`](../../core/dr-catalog/src/lib.rs#L1), [`core/dr-catalog/src/query.rs:1`](../../core/dr-catalog/src/query.rs#L1), [`core/dr-catalog/src/rating.rs:1`](../../core/dr-catalog/src/rating.rs#L1), [`core/dr-catalog/src/rating.rs:449`](../../core/dr-catalog/src/rating.rs#L449), [`core/dr-catalog/src/rating.rs:835`](../../core/dr-catalog/src/rating.rs#L835), [`core/dr-catalog/src/schema.rs:1125`](../../core/dr-catalog/src/schema.rs#L1125), [`core/dr-types/src/place.rs:138`](../../core/dr-types/src/place.rs#L138), [`core/dr-types/src/place.rs:1`](../../core/dr-types/src/place.rs#L1), [`core/dr-types/src/selector.rs:1`](../../core/dr-types/src/selector.rs#L1), [`core/dr-types/src/settings.rs:64`](../../core/dr-types/src/settings.rs#L64), [`core/dr-types/src/time.rs:67`](../../core/dr-types/src/time.rs#L67), [`core/dr-types/src/time.rs:90`](../../core/dr-types/src/time.rs#L90), [`ui/dr-ui/src/library/filters.rs:156`](../../ui/dr-ui/src/library/filters.rs#L156), [`ui/dr-ui/src/library/filters.rs:357`](../../ui/dr-ui/src/library/filters.rs#L357), [`ui/dr-ui/src/library/filters.rs:442`](../../ui/dr-ui/src/library/filters.rs#L442), [`ui/dr-ui/src/library/filters.rs:64`](../../ui/dr-ui/src/library/filters.rs#L64), [`ui/dr-ui/src/library/spans.rs:253`](../../ui/dr-ui/src/library/spans.rs#L253), [`ui/dr-ui/src/library_ui/controller.rs:391`](../../ui/dr-ui/src/library_ui/controller.rs#L391), [`ui/dr-ui/src/library_ui/controller.rs:500`](../../ui/dr-ui/src/library_ui/controller.rs#L500), [`ui/dr-ui/src/library_ui/filter_bar.rs:256`](../../ui/dr-ui/src/library_ui/filter_bar.rs#L256), [`ui/dr-ui/src/library_ui/filter_bar.rs:351`](../../ui/dr-ui/src/library_ui/filter_bar.rs#L351), [`ui/dr-ui/src/library_ui/filter_bar.rs:406`](../../ui/dr-ui/src/library_ui/filter_bar.rs#L406), [`ui/dr-ui/src/library_ui/filter_bar.rs:840`](../../ui/dr-ui/src/library_ui/filter_bar.rs#L840), [`ui/dr-ui/src/library_ui/ratings_keywords.rs:85`](../../ui/dr-ui/src/library_ui/ratings_keywords.rs#L85), [`ui/dr-ui/ui/app.slint:611`](../../ui/dr-ui/ui/app.slint#L611), [`ui/dr-ui/ui/library.slint:112`](../../ui/dr-ui/ui/library.slint#L112), [`ui/dr-ui/ui/library.slint:1851`](../../ui/dr-ui/ui/library.slint#L1851), [`ui/dr-ui/ui/library.slint:1888`](../../ui/dr-ui/ui/library.slint#L1888), [`ui/dr-ui/ui/library.slint:2614`](../../ui/dr-ui/ui/library.slint#L2614), [`ui/dr-ui/ui/library.slint:4835`](../../ui/dr-ui/ui/library.slint#L4835), [`ui/dr-ui/ui/library.slint:487`](../../ui/dr-ui/ui/library.slint#L487), [`ui/dr-ui/ui/library.slint:608`](../../ui/dr-ui/ui/library.slint#L608), [`ui/dr-ui/ui/library.slint:662`](../../ui/dr-ui/ui/library.slint#L662), [`ui/dr-ui/ui/library.slint:684`](../../ui/dr-ui/ui/library.slint#L684), [`ui/dr-ui/ui/settings.slint:196`](../../ui/dr-ui/ui/settings.slint#L196), [`ui/dr-ui/ui/widgets.slint:271`](../../ui/dr-ui/ui/widgets.slint#L271) | | FR-CAT-7 | [`core/dr-catalog/src/collections.rs:1`](../../core/dr-catalog/src/collections.rs#L1), [`core/dr-catalog/src/merge.rs:1`](../../core/dr-catalog/src/merge.rs#L1), [`core/dr-catalog/src/sync.rs:1`](../../core/dr-catalog/src/sync.rs#L1), [`core/dr-types/src/selector.rs:1`](../../core/dr-types/src/selector.rs#L1), [`ui/dr-ui/src/collections_ui/controller.rs:258`](../../ui/dr-ui/src/collections_ui/controller.rs#L258), [`ui/dr-ui/src/collections_ui/controller.rs:268`](../../ui/dr-ui/src/collections_ui/controller.rs#L268), [`ui/dr-ui/src/collections_ui/controller.rs:291`](../../ui/dr-ui/src/collections_ui/controller.rs#L291), [`ui/dr-ui/src/collections_ui/controller.rs:312`](../../ui/dr-ui/src/collections_ui/controller.rs#L312), [`ui/dr-ui/src/collections_ui/controller.rs:46`](../../ui/dr-ui/src/collections_ui/controller.rs#L46), [`ui/dr-ui/src/collections_ui/drag.rs:274`](../../ui/dr-ui/src/collections_ui/drag.rs#L274), [`ui/dr-ui/src/collections_ui/mod.rs:1`](../../ui/dr-ui/src/collections_ui/mod.rs#L1), [`ui/dr-ui/src/collections_ui/press.rs:258`](../../ui/dr-ui/src/collections_ui/press.rs#L258), [`ui/dr-ui/src/collections_ui/press.rs:490`](../../ui/dr-ui/src/collections_ui/press.rs#L490), [`ui/dr-ui/src/collections_ui/press.rs:54`](../../ui/dr-ui/src/collections_ui/press.rs#L54), [`ui/dr-ui/src/collections_ui/rename_menu.rs:196`](../../ui/dr-ui/src/collections_ui/rename_menu.rs#L196), [`ui/dr-ui/src/collections_ui/rename_menu.rs:21`](../../ui/dr-ui/src/collections_ui/rename_menu.rs#L21), [`ui/dr-ui/src/collections_ui/tree_sync.rs:246`](../../ui/dr-ui/src/collections_ui/tree_sync.rs#L246), [`ui/dr-ui/src/collections_ui/tree_sync.rs:317`](../../ui/dr-ui/src/collections_ui/tree_sync.rs#L317), [`ui/dr-ui/src/collections_ui/tree_sync.rs:339`](../../ui/dr-ui/src/collections_ui/tree_sync.rs#L339), [`ui/dr-ui/src/collections_ui/wiring_grid.rs:121`](../../ui/dr-ui/src/collections_ui/wiring_grid.rs#L121), [`ui/dr-ui/src/collections_ui/wiring_grid.rs:171`](../../ui/dr-ui/src/collections_ui/wiring_grid.rs#L171), [`ui/dr-ui/src/collections_ui/wiring_grid.rs:444`](../../ui/dr-ui/src/collections_ui/wiring_grid.rs#L444), [`ui/dr-ui/src/collections_ui/wiring_grid.rs:522`](../../ui/dr-ui/src/collections_ui/wiring_grid.rs#L522), [`ui/dr-ui/src/collections_ui/wiring_grid.rs:586`](../../ui/dr-ui/src/collections_ui/wiring_grid.rs#L586), [`ui/dr-ui/src/collections_ui/wiring_tree.rs:287`](../../ui/dr-ui/src/collections_ui/wiring_tree.rs#L287), [`ui/dr-ui/src/collections_ui/wiring_tree.rs:344`](../../ui/dr-ui/src/collections_ui/wiring_tree.rs#L344), [`ui/dr-ui/src/collections_ui/wiring_tree.rs:394`](../../ui/dr-ui/src/collections_ui/wiring_tree.rs#L394), [`ui/dr-ui/src/collections_ui/wiring_tree.rs:517`](../../ui/dr-ui/src/collections_ui/wiring_tree.rs#L517), [`ui/dr-ui/src/collections_ui/wiring_tree.rs:581`](../../ui/dr-ui/src/collections_ui/wiring_tree.rs#L581), [`ui/dr-ui/src/derived_sync.rs:1`](../../ui/dr-ui/src/derived_sync.rs#L1), [`ui/dr-ui/src/library/spans.rs:139`](../../ui/dr-ui/src/library/spans.rs#L139), [`ui/dr-ui/src/library/spans.rs:58`](../../ui/dr-ui/src/library/spans.rs#L58), [`ui/dr-ui/src/library/spans.rs:84`](../../ui/dr-ui/src/library/spans.rs#L84), [`ui/dr-ui/src/library_ui/sync.rs:235`](../../ui/dr-ui/src/library_ui/sync.rs#L235), [`ui/dr-ui/src/library_ui/timeline.rs:513`](../../ui/dr-ui/src/library_ui/timeline.rs#L513), [`ui/dr-ui/src/library_ui/window.rs:273`](../../ui/dr-ui/src/library_ui/window.rs#L273), [`ui/dr-ui/ui/app.slint:3117`](../../ui/dr-ui/ui/app.slint#L3117), [`ui/dr-ui/ui/collections.slint:1182`](../../ui/dr-ui/ui/collections.slint#L1182), [`ui/dr-ui/ui/collections.slint:4`](../../ui/dr-ui/ui/collections.slint#L4), [`ui/dr-ui/ui/collections.slint:587`](../../ui/dr-ui/ui/collections.slint#L587), [`ui/dr-ui/ui/library.slint:1302`](../../ui/dr-ui/ui/library.slint#L1302), [`ui/dr-ui/ui/library.slint:1654`](../../ui/dr-ui/ui/library.slint#L1654), [`ui/dr-ui/ui/library.slint:3491`](../../ui/dr-ui/ui/library.slint#L3491), [`ui/dr-ui/ui/library.slint:4813`](../../ui/dr-ui/ui/library.slint#L4813), [`ui/dr-ui/ui/library.slint:487`](../../ui/dr-ui/ui/library.slint#L487), [`ui/dr-ui/ui/library.slint:4916`](../../ui/dr-ui/ui/library.slint#L4916), [`ui/dr-ui/ui/library.slint:512`](../../ui/dr-ui/ui/library.slint#L512), [`ui/dr-ui/ui/library.slint:554`](../../ui/dr-ui/ui/library.slint#L554), [`ui/dr-ui/ui/library.slint:564`](../../ui/dr-ui/ui/library.slint#L564) | -| FR-CAT-8 | [`core/dr-catalog/src/schema.rs:740`](../../core/dr-catalog/src/schema.rs#L740), [`core/dr-pipeline/src/coverage.rs:1`](../../core/dr-pipeline/src/coverage.rs#L1), [`core/dr-pipeline/src/graph.rs:587`](../../core/dr-pipeline/src/graph.rs#L587), [`core/dr-pipeline/src/graph.rs:640`](../../core/dr-pipeline/src/graph.rs#L640), [`core/dr-pipeline/src/ops/curve.rs:137`](../../core/dr-pipeline/src/ops/curve.rs#L137), [`core/dr-pipeline/src/ops/curve.rs:656`](../../core/dr-pipeline/src/ops/curve.rs#L656), [`core/dr-pipeline/src/sidecar.rs:1433`](../../core/dr-pipeline/src/sidecar.rs#L1433), [`core/dr-pipeline/src/sidecar.rs:2273`](../../core/dr-pipeline/src/sidecar.rs#L2273), [`core/dr-pipeline/src/sidecar.rs:99`](../../core/dr-pipeline/src/sidecar.rs#L99), [`core/dr-pipeline/src/state.rs:1`](../../core/dr-pipeline/src/state.rs#L1), [`core/dr-pipeline/src/state.rs:75`](../../core/dr-pipeline/src/state.rs#L75), [`core/dr-pipeline/tests/tone_curve.rs:34`](../../core/dr-pipeline/tests/tone_curve.rs#L34), [`core/dr-sync/src/scan.rs:31`](../../core/dr-sync/src/scan.rs#L31), [`core/dr-sync/src/scan.rs:56`](../../core/dr-sync/src/scan.rs#L56), [`core/dr-sync/src/scan.rs:926`](../../core/dr-sync/src/scan.rs#L926), [`ui/dr-ui/src/develop/mask_ops.rs:1076`](../../ui/dr-ui/src/develop/mask_ops.rs#L1076), [`ui/dr-ui/src/develop/mask_ops.rs:1130`](../../ui/dr-ui/src/develop/mask_ops.rs#L1130), [`ui/dr-ui/src/develop/mask_ops.rs:178`](../../ui/dr-ui/src/develop/mask_ops.rs#L178), [`ui/dr-ui/src/develop/masks.rs:743`](../../ui/dr-ui/src/develop/masks.rs#L743), [`ui/dr-ui/src/develop/session.rs:566`](../../ui/dr-ui/src/develop/session.rs#L566), [`ui/dr-ui/src/develop/session.rs:595`](../../ui/dr-ui/src/develop/session.rs#L595), [`ui/dr-ui/src/export.rs:831`](../../ui/dr-ui/src/export.rs#L831), [`ui/dr-ui/src/lib.rs:1211`](../../ui/dr-ui/src/lib.rs#L1211), [`ui/dr-ui/src/lib.rs:1271`](../../ui/dr-ui/src/lib.rs#L1271), [`ui/dr-ui/src/lib.rs:2714`](../../ui/dr-ui/src/lib.rs#L2714), [`ui/dr-ui/src/lib.rs:2861`](../../ui/dr-ui/src/lib.rs#L2861), [`ui/dr-ui/src/lib.rs:786`](../../ui/dr-ui/src/lib.rs#L786), [`ui/dr-ui/src/library/scan.rs:226`](../../ui/dr-ui/src/library/scan.rs#L226), [`ui/dr-ui/src/library/scan.rs:261`](../../ui/dr-ui/src/library/scan.rs#L261), [`ui/dr-ui/src/library/scan.rs:34`](../../ui/dr-ui/src/library/scan.rs#L34), [`ui/dr-ui/src/library/sidecar.rs:100`](../../ui/dr-ui/src/library/sidecar.rs#L100), [`ui/dr-ui/src/library/sidecar.rs:11`](../../ui/dr-ui/src/library/sidecar.rs#L11), [`ui/dr-ui/src/library/sidecar.rs:378`](../../ui/dr-ui/src/library/sidecar.rs#L378), [`ui/dr-ui/src/library/sidecar.rs:63`](../../ui/dr-ui/src/library/sidecar.rs#L63), [`ui/dr-ui/src/library/thumbnails_fetch.rs:413`](../../ui/dr-ui/src/library/thumbnails_fetch.rs#L413), [`ui/dr-ui/src/library_ui/grid.rs:712`](../../ui/dr-ui/src/library_ui/grid.rs#L712), [`ui/dr-ui/src/library_ui/open.rs:455`](../../ui/dr-ui/src/library_ui/open.rs#L455), [`ui/dr-ui/src/sidecar_cache.rs:1`](../../ui/dr-ui/src/sidecar_cache.rs#L1) | +| FR-CAT-8 | [`core/dr-catalog/src/schema.rs:740`](../../core/dr-catalog/src/schema.rs#L740), [`core/dr-pipeline/src/coverage.rs:1`](../../core/dr-pipeline/src/coverage.rs#L1), [`core/dr-pipeline/src/graph.rs:587`](../../core/dr-pipeline/src/graph.rs#L587), [`core/dr-pipeline/src/graph.rs:640`](../../core/dr-pipeline/src/graph.rs#L640), [`core/dr-pipeline/src/ops/curve.rs:137`](../../core/dr-pipeline/src/ops/curve.rs#L137), [`core/dr-pipeline/src/ops/curve.rs:656`](../../core/dr-pipeline/src/ops/curve.rs#L656), [`core/dr-pipeline/src/sidecar.rs:1433`](../../core/dr-pipeline/src/sidecar.rs#L1433), [`core/dr-pipeline/src/sidecar.rs:2273`](../../core/dr-pipeline/src/sidecar.rs#L2273), [`core/dr-pipeline/src/sidecar.rs:99`](../../core/dr-pipeline/src/sidecar.rs#L99), [`core/dr-pipeline/src/state.rs:1`](../../core/dr-pipeline/src/state.rs#L1), [`core/dr-pipeline/src/state.rs:75`](../../core/dr-pipeline/src/state.rs#L75), [`core/dr-pipeline/tests/tone_curve.rs:34`](../../core/dr-pipeline/tests/tone_curve.rs#L34), [`core/dr-sync/src/scan.rs:31`](../../core/dr-sync/src/scan.rs#L31), [`core/dr-sync/src/scan.rs:56`](../../core/dr-sync/src/scan.rs#L56), [`core/dr-sync/src/scan.rs:926`](../../core/dr-sync/src/scan.rs#L926), [`ui/dr-ui/src/develop/mask_ops.rs:1076`](../../ui/dr-ui/src/develop/mask_ops.rs#L1076), [`ui/dr-ui/src/develop/mask_ops.rs:1130`](../../ui/dr-ui/src/develop/mask_ops.rs#L1130), [`ui/dr-ui/src/develop/mask_ops.rs:178`](../../ui/dr-ui/src/develop/mask_ops.rs#L178), [`ui/dr-ui/src/develop/masks.rs:743`](../../ui/dr-ui/src/develop/masks.rs#L743), [`ui/dr-ui/src/develop/session.rs:566`](../../ui/dr-ui/src/develop/session.rs#L566), [`ui/dr-ui/src/develop/session.rs:595`](../../ui/dr-ui/src/develop/session.rs#L595), [`ui/dr-ui/src/export.rs:831`](../../ui/dr-ui/src/export.rs#L831), [`ui/dr-ui/src/lib.rs:1211`](../../ui/dr-ui/src/lib.rs#L1211), [`ui/dr-ui/src/lib.rs:1271`](../../ui/dr-ui/src/lib.rs#L1271), [`ui/dr-ui/src/lib.rs:2714`](../../ui/dr-ui/src/lib.rs#L2714), [`ui/dr-ui/src/lib.rs:2861`](../../ui/dr-ui/src/lib.rs#L2861), [`ui/dr-ui/src/lib.rs:786`](../../ui/dr-ui/src/lib.rs#L786), [`ui/dr-ui/src/library/scan.rs:226`](../../ui/dr-ui/src/library/scan.rs#L226), [`ui/dr-ui/src/library/scan.rs:261`](../../ui/dr-ui/src/library/scan.rs#L261), [`ui/dr-ui/src/library/scan.rs:34`](../../ui/dr-ui/src/library/scan.rs#L34), [`ui/dr-ui/src/library/sidecar.rs:100`](../../ui/dr-ui/src/library/sidecar.rs#L100), [`ui/dr-ui/src/library/sidecar.rs:11`](../../ui/dr-ui/src/library/sidecar.rs#L11), [`ui/dr-ui/src/library/sidecar.rs:378`](../../ui/dr-ui/src/library/sidecar.rs#L378), [`ui/dr-ui/src/library/sidecar.rs:63`](../../ui/dr-ui/src/library/sidecar.rs#L63), [`ui/dr-ui/src/library/thumbnails_fetch.rs:413`](../../ui/dr-ui/src/library/thumbnails_fetch.rs#L413), [`ui/dr-ui/src/library_ui/grid.rs:713`](../../ui/dr-ui/src/library_ui/grid.rs#L713), [`ui/dr-ui/src/library_ui/open.rs:455`](../../ui/dr-ui/src/library_ui/open.rs#L455), [`ui/dr-ui/src/sidecar_cache.rs:1`](../../ui/dr-ui/src/sidecar_cache.rs#L1) | | FR-CAT-9 | [`core/dr-catalog/src/cache.rs:1`](../../core/dr-catalog/src/cache.rs#L1), [`core/dr-catalog/src/scan.rs:1`](../../core/dr-catalog/src/scan.rs#L1), [`core/dr-catalog/src/schema.rs:1182`](../../core/dr-catalog/src/schema.rs#L1182), [`core/dr-catalog/src/walk.rs:1022`](../../core/dr-catalog/src/walk.rs#L1022), [`core/dr-catalog/src/walk.rs:162`](../../core/dr-catalog/src/walk.rs#L162), [`core/dr-catalog/src/walk.rs:1`](../../core/dr-catalog/src/walk.rs#L1), [`core/dr-catalog/src/walk.rs:435`](../../core/dr-catalog/src/walk.rs#L435), [`core/dr-catalog/src/walk.rs:728`](../../core/dr-catalog/src/walk.rs#L728), [`core/dr-sync-nextcloud/src/desktop_client.rs:35`](../../core/dr-sync-nextcloud/src/desktop_client.rs#L35), [`core/dr-sync/src/error.rs:113`](../../core/dr-sync/src/error.rs#L113), [`core/dr-sync/src/reachability.rs:1`](../../core/dr-sync/src/reachability.rs#L1), [`core/dr-sync/src/scan.rs:211`](../../core/dr-sync/src/scan.rs#L211), [`core/dr-sync/src/scan.rs:519`](../../core/dr-sync/src/scan.rs#L519), [`core/dr-types/src/lib.rs:122`](../../core/dr-types/src/lib.rs#L122), [`ui/dr-ui/src/develop/render.rs:666`](../../ui/dr-ui/src/develop/render.rs#L666), [`ui/dr-ui/src/develop/render.rs:709`](../../ui/dr-ui/src/develop/render.rs#L709), [`ui/dr-ui/src/library/filters.rs:89`](../../ui/dr-ui/src/library/filters.rs#L89), [`ui/dr-ui/src/library/scan.rs:126`](../../ui/dr-ui/src/library/scan.rs#L126), [`ui/dr-ui/src/library/scan.rs:179`](../../ui/dr-ui/src/library/scan.rs#L179), [`ui/dr-ui/src/library/scan.rs:210`](../../ui/dr-ui/src/library/scan.rs#L210), [`ui/dr-ui/src/library/scan.rs:261`](../../ui/dr-ui/src/library/scan.rs#L261), [`ui/dr-ui/src/library/scan.rs:624`](../../ui/dr-ui/src/library/scan.rs#L624), [`ui/dr-ui/src/library/sidecar.rs:100`](../../ui/dr-ui/src/library/sidecar.rs#L100), [`ui/dr-ui/src/library/sidecar.rs:362`](../../ui/dr-ui/src/library/sidecar.rs#L362), [`ui/dr-ui/src/library/sidecar.rs:378`](../../ui/dr-ui/src/library/sidecar.rs#L378), [`ui/dr-ui/src/library/sidecar.rs:432`](../../ui/dr-ui/src/library/sidecar.rs#L432), [`ui/dr-ui/src/library/spans.rs:361`](../../ui/dr-ui/src/library/spans.rs#L361), [`ui/dr-ui/src/library/thumbnails_fetch.rs:393`](../../ui/dr-ui/src/library/thumbnails_fetch.rs#L393), [`ui/dr-ui/src/library/thumbnails_fetch.rs:449`](../../ui/dr-ui/src/library/thumbnails_fetch.rs#L449), [`ui/dr-ui/src/library/thumbnails_gen.rs:74`](../../ui/dr-ui/src/library/thumbnails_gen.rs#L74), [`ui/dr-ui/src/library_ui/controller.rs:279`](../../ui/dr-ui/src/library_ui/controller.rs#L279), [`ui/dr-ui/src/library_ui/controller.rs:315`](../../ui/dr-ui/src/library_ui/controller.rs#L315), [`ui/dr-ui/src/library_ui/controller.rs:323`](../../ui/dr-ui/src/library_ui/controller.rs#L323), [`ui/dr-ui/src/library_ui/controller.rs:568`](../../ui/dr-ui/src/library_ui/controller.rs#L568), [`ui/dr-ui/src/library_ui/controller.rs:657`](../../ui/dr-ui/src/library_ui/controller.rs#L657), [`ui/dr-ui/src/library_ui/filter_bar.rs:461`](../../ui/dr-ui/src/library_ui/filter_bar.rs#L461), [`ui/dr-ui/src/library_ui/filter_bar.rs:547`](../../ui/dr-ui/src/library_ui/filter_bar.rs#L547), [`ui/dr-ui/src/library_ui/offline.rs:561`](../../ui/dr-ui/src/library_ui/offline.rs#L561), [`ui/dr-ui/src/library_ui/offline.rs:607`](../../ui/dr-ui/src/library_ui/offline.rs#L607), [`ui/dr-ui/src/library_ui/offline.rs:623`](../../ui/dr-ui/src/library_ui/offline.rs#L623), [`ui/dr-ui/src/library_ui/open.rs:533`](../../ui/dr-ui/src/library_ui/open.rs#L533), [`ui/dr-ui/src/library_ui/open.rs:613`](../../ui/dr-ui/src/library_ui/open.rs#L613), [`ui/dr-ui/src/library_ui/ratings_keywords.rs:75`](../../ui/dr-ui/src/library_ui/ratings_keywords.rs#L75), [`ui/dr-ui/src/library_ui/ratings_keywords.rs:841`](../../ui/dr-ui/src/library_ui/ratings_keywords.rs#L841), [`ui/dr-ui/src/library_ui/sync.rs:287`](../../ui/dr-ui/src/library_ui/sync.rs#L287), [`ui/dr-ui/src/library_ui/sync.rs:414`](../../ui/dr-ui/src/library_ui/sync.rs#L414), [`ui/dr-ui/src/library_ui/sync.rs:83`](../../ui/dr-ui/src/library_ui/sync.rs#L83), [`ui/dr-ui/src/library_ui/window.rs:553`](../../ui/dr-ui/src/library_ui/window.rs#L553), [`ui/dr-ui/src/library_ui/window.rs:833`](../../ui/dr-ui/src/library_ui/window.rs#L833), [`ui/dr-ui/src/presets.rs:486`](../../ui/dr-ui/src/presets.rs#L486), [`ui/dr-ui/src/presets.rs:498`](../../ui/dr-ui/src/presets.rs#L498), [`ui/dr-ui/src/sidecar_cache.rs:1`](../../ui/dr-ui/src/sidecar_cache.rs#L1), [`ui/dr-ui/tests/export_ignores_the_viewport.rs:1`](../../ui/dr-ui/tests/export_ignores_the_viewport.rs#L1) | | FR-CULL-1 | [`core/dr-decode/src/preview.rs:121`](../../core/dr-decode/src/preview.rs#L121) | | FR-CULL-10 | [`core/dr-catalog/src/faces.rs:1`](../../core/dr-catalog/src/faces.rs#L1), [`core/dr-catalog/src/schema.rs:1011`](../../core/dr-catalog/src/schema.rs#L1011), [`core/dr-catalog/src/schema.rs:603`](../../core/dr-catalog/src/schema.rs#L603), [`core/dr-catalog/src/schema.rs:781`](../../core/dr-catalog/src/schema.rs#L781), [`core/dr-face/src/assign.rs:1`](../../core/dr-face/src/assign.rs#L1), [`core/dr-face/src/neighbours.rs:1`](../../core/dr-face/src/neighbours.rs#L1), [`core/dr-face/src/references.rs:1`](../../core/dr-face/src/references.rs#L1), [`core/dr-types/src/settings.rs:129`](../../core/dr-types/src/settings.rs#L129), [`ui/dr-ui/src/develop/segmentation.rs:104`](../../ui/dr-ui/src/develop/segmentation.rs#L104), [`ui/dr-ui/src/develop/segmentation.rs:170`](../../ui/dr-ui/src/develop/segmentation.rs#L170), [`ui/dr-ui/src/develop/segmentation.rs:590`](../../ui/dr-ui/src/develop/segmentation.rs#L590), [`ui/dr-ui/src/develop/segmentation.rs:95`](../../ui/dr-ui/src/develop/segmentation.rs#L95), [`ui/dr-ui/src/develop/session.rs:23`](../../ui/dr-ui/src/develop/session.rs#L23), [`ui/dr-ui/src/faces.rs:1`](../../ui/dr-ui/src/faces.rs#L1), [`ui/dr-ui/src/identity.rs:1`](../../ui/dr-ui/src/identity.rs#L1), [`ui/dr-ui/src/identity_ui.rs:1434`](../../ui/dr-ui/src/identity_ui.rs#L1434), [`ui/dr-ui/src/identity_ui.rs:1`](../../ui/dr-ui/src/identity_ui.rs#L1), [`ui/dr-ui/src/lib.rs:2833`](../../ui/dr-ui/src/lib.rs#L2833), [`ui/dr-ui/src/repairs.rs:1`](../../ui/dr-ui/src/repairs.rs#L1), [`ui/dr-ui/ui/identity.slint:1`](../../ui/dr-ui/ui/identity.slint#L1), [`ui/dr-ui/ui/settings.slint:460`](../../ui/dr-ui/ui/settings.slint#L460), [`ui/dr-ui/ui/settings.slint:95`](../../ui/dr-ui/ui/settings.slint#L95) | @@ -119,7 +119,7 @@ _None._ | FR-NC-12 | [`core/dr-sync-folder/src/lib.rs:1`](../../core/dr-sync-folder/src/lib.rs#L1), [`core/dr-sync-nextcloud/src/lib.rs:1097`](../../core/dr-sync-nextcloud/src/lib.rs#L1097), [`core/dr-sync-nextcloud/src/lib.rs:40`](../../core/dr-sync-nextcloud/src/lib.rs#L40), [`core/dr-sync-nextcloud/src/provider.rs:1`](../../core/dr-sync-nextcloud/src/provider.rs#L1), [`core/dr-sync/src/account.rs:1`](../../core/dr-sync/src/account.rs#L1), [`core/dr-sync/src/account.rs:87`](../../core/dr-sync/src/account.rs#L87), [`core/dr-sync/src/lib.rs:218`](../../core/dr-sync/src/lib.rs#L218), [`core/dr-sync/src/lib.rs:51`](../../core/dr-sync/src/lib.rs#L51), [`core/dr-sync/src/provider.rs:120`](../../core/dr-sync/src/provider.rs#L120), [`core/dr-sync/src/provider.rs:1`](../../core/dr-sync/src/provider.rs#L1), [`core/dr-sync/src/provider.rs:53`](../../core/dr-sync/src/provider.rs#L53), [`core/dr-sync/src/reachability.rs:1`](../../core/dr-sync/src/reachability.rs#L1), [`ui/dr-ui/src/remote.rs:1`](../../ui/dr-ui/src/remote.rs#L1) | | FR-NC-13 | [`core/dr-sync-folder/src/lib.rs:197`](../../core/dr-sync-folder/src/lib.rs#L197), [`core/dr-sync-folder/src/lib.rs:1`](../../core/dr-sync-folder/src/lib.rs#L1), [`core/dr-sync-folder/src/lib.rs:73`](../../core/dr-sync-folder/src/lib.rs#L73), [`core/dr-sync/src/provider.rs:120`](../../core/dr-sync/src/provider.rs#L120), [`ui/dr-ui/src/launch_ui.rs:349`](../../ui/dr-ui/src/launch_ui.rs#L349), [`ui/dr-ui/src/remote.rs:1`](../../ui/dr-ui/src/remote.rs#L1) | | FR-NC-2 | [`core/dr-sync/src/account.rs:1`](../../core/dr-sync/src/account.rs#L1), [`core/dr-sync/src/account.rs:318`](../../core/dr-sync/src/account.rs#L318), [`core/dr-sync/src/account.rs:375`](../../core/dr-sync/src/account.rs#L375), [`core/dr-sync/src/account.rs:59`](../../core/dr-sync/src/account.rs#L59), [`platform/dr-plat/src/secrets.rs:82`](../../platform/dr-plat/src/secrets.rs#L82) | -| FR-NC-3 | [`core/dr-decode/src/locate.rs:1`](../../core/dr-decode/src/locate.rs#L1), [`core/dr-decode/src/preview.rs:148`](../../core/dr-decode/src/preview.rs#L148), [`core/dr-sync/src/capability.rs:85`](../../core/dr-sync/src/capability.rs#L85), [`core/dr-thumbs/src/lib.rs:1`](../../core/dr-thumbs/src/lib.rs#L1), [`core/dr-types/src/place.rs:1`](../../core/dr-types/src/place.rs#L1), [`ui/dr-ui/src/decoder_seam.rs:215`](../../ui/dr-ui/src/decoder_seam.rs#L215), [`ui/dr-ui/src/library/mod.rs:1`](../../ui/dr-ui/src/library/mod.rs#L1), [`ui/dr-ui/src/library/sweep.rs:562`](../../ui/dr-ui/src/library/sweep.rs#L562), [`ui/dr-ui/src/library_ui/grid.rs:478`](../../ui/dr-ui/src/library_ui/grid.rs#L478), [`ui/dr-ui/src/library_ui/mod.rs:1`](../../ui/dr-ui/src/library_ui/mod.rs#L1), [`ui/dr-ui/src/library_ui/sync.rs:385`](../../ui/dr-ui/src/library_ui/sync.rs#L385), [`ui/dr-ui/ui/library.slint:764`](../../ui/dr-ui/ui/library.slint#L764), [`ui/dr-ui/ui/settings.slint:366`](../../ui/dr-ui/ui/settings.slint#L366), [`ui/dr-ui/ui/settings.slint:74`](../../ui/dr-ui/ui/settings.slint#L74) | +| FR-NC-3 | [`core/dr-decode/src/locate.rs:1`](../../core/dr-decode/src/locate.rs#L1), [`core/dr-decode/src/preview.rs:148`](../../core/dr-decode/src/preview.rs#L148), [`core/dr-sync/src/capability.rs:85`](../../core/dr-sync/src/capability.rs#L85), [`core/dr-thumbs/src/lib.rs:1`](../../core/dr-thumbs/src/lib.rs#L1), [`core/dr-types/src/place.rs:1`](../../core/dr-types/src/place.rs#L1), [`ui/dr-ui/src/decoder_seam.rs:215`](../../ui/dr-ui/src/decoder_seam.rs#L215), [`ui/dr-ui/src/library/mod.rs:1`](../../ui/dr-ui/src/library/mod.rs#L1), [`ui/dr-ui/src/library/sweep.rs:562`](../../ui/dr-ui/src/library/sweep.rs#L562), [`ui/dr-ui/src/library_ui/grid.rs:479`](../../ui/dr-ui/src/library_ui/grid.rs#L479), [`ui/dr-ui/src/library_ui/mod.rs:1`](../../ui/dr-ui/src/library_ui/mod.rs#L1), [`ui/dr-ui/src/library_ui/sync.rs:385`](../../ui/dr-ui/src/library_ui/sync.rs#L385), [`ui/dr-ui/ui/library.slint:764`](../../ui/dr-ui/ui/library.slint#L764), [`ui/dr-ui/ui/settings.slint:366`](../../ui/dr-ui/ui/settings.slint#L366), [`ui/dr-ui/ui/settings.slint:74`](../../ui/dr-ui/ui/settings.slint#L74) | | FR-NC-4 | [`core/dr-sync-folder/src/lib.rs:197`](../../core/dr-sync-folder/src/lib.rs#L197), [`core/dr-sync-nextcloud/src/propfind.rs:103`](../../core/dr-sync-nextcloud/src/propfind.rs#L103), [`core/dr-sync-nextcloud/src/propfind.rs:51`](../../core/dr-sync-nextcloud/src/propfind.rs#L51), [`core/dr-sync/src/capability.rs:6`](../../core/dr-sync/src/capability.rs#L6), [`core/dr-sync/src/lib.rs:218`](../../core/dr-sync/src/lib.rs#L218), [`core/dr-sync/src/scan.rs:129`](../../core/dr-sync/src/scan.rs#L129), [`ui/dr-ui/src/launch.rs:61`](../../ui/dr-ui/src/launch.rs#L61) | | FR-NC-5 | [`core/dr-sync-nextcloud/src/propfind.rs:51`](../../core/dr-sync-nextcloud/src/propfind.rs#L51), [`ui/dr-ui/src/import.rs:504`](../../ui/dr-ui/src/import.rs#L504) | | FR-NC-6 | [`ui/dr-ui/src/activity.rs:1`](../../ui/dr-ui/src/activity.rs#L1) | @@ -150,11 +150,11 @@ _None._ | FR-UI-1 | [`core/dr-types/src/settings.rs:1377`](../../core/dr-types/src/settings.rs#L1377), [`core/dr-types/src/settings.rs:492`](../../core/dr-types/src/settings.rs#L492), [`core/dr-types/src/settings.rs:512`](../../core/dr-types/src/settings.rs#L512), [`ui/dr-ui/src/develop_ui.rs:204`](../../ui/dr-ui/src/develop_ui.rs#L204), [`ui/dr-ui/src/lib.rs:114`](../../ui/dr-ui/src/lib.rs#L114), [`ui/dr-ui/src/lib.rs:129`](../../ui/dr-ui/src/lib.rs#L129), [`ui/dr-ui/src/lib.rs:151`](../../ui/dr-ui/src/lib.rs#L151), [`ui/dr-ui/src/lib.rs:3224`](../../ui/dr-ui/src/lib.rs#L3224), [`ui/dr-ui/src/lib.rs:3243`](../../ui/dr-ui/src/lib.rs#L3243), [`ui/dr-ui/src/lib.rs:3270`](../../ui/dr-ui/src/lib.rs#L3270), [`ui/dr-ui/src/lib.rs:3321`](../../ui/dr-ui/src/lib.rs#L3321), [`ui/dr-ui/src/lib.rs:3354`](../../ui/dr-ui/src/lib.rs#L3354), [`ui/dr-ui/src/masks_ui.rs:1567`](../../ui/dr-ui/src/masks_ui.rs#L1567), [`ui/dr-ui/src/settings_ui.rs:179`](../../ui/dr-ui/src/settings_ui.rs#L179), [`ui/dr-ui/ui/adjust.slint:981`](../../ui/dr-ui/ui/adjust.slint#L981), [`ui/dr-ui/ui/app.slint:2714`](../../ui/dr-ui/ui/app.slint#L2714), [`ui/dr-ui/ui/app.slint:621`](../../ui/dr-ui/ui/app.slint#L621), [`ui/dr-ui/ui/app.slint:704`](../../ui/dr-ui/ui/app.slint#L704), [`ui/dr-ui/ui/identity.slint:246`](../../ui/dr-ui/ui/identity.slint#L246), [`ui/dr-ui/ui/library.slint:1382`](../../ui/dr-ui/ui/library.slint#L1382), [`ui/dr-ui/ui/settings.slint:123`](../../ui/dr-ui/ui/settings.slint#L123), [`ui/dr-ui/ui/settings.slint:612`](../../ui/dr-ui/ui/settings.slint#L612), [`ui/dr-ui/ui/toolrail.slint:156`](../../ui/dr-ui/ui/toolrail.slint#L156), [`ui/dr-ui/ui/toolrail.slint:89`](../../ui/dr-ui/ui/toolrail.slint#L89) | | FR-UI-2 | [`ui/dr-ui/src/collections_ui/controller.rs:45`](../../ui/dr-ui/src/collections_ui/controller.rs#L45), [`ui/dr-ui/src/collections_ui/controller.rs:83`](../../ui/dr-ui/src/collections_ui/controller.rs#L83), [`ui/dr-ui/src/collections_ui/drag.rs:246`](../../ui/dr-ui/src/collections_ui/drag.rs#L246), [`ui/dr-ui/src/collections_ui/drag.rs:256`](../../ui/dr-ui/src/collections_ui/drag.rs#L256), [`ui/dr-ui/src/collections_ui/press.rs:453`](../../ui/dr-ui/src/collections_ui/press.rs#L453), [`ui/dr-ui/src/collections_ui/wiring_grid.rs:121`](../../ui/dr-ui/src/collections_ui/wiring_grid.rs#L121), [`ui/dr-ui/src/collections_ui/wiring_grid.rs:138`](../../ui/dr-ui/src/collections_ui/wiring_grid.rs#L138), [`ui/dr-ui/src/collections_ui/wiring_grid.rs:415`](../../ui/dr-ui/src/collections_ui/wiring_grid.rs#L415), [`ui/dr-ui/src/collections_ui/wiring_tree.rs:287`](../../ui/dr-ui/src/collections_ui/wiring_tree.rs#L287), [`ui/dr-ui/src/gestures.rs:1`](../../ui/dr-ui/src/gestures.rs#L1), [`ui/dr-ui/src/lib.rs:114`](../../ui/dr-ui/src/lib.rs#L114), [`ui/dr-ui/src/library_ui/filter_bar.rs:351`](../../ui/dr-ui/src/library_ui/filter_bar.rs#L351), [`ui/dr-ui/src/library_ui/window.rs:875`](../../ui/dr-ui/src/library_ui/window.rs#L875), [`ui/dr-ui/ui/app.slint:127`](../../ui/dr-ui/ui/app.slint#L127), [`ui/dr-ui/ui/app.slint:688`](../../ui/dr-ui/ui/app.slint#L688), [`ui/dr-ui/ui/collections.slint:1253`](../../ui/dr-ui/ui/collections.slint#L1253), [`ui/dr-ui/ui/controls.slint:626`](../../ui/dr-ui/ui/controls.slint#L626), [`ui/dr-ui/ui/gestures.slint:1`](../../ui/dr-ui/ui/gestures.slint#L1), [`ui/dr-ui/ui/library.slint:1269`](../../ui/dr-ui/ui/library.slint#L1269), [`ui/dr-ui/ui/library.slint:1302`](../../ui/dr-ui/ui/library.slint#L1302), [`ui/dr-ui/ui/library.slint:1614`](../../ui/dr-ui/ui/library.slint#L1614), [`ui/dr-ui/ui/library.slint:1621`](../../ui/dr-ui/ui/library.slint#L1621), [`ui/dr-ui/ui/library.slint:1718`](../../ui/dr-ui/ui/library.slint#L1718), [`ui/dr-ui/ui/library.slint:3044`](../../ui/dr-ui/ui/library.slint#L3044), [`ui/dr-ui/ui/library.slint:4977`](../../ui/dr-ui/ui/library.slint#L4977), [`ui/dr-ui/ui/library.slint:559`](../../ui/dr-ui/ui/library.slint#L559), [`ui/dr-ui/ui/presets.slint:19`](../../ui/dr-ui/ui/presets.slint#L19), [`ui/dr-ui/ui/settings.slint:137`](../../ui/dr-ui/ui/settings.slint#L137) | | FR-UI-3 | [`ui/dr-ui/src/collections_ui/controller.rs:138`](../../ui/dr-ui/src/collections_ui/controller.rs#L138), [`ui/dr-ui/src/collections_ui/controller.rs:343`](../../ui/dr-ui/src/collections_ui/controller.rs#L343), [`ui/dr-ui/src/collections_ui/controller.rs:356`](../../ui/dr-ui/src/collections_ui/controller.rs#L356), [`ui/dr-ui/src/collections_ui/wiring_tree.rs:287`](../../ui/dr-ui/src/collections_ui/wiring_tree.rs#L287), [`ui/dr-ui/src/develop/masks.rs:361`](../../ui/dr-ui/src/develop/masks.rs#L361), [`ui/dr-ui/src/develop/repairs.rs:49`](../../ui/dr-ui/src/develop/repairs.rs#L49), [`ui/dr-ui/src/library_ui/grid.rs:168`](../../ui/dr-ui/src/library_ui/grid.rs#L168), [`ui/dr-ui/src/masks_ui.rs:1659`](../../ui/dr-ui/src/masks_ui.rs#L1659), [`ui/dr-ui/src/masks_ui.rs:1681`](../../ui/dr-ui/src/masks_ui.rs#L1681), [`ui/dr-ui/src/masks_ui.rs:339`](../../ui/dr-ui/src/masks_ui.rs#L339), [`ui/dr-ui/src/spots_ui.rs:19`](../../ui/dr-ui/src/spots_ui.rs#L19), [`ui/dr-ui/ui/app.slint:2099`](../../ui/dr-ui/ui/app.slint#L2099), [`ui/dr-ui/ui/collections.slint:1127`](../../ui/dr-ui/ui/collections.slint#L1127), [`ui/dr-ui/ui/collections.slint:4`](../../ui/dr-ui/ui/collections.slint#L4), [`ui/dr-ui/ui/collections.slint:75`](../../ui/dr-ui/ui/collections.slint#L75), [`ui/dr-ui/ui/collections.slint:877`](../../ui/dr-ui/ui/collections.slint#L877), [`ui/dr-ui/ui/masks.slint:1237`](../../ui/dr-ui/ui/masks.slint#L1237), [`ui/dr-ui/ui/widgets.slint:72`](../../ui/dr-ui/ui/widgets.slint#L72) | -| FR-UI-4 | [`tools/traceability/src/gestures.rs:1`](../../tools/traceability/src/gestures.rs#L1), [`ui/dr-ui/src/collections_ui/controller.rs:138`](../../ui/dr-ui/src/collections_ui/controller.rs#L138), [`ui/dr-ui/src/collections_ui/controller.rs:343`](../../ui/dr-ui/src/collections_ui/controller.rs#L343), [`ui/dr-ui/src/collections_ui/controller.rs:356`](../../ui/dr-ui/src/collections_ui/controller.rs#L356), [`ui/dr-ui/src/collections_ui/controller.rs:45`](../../ui/dr-ui/src/collections_ui/controller.rs#L45), [`ui/dr-ui/src/collections_ui/controller.rs:46`](../../ui/dr-ui/src/collections_ui/controller.rs#L46), [`ui/dr-ui/src/collections_ui/controller.rs:55`](../../ui/dr-ui/src/collections_ui/controller.rs#L55), [`ui/dr-ui/src/collections_ui/controller.rs:83`](../../ui/dr-ui/src/collections_ui/controller.rs#L83), [`ui/dr-ui/src/collections_ui/drag.rs:246`](../../ui/dr-ui/src/collections_ui/drag.rs#L246), [`ui/dr-ui/src/collections_ui/drag.rs:256`](../../ui/dr-ui/src/collections_ui/drag.rs#L256), [`ui/dr-ui/src/collections_ui/press.rs:258`](../../ui/dr-ui/src/collections_ui/press.rs#L258), [`ui/dr-ui/src/collections_ui/press.rs:278`](../../ui/dr-ui/src/collections_ui/press.rs#L278), [`ui/dr-ui/src/collections_ui/press.rs:453`](../../ui/dr-ui/src/collections_ui/press.rs#L453), [`ui/dr-ui/src/collections_ui/press.rs:490`](../../ui/dr-ui/src/collections_ui/press.rs#L490), [`ui/dr-ui/src/collections_ui/press.rs:54`](../../ui/dr-ui/src/collections_ui/press.rs#L54), [`ui/dr-ui/src/collections_ui/tree_sync.rs:339`](../../ui/dr-ui/src/collections_ui/tree_sync.rs#L339), [`ui/dr-ui/src/collections_ui/wiring_grid.rs:121`](../../ui/dr-ui/src/collections_ui/wiring_grid.rs#L121), [`ui/dr-ui/src/collections_ui/wiring_grid.rs:138`](../../ui/dr-ui/src/collections_ui/wiring_grid.rs#L138), [`ui/dr-ui/src/collections_ui/wiring_grid.rs:264`](../../ui/dr-ui/src/collections_ui/wiring_grid.rs#L264), [`ui/dr-ui/src/collections_ui/wiring_grid.rs:415`](../../ui/dr-ui/src/collections_ui/wiring_grid.rs#L415), [`ui/dr-ui/src/collections_ui/wiring_grid.rs:444`](../../ui/dr-ui/src/collections_ui/wiring_grid.rs#L444), [`ui/dr-ui/src/collections_ui/wiring_grid.rs:577`](../../ui/dr-ui/src/collections_ui/wiring_grid.rs#L577), [`ui/dr-ui/src/collections_ui/wiring_tree.rs:287`](../../ui/dr-ui/src/collections_ui/wiring_tree.rs#L287), [`ui/dr-ui/src/collections_ui/wiring_tree.rs:344`](../../ui/dr-ui/src/collections_ui/wiring_tree.rs#L344), [`ui/dr-ui/src/develop/framing.rs:257`](../../ui/dr-ui/src/develop/framing.rs#L257), [`ui/dr-ui/src/develop/framing.rs:594`](../../ui/dr-ui/src/develop/framing.rs#L594), [`ui/dr-ui/src/develop/framing.rs:619`](../../ui/dr-ui/src/develop/framing.rs#L619), [`ui/dr-ui/src/develop/framing.rs:630`](../../ui/dr-ui/src/develop/framing.rs#L630), [`ui/dr-ui/src/develop/framing.rs:644`](../../ui/dr-ui/src/develop/framing.rs#L644), [`ui/dr-ui/src/develop/framing.rs:818`](../../ui/dr-ui/src/develop/framing.rs#L818), [`ui/dr-ui/src/develop/framing.rs:849`](../../ui/dr-ui/src/develop/framing.rs#L849), [`ui/dr-ui/src/develop/framing.rs:870`](../../ui/dr-ui/src/develop/framing.rs#L870), [`ui/dr-ui/src/develop/framing.rs:995`](../../ui/dr-ui/src/develop/framing.rs#L995), [`ui/dr-ui/src/develop/render.rs:1107`](../../ui/dr-ui/src/develop/render.rs#L1107), [`ui/dr-ui/src/develop/render.rs:1132`](../../ui/dr-ui/src/develop/render.rs#L1132), [`ui/dr-ui/src/develop/render.rs:1155`](../../ui/dr-ui/src/develop/render.rs#L1155), [`ui/dr-ui/src/develop/render.rs:1194`](../../ui/dr-ui/src/develop/render.rs#L1194), [`ui/dr-ui/src/develop/render.rs:47`](../../ui/dr-ui/src/develop/render.rs#L47), [`ui/dr-ui/src/develop/render.rs:66`](../../ui/dr-ui/src/develop/render.rs#L66), [`ui/dr-ui/src/develop/render.rs:79`](../../ui/dr-ui/src/develop/render.rs#L79), [`ui/dr-ui/src/develop_ui.rs:812`](../../ui/dr-ui/src/develop_ui.rs#L812), [`ui/dr-ui/src/gesture_book.rs:3`](../../ui/dr-ui/src/gesture_book.rs#L3), [`ui/dr-ui/src/gestures.rs:1`](../../ui/dr-ui/src/gestures.rs#L1), [`ui/dr-ui/src/lib.rs:1312`](../../ui/dr-ui/src/lib.rs#L1312), [`ui/dr-ui/src/lib.rs:1600`](../../ui/dr-ui/src/lib.rs#L1600), [`ui/dr-ui/src/lib.rs:2596`](../../ui/dr-ui/src/lib.rs#L2596), [`ui/dr-ui/src/lib.rs:2815`](../../ui/dr-ui/src/lib.rs#L2815), [`ui/dr-ui/src/lib.rs:2875`](../../ui/dr-ui/src/lib.rs#L2875), [`ui/dr-ui/src/lib.rs:3034`](../../ui/dr-ui/src/lib.rs#L3034), [`ui/dr-ui/src/lib.rs:3474`](../../ui/dr-ui/src/lib.rs#L3474), [`ui/dr-ui/src/lib.rs:481`](../../ui/dr-ui/src/lib.rs#L481), [`ui/dr-ui/src/lib.rs:510`](../../ui/dr-ui/src/lib.rs#L510), [`ui/dr-ui/src/library/thumbnails_fetch.rs:718`](../../ui/dr-ui/src/library/thumbnails_fetch.rs#L718), [`ui/dr-ui/src/library/thumbnails_fetch.rs:733`](../../ui/dr-ui/src/library/thumbnails_fetch.rs#L733), [`ui/dr-ui/src/library_ui/controller.rs:382`](../../ui/dr-ui/src/library_ui/controller.rs#L382), [`ui/dr-ui/src/library_ui/controller.rs:522`](../../ui/dr-ui/src/library_ui/controller.rs#L522), [`ui/dr-ui/src/library_ui/controller.rs:599`](../../ui/dr-ui/src/library_ui/controller.rs#L599), [`ui/dr-ui/src/library_ui/filter_bar.rs:500`](../../ui/dr-ui/src/library_ui/filter_bar.rs#L500), [`ui/dr-ui/src/library_ui/grid.rs:168`](../../ui/dr-ui/src/library_ui/grid.rs#L168), [`ui/dr-ui/src/library_ui/grid.rs:182`](../../ui/dr-ui/src/library_ui/grid.rs#L182), [`ui/dr-ui/src/library_ui/grid.rs:202`](../../ui/dr-ui/src/library_ui/grid.rs#L202), [`ui/dr-ui/src/library_ui/grid.rs:276`](../../ui/dr-ui/src/library_ui/grid.rs#L276), [`ui/dr-ui/src/library_ui/grid.rs:413`](../../ui/dr-ui/src/library_ui/grid.rs#L413), [`ui/dr-ui/src/library_ui/grid.rs:443`](../../ui/dr-ui/src/library_ui/grid.rs#L443), [`ui/dr-ui/src/library_ui/ratings_keywords.rs:1109`](../../ui/dr-ui/src/library_ui/ratings_keywords.rs#L1109), [`ui/dr-ui/src/manual.rs:1`](../../ui/dr-ui/src/manual.rs#L1), [`ui/dr-ui/src/settings_ui.rs:157`](../../ui/dr-ui/src/settings_ui.rs#L157), [`ui/dr-ui/src/settings_ui.rs:616`](../../ui/dr-ui/src/settings_ui.rs#L616), [`ui/dr-ui/ui/app.slint:1643`](../../ui/dr-ui/ui/app.slint#L1643), [`ui/dr-ui/ui/app.slint:1792`](../../ui/dr-ui/ui/app.slint#L1792), [`ui/dr-ui/ui/app.slint:1914`](../../ui/dr-ui/ui/app.slint#L1914), [`ui/dr-ui/ui/app.slint:228`](../../ui/dr-ui/ui/app.slint#L228), [`ui/dr-ui/ui/app.slint:2389`](../../ui/dr-ui/ui/app.slint#L2389), [`ui/dr-ui/ui/app.slint:2556`](../../ui/dr-ui/ui/app.slint#L2556), [`ui/dr-ui/ui/app.slint:3117`](../../ui/dr-ui/ui/app.slint#L3117), [`ui/dr-ui/ui/collections.slint:1253`](../../ui/dr-ui/ui/collections.slint#L1253), [`ui/dr-ui/ui/collections.slint:75`](../../ui/dr-ui/ui/collections.slint#L75), [`ui/dr-ui/ui/develop.slint:126`](../../ui/dr-ui/ui/develop.slint#L126), [`ui/dr-ui/ui/gestures.slint:1`](../../ui/dr-ui/ui/gestures.slint#L1), [`ui/dr-ui/ui/labels.slint:74`](../../ui/dr-ui/ui/labels.slint#L74), [`ui/dr-ui/ui/library.slint:1269`](../../ui/dr-ui/ui/library.slint#L1269), [`ui/dr-ui/ui/library.slint:1296`](../../ui/dr-ui/ui/library.slint#L1296), [`ui/dr-ui/ui/library.slint:1302`](../../ui/dr-ui/ui/library.slint#L1302), [`ui/dr-ui/ui/library.slint:1357`](../../ui/dr-ui/ui/library.slint#L1357), [`ui/dr-ui/ui/library.slint:1552`](../../ui/dr-ui/ui/library.slint#L1552), [`ui/dr-ui/ui/library.slint:1587`](../../ui/dr-ui/ui/library.slint#L1587), [`ui/dr-ui/ui/library.slint:1614`](../../ui/dr-ui/ui/library.slint#L1614), [`ui/dr-ui/ui/library.slint:1621`](../../ui/dr-ui/ui/library.slint#L1621), [`ui/dr-ui/ui/library.slint:1654`](../../ui/dr-ui/ui/library.slint#L1654), [`ui/dr-ui/ui/library.slint:1711`](../../ui/dr-ui/ui/library.slint#L1711), [`ui/dr-ui/ui/library.slint:1718`](../../ui/dr-ui/ui/library.slint#L1718), [`ui/dr-ui/ui/library.slint:3044`](../../ui/dr-ui/ui/library.slint#L3044), [`ui/dr-ui/ui/library.slint:3214`](../../ui/dr-ui/ui/library.slint#L3214), [`ui/dr-ui/ui/library.slint:4813`](../../ui/dr-ui/ui/library.slint#L4813), [`ui/dr-ui/ui/library.slint:4851`](../../ui/dr-ui/ui/library.slint#L4851), [`ui/dr-ui/ui/library.slint:4916`](../../ui/dr-ui/ui/library.slint#L4916), [`ui/dr-ui/ui/library.slint:4977`](../../ui/dr-ui/ui/library.slint#L4977), [`ui/dr-ui/ui/library.slint:554`](../../ui/dr-ui/ui/library.slint#L554), [`ui/dr-ui/ui/library.slint:564`](../../ui/dr-ui/ui/library.slint#L564), [`ui/dr-ui/ui/library.slint:654`](../../ui/dr-ui/ui/library.slint#L654), [`ui/dr-ui/ui/library.slint:723`](../../ui/dr-ui/ui/library.slint#L723), [`ui/dr-ui/ui/settings.slint:115`](../../ui/dr-ui/ui/settings.slint#L115), [`ui/dr-ui/ui/settings.slint:166`](../../ui/dr-ui/ui/settings.slint#L166), [`ui/dr-ui/ui/settings.slint:587`](../../ui/dr-ui/ui/settings.slint#L587) | +| FR-UI-4 | [`tools/traceability/src/gestures.rs:1`](../../tools/traceability/src/gestures.rs#L1), [`ui/dr-ui/src/collections_ui/controller.rs:138`](../../ui/dr-ui/src/collections_ui/controller.rs#L138), [`ui/dr-ui/src/collections_ui/controller.rs:343`](../../ui/dr-ui/src/collections_ui/controller.rs#L343), [`ui/dr-ui/src/collections_ui/controller.rs:356`](../../ui/dr-ui/src/collections_ui/controller.rs#L356), [`ui/dr-ui/src/collections_ui/controller.rs:45`](../../ui/dr-ui/src/collections_ui/controller.rs#L45), [`ui/dr-ui/src/collections_ui/controller.rs:46`](../../ui/dr-ui/src/collections_ui/controller.rs#L46), [`ui/dr-ui/src/collections_ui/controller.rs:55`](../../ui/dr-ui/src/collections_ui/controller.rs#L55), [`ui/dr-ui/src/collections_ui/controller.rs:83`](../../ui/dr-ui/src/collections_ui/controller.rs#L83), [`ui/dr-ui/src/collections_ui/drag.rs:246`](../../ui/dr-ui/src/collections_ui/drag.rs#L246), [`ui/dr-ui/src/collections_ui/drag.rs:256`](../../ui/dr-ui/src/collections_ui/drag.rs#L256), [`ui/dr-ui/src/collections_ui/press.rs:258`](../../ui/dr-ui/src/collections_ui/press.rs#L258), [`ui/dr-ui/src/collections_ui/press.rs:278`](../../ui/dr-ui/src/collections_ui/press.rs#L278), [`ui/dr-ui/src/collections_ui/press.rs:453`](../../ui/dr-ui/src/collections_ui/press.rs#L453), [`ui/dr-ui/src/collections_ui/press.rs:490`](../../ui/dr-ui/src/collections_ui/press.rs#L490), [`ui/dr-ui/src/collections_ui/press.rs:54`](../../ui/dr-ui/src/collections_ui/press.rs#L54), [`ui/dr-ui/src/collections_ui/tree_sync.rs:339`](../../ui/dr-ui/src/collections_ui/tree_sync.rs#L339), [`ui/dr-ui/src/collections_ui/wiring_grid.rs:121`](../../ui/dr-ui/src/collections_ui/wiring_grid.rs#L121), [`ui/dr-ui/src/collections_ui/wiring_grid.rs:138`](../../ui/dr-ui/src/collections_ui/wiring_grid.rs#L138), [`ui/dr-ui/src/collections_ui/wiring_grid.rs:264`](../../ui/dr-ui/src/collections_ui/wiring_grid.rs#L264), [`ui/dr-ui/src/collections_ui/wiring_grid.rs:415`](../../ui/dr-ui/src/collections_ui/wiring_grid.rs#L415), [`ui/dr-ui/src/collections_ui/wiring_grid.rs:444`](../../ui/dr-ui/src/collections_ui/wiring_grid.rs#L444), [`ui/dr-ui/src/collections_ui/wiring_grid.rs:577`](../../ui/dr-ui/src/collections_ui/wiring_grid.rs#L577), [`ui/dr-ui/src/collections_ui/wiring_tree.rs:287`](../../ui/dr-ui/src/collections_ui/wiring_tree.rs#L287), [`ui/dr-ui/src/collections_ui/wiring_tree.rs:344`](../../ui/dr-ui/src/collections_ui/wiring_tree.rs#L344), [`ui/dr-ui/src/develop/framing.rs:257`](../../ui/dr-ui/src/develop/framing.rs#L257), [`ui/dr-ui/src/develop/framing.rs:594`](../../ui/dr-ui/src/develop/framing.rs#L594), [`ui/dr-ui/src/develop/framing.rs:619`](../../ui/dr-ui/src/develop/framing.rs#L619), [`ui/dr-ui/src/develop/framing.rs:630`](../../ui/dr-ui/src/develop/framing.rs#L630), [`ui/dr-ui/src/develop/framing.rs:644`](../../ui/dr-ui/src/develop/framing.rs#L644), [`ui/dr-ui/src/develop/framing.rs:818`](../../ui/dr-ui/src/develop/framing.rs#L818), [`ui/dr-ui/src/develop/framing.rs:849`](../../ui/dr-ui/src/develop/framing.rs#L849), [`ui/dr-ui/src/develop/framing.rs:870`](../../ui/dr-ui/src/develop/framing.rs#L870), [`ui/dr-ui/src/develop/framing.rs:995`](../../ui/dr-ui/src/develop/framing.rs#L995), [`ui/dr-ui/src/develop/render.rs:1107`](../../ui/dr-ui/src/develop/render.rs#L1107), [`ui/dr-ui/src/develop/render.rs:1132`](../../ui/dr-ui/src/develop/render.rs#L1132), [`ui/dr-ui/src/develop/render.rs:1155`](../../ui/dr-ui/src/develop/render.rs#L1155), [`ui/dr-ui/src/develop/render.rs:1194`](../../ui/dr-ui/src/develop/render.rs#L1194), [`ui/dr-ui/src/develop/render.rs:47`](../../ui/dr-ui/src/develop/render.rs#L47), [`ui/dr-ui/src/develop/render.rs:66`](../../ui/dr-ui/src/develop/render.rs#L66), [`ui/dr-ui/src/develop/render.rs:79`](../../ui/dr-ui/src/develop/render.rs#L79), [`ui/dr-ui/src/develop_ui.rs:812`](../../ui/dr-ui/src/develop_ui.rs#L812), [`ui/dr-ui/src/gesture_book.rs:3`](../../ui/dr-ui/src/gesture_book.rs#L3), [`ui/dr-ui/src/gestures.rs:1`](../../ui/dr-ui/src/gestures.rs#L1), [`ui/dr-ui/src/lib.rs:1312`](../../ui/dr-ui/src/lib.rs#L1312), [`ui/dr-ui/src/lib.rs:1600`](../../ui/dr-ui/src/lib.rs#L1600), [`ui/dr-ui/src/lib.rs:2596`](../../ui/dr-ui/src/lib.rs#L2596), [`ui/dr-ui/src/lib.rs:2815`](../../ui/dr-ui/src/lib.rs#L2815), [`ui/dr-ui/src/lib.rs:2875`](../../ui/dr-ui/src/lib.rs#L2875), [`ui/dr-ui/src/lib.rs:3034`](../../ui/dr-ui/src/lib.rs#L3034), [`ui/dr-ui/src/lib.rs:3474`](../../ui/dr-ui/src/lib.rs#L3474), [`ui/dr-ui/src/lib.rs:481`](../../ui/dr-ui/src/lib.rs#L481), [`ui/dr-ui/src/lib.rs:510`](../../ui/dr-ui/src/lib.rs#L510), [`ui/dr-ui/src/library/thumbnails_fetch.rs:718`](../../ui/dr-ui/src/library/thumbnails_fetch.rs#L718), [`ui/dr-ui/src/library/thumbnails_fetch.rs:733`](../../ui/dr-ui/src/library/thumbnails_fetch.rs#L733), [`ui/dr-ui/src/library_ui/controller.rs:382`](../../ui/dr-ui/src/library_ui/controller.rs#L382), [`ui/dr-ui/src/library_ui/controller.rs:522`](../../ui/dr-ui/src/library_ui/controller.rs#L522), [`ui/dr-ui/src/library_ui/controller.rs:599`](../../ui/dr-ui/src/library_ui/controller.rs#L599), [`ui/dr-ui/src/library_ui/filter_bar.rs:500`](../../ui/dr-ui/src/library_ui/filter_bar.rs#L500), [`ui/dr-ui/src/library_ui/grid.rs:168`](../../ui/dr-ui/src/library_ui/grid.rs#L168), [`ui/dr-ui/src/library_ui/grid.rs:182`](../../ui/dr-ui/src/library_ui/grid.rs#L182), [`ui/dr-ui/src/library_ui/grid.rs:203`](../../ui/dr-ui/src/library_ui/grid.rs#L203), [`ui/dr-ui/src/library_ui/grid.rs:277`](../../ui/dr-ui/src/library_ui/grid.rs#L277), [`ui/dr-ui/src/library_ui/grid.rs:414`](../../ui/dr-ui/src/library_ui/grid.rs#L414), [`ui/dr-ui/src/library_ui/grid.rs:444`](../../ui/dr-ui/src/library_ui/grid.rs#L444), [`ui/dr-ui/src/library_ui/ratings_keywords.rs:1109`](../../ui/dr-ui/src/library_ui/ratings_keywords.rs#L1109), [`ui/dr-ui/src/manual.rs:1`](../../ui/dr-ui/src/manual.rs#L1), [`ui/dr-ui/src/settings_ui.rs:157`](../../ui/dr-ui/src/settings_ui.rs#L157), [`ui/dr-ui/src/settings_ui.rs:616`](../../ui/dr-ui/src/settings_ui.rs#L616), [`ui/dr-ui/ui/app.slint:1643`](../../ui/dr-ui/ui/app.slint#L1643), [`ui/dr-ui/ui/app.slint:1792`](../../ui/dr-ui/ui/app.slint#L1792), [`ui/dr-ui/ui/app.slint:1914`](../../ui/dr-ui/ui/app.slint#L1914), [`ui/dr-ui/ui/app.slint:228`](../../ui/dr-ui/ui/app.slint#L228), [`ui/dr-ui/ui/app.slint:2389`](../../ui/dr-ui/ui/app.slint#L2389), [`ui/dr-ui/ui/app.slint:2556`](../../ui/dr-ui/ui/app.slint#L2556), [`ui/dr-ui/ui/app.slint:3117`](../../ui/dr-ui/ui/app.slint#L3117), [`ui/dr-ui/ui/collections.slint:1253`](../../ui/dr-ui/ui/collections.slint#L1253), [`ui/dr-ui/ui/collections.slint:75`](../../ui/dr-ui/ui/collections.slint#L75), [`ui/dr-ui/ui/develop.slint:126`](../../ui/dr-ui/ui/develop.slint#L126), [`ui/dr-ui/ui/gestures.slint:1`](../../ui/dr-ui/ui/gestures.slint#L1), [`ui/dr-ui/ui/labels.slint:74`](../../ui/dr-ui/ui/labels.slint#L74), [`ui/dr-ui/ui/library.slint:1269`](../../ui/dr-ui/ui/library.slint#L1269), [`ui/dr-ui/ui/library.slint:1296`](../../ui/dr-ui/ui/library.slint#L1296), [`ui/dr-ui/ui/library.slint:1302`](../../ui/dr-ui/ui/library.slint#L1302), [`ui/dr-ui/ui/library.slint:1357`](../../ui/dr-ui/ui/library.slint#L1357), [`ui/dr-ui/ui/library.slint:1552`](../../ui/dr-ui/ui/library.slint#L1552), [`ui/dr-ui/ui/library.slint:1587`](../../ui/dr-ui/ui/library.slint#L1587), [`ui/dr-ui/ui/library.slint:1614`](../../ui/dr-ui/ui/library.slint#L1614), [`ui/dr-ui/ui/library.slint:1621`](../../ui/dr-ui/ui/library.slint#L1621), [`ui/dr-ui/ui/library.slint:1654`](../../ui/dr-ui/ui/library.slint#L1654), [`ui/dr-ui/ui/library.slint:1711`](../../ui/dr-ui/ui/library.slint#L1711), [`ui/dr-ui/ui/library.slint:1718`](../../ui/dr-ui/ui/library.slint#L1718), [`ui/dr-ui/ui/library.slint:3044`](../../ui/dr-ui/ui/library.slint#L3044), [`ui/dr-ui/ui/library.slint:3214`](../../ui/dr-ui/ui/library.slint#L3214), [`ui/dr-ui/ui/library.slint:4813`](../../ui/dr-ui/ui/library.slint#L4813), [`ui/dr-ui/ui/library.slint:4851`](../../ui/dr-ui/ui/library.slint#L4851), [`ui/dr-ui/ui/library.slint:4916`](../../ui/dr-ui/ui/library.slint#L4916), [`ui/dr-ui/ui/library.slint:4977`](../../ui/dr-ui/ui/library.slint#L4977), [`ui/dr-ui/ui/library.slint:554`](../../ui/dr-ui/ui/library.slint#L554), [`ui/dr-ui/ui/library.slint:564`](../../ui/dr-ui/ui/library.slint#L564), [`ui/dr-ui/ui/library.slint:654`](../../ui/dr-ui/ui/library.slint#L654), [`ui/dr-ui/ui/library.slint:723`](../../ui/dr-ui/ui/library.slint#L723), [`ui/dr-ui/ui/settings.slint:115`](../../ui/dr-ui/ui/settings.slint#L115), [`ui/dr-ui/ui/settings.slint:166`](../../ui/dr-ui/ui/settings.slint#L166), [`ui/dr-ui/ui/settings.slint:587`](../../ui/dr-ui/ui/settings.slint#L587) | | FR-UI-5 | [`core/dr-types/src/place.rs:118`](../../core/dr-types/src/place.rs#L118), [`ui/dr-ui/src/collections_ui/mod.rs:1`](../../ui/dr-ui/src/collections_ui/mod.rs#L1), [`ui/dr-ui/src/develop_ui.rs:857`](../../ui/dr-ui/src/develop_ui.rs#L857), [`ui/dr-ui/src/lib.rs:3418`](../../ui/dr-ui/src/lib.rs#L3418), [`ui/dr-ui/src/lib.rs:3625`](../../ui/dr-ui/src/lib.rs#L3625), [`ui/dr-ui/src/library/filters.rs:79`](../../ui/dr-ui/src/library/filters.rs#L79), [`ui/dr-ui/src/library_ui/filter_bar.rs:57`](../../ui/dr-ui/src/library_ui/filter_bar.rs#L57), [`ui/dr-ui/src/library_ui/ratings_keywords.rs:1085`](../../ui/dr-ui/src/library_ui/ratings_keywords.rs#L1085), [`ui/dr-ui/src/library_ui/ratings_keywords.rs:1149`](../../ui/dr-ui/src/library_ui/ratings_keywords.rs#L1149), [`ui/dr-ui/src/masks_ui.rs:1614`](../../ui/dr-ui/src/masks_ui.rs#L1614), [`ui/dr-ui/src/place.rs:331`](../../ui/dr-ui/src/place.rs#L331), [`ui/dr-ui/src/settings_ui.rs:502`](../../ui/dr-ui/src/settings_ui.rs#L502), [`ui/dr-ui/ui/app.slint:2318`](../../ui/dr-ui/ui/app.slint#L2318), [`ui/dr-ui/ui/app.slint:2346`](../../ui/dr-ui/ui/app.slint#L2346), [`ui/dr-ui/ui/app.slint:2389`](../../ui/dr-ui/ui/app.slint#L2389), [`ui/dr-ui/ui/app.slint:2436`](../../ui/dr-ui/ui/app.slint#L2436), [`ui/dr-ui/ui/app.slint:3058`](../../ui/dr-ui/ui/app.slint#L3058), [`ui/dr-ui/ui/app.slint:3086`](../../ui/dr-ui/ui/app.slint#L3086), [`ui/dr-ui/ui/app.slint:642`](../../ui/dr-ui/ui/app.slint#L642), [`ui/dr-ui/ui/app.slint:649`](../../ui/dr-ui/ui/app.slint#L649), [`ui/dr-ui/ui/app.slint:653`](../../ui/dr-ui/ui/app.slint#L653), [`ui/dr-ui/ui/collections.slint:4`](../../ui/dr-ui/ui/collections.slint#L4), [`ui/dr-ui/ui/export.slint:1`](../../ui/dr-ui/ui/export.slint#L1), [`ui/dr-ui/ui/export.slint:384`](../../ui/dr-ui/ui/export.slint#L384), [`ui/dr-ui/ui/library.slint:1549`](../../ui/dr-ui/ui/library.slint#L1549), [`ui/dr-ui/ui/library.slint:1559`](../../ui/dr-ui/ui/library.slint#L1559), [`ui/dr-ui/ui/library.slint:1803`](../../ui/dr-ui/ui/library.slint#L1803), [`ui/dr-ui/ui/library.slint:1932`](../../ui/dr-ui/ui/library.slint#L1932), [`ui/dr-ui/ui/library.slint:2570`](../../ui/dr-ui/ui/library.slint#L2570), [`ui/dr-ui/ui/library.slint:3012`](../../ui/dr-ui/ui/library.slint#L3012), [`ui/dr-ui/ui/library.slint:3081`](../../ui/dr-ui/ui/library.slint#L3081), [`ui/dr-ui/ui/library.slint:3100`](../../ui/dr-ui/ui/library.slint#L3100), [`ui/dr-ui/ui/library.slint:3107`](../../ui/dr-ui/ui/library.slint#L3107), [`ui/dr-ui/ui/library.slint:3180`](../../ui/dr-ui/ui/library.slint#L3180), [`ui/dr-ui/ui/library.slint:3214`](../../ui/dr-ui/ui/library.slint#L3214), [`ui/dr-ui/ui/library.slint:3795`](../../ui/dr-ui/ui/library.slint#L3795), [`ui/dr-ui/ui/library.slint:648`](../../ui/dr-ui/ui/library.slint#L648), [`ui/dr-ui/ui/library.slint:669`](../../ui/dr-ui/ui/library.slint#L669), [`ui/dr-ui/ui/presets.slint:332`](../../ui/dr-ui/ui/presets.slint#L332), [`ui/dr-ui/ui/session.slint:75`](../../ui/dr-ui/ui/session.slint#L75) | | FR-UI-6 | [`ui/dr-ui/ui/widgets.slint:1`](../../ui/dr-ui/ui/widgets.slint#L1) | | FR-UI-7 | [`core/dr-pipeline/src/descriptor.rs:195`](../../core/dr-pipeline/src/descriptor.rs#L195), [`core/dr-pipeline/src/framing.rs:555`](../../core/dr-pipeline/src/framing.rs#L555), [`core/dr-types/src/settings.rs:492`](../../core/dr-types/src/settings.rs#L492), [`ui/dr-ui/src/develop/rows.rs:118`](../../ui/dr-ui/src/develop/rows.rs#L118), [`ui/dr-ui/src/lib.rs:3243`](../../ui/dr-ui/src/lib.rs#L3243), [`ui/dr-ui/ui/adjust.slint:981`](../../ui/dr-ui/ui/adjust.slint#L981), [`ui/dr-ui/ui/app.slint:2037`](../../ui/dr-ui/ui/app.slint#L2037), [`ui/dr-ui/ui/settings.slint:612`](../../ui/dr-ui/ui/settings.slint#L612), [`ui/dr-ui/ui/toolrail.slint:89`](../../ui/dr-ui/ui/toolrail.slint#L89) | -| FR-UI-8 | [`core/dr-catalog/src/collections.rs:654`](../../core/dr-catalog/src/collections.rs#L654), [`core/dr-catalog/src/collections.rs:675`](../../core/dr-catalog/src/collections.rs#L675), [`core/dr-types/src/place.rs:1`](../../core/dr-types/src/place.rs#L1), [`ui/dr-ui/src/derived_sync.rs:226`](../../ui/dr-ui/src/derived_sync.rs#L226), [`ui/dr-ui/src/derived_sync.rs:84`](../../ui/dr-ui/src/derived_sync.rs#L84), [`ui/dr-ui/src/derived_sync.rs:905`](../../ui/dr-ui/src/derived_sync.rs#L905), [`ui/dr-ui/src/derived_sync.rs:915`](../../ui/dr-ui/src/derived_sync.rs#L915), [`ui/dr-ui/src/derived_sync.rs:997`](../../ui/dr-ui/src/derived_sync.rs#L997), [`ui/dr-ui/src/library/cells.rs:274`](../../ui/dr-ui/src/library/cells.rs#L274), [`ui/dr-ui/src/library/cells.rs:553`](../../ui/dr-ui/src/library/cells.rs#L553), [`ui/dr-ui/src/library/cells.rs:619`](../../ui/dr-ui/src/library/cells.rs#L619), [`ui/dr-ui/src/library/paths.rs:22`](../../ui/dr-ui/src/library/paths.rs#L22), [`ui/dr-ui/src/library_ui/controller.rs:189`](../../ui/dr-ui/src/library_ui/controller.rs#L189), [`ui/dr-ui/src/library_ui/controller.rs:924`](../../ui/dr-ui/src/library_ui/controller.rs#L924), [`ui/dr-ui/src/library_ui/filter_bar.rs:793`](../../ui/dr-ui/src/library_ui/filter_bar.rs#L793), [`ui/dr-ui/src/library_ui/grid.rs:225`](../../ui/dr-ui/src/library_ui/grid.rs#L225), [`ui/dr-ui/src/library_ui/grid.rs:267`](../../ui/dr-ui/src/library_ui/grid.rs#L267), [`ui/dr-ui/src/library_ui/grid.rs:296`](../../ui/dr-ui/src/library_ui/grid.rs#L296), [`ui/dr-ui/src/library_ui/grid.rs:602`](../../ui/dr-ui/src/library_ui/grid.rs#L602), [`ui/dr-ui/src/library_ui/grid.rs:728`](../../ui/dr-ui/src/library_ui/grid.rs#L728), [`ui/dr-ui/src/library_ui/open.rs:118`](../../ui/dr-ui/src/library_ui/open.rs#L118), [`ui/dr-ui/src/library_ui/open.rs:36`](../../ui/dr-ui/src/library_ui/open.rs#L36), [`ui/dr-ui/src/library_ui/open.rs:71`](../../ui/dr-ui/src/library_ui/open.rs#L71), [`ui/dr-ui/src/library_ui/open.rs:836`](../../ui/dr-ui/src/library_ui/open.rs#L836), [`ui/dr-ui/src/library_ui/open.rs:853`](../../ui/dr-ui/src/library_ui/open.rs#L853), [`ui/dr-ui/src/library_ui/open.rs:951`](../../ui/dr-ui/src/library_ui/open.rs#L951), [`ui/dr-ui/src/place.rs:1`](../../ui/dr-ui/src/place.rs#L1) | +| FR-UI-8 | [`core/dr-catalog/src/collections.rs:654`](../../core/dr-catalog/src/collections.rs#L654), [`core/dr-catalog/src/collections.rs:675`](../../core/dr-catalog/src/collections.rs#L675), [`core/dr-types/src/place.rs:1`](../../core/dr-types/src/place.rs#L1), [`ui/dr-ui/src/derived_sync.rs:226`](../../ui/dr-ui/src/derived_sync.rs#L226), [`ui/dr-ui/src/derived_sync.rs:84`](../../ui/dr-ui/src/derived_sync.rs#L84), [`ui/dr-ui/src/derived_sync.rs:905`](../../ui/dr-ui/src/derived_sync.rs#L905), [`ui/dr-ui/src/derived_sync.rs:915`](../../ui/dr-ui/src/derived_sync.rs#L915), [`ui/dr-ui/src/derived_sync.rs:997`](../../ui/dr-ui/src/derived_sync.rs#L997), [`ui/dr-ui/src/library/cells.rs:274`](../../ui/dr-ui/src/library/cells.rs#L274), [`ui/dr-ui/src/library/cells.rs:553`](../../ui/dr-ui/src/library/cells.rs#L553), [`ui/dr-ui/src/library/cells.rs:619`](../../ui/dr-ui/src/library/cells.rs#L619), [`ui/dr-ui/src/library/paths.rs:22`](../../ui/dr-ui/src/library/paths.rs#L22), [`ui/dr-ui/src/library_ui/controller.rs:189`](../../ui/dr-ui/src/library_ui/controller.rs#L189), [`ui/dr-ui/src/library_ui/controller.rs:924`](../../ui/dr-ui/src/library_ui/controller.rs#L924), [`ui/dr-ui/src/library_ui/filter_bar.rs:793`](../../ui/dr-ui/src/library_ui/filter_bar.rs#L793), [`ui/dr-ui/src/library_ui/grid.rs:226`](../../ui/dr-ui/src/library_ui/grid.rs#L226), [`ui/dr-ui/src/library_ui/grid.rs:268`](../../ui/dr-ui/src/library_ui/grid.rs#L268), [`ui/dr-ui/src/library_ui/grid.rs:297`](../../ui/dr-ui/src/library_ui/grid.rs#L297), [`ui/dr-ui/src/library_ui/grid.rs:603`](../../ui/dr-ui/src/library_ui/grid.rs#L603), [`ui/dr-ui/src/library_ui/grid.rs:729`](../../ui/dr-ui/src/library_ui/grid.rs#L729), [`ui/dr-ui/src/library_ui/open.rs:118`](../../ui/dr-ui/src/library_ui/open.rs#L118), [`ui/dr-ui/src/library_ui/open.rs:36`](../../ui/dr-ui/src/library_ui/open.rs#L36), [`ui/dr-ui/src/library_ui/open.rs:71`](../../ui/dr-ui/src/library_ui/open.rs#L71), [`ui/dr-ui/src/library_ui/open.rs:836`](../../ui/dr-ui/src/library_ui/open.rs#L836), [`ui/dr-ui/src/library_ui/open.rs:853`](../../ui/dr-ui/src/library_ui/open.rs#L853), [`ui/dr-ui/src/library_ui/open.rs:951`](../../ui/dr-ui/src/library_ui/open.rs#L951), [`ui/dr-ui/src/place.rs:1`](../../ui/dr-ui/src/place.rs#L1) | | NFR-A11Y-2 | [`ui/dr-ui/tests/ui_controls_are_accessible.rs:1`](../../ui/dr-ui/tests/ui_controls_are_accessible.rs#L1), [`ui/dr-ui/ui/adjust.slint:171`](../../ui/dr-ui/ui/adjust.slint#L171), [`ui/dr-ui/ui/app.slint:2556`](../../ui/dr-ui/ui/app.slint#L2556), [`ui/dr-ui/ui/app.slint:2594`](../../ui/dr-ui/ui/app.slint#L2594) | | NFR-A11Y-3 | [`ui/dr-ui/src/histogram.rs:356`](../../ui/dr-ui/src/histogram.rs#L356), [`ui/dr-ui/tests/status_is_not_colour_alone.rs:1`](../../ui/dr-ui/tests/status_is_not_colour_alone.rs#L1), [`ui/dr-ui/ui/app.slint:2436`](../../ui/dr-ui/ui/app.slint#L2436), [`ui/dr-ui/ui/develop.slint:126`](../../ui/dr-ui/ui/develop.slint#L126), [`ui/dr-ui/ui/histogram.slint:137`](../../ui/dr-ui/ui/histogram.slint#L137), [`ui/dr-ui/ui/labels.slint:19`](../../ui/dr-ui/ui/labels.slint#L19), [`ui/dr-ui/ui/labels.slint:1`](../../ui/dr-ui/ui/labels.slint#L1), [`ui/dr-ui/ui/labels.slint:40`](../../ui/dr-ui/ui/labels.slint#L40), [`ui/dr-ui/ui/labels.slint:74`](../../ui/dr-ui/ui/labels.slint#L74), [`ui/dr-ui/ui/library.slint:1065`](../../ui/dr-ui/ui/library.slint#L1065), [`ui/dr-ui/ui/library.slint:1213`](../../ui/dr-ui/ui/library.slint#L1213), [`ui/dr-ui/ui/library.slint:2614`](../../ui/dr-ui/ui/library.slint#L2614), [`ui/dr-ui/ui/library.slint:3180`](../../ui/dr-ui/ui/library.slint#L3180), [`ui/dr-ui/ui/library.slint:3731`](../../ui/dr-ui/ui/library.slint#L3731), [`ui/dr-ui/ui/peaking.slint:1`](../../ui/dr-ui/ui/peaking.slint#L1), [`ui/dr-ui/ui/widgets.slint:271`](../../ui/dr-ui/ui/widgets.slint#L271) | | NFR-ARCH-2 | [`core/dr-catalog/src/jobs.rs:1`](../../core/dr-catalog/src/jobs.rs#L1), [`ui/dr-ui/src/faces.rs:1`](../../ui/dr-ui/src/faces.rs#L1), [`ui/dr-ui/src/repairs.rs:1`](../../ui/dr-ui/src/repairs.rs#L1) | diff --git a/tools/traceability/src/gestures.rs b/tools/traceability/src/gestures.rs index c0783bf..8251bd1 100644 --- a/tools/traceability/src/gestures.rs +++ b/tools/traceability/src/gestures.rs @@ -57,6 +57,15 @@ //! field before it, which is what lets `why` run to a sentence. An unrecognised //! key is an error rather than a silently dropped line: `pointr:` should not //! quietly cost a gesture its desktop half. +//! +//! # `manual:`, the section that shows it +//! +//! Optional. It names a heading of `docs/manual/README.md` by its anchor — +//! `manual: looking-closer`, with or without the `#` — and the help sheet then +//! offers "See it", opening the bundled manual there, where a picture shows +//! the move being made. The anchor must exist: [`check_manual`] fails the scan +//! when the manual has no such heading, so renaming a section cannot leave a +//! link on the sheet that opens the manual at the top. use std::collections::BTreeMap; @@ -79,6 +88,8 @@ pub struct Gesture { /// a user consulting the help sheet wants the gesture, and a reader of the /// document wants the argument. pub why: Option, + /// The manual section that shows it, as a heading anchor without `#`. + pub manual: Option, pub file: String, pub line: usize, } @@ -105,7 +116,7 @@ impl Gesture { } /// A key that may appear in a gesture block. -const KEYS: &[&str] = &["where", "touch", "pointer", "keys", "why"]; +const KEYS: &[&str] = &["where", "touch", "pointer", "keys", "why", "manual"]; /// Something wrong with a tag, reported rather than dropped. #[derive(Debug, Clone, PartialEq, Eq)] @@ -211,6 +222,7 @@ pub fn extract_from_text(text: &str, path: &str) -> (Vec, Vec Option<(String, String)> { Some((key.to_ascii_lowercase(), tail.to_string())) } +/// Every `manual:` that names a section the manual does not have. +/// +/// `anchors` is [`crate::manual::anchors`] of the README — the ids the bundled +/// page gives its headings — so this and the page cannot disagree about what +/// exists. +pub fn check_manual(gestures: &[Gesture], anchors: &[String]) -> Vec { + gestures + .iter() + .filter_map(|g| { + let m = g.manual.as_ref()?; + (!anchors.iter().any(|a| a == m)).then(|| GestureProblem { + file: g.file.clone(), + line: g.line, + what: format!( + "gesture `{}` names manual section `#{m}`, which docs/manual/README.md \ + has no heading for", + g.title + ), + }) + }) + .collect() +} + /// Group gestures under their `where:`, keeping the order the sections were /// first seen so the document reads in the order a user meets them. pub fn by_section(gestures: &[Gesture]) -> Vec<(String, Vec<&Gesture>)> { @@ -339,6 +374,11 @@ pub fn render_markdown(gestures: &[Gesture]) -> String { for (modality, how) in g.routes() { m.push_str(&format!("- **{modality}** — {how}\n")); } + if let Some(anchor) = &g.manual { + m.push_str(&format!( + "- **See it** — [in the manual](manual/README.md#{anchor})\n" + )); + } if let Some(why) = &g.why { m.push_str(&format!("\n{why}\n")); } @@ -381,6 +421,8 @@ pub fn render_rust(gestures: &[Gesture]) -> String { r.push_str(" pub touch: &'static str,\n"); r.push_str(" pub pointer: &'static str,\n"); r.push_str(" pub keys: &'static str,\n"); + r.push_str(" /// The manual section that shows it, a heading anchor; empty for none.\n"); + r.push_str(" pub manual: &'static str,\n"); r.push_str("}\n\n"); r.push_str("/// Every gesture, in the order the sections were first seen in the source.\n"); @@ -402,6 +444,10 @@ pub fn render_rust(gestures: &[Gesture]) -> String { " keys: {},\n", quote(g.keys.as_deref().unwrap_or("")) )); + r.push_str(&format!( + " manual: {},\n", + quote(g.manual.as_deref().unwrap_or("")) + )); r.push_str(" },\n"); } } @@ -590,6 +636,38 @@ pub fn zoom() {} assert_eq!(g[1].title, "Second"); } + /// `manual:` is read, with or without its `#`, and a section the manual + /// does not have is a problem rather than a link to the top of the page. + #[test] + fn a_manual_anchor_must_name_a_section_the_manual_has() { + let text = "\ +// GESTURE: Zoom +// where: Develop +// touch: Pinch +// manual: #looking-closer +// GESTURE: Pan +// where: Develop +// touch: Drag +// manual: looking-further +"; + let (g, p) = extract_from_text(text, "x.slint"); + assert!(p.is_empty(), "{p:?}"); + assert_eq!(g[0].manual.as_deref(), Some("looking-closer")); + let anchors = crate::manual::anchors("## Looking closer\n"); + let problems = check_manual(&g, &anchors); + assert_eq!(problems.len(), 1, "{problems:?}"); + assert!(problems[0].what.contains("looking-further")); + assert_eq!(problems[0].line, 5); + } + + #[test] + fn a_manual_anchor_is_linked_from_the_document_and_carried_in_the_table() { + let text = "// GESTURE: Zoom\n// where: Develop\n// touch: Pinch\n// manual: looking-closer\n"; + let (g, _) = extract_from_text(text, "x.slint"); + assert!(render_markdown(&g).contains("(manual/README.md#looking-closer)")); + assert!(render_rust(&g).contains("manual: \"looking-closer\",")); + } + #[test] fn sections_keep_the_order_they_were_first_seen() { let text = "\ diff --git a/tools/traceability/src/main.rs b/tools/traceability/src/main.rs index 58cb70c..40dea7c 100644 --- a/tools/traceability/src/main.rs +++ b/tools/traceability/src/main.rs @@ -161,6 +161,15 @@ fn run_gestures(base: &Path, check: bool) -> Result<()> { problems.extend(p); } + // A `manual:` must name a section the manual has, checked against the + // same anchors the bundled page is rendered with. + let manual_source = std::fs::read_to_string(base.join(MANUAL_SOURCE)) + .with_context(|| format!("reading {MANUAL_SOURCE}"))?; + problems.extend(gestures::check_manual( + &found, + &manual::anchors(&manual_source), + )); + println!("files scanned {}", files.len()); println!("gestures found {}", found.len()); println!("places {}", gestures::by_section(&found).len()); diff --git a/ui/dr-ui/src/gesture_book.rs b/ui/dr-ui/src/gesture_book.rs index 3251c09..7e354fc 100644 --- a/ui/dr-ui/src/gesture_book.rs +++ b/ui/dr-ui/src/gesture_book.rs @@ -18,6 +18,8 @@ pub struct Gesture { 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. @@ -28,6 +30,7 @@ pub const GESTURES: &[Gesture] = &[ touch: "Press \"pick\" in the group's heading, then tap something neutral in the picture", pointer: "Press \"pick\", then click something neutral", keys: "", + manual: "", }, Gesture { title: "Magnify the photograph by any amount", @@ -35,6 +38,7 @@ pub const GESTURES: &[Gesture] = &[ touch: "Pinch it with two fingers", pointer: "The scroll wheel over it", keys: "", + manual: "", }, Gesture { title: "Move a magnified photograph about", @@ -42,6 +46,7 @@ pub const GESTURES: &[Gesture] = &[ touch: "Drag it", pointer: "Drag it", keys: "", + manual: "", }, Gesture { title: "Paint a mask by hand", @@ -49,6 +54,7 @@ pub const GESTURES: &[Gesture] = &[ touch: "Choose Paint or Erase, then drag on the photograph", pointer: "Choose Paint or Erase, then drag", keys: "", + manual: "", }, Gesture { title: "Take back the last change", @@ -56,6 +62,7 @@ pub const GESTURES: &[Gesture] = &[ 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: "", }, Gesture { title: "Do it again after taking it back", @@ -63,6 +70,7 @@ pub const GESTURES: &[Gesture] = &[ 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", + manual: "", }, Gesture { title: "Copy the settings from this photograph", @@ -70,6 +78,7 @@ pub const GESTURES: &[Gesture] = &[ touch: "Press Copy in the top bar", pointer: "Press Copy in the top bar", keys: "Ctrl+C", + manual: "", }, Gesture { title: "Paste the settings onto this photograph", @@ -77,6 +86,7 @@ pub const GESTURES: &[Gesture] = &[ touch: "Press Paste in the top bar", pointer: "Press Paste in the top bar", keys: "Ctrl+V", + manual: "", }, Gesture { title: "Choose which kinds of edit a copy carries", @@ -84,6 +94,7 @@ pub const GESTURES: &[Gesture] = &[ touch: "Open Presets and toggle the kinds", pointer: "Open Presets and toggle the kinds", keys: "Ctrl+Shift+C, which offers Copy beside them", + manual: "", }, Gesture { title: "Export this photograph as the last one was", @@ -91,6 +102,7 @@ pub const GESTURES: &[Gesture] = &[ touch: "Press Export in the top bar", pointer: "Press Export in the top bar", keys: "Ctrl+Shift+E", + manual: "", }, Gesture { title: "Choose how to export, then export", @@ -98,6 +110,7 @@ pub const GESTURES: &[Gesture] = &[ touch: "Open Settings, then Export defaults", pointer: "Open Settings, then Export defaults", keys: "Ctrl+E", + manual: "", }, Gesture { title: "Change which group of adjustments is on screen", @@ -105,6 +118,7 @@ pub const GESTURES: &[Gesture] = &[ 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: "", }, Gesture { title: "Look at the photograph at 1:1", @@ -112,6 +126,7 @@ pub const GESTURES: &[Gesture] = &[ touch: "Double-tap the photograph", pointer: "Double-click it, or press the zoom readout floating over the canvas", keys: "Z", + manual: "", }, Gesture { title: "Give this photograph a colour label", @@ -119,6 +134,7 @@ pub const GESTURES: &[Gesture] = &[ 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: "", }, Gesture { title: "Move to the next or previous photograph", @@ -126,6 +142,7 @@ pub const GESTURES: &[Gesture] = &[ touch: "Tap a frame in the roll along the foot of the canvas", pointer: "Click a frame in the roll", keys: "Right arrow, D or space for the next; left arrow or A for the one before", + manual: "", }, Gesture { title: "See the photograph before you edited it", @@ -133,6 +150,7 @@ pub const GESTURES: &[Gesture] = &[ touch: "Press and hold \"Before\"", pointer: "Press and hold \"Before\"", keys: "Hold \\", + manual: "", }, Gesture { title: "Put one control back to its default", @@ -140,6 +158,7 @@ pub const GESTURES: &[Gesture] = &[ 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", @@ -147,6 +166,7 @@ pub const GESTURES: &[Gesture] = &[ touch: "Press and hold the eye beside the snapshot", pointer: "Press and hold the eye beside the snapshot", keys: "", + manual: "", }, Gesture { title: "Keep the photograph as it is now, under a name", @@ -154,6 +174,7 @@ pub const GESTURES: &[Gesture] = &[ touch: "Type a name in the History panel and press Snapshot", pointer: "Type a name in the History panel and press Snapshot", keys: "", + manual: "", }, Gesture { title: "Show or hide one mask layer", @@ -161,6 +182,7 @@ pub const GESTURES: &[Gesture] = &[ 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 history step, unlike holding \"Before\" — the layer really is off until it is switched back on.", + manual: "", }, Gesture { title: "Show or hide one mask on the photograph", @@ -168,6 +190,7 @@ pub const GESTURES: &[Gesture] = &[ touch: "Tap the eye on its row", pointer: "Click the eye on its row", keys: "", + manual: "", }, Gesture { title: "Change how a part joins its mask", @@ -175,6 +198,7 @@ pub const GESTURES: &[Gesture] = &[ touch: "Tap the + / − / ∩ chip on the part's row", pointer: "Click the + / − / ∩ chip on the part's row", keys: "", + manual: "", }, Gesture { title: "Leave one part out of a mask, and put it back", @@ -182,6 +206,7 @@ pub const GESTURES: &[Gesture] = &[ touch: "Tap the ring on the part's row", pointer: "Click the ring on the part's row", keys: "", + manual: "", }, Gesture { title: "Pick a collection up to rearrange the tree", @@ -189,6 +214,7 @@ pub const GESTURES: &[Gesture] = &[ 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: "", }, Gesture { title: "Act on a collection — rename, nest, un-nest, delete", @@ -196,6 +222,7 @@ pub const GESTURES: &[Gesture] = &[ touch: "Press and hold the collection, then let go without moving", pointer: "Right-click it", keys: "", + manual: "", }, Gesture { title: "Take a collection back out of the one it is nested in", @@ -203,6 +230,7 @@ pub const GESTURES: &[Gesture] = &[ 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: "", }, Gesture { title: "Rename a collection", @@ -210,6 +238,7 @@ pub const GESTURES: &[Gesture] = &[ touch: "Hold the collection, then \"Rename\"", pointer: "Double-click its name, or right-click it and choose \"Rename\"", keys: "", + manual: "", }, Gesture { title: "Pull a face out of the wrong person", @@ -217,6 +246,7 @@ pub const GESTURES: &[Gesture] = &[ touch: "Tap the faces that do not belong, then \"Split off\"", pointer: "Click the faces that do not belong, then \"Split off\"", keys: "", + manual: "", }, Gesture { title: "Rule on a suggested face", @@ -224,6 +254,7 @@ pub const GESTURES: &[Gesture] = &[ touch: "Tick to confirm it, cross to reject it", pointer: "Tick to confirm it, cross to reject it", keys: "", + manual: "", }, Gesture { title: "See a person's photographs", @@ -231,6 +262,7 @@ pub const GESTURES: &[Gesture] = &[ touch: "Choose them in the rail, then \"Show photos\"", pointer: "Choose them in the rail, then \"Show photos\"", keys: "", + manual: "", }, Gesture { title: "Change how faces are grouped", @@ -238,6 +270,7 @@ pub const GESTURES: &[Gesture] = &[ touch: "\"Grouping…\", move the dials, then Regroup", pointer: "\"Grouping…\", move the dials, then Regroup", keys: "", + manual: "", }, Gesture { title: "Start selecting several photographs", @@ -245,6 +278,7 @@ pub const GESTURES: &[Gesture] = &[ touch: "Press and hold a photograph, or press Select in the header", pointer: "Ctrl-click, or press Select in the header", keys: "", + manual: "", }, Gesture { title: "Add or remove one photograph", @@ -252,6 +286,7 @@ pub const GESTURES: &[Gesture] = &[ touch: "While selecting, tap it", pointer: "Ctrl-click it", keys: "", + manual: "", }, Gesture { title: "Leave selecting", @@ -259,6 +294,7 @@ pub const GESTURES: &[Gesture] = &[ touch: "Press Done in the header", pointer: "Press Done in the header", keys: "Escape", + manual: "", }, Gesture { title: "Pick a photograph up to drag it", @@ -266,6 +302,7 @@ pub const GESTURES: &[Gesture] = &[ touch: "Press and hold it until a ring opens around it, then drag", pointer: "Drag it", keys: "", + manual: "", }, Gesture { title: "Select a range", @@ -273,6 +310,7 @@ pub const GESTURES: &[Gesture] = &[ touch: "While selecting, press \"Select to…\", then tap the last photograph of the run", pointer: "Shift-click the last photograph of the run", keys: "", + manual: "", }, Gesture { title: "Take the blinks out of a burst", @@ -280,6 +318,7 @@ pub const GESTURES: &[Gesture] = &[ 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: "", }, Gesture { title: "Find photographs with two people in them", @@ -287,6 +326,7 @@ pub const GESTURES: &[Gesture] = &[ 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: "", }, Gesture { title: "Show only photographs with one colour label", @@ -294,6 +334,7 @@ pub const GESTURES: &[Gesture] = &[ touch: "Tap its chip in the filter bar", pointer: "Click its chip in the filter bar", keys: "", + manual: "", }, Gesture { title: "Export the selection as the last export was", @@ -301,6 +342,7 @@ pub const GESTURES: &[Gesture] = &[ 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: "", }, Gesture { title: "Paste copied settings onto the selection", @@ -308,6 +350,7 @@ pub const GESTURES: &[Gesture] = &[ touch: "Select them, then \"Paste to N\" in the selection bar", pointer: "Select them, then \"Paste to N\"", keys: "Ctrl+V", + manual: "", }, Gesture { title: "Show only photographs with some number of stars", @@ -315,6 +358,7 @@ pub const GESTURES: &[Gesture] = &[ 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 for exactly that many stars, or two digits for everything between them; tap F alone to show every rating again", + manual: "", }, Gesture { title: "Give photographs a colour label", @@ -322,6 +366,7 @@ pub const GESTURES: &[Gesture] = &[ 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: "", }, Gesture { title: "Resize the thumbnails", @@ -329,6 +374,7 @@ pub const GESTURES: &[Gesture] = &[ touch: "Pinch the grid with two fingers", pointer: "Ctrl and the scroll wheel", keys: "", + manual: "", }, Gesture { title: "File photographs in a collection", @@ -336,6 +382,7 @@ pub const GESTURES: &[Gesture] = &[ 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: "", }, Gesture { title: "Open a photograph", @@ -343,6 +390,7 @@ pub const GESTURES: &[Gesture] = &[ touch: "Tap it — a single tap, any length", pointer: "Click it", keys: "", + manual: "", }, Gesture { title: "Rate a photograph without opening it", @@ -350,6 +398,7 @@ pub const GESTURES: &[Gesture] = &[ touch: "Tap a star on the cell", pointer: "Hover the cell, then click a star", keys: "0 to 5 with the pointer over it, or on the selection", + manual: "", }, Gesture { title: "Choose the frame a folded burst shows", @@ -357,6 +406,7 @@ pub const GESTURES: &[Gesture] = &[ 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: "", }, Gesture { title: "Drop the selection but keep selecting", @@ -364,6 +414,7 @@ pub const GESTURES: &[Gesture] = &[ touch: "Press Clear in the selection strip", pointer: "Press Clear in the selection strip", keys: "", + manual: "", }, Gesture { title: "Select everything the grid is showing", @@ -371,6 +422,7 @@ pub const GESTURES: &[Gesture] = &[ touch: "While selecting, press \"Select all\"", pointer: "While selecting, press \"Select all\"", keys: "Ctrl+A", + manual: "", }, Gesture { title: "Take photographs out of a collection", @@ -378,5 +430,6 @@ pub const GESTURES: &[Gesture] = &[ touch: "Select them, then \"Collections…\" in the selection bar", pointer: "Select them, then \"Collections…\" in the selection bar", keys: "", + manual: "", }, ]; diff --git a/ui/dr-ui/src/gestures.rs b/ui/dr-ui/src/gestures.rs index 79456ec..5dcd4a7 100644 --- a/ui/dr-ui/src/gestures.rs +++ b/ui/dr-ui/src/gestures.rs @@ -38,6 +38,9 @@ pub struct Row { pub touch: String, pub pointer: String, pub keys: String, + /// The manual section that shows the gesture, as a heading anchor; empty + /// where there is none, and the sheet then offers no "See it". + pub manual: String, } /// Build the sheet's rows from the generated table. @@ -67,6 +70,7 @@ fn rows_from(gestures: &[Gesture]) -> Vec { touch: g.touch.to_string(), pointer: g.pointer.to_string(), keys: g.keys.to_string(), + manual: g.manual.to_string(), }); } out @@ -83,6 +87,7 @@ mod tests { touch: "Tap", pointer: "", keys: "", + manual: "", } } diff --git a/ui/dr-ui/src/library_ui/grid.rs b/ui/dr-ui/src/library_ui/grid.rs index 5443b58..26e5cd2 100644 --- a/ui/dr-ui/src/library_ui/grid.rs +++ b/ui/dr-ui/src/library_ui/grid.rs @@ -195,6 +195,7 @@ pub fn wire( touch: r.touch.into(), pointer: r.pointer.into(), keys: r.keys.into(), + manual: r.manual.into(), }) .collect::>(), ))); diff --git a/ui/dr-ui/ui/gestures.slint b/ui/dr-ui/ui/gestures.slint index b25b23c..66cd97d 100644 --- a/ui/dr-ui/ui/gestures.slint +++ b/ui/dr-ui/ui/gestures.slint @@ -38,6 +38,10 @@ export struct GestureRow { touch: string, pointer: string, keys: string, + // The manual section that shows the gesture being made, as a heading + // anchor; empty where the manual has none. Checked against the manual by + // the generator, so a non-empty one always lands on a heading. + manual: string, } // One route: how a modality performs the gesture. @@ -148,12 +152,28 @@ export component GestureSheet inherits Rectangle { font-weight: 700; } - if r.heading == "": Text { - text: r.title; - color: Theme.ink; - font-size: Theme.text; - font-weight: 600; - wrap: word-wrap; + // The title, and beside it "See it" where the manual + // shows the gesture. On the title's line rather than + // under the routes, so it is found while reading the + // title — the moment of "what does that look like?". + if r.heading == "": HorizontalLayout { + spacing: Theme.gap; + + Text { + text: r.title; + color: Theme.ink; + font-size: Theme.text; + font-weight: 600; + wrap: word-wrap; + horizontal-stretch: 1; + vertical-alignment: center; + } + + if r.manual != "": Button { + text: "See it"; + accessible-label: "See " + r.title + " in the manual"; + clicked => { root.open-manual(r.manual); } + } } if r.touch != "": Route {