diff --git a/docs/dev/traceability.md b/docs/dev/traceability.md
index 907ecff..da9f740 100644
--- a/docs/dev/traceability.md
+++ b/docs/dev/traceability.md
@@ -10,7 +10,7 @@ Denominators are parsed from [`requirements.md`](requirements.md) at run time, n
| Metric | Value |
|---|---|
| Source files scanned | 423 |
-| TRACES tags found | 1571 |
+| TRACES tags found | 1572 |
| Requirements defined | 184 |
| Requirements deferred (post-v1) | 24 |
| Requirements covered | 154 |
@@ -38,42 +38,42 @@ A tag naming an ID `requirements.md` does not define — what renumbering produc
| FR-CAT-10 | [`core/dr-ingest/src/layout.rs:1`](../../core/dr-ingest/src/layout.rs#L1), [`core/dr-ingest/src/lib.rs:1`](../../core/dr-ingest/src/lib.rs#L1), [`core/dr-ingest/src/lib.rs:733`](../../core/dr-ingest/src/lib.rs#L733), [`core/dr-types/src/settings.rs:377`](../../core/dr-types/src/settings.rs#L377), [`platform/dr-plat/src/storage.rs:287`](../../platform/dr-plat/src/storage.rs#L287), [`platform/dr-plat/src/storage.rs:586`](../../platform/dr-plat/src/storage.rs#L586), [`platform/dr-plat/src/volumes.rs:1`](../../platform/dr-plat/src/volumes.rs#L1), [`platform/dr-plat/src/volumes.rs:62`](../../platform/dr-plat/src/volumes.rs#L62), [`ui/dr-ui/src/import.rs:1`](../../ui/dr-ui/src/import.rs#L1), [`ui/dr-ui/src/import.rs:336`](../../ui/dr-ui/src/import.rs#L336), [`ui/dr-ui/src/import_ui.rs:1`](../../ui/dr-ui/src/import_ui.rs#L1), [`ui/dr-ui/src/lib.rs:1790`](../../ui/dr-ui/src/lib.rs#L1790), [`ui/dr-ui/ui/import.slint:5`](../../ui/dr-ui/ui/import.slint#L5), [`ui/dr-ui/ui/library.slint:1033`](../../ui/dr-ui/ui/library.slint#L1033), [`ui/dr-ui/ui/library.slint:1254`](../../ui/dr-ui/ui/library.slint#L1254), [`ui/dr-ui/ui/library.slint:979`](../../ui/dr-ui/ui/library.slint#L979) |
| FR-CAT-11 | [`core/dr-catalog/src/dedup.rs:1`](../../core/dr-catalog/src/dedup.rs#L1), [`core/dr-ingest/src/lib.rs:1`](../../core/dr-ingest/src/lib.rs#L1), [`core/dr-ingest/src/lib.rs:392`](../../core/dr-ingest/src/lib.rs#L392), [`core/dr-sync/src/upload.rs:40`](../../core/dr-sync/src/upload.rs#L40), [`ui/dr-ui/src/import.rs:1`](../../ui/dr-ui/src/import.rs#L1), [`ui/dr-ui/src/import_ui.rs:1`](../../ui/dr-ui/src/import_ui.rs#L1), [`ui/dr-ui/src/lib.rs:1790`](../../ui/dr-ui/src/lib.rs#L1790), [`ui/dr-ui/src/library/filters.rs:12`](../../ui/dr-ui/src/library/filters.rs#L12), [`ui/dr-ui/src/library/thumbnails_gen.rs:518`](../../ui/dr-ui/src/library/thumbnails_gen.rs#L518), [`ui/dr-ui/ui/import.slint:5`](../../ui/dr-ui/ui/import.slint#L5) |
| FR-CAT-12 | [`core/dr-pipeline/src/sidecar.rs:137`](../../core/dr-pipeline/src/sidecar.rs#L137) |
-| FR-CAT-13 | [`core/dr-catalog/src/rating.rs:278`](../../core/dr-catalog/src/rating.rs#L278), [`core/dr-catalog/src/schema.rs:836`](../../core/dr-catalog/src/schema.rs#L836), [`core/dr-sync/src/scan.rs:40`](../../core/dr-sync/src/scan.rs#L40), [`core/dr-sync/src/scan.rs:944`](../../core/dr-sync/src/scan.rs#L944), [`core/dr-types/src/settings.rs:92`](../../core/dr-types/src/settings.rs#L92), [`core/dr-xmp/src/lib.rs:1`](../../core/dr-xmp/src/lib.rs#L1), [`core/dr-xmp/src/lib.rs:331`](../../core/dr-xmp/src/lib.rs#L331), [`core/dr-xmp/src/lib.rs:442`](../../core/dr-xmp/src/lib.rs#L442), [`core/dr-xmp/src/lib.rs:535`](../../core/dr-xmp/src/lib.rs#L535), [`core/dr-xmp/src/lib.rs:733`](../../core/dr-xmp/src/lib.rs#L733), [`core/dr-xmp/src/lib.rs:746`](../../core/dr-xmp/src/lib.rs#L746), [`core/dr-xmp/src/read.rs:1`](../../core/dr-xmp/src/read.rs#L1), [`core/dr-xmp/src/write.rs:1`](../../core/dr-xmp/src/write.rs#L1), [`core/dr-xmp/tests/round_trip.rs:1`](../../core/dr-xmp/tests/round_trip.rs#L1), [`ui/dr-ui/src/library/scan.rs:335`](../../ui/dr-ui/src/library/scan.rs#L335), [`ui/dr-ui/src/library/xmp.rs:132`](../../ui/dr-ui/src/library/xmp.rs#L132), [`ui/dr-ui/src/library/xmp.rs:25`](../../ui/dr-ui/src/library/xmp.rs#L25), [`ui/dr-ui/src/library/xmp.rs:9`](../../ui/dr-ui/src/library/xmp.rs#L9), [`ui/dr-ui/src/library_ui.rs:1322`](../../ui/dr-ui/src/library_ui.rs#L1322), [`ui/dr-ui/src/library_ui.rs:301`](../../ui/dr-ui/src/library_ui.rs#L301), [`ui/dr-ui/src/library_ui.rs:3427`](../../ui/dr-ui/src/library_ui.rs#L3427), [`ui/dr-ui/src/library_ui.rs:3483`](../../ui/dr-ui/src/library_ui.rs#L3483), [`ui/dr-ui/src/library_ui.rs:3581`](../../ui/dr-ui/src/library_ui.rs#L3581), [`ui/dr-ui/src/library_ui.rs:392`](../../ui/dr-ui/src/library_ui.rs#L392), [`ui/dr-ui/src/library_ui.rs:537`](../../ui/dr-ui/src/library_ui.rs#L537), [`ui/dr-ui/src/library_ui.rs:5766`](../../ui/dr-ui/src/library_ui.rs#L5766), [`ui/dr-ui/src/settings_ui.rs:558`](../../ui/dr-ui/src/settings_ui.rs#L558), [`ui/dr-ui/src/xmp_sync.rs:1`](../../ui/dr-ui/src/xmp_sync.rs#L1), [`ui/dr-ui/src/xmp_sync.rs:250`](../../ui/dr-ui/src/xmp_sync.rs#L250), [`ui/dr-ui/src/xmp_sync.rs:287`](../../ui/dr-ui/src/xmp_sync.rs#L287), [`ui/dr-ui/src/xmp_sync.rs:324`](../../ui/dr-ui/src/xmp_sync.rs#L324), [`ui/dr-ui/ui/app.slint:939`](../../ui/dr-ui/ui/app.slint#L939), [`ui/dr-ui/ui/settings.slint:1093`](../../ui/dr-ui/ui/settings.slint#L1093), [`ui/dr-ui/ui/settings.slint:199`](../../ui/dr-ui/ui/settings.slint#L199) |
-| 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:78`](../../ui/dr-ui/src/collections_ui/trash.rs#L78), [`ui/dr-ui/src/collections_ui/wiring_grid.rs:772`](../../ui/dr-ui/src/collections_ui/wiring_grid.rs#L772), [`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.rs:238`](../../ui/dr-ui/src/library_ui.rs#L238), [`ui/dr-ui/src/library_ui.rs:914`](../../ui/dr-ui/src/library_ui.rs#L914), [`ui/dr-ui/src/trash.rs:1`](../../ui/dr-ui/src/trash.rs#L1), [`ui/dr-ui/ui/collections.slint:745`](../../ui/dr-ui/ui/collections.slint#L745) |
+| FR-CAT-13 | [`core/dr-catalog/src/rating.rs:278`](../../core/dr-catalog/src/rating.rs#L278), [`core/dr-catalog/src/schema.rs:836`](../../core/dr-catalog/src/schema.rs#L836), [`core/dr-sync/src/scan.rs:40`](../../core/dr-sync/src/scan.rs#L40), [`core/dr-sync/src/scan.rs:944`](../../core/dr-sync/src/scan.rs#L944), [`core/dr-types/src/settings.rs:92`](../../core/dr-types/src/settings.rs#L92), [`core/dr-xmp/src/lib.rs:1`](../../core/dr-xmp/src/lib.rs#L1), [`core/dr-xmp/src/lib.rs:331`](../../core/dr-xmp/src/lib.rs#L331), [`core/dr-xmp/src/lib.rs:442`](../../core/dr-xmp/src/lib.rs#L442), [`core/dr-xmp/src/lib.rs:535`](../../core/dr-xmp/src/lib.rs#L535), [`core/dr-xmp/src/lib.rs:733`](../../core/dr-xmp/src/lib.rs#L733), [`core/dr-xmp/src/lib.rs:746`](../../core/dr-xmp/src/lib.rs#L746), [`core/dr-xmp/src/read.rs:1`](../../core/dr-xmp/src/read.rs#L1), [`core/dr-xmp/src/write.rs:1`](../../core/dr-xmp/src/write.rs#L1), [`core/dr-xmp/tests/round_trip.rs:1`](../../core/dr-xmp/tests/round_trip.rs#L1), [`ui/dr-ui/src/library/scan.rs:335`](../../ui/dr-ui/src/library/scan.rs#L335), [`ui/dr-ui/src/library/xmp.rs:132`](../../ui/dr-ui/src/library/xmp.rs#L132), [`ui/dr-ui/src/library/xmp.rs:25`](../../ui/dr-ui/src/library/xmp.rs#L25), [`ui/dr-ui/src/library/xmp.rs:9`](../../ui/dr-ui/src/library/xmp.rs#L9), [`ui/dr-ui/src/library_ui.rs:1322`](../../ui/dr-ui/src/library_ui.rs#L1322), [`ui/dr-ui/src/library_ui.rs:301`](../../ui/dr-ui/src/library_ui.rs#L301), [`ui/dr-ui/src/library_ui.rs:3427`](../../ui/dr-ui/src/library_ui.rs#L3427), [`ui/dr-ui/src/library_ui.rs:3483`](../../ui/dr-ui/src/library_ui.rs#L3483), [`ui/dr-ui/src/library_ui.rs:3581`](../../ui/dr-ui/src/library_ui.rs#L3581), [`ui/dr-ui/src/library_ui.rs:392`](../../ui/dr-ui/src/library_ui.rs#L392), [`ui/dr-ui/src/library_ui.rs:537`](../../ui/dr-ui/src/library_ui.rs#L537), [`ui/dr-ui/src/library_ui.rs:5766`](../../ui/dr-ui/src/library_ui.rs#L5766), [`ui/dr-ui/src/settings_ui.rs:558`](../../ui/dr-ui/src/settings_ui.rs#L558), [`ui/dr-ui/src/xmp_sync.rs:1`](../../ui/dr-ui/src/xmp_sync.rs#L1), [`ui/dr-ui/src/xmp_sync.rs:250`](../../ui/dr-ui/src/xmp_sync.rs#L250), [`ui/dr-ui/src/xmp_sync.rs:287`](../../ui/dr-ui/src/xmp_sync.rs#L287), [`ui/dr-ui/src/xmp_sync.rs:324`](../../ui/dr-ui/src/xmp_sync.rs#L324), [`ui/dr-ui/ui/app.slint:856`](../../ui/dr-ui/ui/app.slint#L856), [`ui/dr-ui/ui/settings.slint:1093`](../../ui/dr-ui/ui/settings.slint#L1093), [`ui/dr-ui/ui/settings.slint:199`](../../ui/dr-ui/ui/settings.slint#L199) |
+| 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:82`](../../ui/dr-ui/src/collections_ui/trash.rs#L82), [`ui/dr-ui/src/collections_ui/wiring_grid.rs:794`](../../ui/dr-ui/src/collections_ui/wiring_grid.rs#L794), [`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.rs:238`](../../ui/dr-ui/src/library_ui.rs#L238), [`ui/dr-ui/src/library_ui.rs:914`](../../ui/dr-ui/src/library_ui.rs#L914), [`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:463`](../../ui/dr-ui/src/import.rs#L463), [`ui/dr-ui/src/import.rs:488`](../../ui/dr-ui/src/import.rs#L488), [`ui/dr-ui/src/library/sweep.rs:557`](../../ui/dr-ui/src/library/sweep.rs#L557), [`ui/dr-ui/src/library_ui.rs:177`](../../ui/dr-ui/src/library_ui.rs#L177), [`ui/dr-ui/src/library_ui.rs:4515`](../../ui/dr-ui/src/library_ui.rs#L4515), [`ui/dr-ui/src/library_ui.rs:6053`](../../ui/dr-ui/src/library_ui.rs#L6053), [`ui/dr-ui/src/repairs.rs:1`](../../ui/dr-ui/src/repairs.rs#L1), [`ui/dr-ui/src/repairs.rs:687`](../../ui/dr-ui/src/repairs.rs#L687), [`ui/dr-ui/ui/app.slint:429`](../../ui/dr-ui/ui/app.slint#L429), [`ui/dr-ui/ui/settings.slint:435`](../../ui/dr-ui/ui/settings.slint#L435), [`ui/dr-ui/ui/settings.slint:73`](../../ui/dr-ui/ui/settings.slint#L73) |
+| 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:463`](../../ui/dr-ui/src/import.rs#L463), [`ui/dr-ui/src/import.rs:488`](../../ui/dr-ui/src/import.rs#L488), [`ui/dr-ui/src/library/sweep.rs:557`](../../ui/dr-ui/src/library/sweep.rs#L557), [`ui/dr-ui/src/library_ui.rs:177`](../../ui/dr-ui/src/library_ui.rs#L177), [`ui/dr-ui/src/library_ui.rs:4515`](../../ui/dr-ui/src/library_ui.rs#L4515), [`ui/dr-ui/src/library_ui.rs:6053`](../../ui/dr-ui/src/library_ui.rs#L6053), [`ui/dr-ui/src/repairs.rs:1`](../../ui/dr-ui/src/repairs.rs#L1), [`ui/dr-ui/src/repairs.rs:687`](../../ui/dr-ui/src/repairs.rs#L687), [`ui/dr-ui/ui/app.slint:430`](../../ui/dr-ui/ui/app.slint#L430), [`ui/dr-ui/ui/settings.slint:435`](../../ui/dr-ui/ui/settings.slint#L435), [`ui/dr-ui/ui/settings.slint:73`](../../ui/dr-ui/ui/settings.slint#L73) |
| 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.rs:1`](../../ui/dr-ui/src/library_ui.rs#L1) |
-| 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/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:301`](../../core/dr-decode/src/lib.rs#L301), [`core/dr-decode/src/lib.rs:307`](../../core/dr-decode/src/lib.rs#L307), [`core/dr-decode/src/lib.rs:317`](../../core/dr-decode/src/lib.rs#L317), [`core/dr-decode/src/lib.rs:444`](../../core/dr-decode/src/lib.rs#L444), [`core/dr-export/src/dng.rs:308`](../../core/dr-export/src/dng.rs#L308), [`core/dr-pipeline/src/sidecar.rs:171`](../../core/dr-pipeline/src/sidecar.rs#L171), [`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:143`](../../ui/dr-ui/src/collections_ui/wiring_grid.rs#L143), [`ui/dr-ui/src/collections_ui/wiring_grid.rs:249`](../../ui/dr-ui/src/collections_ui/wiring_grid.rs#L249), [`ui/dr-ui/src/collections_ui/wiring_grid.rs:308`](../../ui/dr-ui/src/collections_ui/wiring_grid.rs#L308), [`ui/dr-ui/src/library/cells.rs:206`](../../ui/dr-ui/src/library/cells.rs#L206), [`ui/dr-ui/src/library_ui.rs:789`](../../ui/dr-ui/src/library_ui.rs#L789), [`ui/dr-ui/src/library_ui.rs:8226`](../../ui/dr-ui/src/library_ui.rs#L8226), [`ui/dr-ui/src/library_ui.rs:8237`](../../ui/dr-ui/src/library_ui.rs#L8237), [`ui/dr-ui/src/library_ui.rs:8250`](../../ui/dr-ui/src/library_ui.rs#L8250), [`ui/dr-ui/src/library_ui.rs:8265`](../../ui/dr-ui/src/library_ui.rs#L8265), [`ui/dr-ui/src/library_ui.rs:8274`](../../ui/dr-ui/src/library_ui.rs#L8274), [`ui/dr-ui/ui/app.slint:350`](../../ui/dr-ui/ui/app.slint#L350), [`ui/dr-ui/ui/app.slint:616`](../../ui/dr-ui/ui/app.slint#L616), [`ui/dr-ui/ui/library.slint:1360`](../../ui/dr-ui/ui/library.slint#L1360), [`ui/dr-ui/ui/library.slint:1384`](../../ui/dr-ui/ui/library.slint#L1384), [`ui/dr-ui/ui/library.slint:1437`](../../ui/dr-ui/ui/library.slint#L1437), [`ui/dr-ui/ui/library.slint:19`](../../ui/dr-ui/ui/library.slint#L19), [`ui/dr-ui/ui/library.slint:4246`](../../ui/dr-ui/ui/library.slint#L4246) |
-| 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/schema.rs:1125`](../../core/dr-catalog/src/schema.rs#L1125), [`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: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.rs:396`](../../ui/dr-ui/src/library_ui.rs#L396), [`ui/dr-ui/src/library_ui.rs:505`](../../ui/dr-ui/src/library_ui.rs#L505), [`ui/dr-ui/src/library_ui.rs:6822`](../../ui/dr-ui/src/library_ui.rs#L6822), [`ui/dr-ui/src/library_ui.rs:6875`](../../ui/dr-ui/src/library_ui.rs#L6875), [`ui/dr-ui/src/library_ui.rs:8366`](../../ui/dr-ui/src/library_ui.rs#L8366), [`ui/dr-ui/ui/app.slint:362`](../../ui/dr-ui/ui/app.slint#L362), [`ui/dr-ui/ui/app.slint:616`](../../ui/dr-ui/ui/app.slint#L616), [`ui/dr-ui/ui/app.slint:935`](../../ui/dr-ui/ui/app.slint#L935), [`ui/dr-ui/ui/library.slint:111`](../../ui/dr-ui/ui/library.slint#L111), [`ui/dr-ui/ui/library.slint:1552`](../../ui/dr-ui/ui/library.slint#L1552), [`ui/dr-ui/ui/library.slint:4246`](../../ui/dr-ui/ui/library.slint#L4246), [`ui/dr-ui/ui/settings.slint:191`](../../ui/dr-ui/ui/settings.slint#L191) |
-| 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:183`](../../ui/dr-ui/src/collections_ui/drag.rs#L183), [`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:257`](../../ui/dr-ui/src/collections_ui/press.rs#L257), [`ui/dr-ui/src/collections_ui/press.rs:489`](../../ui/dr-ui/src/collections_ui/press.rs#L489), [`ui/dr-ui/src/collections_ui/press.rs:53`](../../ui/dr-ui/src/collections_ui/press.rs#L53), [`ui/dr-ui/src/collections_ui/rename_menu.rs:171`](../../ui/dr-ui/src/collections_ui/rename_menu.rs#L171), [`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:240`](../../ui/dr-ui/src/collections_ui/tree_sync.rs#L240), [`ui/dr-ui/src/collections_ui/tree_sync.rs:311`](../../ui/dr-ui/src/collections_ui/tree_sync.rs#L311), [`ui/dr-ui/src/collections_ui/tree_sync.rs:333`](../../ui/dr-ui/src/collections_ui/tree_sync.rs#L333), [`ui/dr-ui/src/collections_ui/wiring_grid.rs:116`](../../ui/dr-ui/src/collections_ui/wiring_grid.rs#L116), [`ui/dr-ui/src/collections_ui/wiring_grid.rs:162`](../../ui/dr-ui/src/collections_ui/wiring_grid.rs#L162), [`ui/dr-ui/src/collections_ui/wiring_grid.rs:422`](../../ui/dr-ui/src/collections_ui/wiring_grid.rs#L422), [`ui/dr-ui/src/collections_ui/wiring_grid.rs:495`](../../ui/dr-ui/src/collections_ui/wiring_grid.rs#L495), [`ui/dr-ui/src/collections_ui/wiring_grid.rs:555`](../../ui/dr-ui/src/collections_ui/wiring_grid.rs#L555), [`ui/dr-ui/src/collections_ui/wiring_tree.rs:265`](../../ui/dr-ui/src/collections_ui/wiring_tree.rs#L265), [`ui/dr-ui/src/collections_ui/wiring_tree.rs:319`](../../ui/dr-ui/src/collections_ui/wiring_tree.rs#L319), [`ui/dr-ui/src/collections_ui/wiring_tree.rs:365`](../../ui/dr-ui/src/collections_ui/wiring_tree.rs#L365), [`ui/dr-ui/src/collections_ui/wiring_tree.rs:475`](../../ui/dr-ui/src/collections_ui/wiring_tree.rs#L475), [`ui/dr-ui/src/collections_ui/wiring_tree.rs:531`](../../ui/dr-ui/src/collections_ui/wiring_tree.rs#L531), [`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.rs:2774`](../../ui/dr-ui/src/library_ui.rs#L2774), [`ui/dr-ui/src/library_ui.rs:4369`](../../ui/dr-ui/src/library_ui.rs#L4369), [`ui/dr-ui/src/library_ui.rs:5128`](../../ui/dr-ui/src/library_ui.rs#L5128), [`ui/dr-ui/ui/app.slint:3252`](../../ui/dr-ui/ui/app.slint#L3252), [`ui/dr-ui/ui/app.slint:353`](../../ui/dr-ui/ui/app.slint#L353), [`ui/dr-ui/ui/app.slint:611`](../../ui/dr-ui/ui/app.slint#L611), [`ui/dr-ui/ui/app.slint:640`](../../ui/dr-ui/ui/app.slint#L640), [`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:1327`](../../ui/dr-ui/ui/library.slint#L1327), [`ui/dr-ui/ui/library.slint:2942`](../../ui/dr-ui/ui/library.slint#L2942), [`ui/dr-ui/ui/library.slint:4224`](../../ui/dr-ui/ui/library.slint#L4224), [`ui/dr-ui/ui/library.slint:4311`](../../ui/dr-ui/ui/library.slint#L4311), [`ui/dr-ui/ui/library.slint:998`](../../ui/dr-ui/ui/library.slint#L998) |
+| 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/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:301`](../../core/dr-decode/src/lib.rs#L301), [`core/dr-decode/src/lib.rs:307`](../../core/dr-decode/src/lib.rs#L307), [`core/dr-decode/src/lib.rs:317`](../../core/dr-decode/src/lib.rs#L317), [`core/dr-decode/src/lib.rs:444`](../../core/dr-decode/src/lib.rs#L444), [`core/dr-export/src/dng.rs:308`](../../core/dr-export/src/dng.rs#L308), [`core/dr-pipeline/src/sidecar.rs:171`](../../core/dr-pipeline/src/sidecar.rs#L171), [`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:143`](../../ui/dr-ui/src/collections_ui/wiring_grid.rs#L143), [`ui/dr-ui/src/collections_ui/wiring_grid.rs:253`](../../ui/dr-ui/src/collections_ui/wiring_grid.rs#L253), [`ui/dr-ui/src/collections_ui/wiring_grid.rs:312`](../../ui/dr-ui/src/collections_ui/wiring_grid.rs#L312), [`ui/dr-ui/src/library/cells.rs:206`](../../ui/dr-ui/src/library/cells.rs#L206), [`ui/dr-ui/src/library_ui.rs:789`](../../ui/dr-ui/src/library_ui.rs#L789), [`ui/dr-ui/src/library_ui.rs:8226`](../../ui/dr-ui/src/library_ui.rs#L8226), [`ui/dr-ui/src/library_ui.rs:8237`](../../ui/dr-ui/src/library_ui.rs#L8237), [`ui/dr-ui/src/library_ui.rs:8250`](../../ui/dr-ui/src/library_ui.rs#L8250), [`ui/dr-ui/src/library_ui.rs:8265`](../../ui/dr-ui/src/library_ui.rs#L8265), [`ui/dr-ui/src/library_ui.rs:8274`](../../ui/dr-ui/src/library_ui.rs#L8274), [`ui/dr-ui/ui/app.slint:351`](../../ui/dr-ui/ui/app.slint#L351), [`ui/dr-ui/ui/app.slint:567`](../../ui/dr-ui/ui/app.slint#L567), [`ui/dr-ui/ui/library.slint:1360`](../../ui/dr-ui/ui/library.slint#L1360), [`ui/dr-ui/ui/library.slint:1384`](../../ui/dr-ui/ui/library.slint#L1384), [`ui/dr-ui/ui/library.slint:1437`](../../ui/dr-ui/ui/library.slint#L1437), [`ui/dr-ui/ui/library.slint:19`](../../ui/dr-ui/ui/library.slint#L19), [`ui/dr-ui/ui/library.slint:4246`](../../ui/dr-ui/ui/library.slint#L4246) |
+| 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/schema.rs:1125`](../../core/dr-catalog/src/schema.rs#L1125), [`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: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.rs:396`](../../ui/dr-ui/src/library_ui.rs#L396), [`ui/dr-ui/src/library_ui.rs:505`](../../ui/dr-ui/src/library_ui.rs#L505), [`ui/dr-ui/src/library_ui.rs:6822`](../../ui/dr-ui/src/library_ui.rs#L6822), [`ui/dr-ui/src/library_ui.rs:6875`](../../ui/dr-ui/src/library_ui.rs#L6875), [`ui/dr-ui/src/library_ui.rs:8366`](../../ui/dr-ui/src/library_ui.rs#L8366), [`ui/dr-ui/ui/app.slint:363`](../../ui/dr-ui/ui/app.slint#L363), [`ui/dr-ui/ui/app.slint:567`](../../ui/dr-ui/ui/app.slint#L567), [`ui/dr-ui/ui/app.slint:852`](../../ui/dr-ui/ui/app.slint#L852), [`ui/dr-ui/ui/library.slint:111`](../../ui/dr-ui/ui/library.slint#L111), [`ui/dr-ui/ui/library.slint:1552`](../../ui/dr-ui/ui/library.slint#L1552), [`ui/dr-ui/ui/library.slint:4246`](../../ui/dr-ui/ui/library.slint#L4246), [`ui/dr-ui/ui/settings.slint:191`](../../ui/dr-ui/ui/settings.slint#L191) |
+| 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:183`](../../ui/dr-ui/src/collections_ui/drag.rs#L183), [`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:257`](../../ui/dr-ui/src/collections_ui/press.rs#L257), [`ui/dr-ui/src/collections_ui/press.rs:489`](../../ui/dr-ui/src/collections_ui/press.rs#L489), [`ui/dr-ui/src/collections_ui/press.rs:53`](../../ui/dr-ui/src/collections_ui/press.rs#L53), [`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:244`](../../ui/dr-ui/src/collections_ui/tree_sync.rs#L244), [`ui/dr-ui/src/collections_ui/tree_sync.rs:315`](../../ui/dr-ui/src/collections_ui/tree_sync.rs#L315), [`ui/dr-ui/src/collections_ui/tree_sync.rs:337`](../../ui/dr-ui/src/collections_ui/tree_sync.rs#L337), [`ui/dr-ui/src/collections_ui/wiring_grid.rs:116`](../../ui/dr-ui/src/collections_ui/wiring_grid.rs#L116), [`ui/dr-ui/src/collections_ui/wiring_grid.rs:162`](../../ui/dr-ui/src/collections_ui/wiring_grid.rs#L162), [`ui/dr-ui/src/collections_ui/wiring_grid.rs:429`](../../ui/dr-ui/src/collections_ui/wiring_grid.rs#L429), [`ui/dr-ui/src/collections_ui/wiring_grid.rs:505`](../../ui/dr-ui/src/collections_ui/wiring_grid.rs#L505), [`ui/dr-ui/src/collections_ui/wiring_grid.rs:567`](../../ui/dr-ui/src/collections_ui/wiring_grid.rs#L567), [`ui/dr-ui/src/collections_ui/wiring_tree.rs:284`](../../ui/dr-ui/src/collections_ui/wiring_tree.rs#L284), [`ui/dr-ui/src/collections_ui/wiring_tree.rs:341`](../../ui/dr-ui/src/collections_ui/wiring_tree.rs#L341), [`ui/dr-ui/src/collections_ui/wiring_tree.rs:391`](../../ui/dr-ui/src/collections_ui/wiring_tree.rs#L391), [`ui/dr-ui/src/collections_ui/wiring_tree.rs:513`](../../ui/dr-ui/src/collections_ui/wiring_tree.rs#L513), [`ui/dr-ui/src/collections_ui/wiring_tree.rs:576`](../../ui/dr-ui/src/collections_ui/wiring_tree.rs#L576), [`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.rs:2774`](../../ui/dr-ui/src/library_ui.rs#L2774), [`ui/dr-ui/src/library_ui.rs:4369`](../../ui/dr-ui/src/library_ui.rs#L4369), [`ui/dr-ui/src/library_ui.rs:5128`](../../ui/dr-ui/src/library_ui.rs#L5128), [`ui/dr-ui/ui/app.slint:3169`](../../ui/dr-ui/ui/app.slint#L3169), [`ui/dr-ui/ui/app.slint:354`](../../ui/dr-ui/ui/app.slint#L354), [`ui/dr-ui/ui/app.slint:562`](../../ui/dr-ui/ui/app.slint#L562), [`ui/dr-ui/ui/app.slint:591`](../../ui/dr-ui/ui/app.slint#L591), [`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:1327`](../../ui/dr-ui/ui/library.slint#L1327), [`ui/dr-ui/ui/library.slint:2942`](../../ui/dr-ui/ui/library.slint#L2942), [`ui/dr-ui/ui/library.slint:4224`](../../ui/dr-ui/ui/library.slint#L4224), [`ui/dr-ui/ui/library.slint:4311`](../../ui/dr-ui/ui/library.slint#L4311), [`ui/dr-ui/ui/library.slint:998`](../../ui/dr-ui/ui/library.slint#L998) |
| 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:1400`](../../core/dr-pipeline/src/sidecar.rs#L1400), [`core/dr-pipeline/src/sidecar.rs:2232`](../../core/dr-pipeline/src/sidecar.rs#L2232), [`core/dr-pipeline/src/sidecar.rs:96`](../../core/dr-pipeline/src/sidecar.rs#L96), [`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:740`](../../ui/dr-ui/src/develop/masks.rs#L740), [`ui/dr-ui/src/develop/session.rs:561`](../../ui/dr-ui/src/develop/session.rs#L561), [`ui/dr-ui/src/develop/session.rs:590`](../../ui/dr-ui/src/develop/session.rs#L590), [`ui/dr-ui/src/export.rs:812`](../../ui/dr-ui/src/export.rs#L812), [`ui/dr-ui/src/lib.rs:1183`](../../ui/dr-ui/src/lib.rs#L1183), [`ui/dr-ui/src/lib.rs:1243`](../../ui/dr-ui/src/lib.rs#L1243), [`ui/dr-ui/src/lib.rs:2691`](../../ui/dr-ui/src/lib.rs#L2691), [`ui/dr-ui/src/lib.rs:2838`](../../ui/dr-ui/src/lib.rs#L2838), [`ui/dr-ui/src/lib.rs:758`](../../ui/dr-ui/src/lib.rs#L758), [`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:373`](../../ui/dr-ui/src/library/sidecar.rs#L373), [`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.rs:1339`](../../ui/dr-ui/src/library_ui.rs#L1339), [`ui/dr-ui/src/library_ui.rs:6389`](../../ui/dr-ui/src/library_ui.rs#L6389), [`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:584`](../../ui/dr-ui/src/develop/render.rs#L584), [`ui/dr-ui/src/develop/render.rs:627`](../../ui/dr-ui/src/develop/render.rs#L627), [`ui/dr-ui/src/library/filters.rs:84`](../../ui/dr-ui/src/library/filters.rs#L84), [`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:605`](../../ui/dr-ui/src/library/scan.rs#L605), [`ui/dr-ui/src/library/sidecar.rs:100`](../../ui/dr-ui/src/library/sidecar.rs#L100), [`ui/dr-ui/src/library/sidecar.rs:357`](../../ui/dr-ui/src/library/sidecar.rs#L357), [`ui/dr-ui/src/library/sidecar.rs:373`](../../ui/dr-ui/src/library/sidecar.rs#L373), [`ui/dr-ui/src/library/sidecar.rs:427`](../../ui/dr-ui/src/library/sidecar.rs#L427), [`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.rs:1406`](../../ui/dr-ui/src/library_ui.rs#L1406), [`ui/dr-ui/src/library_ui.rs:1997`](../../ui/dr-ui/src/library_ui.rs#L1997), [`ui/dr-ui/src/library_ui.rs:2041`](../../ui/dr-ui/src/library_ui.rs#L2041), [`ui/dr-ui/src/library_ui.rs:2057`](../../ui/dr-ui/src/library_ui.rs#L2057), [`ui/dr-ui/src/library_ui.rs:2151`](../../ui/dr-ui/src/library_ui.rs#L2151), [`ui/dr-ui/src/library_ui.rs:284`](../../ui/dr-ui/src/library_ui.rs#L284), [`ui/dr-ui/src/library_ui.rs:2993`](../../ui/dr-ui/src/library_ui.rs#L2993), [`ui/dr-ui/src/library_ui.rs:320`](../../ui/dr-ui/src/library_ui.rs#L320), [`ui/dr-ui/src/library_ui.rs:328`](../../ui/dr-ui/src/library_ui.rs#L328), [`ui/dr-ui/src/library_ui.rs:3616`](../../ui/dr-ui/src/library_ui.rs#L3616), [`ui/dr-ui/src/library_ui.rs:3838`](../../ui/dr-ui/src/library_ui.rs#L3838), [`ui/dr-ui/src/library_ui.rs:4116`](../../ui/dr-ui/src/library_ui.rs#L4116), [`ui/dr-ui/src/library_ui.rs:4232`](../../ui/dr-ui/src/library_ui.rs#L4232), [`ui/dr-ui/src/library_ui.rs:4420`](../../ui/dr-ui/src/library_ui.rs#L4420), [`ui/dr-ui/src/library_ui.rs:4542`](../../ui/dr-ui/src/library_ui.rs#L4542), [`ui/dr-ui/src/library_ui.rs:573`](../../ui/dr-ui/src/library_ui.rs#L573), [`ui/dr-ui/src/library_ui.rs:662`](../../ui/dr-ui/src/library_ui.rs#L662), [`ui/dr-ui/src/library_ui.rs:6928`](../../ui/dr-ui/src/library_ui.rs#L6928), [`ui/dr-ui/src/library_ui.rs:7010`](../../ui/dr-ui/src/library_ui.rs#L7010), [`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:2810`](../../ui/dr-ui/src/lib.rs#L2810), [`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:529`](../../ui/dr-ui/ui/settings.slint#L529), [`ui/dr-ui/ui/settings.slint:94`](../../ui/dr-ui/ui/settings.slint#L94) |
| FR-CULL-11 | [`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), [`ui/dr-ui/src/identity.rs:1`](../../ui/dr-ui/src/identity.rs#L1), [`ui/dr-ui/src/identity_ui.rs:1`](../../ui/dr-ui/src/identity_ui.rs#L1), [`ui/dr-ui/src/library/filters.rs:105`](../../ui/dr-ui/src/library/filters.rs#L105), [`ui/dr-ui/src/library/filters.rs:155`](../../ui/dr-ui/src/library/filters.rs#L155), [`ui/dr-ui/ui/identity.slint:1`](../../ui/dr-ui/ui/identity.slint#L1) |
| FR-CULL-12 | [`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), [`ui/dr-ui/src/identity.rs:1`](../../ui/dr-ui/src/identity.rs#L1), [`ui/dr-ui/ui/identity.slint:1`](../../ui/dr-ui/ui/identity.slint#L1) |
-| FR-CULL-13 | [`core/dr-catalog/src/schema.rs:917`](../../core/dr-catalog/src/schema.rs#L917), [`core/dr-types/src/place.rs:129`](../../core/dr-types/src/place.rs#L129), [`ui/dr-ui/src/identity.rs:104`](../../ui/dr-ui/src/identity.rs#L104), [`ui/dr-ui/src/library/filters.rs:131`](../../ui/dr-ui/src/library/filters.rs#L131), [`ui/dr-ui/src/library/filters.rs:683`](../../ui/dr-ui/src/library/filters.rs#L683), [`ui/dr-ui/src/library/filters.rs:726`](../../ui/dr-ui/src/library/filters.rs#L726), [`ui/dr-ui/src/library/filters.rs:764`](../../ui/dr-ui/src/library/filters.rs#L764), [`ui/dr-ui/ui/app.slint:748`](../../ui/dr-ui/ui/app.slint#L748), [`ui/dr-ui/ui/identity.slint:63`](../../ui/dr-ui/ui/identity.slint#L63), [`ui/dr-ui/ui/library.slint:1512`](../../ui/dr-ui/ui/library.slint#L1512) |
+| FR-CULL-13 | [`core/dr-catalog/src/schema.rs:917`](../../core/dr-catalog/src/schema.rs#L917), [`core/dr-types/src/place.rs:129`](../../core/dr-types/src/place.rs#L129), [`ui/dr-ui/src/identity.rs:104`](../../ui/dr-ui/src/identity.rs#L104), [`ui/dr-ui/src/library/filters.rs:131`](../../ui/dr-ui/src/library/filters.rs#L131), [`ui/dr-ui/src/library/filters.rs:683`](../../ui/dr-ui/src/library/filters.rs#L683), [`ui/dr-ui/src/library/filters.rs:726`](../../ui/dr-ui/src/library/filters.rs#L726), [`ui/dr-ui/src/library/filters.rs:764`](../../ui/dr-ui/src/library/filters.rs#L764), [`ui/dr-ui/ui/app.slint:665`](../../ui/dr-ui/ui/app.slint#L665), [`ui/dr-ui/ui/identity.slint:63`](../../ui/dr-ui/ui/identity.slint#L63), [`ui/dr-ui/ui/library.slint:1512`](../../ui/dr-ui/ui/library.slint#L1512) |
| FR-CULL-2 | [`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), [`ui/dr-ui/src/import.rs:463`](../../ui/dr-ui/src/import.rs#L463) |
-| FR-CULL-3 | [`core/dr-gpu/src/focus.rs:154`](../../core/dr-gpu/src/focus.rs#L154), [`core/dr-gpu/src/focus.rs:186`](../../core/dr-gpu/src/focus.rs#L186), [`core/dr-gpu/src/focus.rs:1`](../../core/dr-gpu/src/focus.rs#L1), [`core/dr-gpu/src/focus.rs:317`](../../core/dr-gpu/src/focus.rs#L317), [`core/dr-gpu/src/raw_histogram.rs:129`](../../core/dr-gpu/src/raw_histogram.rs#L129), [`core/dr-gpu/src/raw_histogram.rs:1`](../../core/dr-gpu/src/raw_histogram.rs#L1), [`core/dr-gpu/src/raw_histogram.rs:272`](../../core/dr-gpu/src/raw_histogram.rs#L272), [`core/dr-gpu/src/raw_histogram.rs:407`](../../core/dr-gpu/src/raw_histogram.rs#L407), [`core/dr-gpu/src/shaders/focus_peak.wgsl:1`](../../core/dr-gpu/src/shaders/focus_peak.wgsl#L1), [`core/dr-gpu/src/shaders/raw_histogram.wgsl:1`](../../core/dr-gpu/src/shaders/raw_histogram.wgsl#L1), [`ui/dr-ui/src/develop/render.rs:1203`](../../ui/dr-ui/src/develop/render.rs#L1203), [`ui/dr-ui/src/develop/render.rs:1267`](../../ui/dr-ui/src/develop/render.rs#L1267), [`ui/dr-ui/src/develop/render.rs:1290`](../../ui/dr-ui/src/develop/render.rs#L1290), [`ui/dr-ui/src/develop/render.rs:256`](../../ui/dr-ui/src/develop/render.rs#L256), [`ui/dr-ui/src/develop/render.rs:269`](../../ui/dr-ui/src/develop/render.rs#L269), [`ui/dr-ui/src/develop/render.rs:314`](../../ui/dr-ui/src/develop/render.rs#L314), [`ui/dr-ui/src/develop/render.rs:325`](../../ui/dr-ui/src/develop/render.rs#L325), [`ui/dr-ui/src/develop/render.rs:331`](../../ui/dr-ui/src/develop/render.rs#L331), [`ui/dr-ui/src/develop/render.rs:348`](../../ui/dr-ui/src/develop/render.rs#L348), [`ui/dr-ui/src/develop/session.rs:118`](../../ui/dr-ui/src/develop/session.rs#L118), [`ui/dr-ui/src/develop/session.rs:138`](../../ui/dr-ui/src/develop/session.rs#L138), [`ui/dr-ui/src/develop/session.rs:144`](../../ui/dr-ui/src/develop/session.rs#L144), [`ui/dr-ui/src/develop_ui.rs:1199`](../../ui/dr-ui/src/develop_ui.rs#L1199), [`ui/dr-ui/src/histogram.rs:1`](../../ui/dr-ui/src/histogram.rs#L1), [`ui/dr-ui/src/histogram.rs:208`](../../ui/dr-ui/src/histogram.rs#L208), [`ui/dr-ui/src/histogram.rs:228`](../../ui/dr-ui/src/histogram.rs#L228), [`ui/dr-ui/src/histogram.rs:272`](../../ui/dr-ui/src/histogram.rs#L272), [`ui/dr-ui/src/histogram.rs:544`](../../ui/dr-ui/src/histogram.rs#L544), [`ui/dr-ui/src/histogram.rs:565`](../../ui/dr-ui/src/histogram.rs#L565), [`ui/dr-ui/src/histogram.rs:593`](../../ui/dr-ui/src/histogram.rs#L593), [`ui/dr-ui/src/histogram.rs:621`](../../ui/dr-ui/src/histogram.rs#L621), [`ui/dr-ui/src/histogram.rs:658`](../../ui/dr-ui/src/histogram.rs#L658), [`ui/dr-ui/src/lib.rs:1272`](../../ui/dr-ui/src/lib.rs#L1272), [`ui/dr-ui/src/lib.rs:2211`](../../ui/dr-ui/src/lib.rs#L2211), [`ui/dr-ui/src/lib.rs:2324`](../../ui/dr-ui/src/lib.rs#L2324), [`ui/dr-ui/src/lib.rs:2365`](../../ui/dr-ui/src/lib.rs#L2365), [`ui/dr-ui/src/lib.rs:443`](../../ui/dr-ui/src/lib.rs#L443), [`ui/dr-ui/src/peaking.rs:1`](../../ui/dr-ui/src/peaking.rs#L1), [`ui/dr-ui/ui/app.slint:129`](../../ui/dr-ui/ui/app.slint#L129), [`ui/dr-ui/ui/app.slint:2067`](../../ui/dr-ui/ui/app.slint#L2067), [`ui/dr-ui/ui/app.slint:3074`](../../ui/dr-ui/ui/app.slint#L3074), [`ui/dr-ui/ui/peaking.slint:1`](../../ui/dr-ui/ui/peaking.slint#L1), [`ui/dr-ui/ui/peaking.slint:25`](../../ui/dr-ui/ui/peaking.slint#L25), [`ui/dr-ui/ui/peaking.slint:56`](../../ui/dr-ui/ui/peaking.slint#L56), [`ui/dr-ui/ui/peaking.slint:91`](../../ui/dr-ui/ui/peaking.slint#L91) |
+| FR-CULL-3 | [`core/dr-gpu/src/focus.rs:154`](../../core/dr-gpu/src/focus.rs#L154), [`core/dr-gpu/src/focus.rs:186`](../../core/dr-gpu/src/focus.rs#L186), [`core/dr-gpu/src/focus.rs:1`](../../core/dr-gpu/src/focus.rs#L1), [`core/dr-gpu/src/focus.rs:317`](../../core/dr-gpu/src/focus.rs#L317), [`core/dr-gpu/src/raw_histogram.rs:129`](../../core/dr-gpu/src/raw_histogram.rs#L129), [`core/dr-gpu/src/raw_histogram.rs:1`](../../core/dr-gpu/src/raw_histogram.rs#L1), [`core/dr-gpu/src/raw_histogram.rs:272`](../../core/dr-gpu/src/raw_histogram.rs#L272), [`core/dr-gpu/src/raw_histogram.rs:407`](../../core/dr-gpu/src/raw_histogram.rs#L407), [`core/dr-gpu/src/shaders/focus_peak.wgsl:1`](../../core/dr-gpu/src/shaders/focus_peak.wgsl#L1), [`core/dr-gpu/src/shaders/raw_histogram.wgsl:1`](../../core/dr-gpu/src/shaders/raw_histogram.wgsl#L1), [`ui/dr-ui/src/develop/render.rs:1203`](../../ui/dr-ui/src/develop/render.rs#L1203), [`ui/dr-ui/src/develop/render.rs:1267`](../../ui/dr-ui/src/develop/render.rs#L1267), [`ui/dr-ui/src/develop/render.rs:1290`](../../ui/dr-ui/src/develop/render.rs#L1290), [`ui/dr-ui/src/develop/render.rs:256`](../../ui/dr-ui/src/develop/render.rs#L256), [`ui/dr-ui/src/develop/render.rs:269`](../../ui/dr-ui/src/develop/render.rs#L269), [`ui/dr-ui/src/develop/render.rs:314`](../../ui/dr-ui/src/develop/render.rs#L314), [`ui/dr-ui/src/develop/render.rs:325`](../../ui/dr-ui/src/develop/render.rs#L325), [`ui/dr-ui/src/develop/render.rs:331`](../../ui/dr-ui/src/develop/render.rs#L331), [`ui/dr-ui/src/develop/render.rs:348`](../../ui/dr-ui/src/develop/render.rs#L348), [`ui/dr-ui/src/develop/session.rs:118`](../../ui/dr-ui/src/develop/session.rs#L118), [`ui/dr-ui/src/develop/session.rs:138`](../../ui/dr-ui/src/develop/session.rs#L138), [`ui/dr-ui/src/develop/session.rs:144`](../../ui/dr-ui/src/develop/session.rs#L144), [`ui/dr-ui/src/develop_ui.rs:1199`](../../ui/dr-ui/src/develop_ui.rs#L1199), [`ui/dr-ui/src/histogram.rs:1`](../../ui/dr-ui/src/histogram.rs#L1), [`ui/dr-ui/src/histogram.rs:208`](../../ui/dr-ui/src/histogram.rs#L208), [`ui/dr-ui/src/histogram.rs:228`](../../ui/dr-ui/src/histogram.rs#L228), [`ui/dr-ui/src/histogram.rs:272`](../../ui/dr-ui/src/histogram.rs#L272), [`ui/dr-ui/src/histogram.rs:544`](../../ui/dr-ui/src/histogram.rs#L544), [`ui/dr-ui/src/histogram.rs:565`](../../ui/dr-ui/src/histogram.rs#L565), [`ui/dr-ui/src/histogram.rs:593`](../../ui/dr-ui/src/histogram.rs#L593), [`ui/dr-ui/src/histogram.rs:621`](../../ui/dr-ui/src/histogram.rs#L621), [`ui/dr-ui/src/histogram.rs:658`](../../ui/dr-ui/src/histogram.rs#L658), [`ui/dr-ui/src/lib.rs:1272`](../../ui/dr-ui/src/lib.rs#L1272), [`ui/dr-ui/src/lib.rs:2211`](../../ui/dr-ui/src/lib.rs#L2211), [`ui/dr-ui/src/lib.rs:2324`](../../ui/dr-ui/src/lib.rs#L2324), [`ui/dr-ui/src/lib.rs:2365`](../../ui/dr-ui/src/lib.rs#L2365), [`ui/dr-ui/src/lib.rs:443`](../../ui/dr-ui/src/lib.rs#L443), [`ui/dr-ui/src/peaking.rs:1`](../../ui/dr-ui/src/peaking.rs#L1), [`ui/dr-ui/ui/app.slint:130`](../../ui/dr-ui/ui/app.slint#L130), [`ui/dr-ui/ui/app.slint:1984`](../../ui/dr-ui/ui/app.slint#L1984), [`ui/dr-ui/ui/app.slint:2991`](../../ui/dr-ui/ui/app.slint#L2991), [`ui/dr-ui/ui/peaking.slint:1`](../../ui/dr-ui/ui/peaking.slint#L1), [`ui/dr-ui/ui/peaking.slint:25`](../../ui/dr-ui/ui/peaking.slint#L25), [`ui/dr-ui/ui/peaking.slint:56`](../../ui/dr-ui/ui/peaking.slint#L56), [`ui/dr-ui/ui/peaking.slint:91`](../../ui/dr-ui/ui/peaking.slint#L91) |
| FR-CULL-4 | [`core/dr-catalog/src/rating.rs:1`](../../core/dr-catalog/src/rating.rs#L1), [`core/dr-pipeline/src/sidecar.rs:171`](../../core/dr-pipeline/src/sidecar.rs#L171), [`core/dr-xmp/src/lib.rs:442`](../../core/dr-xmp/src/lib.rs#L442), [`ui/dr-ui/src/library/filters.rs:64`](../../ui/dr-ui/src/library/filters.rs#L64), [`ui/dr-ui/src/library/sidecar.rs:11`](../../ui/dr-ui/src/library/sidecar.rs#L11) |
| FR-CULL-5 | [`core/dr-catalog/src/bursts.rs:1`](../../core/dr-catalog/src/bursts.rs#L1), [`core/dr-catalog/src/schema.rs:646`](../../core/dr-catalog/src/schema.rs#L646), [`ui/dr-ui/src/bursts.rs:1`](../../ui/dr-ui/src/bursts.rs#L1), [`ui/dr-ui/src/library/cells.rs:19`](../../ui/dr-ui/src/library/cells.rs#L19), [`ui/dr-ui/src/library/cells.rs:769`](../../ui/dr-ui/src/library/cells.rs#L769) |
-| FR-CULL-8 | [`core/dr-catalog/src/face_shard.rs:1`](../../core/dr-catalog/src/face_shard.rs#L1), [`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:714`](../../core/dr-catalog/src/schema.rs#L714), [`core/dr-catalog/src/schema.rs:970`](../../core/dr-catalog/src/schema.rs#L970), [`core/dr-face/src/align.rs:296`](../../core/dr-face/src/align.rs#L296), [`core/dr-types/src/settings.rs:176`](../../core/dr-types/src/settings.rs#L176), [`ui/dr-ui/examples/face_detectors.rs:1`](../../ui/dr-ui/examples/face_detectors.rs#L1), [`ui/dr-ui/examples/face_native.rs:1`](../../ui/dr-ui/examples/face_native.rs#L1), [`ui/dr-ui/src/derived_sync.rs:124`](../../ui/dr-ui/src/derived_sync.rs#L124), [`ui/dr-ui/src/faces.rs:1`](../../ui/dr-ui/src/faces.rs#L1), [`ui/dr-ui/src/faces.rs:446`](../../ui/dr-ui/src/faces.rs#L446), [`ui/dr-ui/src/faces.rs:462`](../../ui/dr-ui/src/faces.rs#L462), [`ui/dr-ui/src/faces.rs:584`](../../ui/dr-ui/src/faces.rs#L584), [`ui/dr-ui/src/identity_ui.rs:1434`](../../ui/dr-ui/src/identity_ui.rs#L1434), [`ui/dr-ui/src/identity_ui.rs:617`](../../ui/dr-ui/src/identity_ui.rs#L617), [`ui/dr-ui/src/lib.rs:1739`](../../ui/dr-ui/src/lib.rs#L1739), [`ui/dr-ui/src/lib.rs:3098`](../../ui/dr-ui/src/lib.rs#L3098), [`ui/dr-ui/src/library/sweep.rs:241`](../../ui/dr-ui/src/library/sweep.rs#L241), [`ui/dr-ui/src/library/sweep.rs:506`](../../ui/dr-ui/src/library/sweep.rs#L506), [`ui/dr-ui/src/library_ui.rs:406`](../../ui/dr-ui/src/library_ui.rs#L406), [`ui/dr-ui/src/library_ui.rs:493`](../../ui/dr-ui/src/library_ui.rs#L493), [`ui/dr-ui/src/repairs.rs:1`](../../ui/dr-ui/src/repairs.rs#L1), [`ui/dr-ui/src/settings_ui.rs:210`](../../ui/dr-ui/src/settings_ui.rs#L210), [`ui/dr-ui/src/settings_ui.rs:571`](../../ui/dr-ui/src/settings_ui.rs#L571), [`ui/dr-ui/ui/app.slint:985`](../../ui/dr-ui/ui/app.slint#L985), [`ui/dr-ui/ui/settings.slint:100`](../../ui/dr-ui/ui/settings.slint#L100), [`ui/dr-ui/ui/settings.slint:467`](../../ui/dr-ui/ui/settings.slint#L467), [`ui/dr-ui/ui/settings.slint:529`](../../ui/dr-ui/ui/settings.slint#L529), [`ui/dr-ui/ui/settings.slint:82`](../../ui/dr-ui/ui/settings.slint#L82), [`ui/dr-ui/ui/settings.slint:94`](../../ui/dr-ui/ui/settings.slint#L94) |
-| FR-CULL-8a | [`core/dr-catalog/src/faces.rs:124`](../../core/dr-catalog/src/faces.rs#L124), [`core/dr-catalog/src/schema.rs:917`](../../core/dr-catalog/src/schema.rs#L917), [`core/dr-face/src/classify.rs:1`](../../core/dr-face/src/classify.rs#L1), [`core/dr-face/src/eyes.rs:1`](../../core/dr-face/src/eyes.rs#L1), [`core/dr-face/src/landmarks.rs:1`](../../core/dr-face/src/landmarks.rs#L1), [`core/dr-types/src/place.rs:129`](../../core/dr-types/src/place.rs#L129), [`ui/dr-ui/src/faces.rs:166`](../../ui/dr-ui/src/faces.rs#L166), [`ui/dr-ui/src/faces.rs:1821`](../../ui/dr-ui/src/faces.rs#L1821), [`ui/dr-ui/src/faces.rs:308`](../../ui/dr-ui/src/faces.rs#L308), [`ui/dr-ui/src/identity.rs:104`](../../ui/dr-ui/src/identity.rs#L104), [`ui/dr-ui/src/library/filters.rs:131`](../../ui/dr-ui/src/library/filters.rs#L131), [`ui/dr-ui/src/library/filters.rs:683`](../../ui/dr-ui/src/library/filters.rs#L683), [`ui/dr-ui/src/library/filters.rs:726`](../../ui/dr-ui/src/library/filters.rs#L726), [`ui/dr-ui/src/library/filters.rs:764`](../../ui/dr-ui/src/library/filters.rs#L764), [`ui/dr-ui/src/repairs.rs:571`](../../ui/dr-ui/src/repairs.rs#L571), [`ui/dr-ui/ui/app.slint:748`](../../ui/dr-ui/ui/app.slint#L748), [`ui/dr-ui/ui/identity.slint:273`](../../ui/dr-ui/ui/identity.slint#L273), [`ui/dr-ui/ui/identity.slint:63`](../../ui/dr-ui/ui/identity.slint#L63), [`ui/dr-ui/ui/library.slint:1512`](../../ui/dr-ui/ui/library.slint#L1512) |
+| FR-CULL-8 | [`core/dr-catalog/src/face_shard.rs:1`](../../core/dr-catalog/src/face_shard.rs#L1), [`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:714`](../../core/dr-catalog/src/schema.rs#L714), [`core/dr-catalog/src/schema.rs:970`](../../core/dr-catalog/src/schema.rs#L970), [`core/dr-face/src/align.rs:296`](../../core/dr-face/src/align.rs#L296), [`core/dr-types/src/settings.rs:176`](../../core/dr-types/src/settings.rs#L176), [`ui/dr-ui/examples/face_detectors.rs:1`](../../ui/dr-ui/examples/face_detectors.rs#L1), [`ui/dr-ui/examples/face_native.rs:1`](../../ui/dr-ui/examples/face_native.rs#L1), [`ui/dr-ui/src/derived_sync.rs:124`](../../ui/dr-ui/src/derived_sync.rs#L124), [`ui/dr-ui/src/faces.rs:1`](../../ui/dr-ui/src/faces.rs#L1), [`ui/dr-ui/src/faces.rs:446`](../../ui/dr-ui/src/faces.rs#L446), [`ui/dr-ui/src/faces.rs:462`](../../ui/dr-ui/src/faces.rs#L462), [`ui/dr-ui/src/faces.rs:584`](../../ui/dr-ui/src/faces.rs#L584), [`ui/dr-ui/src/identity_ui.rs:1434`](../../ui/dr-ui/src/identity_ui.rs#L1434), [`ui/dr-ui/src/identity_ui.rs:617`](../../ui/dr-ui/src/identity_ui.rs#L617), [`ui/dr-ui/src/lib.rs:1739`](../../ui/dr-ui/src/lib.rs#L1739), [`ui/dr-ui/src/lib.rs:3098`](../../ui/dr-ui/src/lib.rs#L3098), [`ui/dr-ui/src/library/sweep.rs:241`](../../ui/dr-ui/src/library/sweep.rs#L241), [`ui/dr-ui/src/library/sweep.rs:506`](../../ui/dr-ui/src/library/sweep.rs#L506), [`ui/dr-ui/src/library_ui.rs:406`](../../ui/dr-ui/src/library_ui.rs#L406), [`ui/dr-ui/src/library_ui.rs:493`](../../ui/dr-ui/src/library_ui.rs#L493), [`ui/dr-ui/src/repairs.rs:1`](../../ui/dr-ui/src/repairs.rs#L1), [`ui/dr-ui/src/settings_ui.rs:210`](../../ui/dr-ui/src/settings_ui.rs#L210), [`ui/dr-ui/src/settings_ui.rs:571`](../../ui/dr-ui/src/settings_ui.rs#L571), [`ui/dr-ui/ui/app.slint:902`](../../ui/dr-ui/ui/app.slint#L902), [`ui/dr-ui/ui/settings.slint:100`](../../ui/dr-ui/ui/settings.slint#L100), [`ui/dr-ui/ui/settings.slint:467`](../../ui/dr-ui/ui/settings.slint#L467), [`ui/dr-ui/ui/settings.slint:529`](../../ui/dr-ui/ui/settings.slint#L529), [`ui/dr-ui/ui/settings.slint:82`](../../ui/dr-ui/ui/settings.slint#L82), [`ui/dr-ui/ui/settings.slint:94`](../../ui/dr-ui/ui/settings.slint#L94) |
+| FR-CULL-8a | [`core/dr-catalog/src/faces.rs:124`](../../core/dr-catalog/src/faces.rs#L124), [`core/dr-catalog/src/schema.rs:917`](../../core/dr-catalog/src/schema.rs#L917), [`core/dr-face/src/classify.rs:1`](../../core/dr-face/src/classify.rs#L1), [`core/dr-face/src/eyes.rs:1`](../../core/dr-face/src/eyes.rs#L1), [`core/dr-face/src/landmarks.rs:1`](../../core/dr-face/src/landmarks.rs#L1), [`core/dr-types/src/place.rs:129`](../../core/dr-types/src/place.rs#L129), [`ui/dr-ui/src/faces.rs:166`](../../ui/dr-ui/src/faces.rs#L166), [`ui/dr-ui/src/faces.rs:1821`](../../ui/dr-ui/src/faces.rs#L1821), [`ui/dr-ui/src/faces.rs:308`](../../ui/dr-ui/src/faces.rs#L308), [`ui/dr-ui/src/identity.rs:104`](../../ui/dr-ui/src/identity.rs#L104), [`ui/dr-ui/src/library/filters.rs:131`](../../ui/dr-ui/src/library/filters.rs#L131), [`ui/dr-ui/src/library/filters.rs:683`](../../ui/dr-ui/src/library/filters.rs#L683), [`ui/dr-ui/src/library/filters.rs:726`](../../ui/dr-ui/src/library/filters.rs#L726), [`ui/dr-ui/src/library/filters.rs:764`](../../ui/dr-ui/src/library/filters.rs#L764), [`ui/dr-ui/src/repairs.rs:571`](../../ui/dr-ui/src/repairs.rs#L571), [`ui/dr-ui/ui/app.slint:665`](../../ui/dr-ui/ui/app.slint#L665), [`ui/dr-ui/ui/identity.slint:273`](../../ui/dr-ui/ui/identity.slint#L273), [`ui/dr-ui/ui/identity.slint:63`](../../ui/dr-ui/ui/identity.slint#L63), [`ui/dr-ui/ui/library.slint:1512`](../../ui/dr-ui/ui/library.slint#L1512) |
| FR-CULL-9 | [`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: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-types/src/settings.rs:129`](../../core/dr-types/src/settings.rs#L129), [`ui/dr-ui/src/faces.rs:1`](../../ui/dr-ui/src/faces.rs#L1), [`ui/dr-ui/src/faces.rs:584`](../../ui/dr-ui/src/faces.rs#L584), [`ui/dr-ui/src/identity_ui.rs:1`](../../ui/dr-ui/src/identity_ui.rs#L1), [`ui/dr-ui/src/repairs.rs:517`](../../ui/dr-ui/src/repairs.rs#L517), [`ui/dr-ui/ui/identity.slint:347`](../../ui/dr-ui/ui/identity.slint#L347) |
| FR-DEV-1 | [`core/dr-pipeline/src/graph.rs:1`](../../core/dr-pipeline/src/graph.rs#L1), [`core/dr-pipeline/src/sidecar.rs:1`](../../core/dr-pipeline/src/sidecar.rs#L1) |
| FR-DEV-10 | [`core/dr-gpu/src/mask.rs:1027`](../../core/dr-gpu/src/mask.rs#L1027), [`core/dr-gpu/src/mask.rs:1251`](../../core/dr-gpu/src/mask.rs#L1251), [`core/dr-gpu/src/mask.rs:1509`](../../core/dr-gpu/src/mask.rs#L1509), [`core/dr-gpu/src/mask.rs:421`](../../core/dr-gpu/src/mask.rs#L421), [`core/dr-gpu/src/mask.rs:463`](../../core/dr-gpu/src/mask.rs#L463), [`core/dr-gpu/src/mask.rs:58`](../../core/dr-gpu/src/mask.rs#L58), [`core/dr-gpu/src/mask.rs:60`](../../core/dr-gpu/src/mask.rs#L60), [`core/dr-gpu/src/mask.rs:834`](../../core/dr-gpu/src/mask.rs#L834), [`core/dr-gpu/src/mask.rs:85`](../../core/dr-gpu/src/mask.rs#L85), [`core/dr-gpu/src/mask.rs:913`](../../core/dr-gpu/src/mask.rs#L913), [`core/dr-gpu/src/shaders/mask.wgsl:117`](../../core/dr-gpu/src/shaders/mask.wgsl#L117), [`core/dr-gpu/src/shaders/mask.wgsl:59`](../../core/dr-gpu/src/shaders/mask.wgsl#L59), [`core/dr-gpu/tests/range_masks.rs:119`](../../core/dr-gpu/tests/range_masks.rs#L119), [`core/dr-gpu/tests/range_masks.rs:147`](../../core/dr-gpu/tests/range_masks.rs#L147), [`core/dr-gpu/tests/range_masks.rs:175`](../../core/dr-gpu/tests/range_masks.rs#L175), [`core/dr-gpu/tests/range_masks.rs:1`](../../core/dr-gpu/tests/range_masks.rs#L1), [`core/dr-gpu/tests/range_masks.rs:94`](../../core/dr-gpu/tests/range_masks.rs#L94), [`core/dr-pipeline/src/mask.rs:125`](../../core/dr-pipeline/src/mask.rs#L125), [`core/dr-pipeline/src/mask.rs:2845`](../../core/dr-pipeline/src/mask.rs#L2845), [`core/dr-pipeline/src/mask.rs:2858`](../../core/dr-pipeline/src/mask.rs#L2858), [`core/dr-pipeline/src/mask.rs:2877`](../../core/dr-pipeline/src/mask.rs#L2877), [`core/dr-pipeline/src/mask.rs:2891`](../../core/dr-pipeline/src/mask.rs#L2891), [`core/dr-pipeline/src/mask.rs:2901`](../../core/dr-pipeline/src/mask.rs#L2901), [`core/dr-pipeline/src/mask.rs:710`](../../core/dr-pipeline/src/mask.rs#L710), [`core/dr-pipeline/src/mask.rs:749`](../../core/dr-pipeline/src/mask.rs#L749), [`core/dr-pipeline/src/mask.rs:809`](../../core/dr-pipeline/src/mask.rs#L809), [`core/dr-pipeline/src/mask.rs:828`](../../core/dr-pipeline/src/mask.rs#L828), [`core/dr-pipeline/src/mask.rs:852`](../../core/dr-pipeline/src/mask.rs#L852), [`core/dr-pipeline/src/mask.rs:864`](../../core/dr-pipeline/src/mask.rs#L864), [`core/dr-pipeline/src/mask.rs:876`](../../core/dr-pipeline/src/mask.rs#L876), [`core/dr-pipeline/src/sidecar.rs:1336`](../../core/dr-pipeline/src/sidecar.rs#L1336), [`core/dr-pipeline/src/sidecar.rs:1515`](../../core/dr-pipeline/src/sidecar.rs#L1515), [`core/dr-pipeline/src/sidecar.rs:1604`](../../core/dr-pipeline/src/sidecar.rs#L1604), [`core/dr-pipeline/src/sidecar.rs:1708`](../../core/dr-pipeline/src/sidecar.rs#L1708), [`core/dr-pipeline/src/sidecar.rs:1916`](../../core/dr-pipeline/src/sidecar.rs#L1916), [`core/dr-pipeline/tests/mask_sidecar.rs:1157`](../../core/dr-pipeline/tests/mask_sidecar.rs#L1157), [`core/dr-pipeline/tests/mask_sidecar.rs:1186`](../../core/dr-pipeline/tests/mask_sidecar.rs#L1186), [`core/dr-pipeline/tests/mask_sidecar.rs:1204`](../../core/dr-pipeline/tests/mask_sidecar.rs#L1204), [`core/dr-pipeline/tests/mask_sidecar.rs:1234`](../../core/dr-pipeline/tests/mask_sidecar.rs#L1234), [`ui/dr-ui/src/develop/mask_ops.rs:341`](../../ui/dr-ui/src/develop/mask_ops.rs#L341), [`ui/dr-ui/src/develop/mask_ops.rs:638`](../../ui/dr-ui/src/develop/mask_ops.rs#L638), [`ui/dr-ui/src/develop/mask_ops.rs:665`](../../ui/dr-ui/src/develop/mask_ops.rs#L665), [`ui/dr-ui/src/develop/mask_ops.rs:697`](../../ui/dr-ui/src/develop/mask_ops.rs#L697), [`ui/dr-ui/src/develop/mask_ops.rs:721`](../../ui/dr-ui/src/develop/mask_ops.rs#L721), [`ui/dr-ui/src/develop/mask_ops.rs:727`](../../ui/dr-ui/src/develop/mask_ops.rs#L727), [`ui/dr-ui/src/develop/mask_ops.rs:734`](../../ui/dr-ui/src/develop/mask_ops.rs#L734), [`ui/dr-ui/src/develop/mask_ops.rs:754`](../../ui/dr-ui/src/develop/mask_ops.rs#L754), [`ui/dr-ui/src/labels.rs:63`](../../ui/dr-ui/src/labels.rs#L63), [`ui/dr-ui/src/masks_ui.rs:1216`](../../ui/dr-ui/src/masks_ui.rs#L1216), [`ui/dr-ui/src/masks_ui.rs:797`](../../ui/dr-ui/src/masks_ui.rs#L797) |
| FR-DEV-12 | [`core/dr-pipeline/ops/colour_grading.yaml:1`](../../core/dr-pipeline/ops/colour_grading.yaml#L1) |
-| FR-DEV-16 | [`ui/dr-ui/src/lib.rs:425`](../../ui/dr-ui/src/lib.rs#L425), [`ui/dr-ui/src/masks_ui.rs:713`](../../ui/dr-ui/src/masks_ui.rs#L713), [`ui/dr-ui/ui/adjust.slint:998`](../../ui/dr-ui/ui/adjust.slint#L998), [`ui/dr-ui/ui/app.slint:2659`](../../ui/dr-ui/ui/app.slint#L2659), [`ui/dr-ui/ui/app.slint:2672`](../../ui/dr-ui/ui/app.slint#L2672), [`ui/dr-ui/ui/masks.slint:832`](../../ui/dr-ui/ui/masks.slint#L832) |
+| FR-DEV-16 | [`ui/dr-ui/src/lib.rs:425`](../../ui/dr-ui/src/lib.rs#L425), [`ui/dr-ui/src/masks_ui.rs:713`](../../ui/dr-ui/src/masks_ui.rs#L713), [`ui/dr-ui/ui/adjust.slint:998`](../../ui/dr-ui/ui/adjust.slint#L998), [`ui/dr-ui/ui/app.slint:2576`](../../ui/dr-ui/ui/app.slint#L2576), [`ui/dr-ui/ui/app.slint:2589`](../../ui/dr-ui/ui/app.slint#L2589), [`ui/dr-ui/ui/masks.slint:832`](../../ui/dr-ui/ui/masks.slint#L832) |
| FR-DEV-18 | [`core/dr-pipeline/src/ops/dehaze.rs:1`](../../core/dr-pipeline/src/ops/dehaze.rs#L1), [`core/dr-pipeline/src/ops/dehaze.rs:221`](../../core/dr-pipeline/src/ops/dehaze.rs#L221) |
| FR-DEV-19 | [`core/dr-pipeline/src/mask.rs:1307`](../../core/dr-pipeline/src/mask.rs#L1307) |
| FR-DEV-19a | [`core/dr-gpu/src/mask.rs:761`](../../core/dr-gpu/src/mask.rs#L761), [`core/dr-pipeline/src/mask.rs:1588`](../../core/dr-pipeline/src/mask.rs#L1588), [`core/dr-pipeline/src/mask.rs:2919`](../../core/dr-pipeline/src/mask.rs#L2919), [`core/dr-pipeline/src/mask.rs:988`](../../core/dr-pipeline/src/mask.rs#L988), [`core/dr-pipeline/src/sidecar.rs:1226`](../../core/dr-pipeline/src/sidecar.rs#L1226), [`core/dr-pipeline/tests/mask_sidecar.rs:1347`](../../core/dr-pipeline/tests/mask_sidecar.rs#L1347), [`core/dr-pipeline/tests/mask_sidecar.rs:1373`](../../core/dr-pipeline/tests/mask_sidecar.rs#L1373), [`ui/dr-ui/src/develop/masks.rs:431`](../../ui/dr-ui/src/develop/masks.rs#L431), [`ui/dr-ui/src/develop/masks.rs:492`](../../ui/dr-ui/src/develop/masks.rs#L492), [`ui/dr-ui/src/develop/masks.rs:511`](../../ui/dr-ui/src/develop/masks.rs#L511), [`ui/dr-ui/src/develop/session.rs:188`](../../ui/dr-ui/src/develop/session.rs#L188), [`ui/dr-ui/src/labels.rs:73`](../../ui/dr-ui/src/labels.rs#L73), [`ui/dr-ui/src/masks_ui.rs:1083`](../../ui/dr-ui/src/masks_ui.rs#L1083), [`ui/dr-ui/src/masks_ui.rs:1155`](../../ui/dr-ui/src/masks_ui.rs#L1155), [`ui/dr-ui/src/masks_ui.rs:1514`](../../ui/dr-ui/src/masks_ui.rs#L1514), [`ui/dr-ui/src/masks_ui.rs:270`](../../ui/dr-ui/src/masks_ui.rs#L270), [`ui/dr-ui/ui/masks.slint:150`](../../ui/dr-ui/ui/masks.slint#L150), [`ui/dr-ui/ui/masks.slint:175`](../../ui/dr-ui/ui/masks.slint#L175), [`ui/dr-ui/ui/masks.slint:337`](../../ui/dr-ui/ui/masks.slint#L337), [`ui/dr-ui/ui/masks.slint:406`](../../ui/dr-ui/ui/masks.slint#L406), [`ui/dr-ui/ui/masks.slint:770`](../../ui/dr-ui/ui/masks.slint#L770), [`ui/dr-ui/ui/masks.slint:855`](../../ui/dr-ui/ui/masks.slint#L855) |
-| FR-DEV-19b | [`ui/dr-ui/src/develop/mask_ops.rs:606`](../../ui/dr-ui/src/develop/mask_ops.rs#L606), [`ui/dr-ui/src/develop/masks.rs:592`](../../ui/dr-ui/src/develop/masks.rs#L592), [`ui/dr-ui/src/develop/session.rs:197`](../../ui/dr-ui/src/develop/session.rs#L197), [`ui/dr-ui/src/develop/session.rs:204`](../../ui/dr-ui/src/develop/session.rs#L204), [`ui/dr-ui/src/labels.rs:67`](../../ui/dr-ui/src/labels.rs#L67), [`ui/dr-ui/src/masks_ui.rs:1188`](../../ui/dr-ui/src/masks_ui.rs#L1188), [`ui/dr-ui/src/masks_ui.rs:1407`](../../ui/dr-ui/src/masks_ui.rs#L1407), [`ui/dr-ui/src/masks_ui.rs:1435`](../../ui/dr-ui/src/masks_ui.rs#L1435), [`ui/dr-ui/src/masks_ui.rs:1778`](../../ui/dr-ui/src/masks_ui.rs#L1778), [`ui/dr-ui/src/masks_ui.rs:908`](../../ui/dr-ui/src/masks_ui.rs#L908), [`ui/dr-ui/ui/app.slint:1095`](../../ui/dr-ui/ui/app.slint#L1095), [`ui/dr-ui/ui/app.slint:2299`](../../ui/dr-ui/ui/app.slint#L2299), [`ui/dr-ui/ui/masks.slint:1126`](../../ui/dr-ui/ui/masks.slint#L1126), [`ui/dr-ui/ui/masks.slint:453`](../../ui/dr-ui/ui/masks.slint#L453), [`ui/dr-ui/ui/masks.slint:774`](../../ui/dr-ui/ui/masks.slint#L774), [`ui/dr-ui/ui/masks.slint:848`](../../ui/dr-ui/ui/masks.slint#L848), [`ui/dr-ui/ui/masks.slint:864`](../../ui/dr-ui/ui/masks.slint#L864) |
+| FR-DEV-19b | [`ui/dr-ui/src/develop/mask_ops.rs:606`](../../ui/dr-ui/src/develop/mask_ops.rs#L606), [`ui/dr-ui/src/develop/masks.rs:592`](../../ui/dr-ui/src/develop/masks.rs#L592), [`ui/dr-ui/src/develop/session.rs:197`](../../ui/dr-ui/src/develop/session.rs#L197), [`ui/dr-ui/src/develop/session.rs:204`](../../ui/dr-ui/src/develop/session.rs#L204), [`ui/dr-ui/src/labels.rs:67`](../../ui/dr-ui/src/labels.rs#L67), [`ui/dr-ui/src/masks_ui.rs:1188`](../../ui/dr-ui/src/masks_ui.rs#L1188), [`ui/dr-ui/src/masks_ui.rs:1407`](../../ui/dr-ui/src/masks_ui.rs#L1407), [`ui/dr-ui/src/masks_ui.rs:1435`](../../ui/dr-ui/src/masks_ui.rs#L1435), [`ui/dr-ui/src/masks_ui.rs:1778`](../../ui/dr-ui/src/masks_ui.rs#L1778), [`ui/dr-ui/src/masks_ui.rs:908`](../../ui/dr-ui/src/masks_ui.rs#L908), [`ui/dr-ui/ui/app.slint:1012`](../../ui/dr-ui/ui/app.slint#L1012), [`ui/dr-ui/ui/app.slint:2216`](../../ui/dr-ui/ui/app.slint#L2216), [`ui/dr-ui/ui/masks.slint:1126`](../../ui/dr-ui/ui/masks.slint#L1126), [`ui/dr-ui/ui/masks.slint:453`](../../ui/dr-ui/ui/masks.slint#L453), [`ui/dr-ui/ui/masks.slint:774`](../../ui/dr-ui/ui/masks.slint#L774), [`ui/dr-ui/ui/masks.slint:848`](../../ui/dr-ui/ui/masks.slint#L848), [`ui/dr-ui/ui/masks.slint:864`](../../ui/dr-ui/ui/masks.slint#L864) |
| FR-DEV-19c | [`core/dr-gpu/src/mask.rs:715`](../../core/dr-gpu/src/mask.rs#L715), [`core/dr-gpu/tests/local_adjustments.rs:830`](../../core/dr-gpu/tests/local_adjustments.rs#L830), [`core/dr-gpu/tests/local_adjustments.rs:887`](../../core/dr-gpu/tests/local_adjustments.rs#L887), [`core/dr-gpu/tests/local_adjustments.rs:922`](../../core/dr-gpu/tests/local_adjustments.rs#L922), [`core/dr-gpu/tests/local_adjustments.rs:967`](../../core/dr-gpu/tests/local_adjustments.rs#L967), [`core/dr-pipeline/src/graph.rs:893`](../../core/dr-pipeline/src/graph.rs#L893), [`core/dr-pipeline/src/mask.rs:1796`](../../core/dr-pipeline/src/mask.rs#L1796), [`core/dr-pipeline/src/mask.rs:1822`](../../core/dr-pipeline/src/mask.rs#L1822), [`core/dr-pipeline/src/mask.rs:1837`](../../core/dr-pipeline/src/mask.rs#L1837), [`core/dr-pipeline/src/mask.rs:1957`](../../core/dr-pipeline/src/mask.rs#L1957), [`core/dr-pipeline/src/mask.rs:2005`](../../core/dr-pipeline/src/mask.rs#L2005), [`core/dr-pipeline/src/mask.rs:2149`](../../core/dr-pipeline/src/mask.rs#L2149), [`core/dr-pipeline/src/mask.rs:2386`](../../core/dr-pipeline/src/mask.rs#L2386), [`core/dr-pipeline/src/operation.rs:1748`](../../core/dr-pipeline/src/operation.rs#L1748), [`core/dr-pipeline/src/operation.rs:588`](../../core/dr-pipeline/src/operation.rs#L588), [`core/dr-pipeline/src/operation.rs:863`](../../core/dr-pipeline/src/operation.rs#L863), [`ui/dr-ui/src/develop/mask_ops.rs:1199`](../../ui/dr-ui/src/develop/mask_ops.rs#L1199), [`ui/dr-ui/src/develop/mask_ops.rs:1235`](../../ui/dr-ui/src/develop/mask_ops.rs#L1235), [`ui/dr-ui/src/develop/mask_ops.rs:318`](../../ui/dr-ui/src/develop/mask_ops.rs#L318), [`ui/dr-ui/src/develop/mask_ops.rs:58`](../../ui/dr-ui/src/develop/mask_ops.rs#L58), [`ui/dr-ui/src/develop/masks.rs:12`](../../ui/dr-ui/src/develop/masks.rs#L12), [`ui/dr-ui/src/develop/masks.rs:176`](../../ui/dr-ui/src/develop/masks.rs#L176), [`ui/dr-ui/src/develop/masks.rs:21`](../../ui/dr-ui/src/develop/masks.rs#L21), [`ui/dr-ui/src/develop/masks.rs:43`](../../ui/dr-ui/src/develop/masks.rs#L43), [`ui/dr-ui/src/develop/render.rs:178`](../../ui/dr-ui/src/develop/render.rs#L178), [`ui/dr-ui/src/develop/session.rs:223`](../../ui/dr-ui/src/develop/session.rs#L223), [`ui/dr-ui/src/develop/session.rs:232`](../../ui/dr-ui/src/develop/session.rs#L232), [`ui/dr-ui/src/masks_ui.rs:1024`](../../ui/dr-ui/src/masks_ui.rs#L1024), [`ui/dr-ui/src/masks_ui.rs:1407`](../../ui/dr-ui/src/masks_ui.rs#L1407), [`ui/dr-ui/src/masks_ui.rs:152`](../../ui/dr-ui/src/masks_ui.rs#L152), [`ui/dr-ui/src/masks_ui.rs:1778`](../../ui/dr-ui/src/masks_ui.rs#L1778), [`ui/dr-ui/src/masks_ui.rs:291`](../../ui/dr-ui/src/masks_ui.rs#L291), [`ui/dr-ui/src/masks_ui.rs:317`](../../ui/dr-ui/src/masks_ui.rs#L317), [`ui/dr-ui/src/masks_ui.rs:677`](../../ui/dr-ui/src/masks_ui.rs#L677), [`ui/dr-ui/src/masks_ui.rs:996`](../../ui/dr-ui/src/masks_ui.rs#L996), [`ui/dr-ui/ui/icons.slint:339`](../../ui/dr-ui/ui/icons.slint#L339), [`ui/dr-ui/ui/masks.slint:1091`](../../ui/dr-ui/ui/masks.slint#L1091), [`ui/dr-ui/ui/masks.slint:183`](../../ui/dr-ui/ui/masks.slint#L183), [`ui/dr-ui/ui/masks.slint:292`](../../ui/dr-ui/ui/masks.slint#L292), [`ui/dr-ui/ui/masks.slint:517`](../../ui/dr-ui/ui/masks.slint#L517), [`ui/dr-ui/ui/masks.slint:70`](../../ui/dr-ui/ui/masks.slint#L70), [`ui/dr-ui/ui/masks.slint:782`](../../ui/dr-ui/ui/masks.slint#L782), [`ui/dr-ui/ui/masks.slint:850`](../../ui/dr-ui/ui/masks.slint#L850), [`ui/dr-ui/ui/masks.slint:938`](../../ui/dr-ui/ui/masks.slint#L938) |
| FR-DEV-2 | [`core/dr-pipeline/src/operation.rs:403`](../../core/dr-pipeline/src/operation.rs#L403) |
-| FR-DEV-3 | [`core/dr-gpu/src/adjust.rs:2443`](../../core/dr-gpu/src/adjust.rs#L2443), [`core/dr-gpu/src/adjust.rs:679`](../../core/dr-gpu/src/adjust.rs#L679), [`core/dr-gpu/src/adjust.rs:798`](../../core/dr-gpu/src/adjust.rs#L798), [`core/dr-gpu/src/adjust.rs:84`](../../core/dr-gpu/src/adjust.rs#L84), [`core/dr-gpu/tests/tone_curve.rs:1`](../../core/dr-gpu/tests/tone_curve.rs#L1), [`core/dr-pipeline/src/coverage.rs:122`](../../core/dr-pipeline/src/coverage.rs#L122), [`core/dr-pipeline/src/coverage.rs:1`](../../core/dr-pipeline/src/coverage.rs#L1), [`core/dr-pipeline/src/detail.rs:434`](../../core/dr-pipeline/src/detail.rs#L434), [`core/dr-pipeline/src/detail.rs:524`](../../core/dr-pipeline/src/detail.rs#L524), [`core/dr-pipeline/src/framing.rs:177`](../../core/dr-pipeline/src/framing.rs#L177), [`core/dr-pipeline/src/framing.rs:234`](../../core/dr-pipeline/src/framing.rs#L234), [`core/dr-pipeline/src/framing.rs:314`](../../core/dr-pipeline/src/framing.rs#L314), [`core/dr-pipeline/src/framing.rs:498`](../../core/dr-pipeline/src/framing.rs#L498), [`core/dr-pipeline/src/framing.rs:753`](../../core/dr-pipeline/src/framing.rs#L753), [`core/dr-pipeline/src/graph.rs:1348`](../../core/dr-pipeline/src/graph.rs#L1348), [`core/dr-pipeline/src/graph.rs:1379`](../../core/dr-pipeline/src/graph.rs#L1379), [`core/dr-pipeline/src/graph.rs:1402`](../../core/dr-pipeline/src/graph.rs#L1402), [`core/dr-pipeline/src/graph.rs:1440`](../../core/dr-pipeline/src/graph.rs#L1440), [`core/dr-pipeline/src/graph.rs:1471`](../../core/dr-pipeline/src/graph.rs#L1471), [`core/dr-pipeline/src/graph.rs:225`](../../core/dr-pipeline/src/graph.rs#L225), [`core/dr-pipeline/src/graph.rs:306`](../../core/dr-pipeline/src/graph.rs#L306), [`core/dr-pipeline/src/graph.rs:344`](../../core/dr-pipeline/src/graph.rs#L344), [`core/dr-pipeline/src/graph.rs:350`](../../core/dr-pipeline/src/graph.rs#L350), [`core/dr-pipeline/src/graph.rs:860`](../../core/dr-pipeline/src/graph.rs#L860), [`core/dr-pipeline/src/graph.rs:952`](../../core/dr-pipeline/src/graph.rs#L952), [`core/dr-pipeline/src/lens.rs:93`](../../core/dr-pipeline/src/lens.rs#L93), [`core/dr-pipeline/src/mask.rs:205`](../../core/dr-pipeline/src/mask.rs#L205), [`core/dr-pipeline/src/mask.rs:558`](../../core/dr-pipeline/src/mask.rs#L558), [`core/dr-pipeline/src/neutral.rs:1`](../../core/dr-pipeline/src/neutral.rs#L1), [`core/dr-pipeline/src/neutral.rs:306`](../../core/dr-pipeline/src/neutral.rs#L306), [`core/dr-pipeline/src/neutral.rs:322`](../../core/dr-pipeline/src/neutral.rs#L322), [`core/dr-pipeline/src/neutral.rs:338`](../../core/dr-pipeline/src/neutral.rs#L338), [`core/dr-pipeline/src/neutral.rs:360`](../../core/dr-pipeline/src/neutral.rs#L360), [`core/dr-pipeline/src/neutral.rs:81`](../../core/dr-pipeline/src/neutral.rs#L81), [`core/dr-pipeline/src/operation.rs:330`](../../core/dr-pipeline/src/operation.rs#L330), [`core/dr-pipeline/src/operation.rs:565`](../../core/dr-pipeline/src/operation.rs#L565), [`core/dr-pipeline/src/operation.rs:637`](../../core/dr-pipeline/src/operation.rs#L637), [`core/dr-pipeline/src/ops/capture_sharpen.rs:1`](../../core/dr-pipeline/src/ops/capture_sharpen.rs#L1), [`core/dr-pipeline/src/ops/capture_sharpen.rs:210`](../../core/dr-pipeline/src/ops/capture_sharpen.rs#L210), [`core/dr-pipeline/src/ops/curve.rs:100`](../../core/dr-pipeline/src/ops/curve.rs#L100), [`core/dr-pipeline/src/ops/curve.rs:1`](../../core/dr-pipeline/src/ops/curve.rs#L1), [`core/dr-pipeline/src/ops/curve.rs:219`](../../core/dr-pipeline/src/ops/curve.rs#L219), [`core/dr-pipeline/src/ops/curve.rs:635`](../../core/dr-pipeline/src/ops/curve.rs#L635), [`core/dr-pipeline/src/ops/local_contrast.rs:1`](../../core/dr-pipeline/src/ops/local_contrast.rs#L1), [`core/dr-pipeline/src/ops/noise_reduction.rs:1`](../../core/dr-pipeline/src/ops/noise_reduction.rs#L1), [`core/dr-pipeline/src/ops/noise_reduction.rs:273`](../../core/dr-pipeline/src/ops/noise_reduction.rs#L273), [`core/dr-pipeline/src/preset.rs:751`](../../core/dr-pipeline/src/preset.rs#L751), [`core/dr-pipeline/src/sidecar.rs:1400`](../../core/dr-pipeline/src/sidecar.rs#L1400), [`core/dr-pipeline/src/sidecar.rs:192`](../../core/dr-pipeline/src/sidecar.rs#L192), [`core/dr-pipeline/src/sidecar.rs:2232`](../../core/dr-pipeline/src/sidecar.rs#L2232), [`core/dr-pipeline/src/sidecar.rs:2312`](../../core/dr-pipeline/src/sidecar.rs#L2312), [`core/dr-pipeline/tests/tone_curve.rs:1`](../../core/dr-pipeline/tests/tone_curve.rs#L1), [`core/dr-segment/src/refine.rs:937`](../../core/dr-segment/src/refine.rs#L937), [`ui/dr-ui/src/develop/curves.rs:163`](../../ui/dr-ui/src/develop/curves.rs#L163), [`ui/dr-ui/src/develop/framing.rs:10`](../../ui/dr-ui/src/develop/framing.rs#L10), [`ui/dr-ui/src/develop/framing.rs:182`](../../ui/dr-ui/src/develop/framing.rs#L182), [`ui/dr-ui/src/develop/framing.rs:212`](../../ui/dr-ui/src/develop/framing.rs#L212), [`ui/dr-ui/src/develop/framing.rs:278`](../../ui/dr-ui/src/develop/framing.rs#L278), [`ui/dr-ui/src/develop/framing.rs:292`](../../ui/dr-ui/src/develop/framing.rs#L292), [`ui/dr-ui/src/develop/framing.rs:494`](../../ui/dr-ui/src/develop/framing.rs#L494), [`ui/dr-ui/src/develop/framing.rs:71`](../../ui/dr-ui/src/develop/framing.rs#L71), [`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:1340`](../../ui/dr-ui/src/develop/mask_ops.rs#L1340), [`ui/dr-ui/src/develop/mask_ops.rs:178`](../../ui/dr-ui/src/develop/mask_ops.rs#L178), [`ui/dr-ui/src/develop/mask_ops.rs:969`](../../ui/dr-ui/src/develop/mask_ops.rs#L969), [`ui/dr-ui/src/develop/masks.rs:262`](../../ui/dr-ui/src/develop/masks.rs#L262), [`ui/dr-ui/src/develop/masks.rs:360`](../../ui/dr-ui/src/develop/masks.rs#L360), [`ui/dr-ui/src/develop/masks.rs:740`](../../ui/dr-ui/src/develop/masks.rs#L740), [`ui/dr-ui/src/develop/masks.rs:770`](../../ui/dr-ui/src/develop/masks.rs#L770), [`ui/dr-ui/src/develop/render.rs:1039`](../../ui/dr-ui/src/develop/render.rs#L1039), [`ui/dr-ui/src/develop/rows.rs:106`](../../ui/dr-ui/src/develop/rows.rs#L106), [`ui/dr-ui/src/develop/rows.rs:195`](../../ui/dr-ui/src/develop/rows.rs#L195), [`ui/dr-ui/src/develop/rows.rs:231`](../../ui/dr-ui/src/develop/rows.rs#L231), [`ui/dr-ui/src/develop/rows.rs:679`](../../ui/dr-ui/src/develop/rows.rs#L679), [`ui/dr-ui/src/develop/segmentation.rs:139`](../../ui/dr-ui/src/develop/segmentation.rs#L139), [`ui/dr-ui/src/develop/segmentation.rs:302`](../../ui/dr-ui/src/develop/segmentation.rs#L302), [`ui/dr-ui/src/develop/segmentation.rs:339`](../../ui/dr-ui/src/develop/segmentation.rs#L339), [`ui/dr-ui/src/develop/segmentation.rs:572`](../../ui/dr-ui/src/develop/segmentation.rs#L572), [`ui/dr-ui/src/develop/segmentation.rs:590`](../../ui/dr-ui/src/develop/segmentation.rs#L590), [`ui/dr-ui/src/develop/segmentation.rs:604`](../../ui/dr-ui/src/develop/segmentation.rs#L604), [`ui/dr-ui/src/develop/segmentation.rs:626`](../../ui/dr-ui/src/develop/segmentation.rs#L626), [`ui/dr-ui/src/develop/segmentation.rs:77`](../../ui/dr-ui/src/develop/segmentation.rs#L77), [`ui/dr-ui/src/develop/segmentation.rs:806`](../../ui/dr-ui/src/develop/segmentation.rs#L806), [`ui/dr-ui/src/develop/session.rs:158`](../../ui/dr-ui/src/develop/session.rs#L158), [`ui/dr-ui/src/develop/session.rs:251`](../../ui/dr-ui/src/develop/session.rs#L251), [`ui/dr-ui/src/develop/session.rs:280`](../../ui/dr-ui/src/develop/session.rs#L280), [`ui/dr-ui/src/develop/session.rs:429`](../../ui/dr-ui/src/develop/session.rs#L429), [`ui/dr-ui/src/develop/session.rs:489`](../../ui/dr-ui/src/develop/session.rs#L489), [`ui/dr-ui/src/develop/session.rs:561`](../../ui/dr-ui/src/develop/session.rs#L561), [`ui/dr-ui/src/develop/session.rs:711`](../../ui/dr-ui/src/develop/session.rs#L711), [`ui/dr-ui/src/develop/white_balance.rs:11`](../../ui/dr-ui/src/develop/white_balance.rs#L11), [`ui/dr-ui/src/develop/white_balance.rs:162`](../../ui/dr-ui/src/develop/white_balance.rs#L162), [`ui/dr-ui/src/develop/white_balance.rs:193`](../../ui/dr-ui/src/develop/white_balance.rs#L193), [`ui/dr-ui/src/develop/white_balance.rs:276`](../../ui/dr-ui/src/develop/white_balance.rs#L276), [`ui/dr-ui/src/develop/white_balance.rs:338`](../../ui/dr-ui/src/develop/white_balance.rs#L338), [`ui/dr-ui/src/develop_ui.rs:1040`](../../ui/dr-ui/src/develop_ui.rs#L1040), [`ui/dr-ui/src/develop_ui.rs:1094`](../../ui/dr-ui/src/develop_ui.rs#L1094), [`ui/dr-ui/src/develop_ui.rs:117`](../../ui/dr-ui/src/develop_ui.rs#L117), [`ui/dr-ui/src/develop_ui.rs:406`](../../ui/dr-ui/src/develop_ui.rs#L406), [`ui/dr-ui/src/develop_ui.rs:626`](../../ui/dr-ui/src/develop_ui.rs#L626), [`ui/dr-ui/src/develop_ui.rs:964`](../../ui/dr-ui/src/develop_ui.rs#L964), [`ui/dr-ui/src/labels.rs:35`](../../ui/dr-ui/src/labels.rs#L35), [`ui/dr-ui/src/lib.rs:2192`](../../ui/dr-ui/src/lib.rs#L2192), [`ui/dr-ui/src/lib.rs:420`](../../ui/dr-ui/src/lib.rs#L420), [`ui/dr-ui/src/lib.rs:449`](../../ui/dr-ui/src/lib.rs#L449), [`ui/dr-ui/src/lib.rs:555`](../../ui/dr-ui/src/lib.rs#L555), [`ui/dr-ui/src/lib.rs:579`](../../ui/dr-ui/src/lib.rs#L579), [`ui/dr-ui/src/library/sidecar.rs:63`](../../ui/dr-ui/src/library/sidecar.rs#L63), [`ui/dr-ui/src/masks_ui.rs:1537`](../../ui/dr-ui/src/masks_ui.rs#L1537), [`ui/dr-ui/src/masks_ui.rs:1651`](../../ui/dr-ui/src/masks_ui.rs#L1651), [`ui/dr-ui/src/masks_ui.rs:339`](../../ui/dr-ui/src/masks_ui.rs#L339), [`ui/dr-ui/src/masks_ui.rs:44`](../../ui/dr-ui/src/masks_ui.rs#L44), [`ui/dr-ui/src/presets.rs:414`](../../ui/dr-ui/src/presets.rs#L414), [`ui/dr-ui/src/segmentation.rs:117`](../../ui/dr-ui/src/segmentation.rs#L117), [`ui/dr-ui/src/segmentation.rs:353`](../../ui/dr-ui/src/segmentation.rs#L353), [`ui/dr-ui/src/segmentation.rs:369`](../../ui/dr-ui/src/segmentation.rs#L369), [`ui/dr-ui/src/segmentation.rs:499`](../../ui/dr-ui/src/segmentation.rs#L499), [`ui/dr-ui/src/segmentation.rs:527`](../../ui/dr-ui/src/segmentation.rs#L527), [`ui/dr-ui/ui/adjust.slint:1019`](../../ui/dr-ui/ui/adjust.slint#L1019), [`ui/dr-ui/ui/adjust.slint:126`](../../ui/dr-ui/ui/adjust.slint#L126), [`ui/dr-ui/ui/adjust.slint:1496`](../../ui/dr-ui/ui/adjust.slint#L1496), [`ui/dr-ui/ui/adjust.slint:171`](../../ui/dr-ui/ui/adjust.slint#L171), [`ui/dr-ui/ui/adjust.slint:46`](../../ui/dr-ui/ui/adjust.slint#L46), [`ui/dr-ui/ui/adjust.slint:624`](../../ui/dr-ui/ui/adjust.slint#L624), [`ui/dr-ui/ui/adjust.slint:650`](../../ui/dr-ui/ui/adjust.slint#L650), [`ui/dr-ui/ui/adjust.slint:669`](../../ui/dr-ui/ui/adjust.slint#L669), [`ui/dr-ui/ui/adjust.slint:790`](../../ui/dr-ui/ui/adjust.slint#L790), [`ui/dr-ui/ui/adjust.slint:947`](../../ui/dr-ui/ui/adjust.slint#L947), [`ui/dr-ui/ui/app.slint:188`](../../ui/dr-ui/ui/app.slint#L188), [`ui/dr-ui/ui/app.slint:2364`](../../ui/dr-ui/ui/app.slint#L2364), [`ui/dr-ui/ui/app.slint:2424`](../../ui/dr-ui/ui/app.slint#L2424), [`ui/dr-ui/ui/develop.slint:223`](../../ui/dr-ui/ui/develop.slint#L223), [`ui/dr-ui/ui/masks.slint:1216`](../../ui/dr-ui/ui/masks.slint#L1216), [`ui/dr-ui/ui/masks.slint:753`](../../ui/dr-ui/ui/masks.slint#L753), [`ui/dr-ui/ui/masks.slint:812`](../../ui/dr-ui/ui/masks.slint#L812) |
-| FR-DEV-3a | [`core/dr-pipeline/ops/exposure.yaml:1`](../../core/dr-pipeline/ops/exposure.yaml#L1), [`core/dr-pipeline/src/descriptor.rs:212`](../../core/dr-pipeline/src/descriptor.rs#L212), [`core/dr-pipeline/src/descriptor.rs:252`](../../core/dr-pipeline/src/descriptor.rs#L252), [`core/dr-pipeline/src/descriptor.rs:276`](../../core/dr-pipeline/src/descriptor.rs#L276), [`core/dr-pipeline/src/descriptor.rs:331`](../../core/dr-pipeline/src/descriptor.rs#L331), [`core/dr-pipeline/src/framing.rs:395`](../../core/dr-pipeline/src/framing.rs#L395), [`core/dr-pipeline/src/graph.rs:25`](../../core/dr-pipeline/src/graph.rs#L25), [`core/dr-pipeline/src/graph.rs:393`](../../core/dr-pipeline/src/graph.rs#L393), [`core/dr-pipeline/src/graph.rs:47`](../../core/dr-pipeline/src/graph.rs#L47), [`core/dr-pipeline/src/graph.rs:534`](../../core/dr-pipeline/src/graph.rs#L534), [`core/dr-pipeline/src/graph.rs:60`](../../core/dr-pipeline/src/graph.rs#L60), [`core/dr-pipeline/src/mask.rs:1699`](../../core/dr-pipeline/src/mask.rs#L1699), [`core/dr-pipeline/src/neutral.rs:1`](../../core/dr-pipeline/src/neutral.rs#L1), [`core/dr-pipeline/src/neutral.rs:378`](../../core/dr-pipeline/src/neutral.rs#L378), [`core/dr-pipeline/src/operation.rs:232`](../../core/dr-pipeline/src/operation.rs#L232), [`core/dr-pipeline/src/operation.rs:365`](../../core/dr-pipeline/src/operation.rs#L365), [`core/dr-pipeline/src/ops/curve.rs:319`](../../core/dr-pipeline/src/ops/curve.rs#L319), [`ui/dr-ui/src/develop/curves.rs:36`](../../ui/dr-ui/src/develop/curves.rs#L36), [`ui/dr-ui/src/develop/rows.rs:118`](../../ui/dr-ui/src/develop/rows.rs#L118), [`ui/dr-ui/src/develop/rows.rs:679`](../../ui/dr-ui/src/develop/rows.rs#L679), [`ui/dr-ui/src/develop/rows.rs:877`](../../ui/dr-ui/src/develop/rows.rs#L877), [`ui/dr-ui/src/lib.rs:880`](../../ui/dr-ui/src/lib.rs#L880), [`ui/dr-ui/tests/ui_names_no_operation.rs:1`](../../ui/dr-ui/tests/ui_names_no_operation.rs#L1), [`ui/dr-ui/ui/app.slint:2608`](../../ui/dr-ui/ui/app.slint#L2608) |
-| FR-DEV-3b | [`core/dr-pipeline/src/descriptor.rs:276`](../../core/dr-pipeline/src/descriptor.rs#L276), [`core/dr-pipeline/src/framing.rs:395`](../../core/dr-pipeline/src/framing.rs#L395), [`core/dr-pipeline/src/graph.rs:60`](../../core/dr-pipeline/src/graph.rs#L60), [`core/dr-pipeline/src/operation.rs:365`](../../core/dr-pipeline/src/operation.rs#L365), [`ui/dr-ui/ui/app.slint:2819`](../../ui/dr-ui/ui/app.slint#L2819) |
+| FR-DEV-3 | [`core/dr-gpu/src/adjust.rs:2443`](../../core/dr-gpu/src/adjust.rs#L2443), [`core/dr-gpu/src/adjust.rs:679`](../../core/dr-gpu/src/adjust.rs#L679), [`core/dr-gpu/src/adjust.rs:798`](../../core/dr-gpu/src/adjust.rs#L798), [`core/dr-gpu/src/adjust.rs:84`](../../core/dr-gpu/src/adjust.rs#L84), [`core/dr-gpu/tests/tone_curve.rs:1`](../../core/dr-gpu/tests/tone_curve.rs#L1), [`core/dr-pipeline/src/coverage.rs:122`](../../core/dr-pipeline/src/coverage.rs#L122), [`core/dr-pipeline/src/coverage.rs:1`](../../core/dr-pipeline/src/coverage.rs#L1), [`core/dr-pipeline/src/detail.rs:434`](../../core/dr-pipeline/src/detail.rs#L434), [`core/dr-pipeline/src/detail.rs:524`](../../core/dr-pipeline/src/detail.rs#L524), [`core/dr-pipeline/src/framing.rs:177`](../../core/dr-pipeline/src/framing.rs#L177), [`core/dr-pipeline/src/framing.rs:234`](../../core/dr-pipeline/src/framing.rs#L234), [`core/dr-pipeline/src/framing.rs:314`](../../core/dr-pipeline/src/framing.rs#L314), [`core/dr-pipeline/src/framing.rs:498`](../../core/dr-pipeline/src/framing.rs#L498), [`core/dr-pipeline/src/framing.rs:753`](../../core/dr-pipeline/src/framing.rs#L753), [`core/dr-pipeline/src/graph.rs:1348`](../../core/dr-pipeline/src/graph.rs#L1348), [`core/dr-pipeline/src/graph.rs:1379`](../../core/dr-pipeline/src/graph.rs#L1379), [`core/dr-pipeline/src/graph.rs:1402`](../../core/dr-pipeline/src/graph.rs#L1402), [`core/dr-pipeline/src/graph.rs:1440`](../../core/dr-pipeline/src/graph.rs#L1440), [`core/dr-pipeline/src/graph.rs:1471`](../../core/dr-pipeline/src/graph.rs#L1471), [`core/dr-pipeline/src/graph.rs:225`](../../core/dr-pipeline/src/graph.rs#L225), [`core/dr-pipeline/src/graph.rs:306`](../../core/dr-pipeline/src/graph.rs#L306), [`core/dr-pipeline/src/graph.rs:344`](../../core/dr-pipeline/src/graph.rs#L344), [`core/dr-pipeline/src/graph.rs:350`](../../core/dr-pipeline/src/graph.rs#L350), [`core/dr-pipeline/src/graph.rs:860`](../../core/dr-pipeline/src/graph.rs#L860), [`core/dr-pipeline/src/graph.rs:952`](../../core/dr-pipeline/src/graph.rs#L952), [`core/dr-pipeline/src/lens.rs:93`](../../core/dr-pipeline/src/lens.rs#L93), [`core/dr-pipeline/src/mask.rs:205`](../../core/dr-pipeline/src/mask.rs#L205), [`core/dr-pipeline/src/mask.rs:558`](../../core/dr-pipeline/src/mask.rs#L558), [`core/dr-pipeline/src/neutral.rs:1`](../../core/dr-pipeline/src/neutral.rs#L1), [`core/dr-pipeline/src/neutral.rs:306`](../../core/dr-pipeline/src/neutral.rs#L306), [`core/dr-pipeline/src/neutral.rs:322`](../../core/dr-pipeline/src/neutral.rs#L322), [`core/dr-pipeline/src/neutral.rs:338`](../../core/dr-pipeline/src/neutral.rs#L338), [`core/dr-pipeline/src/neutral.rs:360`](../../core/dr-pipeline/src/neutral.rs#L360), [`core/dr-pipeline/src/neutral.rs:81`](../../core/dr-pipeline/src/neutral.rs#L81), [`core/dr-pipeline/src/operation.rs:330`](../../core/dr-pipeline/src/operation.rs#L330), [`core/dr-pipeline/src/operation.rs:565`](../../core/dr-pipeline/src/operation.rs#L565), [`core/dr-pipeline/src/operation.rs:637`](../../core/dr-pipeline/src/operation.rs#L637), [`core/dr-pipeline/src/ops/capture_sharpen.rs:1`](../../core/dr-pipeline/src/ops/capture_sharpen.rs#L1), [`core/dr-pipeline/src/ops/capture_sharpen.rs:210`](../../core/dr-pipeline/src/ops/capture_sharpen.rs#L210), [`core/dr-pipeline/src/ops/curve.rs:100`](../../core/dr-pipeline/src/ops/curve.rs#L100), [`core/dr-pipeline/src/ops/curve.rs:1`](../../core/dr-pipeline/src/ops/curve.rs#L1), [`core/dr-pipeline/src/ops/curve.rs:219`](../../core/dr-pipeline/src/ops/curve.rs#L219), [`core/dr-pipeline/src/ops/curve.rs:635`](../../core/dr-pipeline/src/ops/curve.rs#L635), [`core/dr-pipeline/src/ops/local_contrast.rs:1`](../../core/dr-pipeline/src/ops/local_contrast.rs#L1), [`core/dr-pipeline/src/ops/noise_reduction.rs:1`](../../core/dr-pipeline/src/ops/noise_reduction.rs#L1), [`core/dr-pipeline/src/ops/noise_reduction.rs:273`](../../core/dr-pipeline/src/ops/noise_reduction.rs#L273), [`core/dr-pipeline/src/preset.rs:751`](../../core/dr-pipeline/src/preset.rs#L751), [`core/dr-pipeline/src/sidecar.rs:1400`](../../core/dr-pipeline/src/sidecar.rs#L1400), [`core/dr-pipeline/src/sidecar.rs:192`](../../core/dr-pipeline/src/sidecar.rs#L192), [`core/dr-pipeline/src/sidecar.rs:2232`](../../core/dr-pipeline/src/sidecar.rs#L2232), [`core/dr-pipeline/src/sidecar.rs:2312`](../../core/dr-pipeline/src/sidecar.rs#L2312), [`core/dr-pipeline/tests/tone_curve.rs:1`](../../core/dr-pipeline/tests/tone_curve.rs#L1), [`core/dr-segment/src/refine.rs:937`](../../core/dr-segment/src/refine.rs#L937), [`ui/dr-ui/src/develop/curves.rs:163`](../../ui/dr-ui/src/develop/curves.rs#L163), [`ui/dr-ui/src/develop/framing.rs:10`](../../ui/dr-ui/src/develop/framing.rs#L10), [`ui/dr-ui/src/develop/framing.rs:182`](../../ui/dr-ui/src/develop/framing.rs#L182), [`ui/dr-ui/src/develop/framing.rs:212`](../../ui/dr-ui/src/develop/framing.rs#L212), [`ui/dr-ui/src/develop/framing.rs:278`](../../ui/dr-ui/src/develop/framing.rs#L278), [`ui/dr-ui/src/develop/framing.rs:292`](../../ui/dr-ui/src/develop/framing.rs#L292), [`ui/dr-ui/src/develop/framing.rs:494`](../../ui/dr-ui/src/develop/framing.rs#L494), [`ui/dr-ui/src/develop/framing.rs:71`](../../ui/dr-ui/src/develop/framing.rs#L71), [`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:1340`](../../ui/dr-ui/src/develop/mask_ops.rs#L1340), [`ui/dr-ui/src/develop/mask_ops.rs:178`](../../ui/dr-ui/src/develop/mask_ops.rs#L178), [`ui/dr-ui/src/develop/mask_ops.rs:969`](../../ui/dr-ui/src/develop/mask_ops.rs#L969), [`ui/dr-ui/src/develop/masks.rs:262`](../../ui/dr-ui/src/develop/masks.rs#L262), [`ui/dr-ui/src/develop/masks.rs:360`](../../ui/dr-ui/src/develop/masks.rs#L360), [`ui/dr-ui/src/develop/masks.rs:740`](../../ui/dr-ui/src/develop/masks.rs#L740), [`ui/dr-ui/src/develop/masks.rs:770`](../../ui/dr-ui/src/develop/masks.rs#L770), [`ui/dr-ui/src/develop/render.rs:1039`](../../ui/dr-ui/src/develop/render.rs#L1039), [`ui/dr-ui/src/develop/rows.rs:106`](../../ui/dr-ui/src/develop/rows.rs#L106), [`ui/dr-ui/src/develop/rows.rs:195`](../../ui/dr-ui/src/develop/rows.rs#L195), [`ui/dr-ui/src/develop/rows.rs:231`](../../ui/dr-ui/src/develop/rows.rs#L231), [`ui/dr-ui/src/develop/rows.rs:679`](../../ui/dr-ui/src/develop/rows.rs#L679), [`ui/dr-ui/src/develop/segmentation.rs:139`](../../ui/dr-ui/src/develop/segmentation.rs#L139), [`ui/dr-ui/src/develop/segmentation.rs:302`](../../ui/dr-ui/src/develop/segmentation.rs#L302), [`ui/dr-ui/src/develop/segmentation.rs:339`](../../ui/dr-ui/src/develop/segmentation.rs#L339), [`ui/dr-ui/src/develop/segmentation.rs:572`](../../ui/dr-ui/src/develop/segmentation.rs#L572), [`ui/dr-ui/src/develop/segmentation.rs:590`](../../ui/dr-ui/src/develop/segmentation.rs#L590), [`ui/dr-ui/src/develop/segmentation.rs:604`](../../ui/dr-ui/src/develop/segmentation.rs#L604), [`ui/dr-ui/src/develop/segmentation.rs:626`](../../ui/dr-ui/src/develop/segmentation.rs#L626), [`ui/dr-ui/src/develop/segmentation.rs:77`](../../ui/dr-ui/src/develop/segmentation.rs#L77), [`ui/dr-ui/src/develop/segmentation.rs:806`](../../ui/dr-ui/src/develop/segmentation.rs#L806), [`ui/dr-ui/src/develop/session.rs:158`](../../ui/dr-ui/src/develop/session.rs#L158), [`ui/dr-ui/src/develop/session.rs:251`](../../ui/dr-ui/src/develop/session.rs#L251), [`ui/dr-ui/src/develop/session.rs:280`](../../ui/dr-ui/src/develop/session.rs#L280), [`ui/dr-ui/src/develop/session.rs:429`](../../ui/dr-ui/src/develop/session.rs#L429), [`ui/dr-ui/src/develop/session.rs:489`](../../ui/dr-ui/src/develop/session.rs#L489), [`ui/dr-ui/src/develop/session.rs:561`](../../ui/dr-ui/src/develop/session.rs#L561), [`ui/dr-ui/src/develop/session.rs:711`](../../ui/dr-ui/src/develop/session.rs#L711), [`ui/dr-ui/src/develop/white_balance.rs:11`](../../ui/dr-ui/src/develop/white_balance.rs#L11), [`ui/dr-ui/src/develop/white_balance.rs:162`](../../ui/dr-ui/src/develop/white_balance.rs#L162), [`ui/dr-ui/src/develop/white_balance.rs:193`](../../ui/dr-ui/src/develop/white_balance.rs#L193), [`ui/dr-ui/src/develop/white_balance.rs:276`](../../ui/dr-ui/src/develop/white_balance.rs#L276), [`ui/dr-ui/src/develop/white_balance.rs:338`](../../ui/dr-ui/src/develop/white_balance.rs#L338), [`ui/dr-ui/src/develop_ui.rs:1040`](../../ui/dr-ui/src/develop_ui.rs#L1040), [`ui/dr-ui/src/develop_ui.rs:1094`](../../ui/dr-ui/src/develop_ui.rs#L1094), [`ui/dr-ui/src/develop_ui.rs:117`](../../ui/dr-ui/src/develop_ui.rs#L117), [`ui/dr-ui/src/develop_ui.rs:406`](../../ui/dr-ui/src/develop_ui.rs#L406), [`ui/dr-ui/src/develop_ui.rs:626`](../../ui/dr-ui/src/develop_ui.rs#L626), [`ui/dr-ui/src/develop_ui.rs:964`](../../ui/dr-ui/src/develop_ui.rs#L964), [`ui/dr-ui/src/labels.rs:35`](../../ui/dr-ui/src/labels.rs#L35), [`ui/dr-ui/src/lib.rs:2192`](../../ui/dr-ui/src/lib.rs#L2192), [`ui/dr-ui/src/lib.rs:420`](../../ui/dr-ui/src/lib.rs#L420), [`ui/dr-ui/src/lib.rs:449`](../../ui/dr-ui/src/lib.rs#L449), [`ui/dr-ui/src/lib.rs:555`](../../ui/dr-ui/src/lib.rs#L555), [`ui/dr-ui/src/lib.rs:579`](../../ui/dr-ui/src/lib.rs#L579), [`ui/dr-ui/src/library/sidecar.rs:63`](../../ui/dr-ui/src/library/sidecar.rs#L63), [`ui/dr-ui/src/masks_ui.rs:1537`](../../ui/dr-ui/src/masks_ui.rs#L1537), [`ui/dr-ui/src/masks_ui.rs:1651`](../../ui/dr-ui/src/masks_ui.rs#L1651), [`ui/dr-ui/src/masks_ui.rs:339`](../../ui/dr-ui/src/masks_ui.rs#L339), [`ui/dr-ui/src/masks_ui.rs:44`](../../ui/dr-ui/src/masks_ui.rs#L44), [`ui/dr-ui/src/presets.rs:414`](../../ui/dr-ui/src/presets.rs#L414), [`ui/dr-ui/src/segmentation.rs:117`](../../ui/dr-ui/src/segmentation.rs#L117), [`ui/dr-ui/src/segmentation.rs:353`](../../ui/dr-ui/src/segmentation.rs#L353), [`ui/dr-ui/src/segmentation.rs:369`](../../ui/dr-ui/src/segmentation.rs#L369), [`ui/dr-ui/src/segmentation.rs:499`](../../ui/dr-ui/src/segmentation.rs#L499), [`ui/dr-ui/src/segmentation.rs:527`](../../ui/dr-ui/src/segmentation.rs#L527), [`ui/dr-ui/ui/adjust.slint:1019`](../../ui/dr-ui/ui/adjust.slint#L1019), [`ui/dr-ui/ui/adjust.slint:126`](../../ui/dr-ui/ui/adjust.slint#L126), [`ui/dr-ui/ui/adjust.slint:1496`](../../ui/dr-ui/ui/adjust.slint#L1496), [`ui/dr-ui/ui/adjust.slint:171`](../../ui/dr-ui/ui/adjust.slint#L171), [`ui/dr-ui/ui/adjust.slint:46`](../../ui/dr-ui/ui/adjust.slint#L46), [`ui/dr-ui/ui/adjust.slint:624`](../../ui/dr-ui/ui/adjust.slint#L624), [`ui/dr-ui/ui/adjust.slint:650`](../../ui/dr-ui/ui/adjust.slint#L650), [`ui/dr-ui/ui/adjust.slint:669`](../../ui/dr-ui/ui/adjust.slint#L669), [`ui/dr-ui/ui/adjust.slint:790`](../../ui/dr-ui/ui/adjust.slint#L790), [`ui/dr-ui/ui/adjust.slint:947`](../../ui/dr-ui/ui/adjust.slint#L947), [`ui/dr-ui/ui/app.slint:189`](../../ui/dr-ui/ui/app.slint#L189), [`ui/dr-ui/ui/app.slint:2281`](../../ui/dr-ui/ui/app.slint#L2281), [`ui/dr-ui/ui/app.slint:2341`](../../ui/dr-ui/ui/app.slint#L2341), [`ui/dr-ui/ui/develop.slint:223`](../../ui/dr-ui/ui/develop.slint#L223), [`ui/dr-ui/ui/masks.slint:1216`](../../ui/dr-ui/ui/masks.slint#L1216), [`ui/dr-ui/ui/masks.slint:753`](../../ui/dr-ui/ui/masks.slint#L753), [`ui/dr-ui/ui/masks.slint:812`](../../ui/dr-ui/ui/masks.slint#L812) |
+| FR-DEV-3a | [`core/dr-pipeline/ops/exposure.yaml:1`](../../core/dr-pipeline/ops/exposure.yaml#L1), [`core/dr-pipeline/src/descriptor.rs:212`](../../core/dr-pipeline/src/descriptor.rs#L212), [`core/dr-pipeline/src/descriptor.rs:252`](../../core/dr-pipeline/src/descriptor.rs#L252), [`core/dr-pipeline/src/descriptor.rs:276`](../../core/dr-pipeline/src/descriptor.rs#L276), [`core/dr-pipeline/src/descriptor.rs:331`](../../core/dr-pipeline/src/descriptor.rs#L331), [`core/dr-pipeline/src/framing.rs:395`](../../core/dr-pipeline/src/framing.rs#L395), [`core/dr-pipeline/src/graph.rs:25`](../../core/dr-pipeline/src/graph.rs#L25), [`core/dr-pipeline/src/graph.rs:393`](../../core/dr-pipeline/src/graph.rs#L393), [`core/dr-pipeline/src/graph.rs:47`](../../core/dr-pipeline/src/graph.rs#L47), [`core/dr-pipeline/src/graph.rs:534`](../../core/dr-pipeline/src/graph.rs#L534), [`core/dr-pipeline/src/graph.rs:60`](../../core/dr-pipeline/src/graph.rs#L60), [`core/dr-pipeline/src/mask.rs:1699`](../../core/dr-pipeline/src/mask.rs#L1699), [`core/dr-pipeline/src/neutral.rs:1`](../../core/dr-pipeline/src/neutral.rs#L1), [`core/dr-pipeline/src/neutral.rs:378`](../../core/dr-pipeline/src/neutral.rs#L378), [`core/dr-pipeline/src/operation.rs:232`](../../core/dr-pipeline/src/operation.rs#L232), [`core/dr-pipeline/src/operation.rs:365`](../../core/dr-pipeline/src/operation.rs#L365), [`core/dr-pipeline/src/ops/curve.rs:319`](../../core/dr-pipeline/src/ops/curve.rs#L319), [`ui/dr-ui/src/develop/curves.rs:36`](../../ui/dr-ui/src/develop/curves.rs#L36), [`ui/dr-ui/src/develop/rows.rs:118`](../../ui/dr-ui/src/develop/rows.rs#L118), [`ui/dr-ui/src/develop/rows.rs:679`](../../ui/dr-ui/src/develop/rows.rs#L679), [`ui/dr-ui/src/develop/rows.rs:877`](../../ui/dr-ui/src/develop/rows.rs#L877), [`ui/dr-ui/src/lib.rs:880`](../../ui/dr-ui/src/lib.rs#L880), [`ui/dr-ui/tests/ui_names_no_operation.rs:1`](../../ui/dr-ui/tests/ui_names_no_operation.rs#L1), [`ui/dr-ui/ui/app.slint:2525`](../../ui/dr-ui/ui/app.slint#L2525) |
+| FR-DEV-3b | [`core/dr-pipeline/src/descriptor.rs:276`](../../core/dr-pipeline/src/descriptor.rs#L276), [`core/dr-pipeline/src/framing.rs:395`](../../core/dr-pipeline/src/framing.rs#L395), [`core/dr-pipeline/src/graph.rs:60`](../../core/dr-pipeline/src/graph.rs#L60), [`core/dr-pipeline/src/operation.rs:365`](../../core/dr-pipeline/src/operation.rs#L365), [`ui/dr-ui/ui/app.slint:2736`](../../ui/dr-ui/ui/app.slint#L2736) |
| FR-DEV-3c | [`core/dr-pipeline/ops/exposure.yaml:1`](../../core/dr-pipeline/ops/exposure.yaml#L1), [`core/dr-pipeline/src/graph.rs:393`](../../core/dr-pipeline/src/graph.rs#L393), [`core/dr-pipeline/src/graph.rs:47`](../../core/dr-pipeline/src/graph.rs#L47), [`core/dr-pipeline/src/mask.rs:1699`](../../core/dr-pipeline/src/mask.rs#L1699), [`core/dr-pipeline/src/preset.rs:751`](../../core/dr-pipeline/src/preset.rs#L751), [`ui/dr-ui/src/develop/rows.rs:928`](../../ui/dr-ui/src/develop/rows.rs#L928) |
| FR-DEV-3d | [`core/dr-gpu/src/adjust.rs:1014`](../../core/dr-gpu/src/adjust.rs#L1014), [`core/dr-gpu/src/adjust.rs:1107`](../../core/dr-gpu/src/adjust.rs#L1107), [`core/dr-gpu/src/adjust.rs:114`](../../core/dr-gpu/src/adjust.rs#L114), [`core/dr-gpu/src/adjust.rs:798`](../../core/dr-gpu/src/adjust.rs#L798), [`core/dr-gpu/src/adjust.rs:84`](../../core/dr-gpu/src/adjust.rs#L84), [`core/dr-gpu/tests/capture_sharpen.rs:434`](../../core/dr-gpu/tests/capture_sharpen.rs#L434), [`core/dr-gpu/tests/detail_stage.rs:242`](../../core/dr-gpu/tests/detail_stage.rs#L242), [`core/dr-gpu/tests/local_contrast.rs:558`](../../core/dr-gpu/tests/local_contrast.rs#L558), [`core/dr-gpu/tests/noise_reduction.rs:556`](../../core/dr-gpu/tests/noise_reduction.rs#L556), [`core/dr-pipeline/src/framing.rs:314`](../../core/dr-pipeline/src/framing.rs#L314), [`core/dr-pipeline/src/graph.rs:991`](../../core/dr-pipeline/src/graph.rs#L991), [`core/dr-pipeline/src/operation.rs:32`](../../core/dr-pipeline/src/operation.rs#L32), [`core/dr-pipeline/src/operation.rs:403`](../../core/dr-pipeline/src/operation.rs#L403), [`core/dr-pipeline/src/operation.rs:53`](../../core/dr-pipeline/src/operation.rs#L53), [`core/dr-pipeline/src/operation.rs:71`](../../core/dr-pipeline/src/operation.rs#L71) |
| FR-DEV-3e | [`core/dr-decode/src/base_curve.rs:145`](../../core/dr-decode/src/base_curve.rs#L145), [`core/dr-decode/src/base_curve.rs:158`](../../core/dr-decode/src/base_curve.rs#L158), [`core/dr-decode/src/base_curve.rs:1`](../../core/dr-decode/src/base_curve.rs#L1), [`core/dr-decode/src/base_curve.rs:267`](../../core/dr-decode/src/base_curve.rs#L267), [`core/dr-decode/src/base_curve.rs:347`](../../core/dr-decode/src/base_curve.rs#L347), [`core/dr-decode/src/base_curve.rs:55`](../../core/dr-decode/src/base_curve.rs#L55), [`core/dr-decode/src/lib.rs:121`](../../core/dr-decode/src/lib.rs#L121), [`core/dr-decode/src/lib.rs:771`](../../core/dr-decode/src/lib.rs#L771), [`core/dr-decode/src/lib.rs:811`](../../core/dr-decode/src/lib.rs#L811), [`core/dr-decode/src/profile.rs:102`](../../core/dr-decode/src/profile.rs#L102), [`core/dr-decode/src/profile.rs:151`](../../core/dr-decode/src/profile.rs#L151), [`core/dr-decode/src/profile.rs:1`](../../core/dr-decode/src/profile.rs#L1), [`core/dr-decode/src/profile.rs:235`](../../core/dr-decode/src/profile.rs#L235), [`core/dr-decode/src/profile.rs:286`](../../core/dr-decode/src/profile.rs#L286), [`core/dr-decode/src/profile.rs:343`](../../core/dr-decode/src/profile.rs#L343), [`core/dr-decode/src/profile.rs:473`](../../core/dr-decode/src/profile.rs#L473), [`core/dr-decode/src/profile.rs:507`](../../core/dr-decode/src/profile.rs#L507), [`core/dr-decode/src/profile.rs:678`](../../core/dr-decode/src/profile.rs#L678), [`core/dr-gpu/src/adjust.rs:37`](../../core/dr-gpu/src/adjust.rs#L37), [`core/dr-gpu/src/adjust.rs:995`](../../core/dr-gpu/src/adjust.rs#L995), [`core/dr-gpu/src/demosaic.rs:121`](../../core/dr-gpu/src/demosaic.rs#L121), [`core/dr-gpu/src/demosaic.rs:86`](../../core/dr-gpu/src/demosaic.rs#L86), [`core/dr-gpu/tests/base_curve.rs:1`](../../core/dr-gpu/tests/base_curve.rs#L1), [`core/dr-pipeline/src/operation.rs:1985`](../../core/dr-pipeline/src/operation.rs#L1985), [`core/dr-pipeline/src/operation.rs:2066`](../../core/dr-pipeline/src/operation.rs#L2066), [`core/dr-pipeline/src/operation.rs:2091`](../../core/dr-pipeline/src/operation.rs#L2091), [`core/dr-pipeline/src/operation.rs:2106`](../../core/dr-pipeline/src/operation.rs#L2106), [`core/dr-pipeline/src/operation.rs:2130`](../../core/dr-pipeline/src/operation.rs#L2130), [`core/dr-pipeline/src/operation.rs:310`](../../core/dr-pipeline/src/operation.rs#L310), [`core/dr-pipeline/src/operation.rs:471`](../../core/dr-pipeline/src/operation.rs#L471), [`core/dr-pipeline/src/operation.rs:481`](../../core/dr-pipeline/src/operation.rs#L481), [`core/dr-pipeline/src/operation.rs:769`](../../core/dr-pipeline/src/operation.rs#L769) |
@@ -82,25 +82,25 @@ A tag naming an ID `requirements.md` does not define — what renumbering produc
| FR-DEV-3i | [`core/dr-pipeline/src/mask.rs:558`](../../core/dr-pipeline/src/mask.rs#L558), [`core/dr-segment/src/lib.rs:1`](../../core/dr-segment/src/lib.rs#L1), [`ui/dr-ui/src/segmentation.rs:1`](../../ui/dr-ui/src/segmentation.rs#L1) |
| FR-DEV-4 | [`core/dr-gpu/src/adjust.rs:798`](../../core/dr-gpu/src/adjust.rs#L798), [`core/dr-gpu/src/lib.rs:368`](../../core/dr-gpu/src/lib.rs#L368), [`ui/dr-ui/ui/crop.slint:1`](../../ui/dr-ui/ui/crop.slint#L1) |
| FR-DEV-5 | [`core/dr-pipeline/src/graph.rs:1440`](../../core/dr-pipeline/src/graph.rs#L1440), [`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/history.rs:102`](../../core/dr-pipeline/src/history.rs#L102), [`core/dr-pipeline/src/history.rs:110`](../../core/dr-pipeline/src/history.rs#L110), [`core/dr-pipeline/src/history.rs:127`](../../core/dr-pipeline/src/history.rs#L127), [`core/dr-pipeline/src/history.rs:184`](../../core/dr-pipeline/src/history.rs#L184), [`core/dr-pipeline/src/history.rs:1`](../../core/dr-pipeline/src/history.rs#L1), [`core/dr-pipeline/src/history.rs:214`](../../core/dr-pipeline/src/history.rs#L214), [`core/dr-pipeline/src/history.rs:234`](../../core/dr-pipeline/src/history.rs#L234), [`core/dr-pipeline/src/history.rs:293`](../../core/dr-pipeline/src/history.rs#L293), [`core/dr-pipeline/src/history.rs:479`](../../core/dr-pipeline/src/history.rs#L479), [`core/dr-pipeline/src/history.rs:489`](../../core/dr-pipeline/src/history.rs#L489), [`core/dr-pipeline/src/history.rs:499`](../../core/dr-pipeline/src/history.rs#L499), [`core/dr-pipeline/src/history.rs:526`](../../core/dr-pipeline/src/history.rs#L526), [`core/dr-pipeline/src/history.rs:86`](../../core/dr-pipeline/src/history.rs#L86), [`core/dr-pipeline/src/sidecar.rs:1045`](../../core/dr-pipeline/src/sidecar.rs#L1045), [`core/dr-pipeline/src/sidecar.rs:144`](../../core/dr-pipeline/src/sidecar.rs#L144), [`core/dr-pipeline/src/sidecar.rs:2472`](../../core/dr-pipeline/src/sidecar.rs#L2472), [`core/dr-pipeline/src/sidecar.rs:2508`](../../core/dr-pipeline/src/sidecar.rs#L2508), [`core/dr-pipeline/src/sidecar.rs:2520`](../../core/dr-pipeline/src/sidecar.rs#L2520), [`core/dr-pipeline/src/sidecar.rs:303`](../../core/dr-pipeline/src/sidecar.rs#L303), [`core/dr-pipeline/src/sidecar.rs:694`](../../core/dr-pipeline/src/sidecar.rs#L694), [`core/dr-pipeline/src/sidecar.rs:710`](../../core/dr-pipeline/src/sidecar.rs#L710), [`core/dr-pipeline/src/sidecar.rs:857`](../../core/dr-pipeline/src/sidecar.rs#L857), [`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), [`ui/dr-ui/src/develop/framing.rs:720`](../../ui/dr-ui/src/develop/framing.rs#L720), [`ui/dr-ui/src/develop/history.rs:11`](../../ui/dr-ui/src/develop/history.rs#L11), [`ui/dr-ui/src/develop/history.rs:152`](../../ui/dr-ui/src/develop/history.rs#L152), [`ui/dr-ui/src/develop/history.rs:165`](../../ui/dr-ui/src/develop/history.rs#L165), [`ui/dr-ui/src/develop/history.rs:178`](../../ui/dr-ui/src/develop/history.rs#L178), [`ui/dr-ui/src/develop/history.rs:190`](../../ui/dr-ui/src/develop/history.rs#L190), [`ui/dr-ui/src/develop/history.rs:206`](../../ui/dr-ui/src/develop/history.rs#L206), [`ui/dr-ui/src/develop/history.rs:238`](../../ui/dr-ui/src/develop/history.rs#L238), [`ui/dr-ui/src/develop/history.rs:242`](../../ui/dr-ui/src/develop/history.rs#L242), [`ui/dr-ui/src/develop/history.rs:261`](../../ui/dr-ui/src/develop/history.rs#L261), [`ui/dr-ui/src/develop/history.rs:277`](../../ui/dr-ui/src/develop/history.rs#L277), [`ui/dr-ui/src/develop/history.rs:299`](../../ui/dr-ui/src/develop/history.rs#L299), [`ui/dr-ui/src/develop/history.rs:29`](../../ui/dr-ui/src/develop/history.rs#L29), [`ui/dr-ui/src/develop/history.rs:359`](../../ui/dr-ui/src/develop/history.rs#L359), [`ui/dr-ui/src/develop/history.rs:68`](../../ui/dr-ui/src/develop/history.rs#L68), [`ui/dr-ui/src/develop/history.rs:82`](../../ui/dr-ui/src/develop/history.rs#L82), [`ui/dr-ui/src/develop/history.rs:93`](../../ui/dr-ui/src/develop/history.rs#L93), [`ui/dr-ui/src/develop/render.rs:671`](../../ui/dr-ui/src/develop/render.rs#L671), [`ui/dr-ui/src/develop/render.rs:847`](../../ui/dr-ui/src/develop/render.rs#L847), [`ui/dr-ui/src/develop/render.rs:883`](../../ui/dr-ui/src/develop/render.rs#L883), [`ui/dr-ui/src/develop/session.rs:80`](../../ui/dr-ui/src/develop/session.rs#L80), [`ui/dr-ui/src/develop/session.rs:89`](../../ui/dr-ui/src/develop/session.rs#L89), [`ui/dr-ui/src/develop/white_balance.rs:11`](../../ui/dr-ui/src/develop/white_balance.rs#L11), [`ui/dr-ui/src/develop/white_balance.rs:162`](../../ui/dr-ui/src/develop/white_balance.rs#L162), [`ui/dr-ui/src/develop_ui.rs:657`](../../ui/dr-ui/src/develop_ui.rs#L657), [`ui/dr-ui/src/develop_ui.rs:677`](../../ui/dr-ui/src/develop_ui.rs#L677), [`ui/dr-ui/src/labels.rs:12`](../../ui/dr-ui/src/labels.rs#L12), [`ui/dr-ui/src/labels.rs:278`](../../ui/dr-ui/src/labels.rs#L278), [`ui/dr-ui/src/labels.rs:31`](../../ui/dr-ui/src/labels.rs#L31), [`ui/dr-ui/src/lib.rs:2123`](../../ui/dr-ui/src/lib.rs#L2123), [`ui/dr-ui/src/lib.rs:2128`](../../ui/dr-ui/src/lib.rs#L2128), [`ui/dr-ui/src/lib.rs:2160`](../../ui/dr-ui/src/lib.rs#L2160), [`ui/dr-ui/src/lib.rs:2169`](../../ui/dr-ui/src/lib.rs#L2169), [`ui/dr-ui/src/lib.rs:2181`](../../ui/dr-ui/src/lib.rs#L2181), [`ui/dr-ui/src/library/sidecar.rs:343`](../../ui/dr-ui/src/library/sidecar.rs#L343), [`ui/dr-ui/src/library/sidecar.rs:58`](../../ui/dr-ui/src/library/sidecar.rs#L58), [`ui/dr-ui/src/presets.rs:1678`](../../ui/dr-ui/src/presets.rs#L1678), [`ui/dr-ui/src/presets.rs:373`](../../ui/dr-ui/src/presets.rs#L373), [`ui/dr-ui/src/presets.rs:437`](../../ui/dr-ui/src/presets.rs#L437), [`ui/dr-ui/src/presets.rs:557`](../../ui/dr-ui/src/presets.rs#L557), [`ui/dr-ui/ui/history.slint:191`](../../ui/dr-ui/ui/history.slint#L191), [`ui/dr-ui/ui/history.slint:1`](../../ui/dr-ui/ui/history.slint#L1), [`ui/dr-ui/ui/history.slint:218`](../../ui/dr-ui/ui/history.slint#L218), [`ui/dr-ui/ui/history.slint:303`](../../ui/dr-ui/ui/history.slint#L303), [`ui/dr-ui/ui/history.slint:43`](../../ui/dr-ui/ui/history.slint#L43), [`ui/dr-ui/ui/history.slint:53`](../../ui/dr-ui/ui/history.slint#L53) |
-| FR-DEV-6 | [`core/dr-pipeline/src/preset.rs:1`](../../core/dr-pipeline/src/preset.rs#L1), [`core/dr-pipeline/src/preset.rs:390`](../../core/dr-pipeline/src/preset.rs#L390), [`core/dr-pipeline/src/preset.rs:423`](../../core/dr-pipeline/src/preset.rs#L423), [`core/dr-pipeline/src/starter.rs:1`](../../core/dr-pipeline/src/starter.rs#L1), [`core/dr-preset-xmp/src/lib.rs:1`](../../core/dr-preset-xmp/src/lib.rs#L1), [`core/dr-types/src/settings.rs:443`](../../core/dr-types/src/settings.rs#L443), [`ui/dr-ui/src/develop/session.rs:555`](../../ui/dr-ui/src/develop/session.rs#L555), [`ui/dr-ui/src/develop/session.rs:576`](../../ui/dr-ui/src/develop/session.rs#L576), [`ui/dr-ui/src/develop_ui.rs:167`](../../ui/dr-ui/src/develop_ui.rs#L167), [`ui/dr-ui/src/develop_ui.rs:196`](../../ui/dr-ui/src/develop_ui.rs#L196), [`ui/dr-ui/src/lib.rs:1243`](../../ui/dr-ui/src/lib.rs#L1243), [`ui/dr-ui/src/library/sidecar.rs:11`](../../ui/dr-ui/src/library/sidecar.rs#L11), [`ui/dr-ui/src/library/sidecar.rs:39`](../../ui/dr-ui/src/library/sidecar.rs#L39), [`ui/dr-ui/src/library/thumbnails_fetch.rs:413`](../../ui/dr-ui/src/library/thumbnails_fetch.rs#L413), [`ui/dr-ui/src/library_ui.rs:3255`](../../ui/dr-ui/src/library_ui.rs#L3255), [`ui/dr-ui/src/library_ui.rs:3838`](../../ui/dr-ui/src/library_ui.rs#L3838), [`ui/dr-ui/src/library_ui.rs:630`](../../ui/dr-ui/src/library_ui.rs#L630), [`ui/dr-ui/src/preset_store.rs:1`](../../ui/dr-ui/src/preset_store.rs#L1), [`ui/dr-ui/src/presets.rs:1`](../../ui/dr-ui/src/presets.rs#L1), [`ui/dr-ui/src/presets.rs:707`](../../ui/dr-ui/src/presets.rs#L707), [`ui/dr-ui/src/presets.rs:741`](../../ui/dr-ui/src/presets.rs#L741), [`ui/dr-ui/ui/adjust.slint:853`](../../ui/dr-ui/ui/adjust.slint#L853), [`ui/dr-ui/ui/adjust.slint:878`](../../ui/dr-ui/ui/adjust.slint#L878), [`ui/dr-ui/ui/adjust.slint:889`](../../ui/dr-ui/ui/adjust.slint#L889), [`ui/dr-ui/ui/adjust.slint:932`](../../ui/dr-ui/ui/adjust.slint#L932), [`ui/dr-ui/ui/app.slint:1745`](../../ui/dr-ui/ui/app.slint#L1745), [`ui/dr-ui/ui/app.slint:2577`](../../ui/dr-ui/ui/app.slint#L2577), [`ui/dr-ui/ui/app.slint:3212`](../../ui/dr-ui/ui/app.slint#L3212), [`ui/dr-ui/ui/app.slint:806`](../../ui/dr-ui/ui/app.slint#L806), [`ui/dr-ui/ui/app.slint:817`](../../ui/dr-ui/ui/app.slint#L817), [`ui/dr-ui/ui/library.slint:1579`](../../ui/dr-ui/ui/library.slint#L1579), [`ui/dr-ui/ui/library.slint:1585`](../../ui/dr-ui/ui/library.slint#L1585), [`ui/dr-ui/ui/library.slint:4262`](../../ui/dr-ui/ui/library.slint#L4262), [`ui/dr-ui/ui/library.slint:4286`](../../ui/dr-ui/ui/library.slint#L4286), [`ui/dr-ui/ui/presets.slint:105`](../../ui/dr-ui/ui/presets.slint#L105), [`ui/dr-ui/ui/presets.slint:113`](../../ui/dr-ui/ui/presets.slint#L113), [`ui/dr-ui/ui/presets.slint:19`](../../ui/dr-ui/ui/presets.slint#L19), [`ui/dr-ui/ui/presets.slint:276`](../../ui/dr-ui/ui/presets.slint#L276), [`ui/dr-ui/ui/presets.slint:297`](../../ui/dr-ui/ui/presets.slint#L297), [`ui/dr-ui/ui/presets.slint:5`](../../ui/dr-ui/ui/presets.slint#L5), [`ui/dr-ui/ui/presets.slint:60`](../../ui/dr-ui/ui/presets.slint#L60), [`ui/dr-ui/ui/settings.slint:119`](../../ui/dr-ui/ui/settings.slint#L119), [`ui/dr-ui/ui/settings.slint:711`](../../ui/dr-ui/ui/settings.slint#L711) |
-| FR-DEV-7 | [`core/dr-pipeline/src/history.rs:214`](../../core/dr-pipeline/src/history.rs#L214), [`core/dr-pipeline/src/history.rs:499`](../../core/dr-pipeline/src/history.rs#L499), [`core/dr-pipeline/src/history.rs:526`](../../core/dr-pipeline/src/history.rs#L526), [`ui/dr-ui/src/develop/history.rs:107`](../../ui/dr-ui/src/develop/history.rs#L107), [`ui/dr-ui/src/develop/history.rs:124`](../../ui/dr-ui/src/develop/history.rs#L124), [`ui/dr-ui/src/develop/history.rs:206`](../../ui/dr-ui/src/develop/history.rs#L206), [`ui/dr-ui/src/develop/history.rs:238`](../../ui/dr-ui/src/develop/history.rs#L238), [`ui/dr-ui/src/develop/history.rs:359`](../../ui/dr-ui/src/develop/history.rs#L359), [`ui/dr-ui/src/develop/render.rs:453`](../../ui/dr-ui/src/develop/render.rs#L453), [`ui/dr-ui/src/develop/render.rs:494`](../../ui/dr-ui/src/develop/render.rs#L494), [`ui/dr-ui/src/develop/render.rs:883`](../../ui/dr-ui/src/develop/render.rs#L883), [`ui/dr-ui/src/develop/session.rs:105`](../../ui/dr-ui/src/develop/session.rs#L105), [`ui/dr-ui/src/develop_ui.rs:598`](../../ui/dr-ui/src/develop_ui.rs#L598), [`ui/dr-ui/src/develop_ui.rs:657`](../../ui/dr-ui/src/develop_ui.rs#L657), [`ui/dr-ui/src/develop_ui.rs:729`](../../ui/dr-ui/src/develop_ui.rs#L729), [`ui/dr-ui/src/lib.rs:2169`](../../ui/dr-ui/src/lib.rs#L2169), [`ui/dr-ui/src/lib.rs:2241`](../../ui/dr-ui/src/lib.rs#L2241), [`ui/dr-ui/src/lib.rs:2255`](../../ui/dr-ui/src/lib.rs#L2255), [`ui/dr-ui/src/lib.rs:412`](../../ui/dr-ui/src/lib.rs#L412), [`ui/dr-ui/ui/app.slint:170`](../../ui/dr-ui/ui/app.slint#L170), [`ui/dr-ui/ui/app.slint:2484`](../../ui/dr-ui/ui/app.slint#L2484), [`ui/dr-ui/ui/app.slint:2499`](../../ui/dr-ui/ui/app.slint#L2499), [`ui/dr-ui/ui/app.slint:2819`](../../ui/dr-ui/ui/app.slint#L2819), [`ui/dr-ui/ui/history.slint:102`](../../ui/dr-ui/ui/history.slint#L102), [`ui/dr-ui/ui/history.slint:1`](../../ui/dr-ui/ui/history.slint#L1), [`ui/dr-ui/ui/history.slint:226`](../../ui/dr-ui/ui/history.slint#L226), [`ui/dr-ui/ui/history.slint:53`](../../ui/dr-ui/ui/history.slint#L53), [`ui/dr-ui/ui/widgets.slint:71`](../../ui/dr-ui/ui/widgets.slint#L71) |
-| FR-DEV-8 | [`core/dr-gpu/src/detail.rs:405`](../../core/dr-gpu/src/detail.rs#L405), [`core/dr-gpu/src/detail.rs:623`](../../core/dr-gpu/src/detail.rs#L623), [`core/dr-gpu/tests/detail_instances.rs:1`](../../core/dr-gpu/tests/detail_instances.rs#L1), [`core/dr-gpu/tests/spot_removal.rs:1`](../../core/dr-gpu/tests/spot_removal.rs#L1), [`core/dr-pipeline/src/detail.rs:410`](../../core/dr-pipeline/src/detail.rs#L410), [`core/dr-pipeline/src/detail.rs:434`](../../core/dr-pipeline/src/detail.rs#L434), [`core/dr-pipeline/src/detail.rs:469`](../../core/dr-pipeline/src/detail.rs#L469), [`core/dr-pipeline/src/detail.rs:555`](../../core/dr-pipeline/src/detail.rs#L555), [`core/dr-pipeline/src/graph.rs:1092`](../../core/dr-pipeline/src/graph.rs#L1092), [`core/dr-pipeline/src/graph.rs:115`](../../core/dr-pipeline/src/graph.rs#L115), [`core/dr-pipeline/src/graph.rs:247`](../../core/dr-pipeline/src/graph.rs#L247), [`core/dr-pipeline/src/operation.rs:330`](../../core/dr-pipeline/src/operation.rs#L330), [`core/dr-pipeline/src/operation.rs:717`](../../core/dr-pipeline/src/operation.rs#L717), [`core/dr-pipeline/src/sidecar.rs:1071`](../../core/dr-pipeline/src/sidecar.rs#L1071), [`core/dr-pipeline/src/sidecar.rs:1125`](../../core/dr-pipeline/src/sidecar.rs#L1125), [`core/dr-pipeline/src/sidecar.rs:1155`](../../core/dr-pipeline/src/sidecar.rs#L1155), [`core/dr-pipeline/src/sidecar.rs:219`](../../core/dr-pipeline/src/sidecar.rs#L219), [`core/dr-pipeline/src/sidecar.rs:395`](../../core/dr-pipeline/src/sidecar.rs#L395), [`core/dr-pipeline/src/sidecar.rs:888`](../../core/dr-pipeline/src/sidecar.rs#L888), [`core/dr-pipeline/src/spot.rs:115`](../../core/dr-pipeline/src/spot.rs#L115), [`core/dr-pipeline/src/spot.rs:151`](../../core/dr-pipeline/src/spot.rs#L151), [`core/dr-pipeline/src/spot.rs:1`](../../core/dr-pipeline/src/spot.rs#L1), [`core/dr-pipeline/src/spot.rs:207`](../../core/dr-pipeline/src/spot.rs#L207), [`core/dr-pipeline/src/spot.rs:387`](../../core/dr-pipeline/src/spot.rs#L387), [`core/dr-pipeline/src/spot.rs:472`](../../core/dr-pipeline/src/spot.rs#L472), [`core/dr-pipeline/src/spot.rs:582`](../../core/dr-pipeline/src/spot.rs#L582), [`core/dr-pipeline/src/spot.rs:673`](../../core/dr-pipeline/src/spot.rs#L673), [`core/dr-pipeline/src/state.rs:103`](../../core/dr-pipeline/src/state.rs#L103), [`core/dr-pipeline/tests/spot_sidecar.rs:1`](../../core/dr-pipeline/tests/spot_sidecar.rs#L1), [`core/dr-pipeline/tests/spots.rs:1`](../../core/dr-pipeline/tests/spots.rs#L1), [`ui/dr-ui/src/develop/repairs.rs:114`](../../ui/dr-ui/src/develop/repairs.rs#L114), [`ui/dr-ui/src/develop/repairs.rs:11`](../../ui/dr-ui/src/develop/repairs.rs#L11), [`ui/dr-ui/src/develop/repairs.rs:197`](../../ui/dr-ui/src/develop/repairs.rs#L197), [`ui/dr-ui/src/develop/repairs.rs:211`](../../ui/dr-ui/src/develop/repairs.rs#L211), [`ui/dr-ui/src/develop/repairs.rs:49`](../../ui/dr-ui/src/develop/repairs.rs#L49), [`ui/dr-ui/src/develop/session.rs:212`](../../ui/dr-ui/src/develop/session.rs#L212), [`ui/dr-ui/src/develop_ui.rs:884`](../../ui/dr-ui/src/develop_ui.rs#L884), [`ui/dr-ui/src/labels.rs:80`](../../ui/dr-ui/src/labels.rs#L80), [`ui/dr-ui/src/lib.rs:2199`](../../ui/dr-ui/src/lib.rs#L2199), [`ui/dr-ui/src/lib.rs:454`](../../ui/dr-ui/src/lib.rs#L454), [`ui/dr-ui/src/spots_ui.rs:19`](../../ui/dr-ui/src/spots_ui.rs#L19), [`ui/dr-ui/src/spots_ui.rs:1`](../../ui/dr-ui/src/spots_ui.rs#L1), [`ui/dr-ui/src/spots_ui.rs:265`](../../ui/dr-ui/src/spots_ui.rs#L265), [`ui/dr-ui/ui/app.slint:2340`](../../ui/dr-ui/ui/app.slint#L2340), [`ui/dr-ui/ui/app.slint:2542`](../../ui/dr-ui/ui/app.slint#L2542), [`ui/dr-ui/ui/app.slint:3118`](../../ui/dr-ui/ui/app.slint#L3118), [`ui/dr-ui/ui/icons.slint:366`](../../ui/dr-ui/ui/icons.slint#L366), [`ui/dr-ui/ui/session.slint:102`](../../ui/dr-ui/ui/session.slint#L102), [`ui/dr-ui/ui/session.slint:52`](../../ui/dr-ui/ui/session.slint#L52), [`ui/dr-ui/ui/spots.slint:191`](../../ui/dr-ui/ui/spots.slint#L191), [`ui/dr-ui/ui/spots.slint:49`](../../ui/dr-ui/ui/spots.slint#L49), [`ui/dr-ui/ui/spots.slint:6`](../../ui/dr-ui/ui/spots.slint#L6), [`ui/dr-ui/ui/spots.slint:91`](../../ui/dr-ui/ui/spots.slint#L91) |
+| FR-DEV-6 | [`core/dr-pipeline/src/preset.rs:1`](../../core/dr-pipeline/src/preset.rs#L1), [`core/dr-pipeline/src/preset.rs:390`](../../core/dr-pipeline/src/preset.rs#L390), [`core/dr-pipeline/src/preset.rs:423`](../../core/dr-pipeline/src/preset.rs#L423), [`core/dr-pipeline/src/starter.rs:1`](../../core/dr-pipeline/src/starter.rs#L1), [`core/dr-preset-xmp/src/lib.rs:1`](../../core/dr-preset-xmp/src/lib.rs#L1), [`core/dr-types/src/settings.rs:443`](../../core/dr-types/src/settings.rs#L443), [`ui/dr-ui/src/develop/session.rs:555`](../../ui/dr-ui/src/develop/session.rs#L555), [`ui/dr-ui/src/develop/session.rs:576`](../../ui/dr-ui/src/develop/session.rs#L576), [`ui/dr-ui/src/develop_ui.rs:167`](../../ui/dr-ui/src/develop_ui.rs#L167), [`ui/dr-ui/src/develop_ui.rs:196`](../../ui/dr-ui/src/develop_ui.rs#L196), [`ui/dr-ui/src/lib.rs:1243`](../../ui/dr-ui/src/lib.rs#L1243), [`ui/dr-ui/src/library/sidecar.rs:11`](../../ui/dr-ui/src/library/sidecar.rs#L11), [`ui/dr-ui/src/library/sidecar.rs:39`](../../ui/dr-ui/src/library/sidecar.rs#L39), [`ui/dr-ui/src/library/thumbnails_fetch.rs:413`](../../ui/dr-ui/src/library/thumbnails_fetch.rs#L413), [`ui/dr-ui/src/library_ui.rs:3255`](../../ui/dr-ui/src/library_ui.rs#L3255), [`ui/dr-ui/src/library_ui.rs:3838`](../../ui/dr-ui/src/library_ui.rs#L3838), [`ui/dr-ui/src/library_ui.rs:630`](../../ui/dr-ui/src/library_ui.rs#L630), [`ui/dr-ui/src/preset_store.rs:1`](../../ui/dr-ui/src/preset_store.rs#L1), [`ui/dr-ui/src/presets.rs:1`](../../ui/dr-ui/src/presets.rs#L1), [`ui/dr-ui/src/presets.rs:707`](../../ui/dr-ui/src/presets.rs#L707), [`ui/dr-ui/src/presets.rs:741`](../../ui/dr-ui/src/presets.rs#L741), [`ui/dr-ui/ui/adjust.slint:853`](../../ui/dr-ui/ui/adjust.slint#L853), [`ui/dr-ui/ui/adjust.slint:878`](../../ui/dr-ui/ui/adjust.slint#L878), [`ui/dr-ui/ui/adjust.slint:889`](../../ui/dr-ui/ui/adjust.slint#L889), [`ui/dr-ui/ui/adjust.slint:932`](../../ui/dr-ui/ui/adjust.slint#L932), [`ui/dr-ui/ui/app.slint:1662`](../../ui/dr-ui/ui/app.slint#L1662), [`ui/dr-ui/ui/app.slint:2494`](../../ui/dr-ui/ui/app.slint#L2494), [`ui/dr-ui/ui/app.slint:3129`](../../ui/dr-ui/ui/app.slint#L3129), [`ui/dr-ui/ui/app.slint:723`](../../ui/dr-ui/ui/app.slint#L723), [`ui/dr-ui/ui/app.slint:734`](../../ui/dr-ui/ui/app.slint#L734), [`ui/dr-ui/ui/library.slint:1579`](../../ui/dr-ui/ui/library.slint#L1579), [`ui/dr-ui/ui/library.slint:1585`](../../ui/dr-ui/ui/library.slint#L1585), [`ui/dr-ui/ui/library.slint:4262`](../../ui/dr-ui/ui/library.slint#L4262), [`ui/dr-ui/ui/library.slint:4286`](../../ui/dr-ui/ui/library.slint#L4286), [`ui/dr-ui/ui/presets.slint:105`](../../ui/dr-ui/ui/presets.slint#L105), [`ui/dr-ui/ui/presets.slint:113`](../../ui/dr-ui/ui/presets.slint#L113), [`ui/dr-ui/ui/presets.slint:19`](../../ui/dr-ui/ui/presets.slint#L19), [`ui/dr-ui/ui/presets.slint:276`](../../ui/dr-ui/ui/presets.slint#L276), [`ui/dr-ui/ui/presets.slint:297`](../../ui/dr-ui/ui/presets.slint#L297), [`ui/dr-ui/ui/presets.slint:5`](../../ui/dr-ui/ui/presets.slint#L5), [`ui/dr-ui/ui/presets.slint:60`](../../ui/dr-ui/ui/presets.slint#L60), [`ui/dr-ui/ui/settings.slint:119`](../../ui/dr-ui/ui/settings.slint#L119), [`ui/dr-ui/ui/settings.slint:711`](../../ui/dr-ui/ui/settings.slint#L711) |
+| FR-DEV-7 | [`core/dr-pipeline/src/history.rs:214`](../../core/dr-pipeline/src/history.rs#L214), [`core/dr-pipeline/src/history.rs:499`](../../core/dr-pipeline/src/history.rs#L499), [`core/dr-pipeline/src/history.rs:526`](../../core/dr-pipeline/src/history.rs#L526), [`ui/dr-ui/src/develop/history.rs:107`](../../ui/dr-ui/src/develop/history.rs#L107), [`ui/dr-ui/src/develop/history.rs:124`](../../ui/dr-ui/src/develop/history.rs#L124), [`ui/dr-ui/src/develop/history.rs:206`](../../ui/dr-ui/src/develop/history.rs#L206), [`ui/dr-ui/src/develop/history.rs:238`](../../ui/dr-ui/src/develop/history.rs#L238), [`ui/dr-ui/src/develop/history.rs:359`](../../ui/dr-ui/src/develop/history.rs#L359), [`ui/dr-ui/src/develop/render.rs:453`](../../ui/dr-ui/src/develop/render.rs#L453), [`ui/dr-ui/src/develop/render.rs:494`](../../ui/dr-ui/src/develop/render.rs#L494), [`ui/dr-ui/src/develop/render.rs:883`](../../ui/dr-ui/src/develop/render.rs#L883), [`ui/dr-ui/src/develop/session.rs:105`](../../ui/dr-ui/src/develop/session.rs#L105), [`ui/dr-ui/src/develop_ui.rs:598`](../../ui/dr-ui/src/develop_ui.rs#L598), [`ui/dr-ui/src/develop_ui.rs:657`](../../ui/dr-ui/src/develop_ui.rs#L657), [`ui/dr-ui/src/develop_ui.rs:729`](../../ui/dr-ui/src/develop_ui.rs#L729), [`ui/dr-ui/src/lib.rs:2169`](../../ui/dr-ui/src/lib.rs#L2169), [`ui/dr-ui/src/lib.rs:2241`](../../ui/dr-ui/src/lib.rs#L2241), [`ui/dr-ui/src/lib.rs:2255`](../../ui/dr-ui/src/lib.rs#L2255), [`ui/dr-ui/src/lib.rs:412`](../../ui/dr-ui/src/lib.rs#L412), [`ui/dr-ui/ui/app.slint:171`](../../ui/dr-ui/ui/app.slint#L171), [`ui/dr-ui/ui/app.slint:2401`](../../ui/dr-ui/ui/app.slint#L2401), [`ui/dr-ui/ui/app.slint:2416`](../../ui/dr-ui/ui/app.slint#L2416), [`ui/dr-ui/ui/app.slint:2736`](../../ui/dr-ui/ui/app.slint#L2736), [`ui/dr-ui/ui/history.slint:102`](../../ui/dr-ui/ui/history.slint#L102), [`ui/dr-ui/ui/history.slint:1`](../../ui/dr-ui/ui/history.slint#L1), [`ui/dr-ui/ui/history.slint:226`](../../ui/dr-ui/ui/history.slint#L226), [`ui/dr-ui/ui/history.slint:53`](../../ui/dr-ui/ui/history.slint#L53), [`ui/dr-ui/ui/widgets.slint:71`](../../ui/dr-ui/ui/widgets.slint#L71) |
+| FR-DEV-8 | [`core/dr-gpu/src/detail.rs:405`](../../core/dr-gpu/src/detail.rs#L405), [`core/dr-gpu/src/detail.rs:623`](../../core/dr-gpu/src/detail.rs#L623), [`core/dr-gpu/tests/detail_instances.rs:1`](../../core/dr-gpu/tests/detail_instances.rs#L1), [`core/dr-gpu/tests/spot_removal.rs:1`](../../core/dr-gpu/tests/spot_removal.rs#L1), [`core/dr-pipeline/src/detail.rs:410`](../../core/dr-pipeline/src/detail.rs#L410), [`core/dr-pipeline/src/detail.rs:434`](../../core/dr-pipeline/src/detail.rs#L434), [`core/dr-pipeline/src/detail.rs:469`](../../core/dr-pipeline/src/detail.rs#L469), [`core/dr-pipeline/src/detail.rs:555`](../../core/dr-pipeline/src/detail.rs#L555), [`core/dr-pipeline/src/graph.rs:1092`](../../core/dr-pipeline/src/graph.rs#L1092), [`core/dr-pipeline/src/graph.rs:115`](../../core/dr-pipeline/src/graph.rs#L115), [`core/dr-pipeline/src/graph.rs:247`](../../core/dr-pipeline/src/graph.rs#L247), [`core/dr-pipeline/src/operation.rs:330`](../../core/dr-pipeline/src/operation.rs#L330), [`core/dr-pipeline/src/operation.rs:717`](../../core/dr-pipeline/src/operation.rs#L717), [`core/dr-pipeline/src/sidecar.rs:1071`](../../core/dr-pipeline/src/sidecar.rs#L1071), [`core/dr-pipeline/src/sidecar.rs:1125`](../../core/dr-pipeline/src/sidecar.rs#L1125), [`core/dr-pipeline/src/sidecar.rs:1155`](../../core/dr-pipeline/src/sidecar.rs#L1155), [`core/dr-pipeline/src/sidecar.rs:219`](../../core/dr-pipeline/src/sidecar.rs#L219), [`core/dr-pipeline/src/sidecar.rs:395`](../../core/dr-pipeline/src/sidecar.rs#L395), [`core/dr-pipeline/src/sidecar.rs:888`](../../core/dr-pipeline/src/sidecar.rs#L888), [`core/dr-pipeline/src/spot.rs:115`](../../core/dr-pipeline/src/spot.rs#L115), [`core/dr-pipeline/src/spot.rs:151`](../../core/dr-pipeline/src/spot.rs#L151), [`core/dr-pipeline/src/spot.rs:1`](../../core/dr-pipeline/src/spot.rs#L1), [`core/dr-pipeline/src/spot.rs:207`](../../core/dr-pipeline/src/spot.rs#L207), [`core/dr-pipeline/src/spot.rs:387`](../../core/dr-pipeline/src/spot.rs#L387), [`core/dr-pipeline/src/spot.rs:472`](../../core/dr-pipeline/src/spot.rs#L472), [`core/dr-pipeline/src/spot.rs:582`](../../core/dr-pipeline/src/spot.rs#L582), [`core/dr-pipeline/src/spot.rs:673`](../../core/dr-pipeline/src/spot.rs#L673), [`core/dr-pipeline/src/state.rs:103`](../../core/dr-pipeline/src/state.rs#L103), [`core/dr-pipeline/tests/spot_sidecar.rs:1`](../../core/dr-pipeline/tests/spot_sidecar.rs#L1), [`core/dr-pipeline/tests/spots.rs:1`](../../core/dr-pipeline/tests/spots.rs#L1), [`ui/dr-ui/src/develop/repairs.rs:114`](../../ui/dr-ui/src/develop/repairs.rs#L114), [`ui/dr-ui/src/develop/repairs.rs:11`](../../ui/dr-ui/src/develop/repairs.rs#L11), [`ui/dr-ui/src/develop/repairs.rs:197`](../../ui/dr-ui/src/develop/repairs.rs#L197), [`ui/dr-ui/src/develop/repairs.rs:211`](../../ui/dr-ui/src/develop/repairs.rs#L211), [`ui/dr-ui/src/develop/repairs.rs:49`](../../ui/dr-ui/src/develop/repairs.rs#L49), [`ui/dr-ui/src/develop/session.rs:212`](../../ui/dr-ui/src/develop/session.rs#L212), [`ui/dr-ui/src/develop_ui.rs:884`](../../ui/dr-ui/src/develop_ui.rs#L884), [`ui/dr-ui/src/labels.rs:80`](../../ui/dr-ui/src/labels.rs#L80), [`ui/dr-ui/src/lib.rs:2199`](../../ui/dr-ui/src/lib.rs#L2199), [`ui/dr-ui/src/lib.rs:454`](../../ui/dr-ui/src/lib.rs#L454), [`ui/dr-ui/src/spots_ui.rs:19`](../../ui/dr-ui/src/spots_ui.rs#L19), [`ui/dr-ui/src/spots_ui.rs:1`](../../ui/dr-ui/src/spots_ui.rs#L1), [`ui/dr-ui/src/spots_ui.rs:265`](../../ui/dr-ui/src/spots_ui.rs#L265), [`ui/dr-ui/ui/app.slint:2257`](../../ui/dr-ui/ui/app.slint#L2257), [`ui/dr-ui/ui/app.slint:2459`](../../ui/dr-ui/ui/app.slint#L2459), [`ui/dr-ui/ui/app.slint:3035`](../../ui/dr-ui/ui/app.slint#L3035), [`ui/dr-ui/ui/icons.slint:366`](../../ui/dr-ui/ui/icons.slint#L366), [`ui/dr-ui/ui/session.slint:102`](../../ui/dr-ui/ui/session.slint#L102), [`ui/dr-ui/ui/session.slint:52`](../../ui/dr-ui/ui/session.slint#L52), [`ui/dr-ui/ui/spots.slint:191`](../../ui/dr-ui/ui/spots.slint#L191), [`ui/dr-ui/ui/spots.slint:49`](../../ui/dr-ui/ui/spots.slint#L49), [`ui/dr-ui/ui/spots.slint:6`](../../ui/dr-ui/ui/spots.slint#L6), [`ui/dr-ui/ui/spots.slint:91`](../../ui/dr-ui/ui/spots.slint#L91) |
| FR-DSP-1 | [`core/dr-gpu/src/adjust.rs:2366`](../../core/dr-gpu/src/adjust.rs#L2366), [`core/dr-gpu/src/adjust.rs:2443`](../../core/dr-gpu/src/adjust.rs#L2443), [`core/dr-gpu/src/adjust.rs:2528`](../../core/dr-gpu/src/adjust.rs#L2528), [`core/dr-gpu/src/adjust.rs:54`](../../core/dr-gpu/src/adjust.rs#L54), [`core/dr-gpu/src/adjust.rs:798`](../../core/dr-gpu/src/adjust.rs#L798), [`core/dr-gpu/src/lib.rs:174`](../../core/dr-gpu/src/lib.rs#L174), [`core/dr-gpu/src/lib.rs:194`](../../core/dr-gpu/src/lib.rs#L194), [`core/dr-gpu/src/lib.rs:72`](../../core/dr-gpu/src/lib.rs#L72), [`core/dr-gpu/src/lib.rs:95`](../../core/dr-gpu/src/lib.rs#L95), [`core/dr-gpu/tests/capture_sharpen.rs:200`](../../core/dr-gpu/tests/capture_sharpen.rs#L200), [`core/dr-gpu/tests/detail_stage.rs:328`](../../core/dr-gpu/tests/detail_stage.rs#L328), [`core/dr-gpu/tests/local_contrast.rs:264`](../../core/dr-gpu/tests/local_contrast.rs#L264), [`core/dr-gpu/tests/noise_reduction.rs:378`](../../core/dr-gpu/tests/noise_reduction.rs#L378), [`core/dr-pipeline/src/detail.rs:136`](../../core/dr-pipeline/src/detail.rs#L136), [`core/dr-pipeline/src/detail.rs:524`](../../core/dr-pipeline/src/detail.rs#L524), [`core/dr-pipeline/src/graph.rs:922`](../../core/dr-pipeline/src/graph.rs#L922), [`core/dr-pipeline/src/graph.rs:952`](../../core/dr-pipeline/src/graph.rs#L952), [`core/dr-pipeline/src/ops/capture_sharpen.rs:1`](../../core/dr-pipeline/src/ops/capture_sharpen.rs#L1), [`core/dr-pipeline/src/ops/capture_sharpen.rs:659`](../../core/dr-pipeline/src/ops/capture_sharpen.rs#L659), [`core/dr-pipeline/src/ops/dehaze.rs:1`](../../core/dr-pipeline/src/ops/dehaze.rs#L1), [`core/dr-pipeline/src/ops/dehaze.rs:592`](../../core/dr-pipeline/src/ops/dehaze.rs#L592), [`core/dr-pipeline/src/ops/local_contrast.rs:1`](../../core/dr-pipeline/src/ops/local_contrast.rs#L1), [`core/dr-pipeline/src/ops/local_contrast.rs:971`](../../core/dr-pipeline/src/ops/local_contrast.rs#L971), [`core/dr-pipeline/src/ops/noise_reduction.rs:700`](../../core/dr-pipeline/src/ops/noise_reduction.rs#L700), [`core/dr-pipeline/src/spot.rs:673`](../../core/dr-pipeline/src/spot.rs#L673), [`ui/dr-ui/src/develop/framing.rs:444`](../../ui/dr-ui/src/develop/framing.rs#L444), [`ui/dr-ui/src/develop/mod.rs:55`](../../ui/dr-ui/src/develop/mod.rs#L55), [`ui/dr-ui/src/develop/render.rs:140`](../../ui/dr-ui/src/develop/render.rs#L140), [`ui/dr-ui/src/develop/render.rs:940`](../../ui/dr-ui/src/develop/render.rs#L940), [`ui/dr-ui/src/develop/render.rs:974`](../../ui/dr-ui/src/develop/render.rs#L974), [`ui/dr-ui/src/lib.rs:101`](../../ui/dr-ui/src/lib.rs#L101), [`ui/dr-ui/src/lib.rs:1027`](../../ui/dr-ui/src/lib.rs#L1027), [`ui/dr-ui/src/lib.rs:1086`](../../ui/dr-ui/src/lib.rs#L1086) |
| FR-DSP-3 | [`core/dr-gpu/tests/frame_budget.rs:101`](../../core/dr-gpu/tests/frame_budget.rs#L101), [`core/dr-gpu/tests/local_contrast.rs:329`](../../core/dr-gpu/tests/local_contrast.rs#L329), [`core/dr-pipeline/src/ops/local_contrast.rs:447`](../../core/dr-pipeline/src/ops/local_contrast.rs#L447) |
| FR-DSP-5 | [`core/dr-gpu/tests/frame_budget.rs:101`](../../core/dr-gpu/tests/frame_budget.rs#L101), [`core/dr-gpu/tests/zoom_resolution.rs:135`](../../core/dr-gpu/tests/zoom_resolution.rs#L135), [`core/dr-gpu/tests/zoom_resolution.rs:166`](../../core/dr-gpu/tests/zoom_resolution.rs#L166), [`core/dr-gpu/tests/zoom_resolution.rs:1`](../../core/dr-gpu/tests/zoom_resolution.rs#L1), [`core/dr-gpu/tests/zoom_resolution.rs:216`](../../core/dr-gpu/tests/zoom_resolution.rs#L216) |
| FR-DSP-6 | [`core/dr-pipeline/src/operation.rs:527`](../../core/dr-pipeline/src/operation.rs#L527), [`core/dr-types/src/colour.rs:1`](../../core/dr-types/src/colour.rs#L1), [`ui/dr-ui/src/develop/render.rs:1316`](../../ui/dr-ui/src/develop/render.rs#L1316), [`ui/dr-ui/src/develop/render.rs:170`](../../ui/dr-ui/src/develop/render.rs#L170), [`ui/dr-ui/src/lib.rs:2145`](../../ui/dr-ui/src/lib.rs#L2145), [`ui/dr-ui/src/lib.rs:2929`](../../ui/dr-ui/src/lib.rs#L2929) |
| FR-DSP-7 | [`core/dr-gpu/src/histogram.rs:147`](../../core/dr-gpu/src/histogram.rs#L147), [`core/dr-gpu/src/histogram.rs:1`](../../core/dr-gpu/src/histogram.rs#L1), [`core/dr-gpu/src/histogram.rs:281`](../../core/dr-gpu/src/histogram.rs#L281), [`core/dr-gpu/src/histogram.rs:50`](../../core/dr-gpu/src/histogram.rs#L50), [`core/dr-gpu/src/shaders/histogram.wgsl:1`](../../core/dr-gpu/src/shaders/histogram.wgsl#L1), [`ui/dr-ui/src/develop/render.rs:1106`](../../ui/dr-ui/src/develop/render.rs#L1106), [`ui/dr-ui/src/develop/render.rs:1138`](../../ui/dr-ui/src/develop/render.rs#L1138), [`ui/dr-ui/src/develop/render.rs:224`](../../ui/dr-ui/src/develop/render.rs#L224), [`ui/dr-ui/src/develop/session.rs:112`](../../ui/dr-ui/src/develop/session.rs#L112), [`ui/dr-ui/src/histogram.rs:1`](../../ui/dr-ui/src/histogram.rs#L1), [`ui/dr-ui/src/lib.rs:2279`](../../ui/dr-ui/src/lib.rs#L2279), [`ui/dr-ui/src/lib.rs:431`](../../ui/dr-ui/src/lib.rs#L431), [`ui/dr-ui/ui/histogram.slint:184`](../../ui/dr-ui/ui/histogram.slint#L184), [`ui/dr-ui/ui/histogram.slint:1`](../../ui/dr-ui/ui/histogram.slint#L1) |
-| FR-DSP-8 | [`platform/dr-plat/src/display.rs:1`](../../platform/dr-plat/src/display.rs#L1), [`platform/dr-plat/src/display/icc.rs:1`](../../platform/dr-plat/src/display/icc.rs#L1), [`platform/dr-plat/src/display/wayland.rs:1`](../../platform/dr-plat/src/display/wayland.rs#L1), [`platform/dr-plat/src/display/x11.rs:1`](../../platform/dr-plat/src/display/x11.rs#L1), [`ui/dr-ui/src/develop/render.rs:116`](../../ui/dr-ui/src/develop/render.rs#L116), [`ui/dr-ui/src/develop/render.rs:1316`](../../ui/dr-ui/src/develop/render.rs#L1316), [`ui/dr-ui/src/develop/render.rs:1362`](../../ui/dr-ui/src/develop/render.rs#L1362), [`ui/dr-ui/src/develop/render.rs:1381`](../../ui/dr-ui/src/develop/render.rs#L1381), [`ui/dr-ui/src/develop/render.rs:170`](../../ui/dr-ui/src/develop/render.rs#L170), [`ui/dr-ui/src/develop/session.rs:265`](../../ui/dr-ui/src/develop/session.rs#L265), [`ui/dr-ui/src/display_ui.rs:192`](../../ui/dr-ui/src/display_ui.rs#L192), [`ui/dr-ui/src/display_ui.rs:1`](../../ui/dr-ui/src/display_ui.rs#L1), [`ui/dr-ui/src/display_ui.rs:325`](../../ui/dr-ui/src/display_ui.rs#L325), [`ui/dr-ui/src/display_ui.rs:346`](../../ui/dr-ui/src/display_ui.rs#L346), [`ui/dr-ui/src/display_ui.rs:379`](../../ui/dr-ui/src/display_ui.rs#L379), [`ui/dr-ui/src/lib.rs:1265`](../../ui/dr-ui/src/lib.rs#L1265), [`ui/dr-ui/src/lib.rs:2145`](../../ui/dr-ui/src/lib.rs#L2145), [`ui/dr-ui/src/lib.rs:2906`](../../ui/dr-ui/src/lib.rs#L2906), [`ui/dr-ui/src/lib.rs:2929`](../../ui/dr-ui/src/lib.rs#L2929), [`ui/dr-ui/ui/app.slint:103`](../../ui/dr-ui/ui/app.slint#L103), [`ui/dr-ui/ui/app.slint:2020`](../../ui/dr-ui/ui/app.slint#L2020), [`ui/dr-ui/ui/settings.slint:165`](../../ui/dr-ui/ui/settings.slint#L165), [`ui/dr-ui/ui/settings.slint:968`](../../ui/dr-ui/ui/settings.slint#L968) |
+| FR-DSP-8 | [`platform/dr-plat/src/display.rs:1`](../../platform/dr-plat/src/display.rs#L1), [`platform/dr-plat/src/display/icc.rs:1`](../../platform/dr-plat/src/display/icc.rs#L1), [`platform/dr-plat/src/display/wayland.rs:1`](../../platform/dr-plat/src/display/wayland.rs#L1), [`platform/dr-plat/src/display/x11.rs:1`](../../platform/dr-plat/src/display/x11.rs#L1), [`ui/dr-ui/src/develop/render.rs:116`](../../ui/dr-ui/src/develop/render.rs#L116), [`ui/dr-ui/src/develop/render.rs:1316`](../../ui/dr-ui/src/develop/render.rs#L1316), [`ui/dr-ui/src/develop/render.rs:1362`](../../ui/dr-ui/src/develop/render.rs#L1362), [`ui/dr-ui/src/develop/render.rs:1381`](../../ui/dr-ui/src/develop/render.rs#L1381), [`ui/dr-ui/src/develop/render.rs:170`](../../ui/dr-ui/src/develop/render.rs#L170), [`ui/dr-ui/src/develop/session.rs:265`](../../ui/dr-ui/src/develop/session.rs#L265), [`ui/dr-ui/src/display_ui.rs:192`](../../ui/dr-ui/src/display_ui.rs#L192), [`ui/dr-ui/src/display_ui.rs:1`](../../ui/dr-ui/src/display_ui.rs#L1), [`ui/dr-ui/src/display_ui.rs:325`](../../ui/dr-ui/src/display_ui.rs#L325), [`ui/dr-ui/src/display_ui.rs:346`](../../ui/dr-ui/src/display_ui.rs#L346), [`ui/dr-ui/src/display_ui.rs:379`](../../ui/dr-ui/src/display_ui.rs#L379), [`ui/dr-ui/src/lib.rs:1265`](../../ui/dr-ui/src/lib.rs#L1265), [`ui/dr-ui/src/lib.rs:2145`](../../ui/dr-ui/src/lib.rs#L2145), [`ui/dr-ui/src/lib.rs:2906`](../../ui/dr-ui/src/lib.rs#L2906), [`ui/dr-ui/src/lib.rs:2929`](../../ui/dr-ui/src/lib.rs#L2929), [`ui/dr-ui/ui/app.slint:104`](../../ui/dr-ui/ui/app.slint#L104), [`ui/dr-ui/ui/app.slint:1937`](../../ui/dr-ui/ui/app.slint#L1937), [`ui/dr-ui/ui/settings.slint:165`](../../ui/dr-ui/ui/settings.slint#L165), [`ui/dr-ui/ui/settings.slint:968`](../../ui/dr-ui/ui/settings.slint#L968) |
| FR-EXP-1 | [`core/dr-export/src/encode.rs:1`](../../core/dr-export/src/encode.rs#L1), [`core/dr-export/src/lib.rs:1`](../../core/dr-export/src/lib.rs#L1), [`core/dr-types/src/settings.rs:1`](../../core/dr-types/src/settings.rs#L1), [`ui/dr-ui/src/settings_ui.rs:1`](../../ui/dr-ui/src/settings_ui.rs#L1) |
| FR-EXP-2 | [`core/dr-export/src/encode.rs:1`](../../core/dr-export/src/encode.rs#L1), [`core/dr-export/src/error.rs:26`](../../core/dr-export/src/error.rs#L26), [`core/dr-export/src/icc.rs:1`](../../core/dr-export/src/icc.rs#L1), [`core/dr-export/src/lib.rs:157`](../../core/dr-export/src/lib.rs#L157), [`core/dr-export/src/lib.rs:1`](../../core/dr-export/src/lib.rs#L1), [`core/dr-export/src/lib.rs:57`](../../core/dr-export/src/lib.rs#L57), [`core/dr-gpu/src/adjust.rs:2676`](../../core/dr-gpu/src/adjust.rs#L2676), [`core/dr-pipeline/src/graph.rs:835`](../../core/dr-pipeline/src/graph.rs#L835), [`core/dr-pipeline/src/graph.rs:966`](../../core/dr-pipeline/src/graph.rs#L966), [`core/dr-pipeline/src/operation.rs:527`](../../core/dr-pipeline/src/operation.rs#L527), [`core/dr-types/src/colour.rs:1`](../../core/dr-types/src/colour.rs#L1), [`core/dr-types/src/settings.rs:1`](../../core/dr-types/src/settings.rs#L1), [`core/dr-types/src/settings.rs:963`](../../core/dr-types/src/settings.rs#L963), [`ui/dr-ui/src/develop/render.rs:1381`](../../ui/dr-ui/src/develop/render.rs#L1381), [`ui/dr-ui/src/settings_ui.rs:1`](../../ui/dr-ui/src/settings_ui.rs#L1) |
| FR-EXP-3 | [`core/dr-export/src/lib.rs:186`](../../core/dr-export/src/lib.rs#L186), [`core/dr-export/src/lib.rs:1`](../../core/dr-export/src/lib.rs#L1), [`core/dr-export/src/size.rs:136`](../../core/dr-export/src/size.rs#L136), [`core/dr-export/src/size.rs:1`](../../core/dr-export/src/size.rs#L1), [`core/dr-export/src/size.rs:25`](../../core/dr-export/src/size.rs#L25), [`core/dr-export/src/size.rs:84`](../../core/dr-export/src/size.rs#L84), [`core/dr-types/src/settings.rs:1008`](../../core/dr-types/src/settings.rs#L1008), [`core/dr-types/src/settings.rs:1016`](../../core/dr-types/src/settings.rs#L1016), [`core/dr-types/src/settings.rs:1032`](../../core/dr-types/src/settings.rs#L1032), [`core/dr-types/src/settings.rs:1101`](../../core/dr-types/src/settings.rs#L1101), [`core/dr-types/src/settings.rs:1129`](../../core/dr-types/src/settings.rs#L1129), [`core/dr-types/src/settings.rs:1140`](../../core/dr-types/src/settings.rs#L1140), [`core/dr-types/src/settings.rs:1146`](../../core/dr-types/src/settings.rs#L1146), [`core/dr-types/src/settings.rs:1`](../../core/dr-types/src/settings.rs#L1), [`ui/dr-ui/src/settings_ui.rs:1`](../../ui/dr-ui/src/settings_ui.rs#L1), [`ui/dr-ui/src/settings_ui.rs:274`](../../ui/dr-ui/src/settings_ui.rs#L274), [`ui/dr-ui/src/settings_ui.rs:287`](../../ui/dr-ui/src/settings_ui.rs#L287), [`ui/dr-ui/src/settings_ui.rs:302`](../../ui/dr-ui/src/settings_ui.rs#L302), [`ui/dr-ui/src/settings_ui.rs:727`](../../ui/dr-ui/src/settings_ui.rs#L727), [`ui/dr-ui/ui/settings.slint:851`](../../ui/dr-ui/ui/settings.slint#L851), [`ui/dr-ui/ui/settings.slint:861`](../../ui/dr-ui/ui/settings.slint#L861) |
| FR-EXP-4 | [`core/dr-export/src/lib.rs:1`](../../core/dr-export/src/lib.rs#L1), [`core/dr-export/src/sharpen.rs:1`](../../core/dr-export/src/sharpen.rs#L1), [`core/dr-export/src/size.rs:1`](../../core/dr-export/src/size.rs#L1), [`ui/dr-ui/src/settings_ui.rs:1`](../../ui/dr-ui/src/settings_ui.rs#L1) |
| FR-EXP-5 | [`ui/dr-ui/src/settings_store.rs:1`](../../ui/dr-ui/src/settings_store.rs#L1) |
| FR-EXP-6 | [`core/dr-export/src/lib.rs:1`](../../core/dr-export/src/lib.rs#L1), [`core/dr-export/src/name.rs:1`](../../core/dr-export/src/name.rs#L1), [`core/dr-types/src/settings.rs:1`](../../core/dr-types/src/settings.rs#L1), [`ui/dr-ui/src/export.rs:1`](../../ui/dr-ui/src/export.rs#L1), [`ui/dr-ui/src/lib.rs:608`](../../ui/dr-ui/src/lib.rs#L608), [`ui/dr-ui/src/settings_ui.rs:1`](../../ui/dr-ui/src/settings_ui.rs#L1), [`ui/dr-ui/src/settings_ui.rs:49`](../../ui/dr-ui/src/settings_ui.rs#L49), [`ui/dr-ui/src/settings_ui.rs:847`](../../ui/dr-ui/src/settings_ui.rs#L847) |
-| FR-EXP-7 | [`ui/dr-ui/src/activity.rs:83`](../../ui/dr-ui/src/activity.rs#L83), [`ui/dr-ui/src/develop_ui.rs:309`](../../ui/dr-ui/src/develop_ui.rs#L309), [`ui/dr-ui/src/export.rs:1005`](../../ui/dr-ui/src/export.rs#L1005), [`ui/dr-ui/src/export.rs:1`](../../ui/dr-ui/src/export.rs#L1), [`ui/dr-ui/src/lib.rs:269`](../../ui/dr-ui/src/lib.rs#L269), [`ui/dr-ui/src/lib.rs:608`](../../ui/dr-ui/src/lib.rs#L608), [`ui/dr-ui/src/lib.rs:654`](../../ui/dr-ui/src/lib.rs#L654), [`ui/dr-ui/src/lib.rs:681`](../../ui/dr-ui/src/lib.rs#L681), [`ui/dr-ui/src/library_ui.rs:4249`](../../ui/dr-ui/src/library_ui.rs#L4249), [`ui/dr-ui/src/library_ui.rs:721`](../../ui/dr-ui/src/library_ui.rs#L721), [`ui/dr-ui/src/library_ui.rs:8208`](../../ui/dr-ui/src/library_ui.rs#L8208), [`ui/dr-ui/src/library_ui.rs:821`](../../ui/dr-ui/src/library_ui.rs#L821), [`ui/dr-ui/src/library_ui.rs:8285`](../../ui/dr-ui/src/library_ui.rs#L8285), [`ui/dr-ui/src/library_ui.rs:8297`](../../ui/dr-ui/src/library_ui.rs#L8297), [`ui/dr-ui/src/library_ui.rs:878`](../../ui/dr-ui/src/library_ui.rs#L878), [`ui/dr-ui/ui/app.slint:1178`](../../ui/dr-ui/ui/app.slint#L1178), [`ui/dr-ui/ui/app.slint:1755`](../../ui/dr-ui/ui/app.slint#L1755), [`ui/dr-ui/ui/library.slint:1588`](../../ui/dr-ui/ui/library.slint#L1588), [`ui/dr-ui/ui/library.slint:4332`](../../ui/dr-ui/ui/library.slint#L4332) |
+| FR-EXP-7 | [`ui/dr-ui/src/activity.rs:83`](../../ui/dr-ui/src/activity.rs#L83), [`ui/dr-ui/src/develop_ui.rs:309`](../../ui/dr-ui/src/develop_ui.rs#L309), [`ui/dr-ui/src/export.rs:1005`](../../ui/dr-ui/src/export.rs#L1005), [`ui/dr-ui/src/export.rs:1`](../../ui/dr-ui/src/export.rs#L1), [`ui/dr-ui/src/lib.rs:269`](../../ui/dr-ui/src/lib.rs#L269), [`ui/dr-ui/src/lib.rs:608`](../../ui/dr-ui/src/lib.rs#L608), [`ui/dr-ui/src/lib.rs:654`](../../ui/dr-ui/src/lib.rs#L654), [`ui/dr-ui/src/lib.rs:681`](../../ui/dr-ui/src/lib.rs#L681), [`ui/dr-ui/src/library_ui.rs:4249`](../../ui/dr-ui/src/library_ui.rs#L4249), [`ui/dr-ui/src/library_ui.rs:721`](../../ui/dr-ui/src/library_ui.rs#L721), [`ui/dr-ui/src/library_ui.rs:8208`](../../ui/dr-ui/src/library_ui.rs#L8208), [`ui/dr-ui/src/library_ui.rs:821`](../../ui/dr-ui/src/library_ui.rs#L821), [`ui/dr-ui/src/library_ui.rs:8285`](../../ui/dr-ui/src/library_ui.rs#L8285), [`ui/dr-ui/src/library_ui.rs:8297`](../../ui/dr-ui/src/library_ui.rs#L8297), [`ui/dr-ui/src/library_ui.rs:878`](../../ui/dr-ui/src/library_ui.rs#L878), [`ui/dr-ui/ui/app.slint:1095`](../../ui/dr-ui/ui/app.slint#L1095), [`ui/dr-ui/ui/app.slint:1672`](../../ui/dr-ui/ui/app.slint#L1672), [`ui/dr-ui/ui/library.slint:1588`](../../ui/dr-ui/ui/library.slint#L1588), [`ui/dr-ui/ui/library.slint:4332`](../../ui/dr-ui/ui/library.slint#L4332) |
| FR-EXP-8 | [`core/dr-decode/src/lib.rs:366`](../../core/dr-decode/src/lib.rs#L366), [`core/dr-decode/src/lib.rs:390`](../../core/dr-decode/src/lib.rs#L390), [`core/dr-decode/src/lib.rs:404`](../../core/dr-decode/src/lib.rs#L404), [`core/dr-decode/src/lib.rs:71`](../../core/dr-decode/src/lib.rs#L71), [`core/dr-decode/src/lib.rs:79`](../../core/dr-decode/src/lib.rs#L79), [`core/dr-decode/src/lib.rs:82`](../../core/dr-decode/src/lib.rs#L82), [`core/dr-decode/src/locate.rs:1233`](../../core/dr-decode/src/locate.rs#L1233), [`core/dr-decode/src/locate.rs:1292`](../../core/dr-decode/src/locate.rs#L1292), [`core/dr-decode/src/locate.rs:359`](../../core/dr-decode/src/locate.rs#L359), [`core/dr-decode/src/locate.rs:556`](../../core/dr-decode/src/locate.rs#L556), [`core/dr-decode/src/locate.rs:640`](../../core/dr-decode/src/locate.rs#L640), [`core/dr-decode/src/locate.rs:653`](../../core/dr-decode/src/locate.rs#L653), [`core/dr-decode/src/locate.rs:736`](../../core/dr-decode/src/locate.rs#L736), [`core/dr-export/examples/export.rs:99`](../../core/dr-export/examples/export.rs#L99), [`core/dr-export/src/encode.rs:117`](../../core/dr-export/src/encode.rs#L117), [`core/dr-export/src/encode.rs:161`](../../core/dr-export/src/encode.rs#L161), [`core/dr-export/src/encode.rs:1`](../../core/dr-export/src/encode.rs#L1), [`core/dr-export/src/encode.rs:206`](../../core/dr-export/src/encode.rs#L206), [`core/dr-export/src/encode.rs:235`](../../core/dr-export/src/encode.rs#L235), [`core/dr-export/src/encode.rs:311`](../../core/dr-export/src/encode.rs#L311), [`core/dr-export/src/encode.rs:325`](../../core/dr-export/src/encode.rs#L325), [`core/dr-export/src/encode.rs:408`](../../core/dr-export/src/encode.rs#L408), [`core/dr-export/src/encode.rs:456`](../../core/dr-export/src/encode.rs#L456), [`core/dr-export/src/encode.rs:70`](../../core/dr-export/src/encode.rs#L70), [`core/dr-export/src/encode.rs:795`](../../core/dr-export/src/encode.rs#L795), [`core/dr-export/src/encode.rs:809`](../../core/dr-export/src/encode.rs#L809), [`core/dr-export/src/encode.rs:850`](../../core/dr-export/src/encode.rs#L850), [`core/dr-export/src/encode.rs:898`](../../core/dr-export/src/encode.rs#L898), [`core/dr-export/src/exif.rs:1`](../../core/dr-export/src/exif.rs#L1), [`core/dr-export/src/lib.rs:140`](../../core/dr-export/src/lib.rs#L140), [`core/dr-export/src/metadata.rs:1`](../../core/dr-export/src/metadata.rs#L1), [`core/dr-export/src/metadata.rs:41`](../../core/dr-export/src/metadata.rs#L41), [`core/dr-export/src/metadata.rs:74`](../../core/dr-export/src/metadata.rs#L74), [`core/dr-types/src/lib.rs:655`](../../core/dr-types/src/lib.rs#L655), [`core/dr-types/src/settings.rs:671`](../../core/dr-types/src/settings.rs#L671), [`ui/dr-ui/src/develop/session.rs:37`](../../ui/dr-ui/src/develop/session.rs#L37), [`ui/dr-ui/src/develop/session.rs:412`](../../ui/dr-ui/src/develop/session.rs#L412), [`ui/dr-ui/src/develop/session.rs:524`](../../ui/dr-ui/src/develop/session.rs#L524), [`ui/dr-ui/src/export.rs:474`](../../ui/dr-ui/src/export.rs#L474), [`ui/dr-ui/src/export.rs:641`](../../ui/dr-ui/src/export.rs#L641), [`ui/dr-ui/src/export.rs:687`](../../ui/dr-ui/src/export.rs#L687), [`ui/dr-ui/src/export.rs:715`](../../ui/dr-ui/src/export.rs#L715), [`ui/dr-ui/src/export.rs:839`](../../ui/dr-ui/src/export.rs#L839), [`ui/dr-ui/src/export.rs:857`](../../ui/dr-ui/src/export.rs#L857), [`ui/dr-ui/src/lib.rs:269`](../../ui/dr-ui/src/lib.rs#L269), [`ui/dr-ui/src/lib.rs:292`](../../ui/dr-ui/src/lib.rs#L292), [`ui/dr-ui/src/lib.rs:640`](../../ui/dr-ui/src/lib.rs#L640), [`ui/dr-ui/src/settings_ui.rs:1`](../../ui/dr-ui/src/settings_ui.rs#L1) |
| FR-EXP-9 | [`core/dr-decode/src/lib.rs:546`](../../core/dr-decode/src/lib.rs#L546), [`core/dr-export/src/lib.rs:132`](../../core/dr-export/src/lib.rs#L132), [`core/dr-export/src/lib.rs:1`](../../core/dr-export/src/lib.rs#L1), [`core/dr-gpu/src/adjust.rs:1134`](../../core/dr-gpu/src/adjust.rs#L1134), [`ui/dr-ui/examples/face_native.rs:1`](../../ui/dr-ui/examples/face_native.rs#L1), [`ui/dr-ui/src/develop/mask_ops.rs:1130`](../../ui/dr-ui/src/develop/mask_ops.rs#L1130), [`ui/dr-ui/src/develop/render.rs:546`](../../ui/dr-ui/src/develop/render.rs#L546), [`ui/dr-ui/src/develop/render.rs:584`](../../ui/dr-ui/src/develop/render.rs#L584), [`ui/dr-ui/src/lib.rs:608`](../../ui/dr-ui/src/lib.rs#L608), [`ui/dr-ui/src/library/sweep.rs:506`](../../ui/dr-ui/src/library/sweep.rs#L506), [`ui/dr-ui/tests/export_ignores_the_viewport.rs:1`](../../ui/dr-ui/tests/export_ignores_the_viewport.rs#L1) |
-| FR-MRG-1 | [`core/dr-pano/src/align.rs:1`](../../core/dr-pano/src/align.rs#L1), [`core/dr-pano/src/lib.rs:1`](../../core/dr-pano/src/lib.rs#L1), [`ui/dr-ui/src/lib.rs:1820`](../../ui/dr-ui/src/lib.rs#L1820), [`ui/dr-ui/src/merge.rs:1`](../../ui/dr-ui/src/merge.rs#L1), [`ui/dr-ui/src/merge_ui.rs:1`](../../ui/dr-ui/src/merge_ui.rs#L1), [`ui/dr-ui/ui/app.slint:1760`](../../ui/dr-ui/ui/app.slint#L1760), [`ui/dr-ui/ui/app.slint:869`](../../ui/dr-ui/ui/app.slint#L869), [`ui/dr-ui/ui/library.slint:1596`](../../ui/dr-ui/ui/library.slint#L1596), [`ui/dr-ui/ui/library.slint:4277`](../../ui/dr-ui/ui/library.slint#L4277), [`ui/dr-ui/ui/merge.slint:1`](../../ui/dr-ui/ui/merge.slint#L1) |
+| FR-MRG-1 | [`core/dr-pano/src/align.rs:1`](../../core/dr-pano/src/align.rs#L1), [`core/dr-pano/src/lib.rs:1`](../../core/dr-pano/src/lib.rs#L1), [`ui/dr-ui/src/lib.rs:1820`](../../ui/dr-ui/src/lib.rs#L1820), [`ui/dr-ui/src/merge.rs:1`](../../ui/dr-ui/src/merge.rs#L1), [`ui/dr-ui/src/merge_ui.rs:1`](../../ui/dr-ui/src/merge_ui.rs#L1), [`ui/dr-ui/ui/app.slint:1677`](../../ui/dr-ui/ui/app.slint#L1677), [`ui/dr-ui/ui/app.slint:786`](../../ui/dr-ui/ui/app.slint#L786), [`ui/dr-ui/ui/library.slint:1596`](../../ui/dr-ui/ui/library.slint#L1596), [`ui/dr-ui/ui/library.slint:4277`](../../ui/dr-ui/ui/library.slint#L4277), [`ui/dr-ui/ui/merge.slint:1`](../../ui/dr-ui/ui/merge.slint#L1) |
| FR-MRG-10 | [`core/dr-gpu/src/merge.rs:1`](../../core/dr-gpu/src/merge.rs#L1), [`core/dr-gpu/src/shaders/merge.wgsl:1`](../../core/dr-gpu/src/shaders/merge.wgsl#L1), [`core/dr-pano/src/lib.rs:1`](../../core/dr-pano/src/lib.rs#L1) |
| FR-MRG-11 | [`core/dr-gpu/src/merge.rs:1`](../../core/dr-gpu/src/merge.rs#L1), [`core/dr-gpu/src/shaders/merge.wgsl:1`](../../core/dr-gpu/src/shaders/merge.wgsl#L1) |
| FR-MRG-2 | [`core/dr-gpu/src/adjust.rs:104`](../../core/dr-gpu/src/adjust.rs#L104), [`core/dr-gpu/src/adjust.rs:1157`](../../core/dr-gpu/src/adjust.rs#L1157), [`core/dr-gpu/src/adjust.rs:1276`](../../core/dr-gpu/src/adjust.rs#L1276), [`core/dr-gpu/src/adjust.rs:316`](../../core/dr-gpu/src/adjust.rs#L316), [`core/dr-pipeline/src/graph.rs:852`](../../core/dr-pipeline/src/graph.rs#L852), [`core/dr-pipeline/src/operation.rs:2183`](../../core/dr-pipeline/src/operation.rs#L2183), [`core/dr-pipeline/src/operation.rs:427`](../../core/dr-pipeline/src/operation.rs#L427), [`core/dr-pipeline/src/operation.rs:612`](../../core/dr-pipeline/src/operation.rs#L612), [`core/dr-pipeline/src/operation.rs:916`](../../core/dr-pipeline/src/operation.rs#L916), [`ui/dr-ui/src/merge.rs:1`](../../ui/dr-ui/src/merge.rs#L1) |
@@ -108,20 +108,20 @@ A tag naming an ID `requirements.md` does not define — what renumbering produc
| FR-MRG-4 | [`core/dr-export/src/inscribed.rs:1`](../../core/dr-export/src/inscribed.rs#L1), [`core/dr-pano/src/fill.rs:1`](../../core/dr-pano/src/fill.rs#L1), [`core/dr-pano/src/migan.rs:1`](../../core/dr-pano/src/migan.rs#L1), [`core/dr-pano/src/projection.rs:1`](../../core/dr-pano/src/projection.rs#L1), [`ui/dr-ui/src/library/paths.rs:344`](../../ui/dr-ui/src/library/paths.rs#L344), [`ui/dr-ui/src/library/paths.rs:348`](../../ui/dr-ui/src/library/paths.rs#L348), [`ui/dr-ui/src/merge.rs:143`](../../ui/dr-ui/src/merge.rs#L143), [`ui/dr-ui/src/merge_ui.rs:1`](../../ui/dr-ui/src/merge_ui.rs#L1), [`ui/dr-ui/ui/merge.slint:1`](../../ui/dr-ui/ui/merge.slint#L1), [`ui/dr-ui/ui/merge.slint:46`](../../ui/dr-ui/ui/merge.slint#L46) |
| FR-MRG-5 | [`core/dr-pano/src/align.rs:1`](../../core/dr-pano/src/align.rs#L1), [`ui/dr-ui/src/merge.rs:1`](../../ui/dr-ui/src/merge.rs#L1), [`ui/dr-ui/src/merge_ui.rs:1`](../../ui/dr-ui/src/merge_ui.rs#L1), [`ui/dr-ui/ui/merge.slint:1`](../../ui/dr-ui/ui/merge.slint#L1) |
| FR-MRG-6 | [`core/dr-pipeline/src/sidecar.rs:1033`](../../core/dr-pipeline/src/sidecar.rs#L1033), [`core/dr-pipeline/src/sidecar.rs:113`](../../core/dr-pipeline/src/sidecar.rs#L113), [`core/dr-pipeline/src/sidecar.rs:123`](../../core/dr-pipeline/src/sidecar.rs#L123), [`core/dr-pipeline/src/sidecar.rs:2241`](../../core/dr-pipeline/src/sidecar.rs#L2241), [`core/dr-pipeline/src/sidecar.rs:841`](../../core/dr-pipeline/src/sidecar.rs#L841), [`ui/dr-ui/src/merge.rs:842`](../../ui/dr-ui/src/merge.rs#L842) |
-| FR-MRG-7 | [`ui/dr-ui/src/merge.rs:1`](../../ui/dr-ui/src/merge.rs#L1), [`ui/dr-ui/src/merge_ui.rs:1`](../../ui/dr-ui/src/merge_ui.rs#L1), [`ui/dr-ui/ui/app.slint:869`](../../ui/dr-ui/ui/app.slint#L869), [`ui/dr-ui/ui/merge.slint:1`](../../ui/dr-ui/ui/merge.slint#L1) |
+| FR-MRG-7 | [`ui/dr-ui/src/merge.rs:1`](../../ui/dr-ui/src/merge.rs#L1), [`ui/dr-ui/src/merge_ui.rs:1`](../../ui/dr-ui/src/merge_ui.rs#L1), [`ui/dr-ui/ui/app.slint:786`](../../ui/dr-ui/ui/app.slint#L786), [`ui/dr-ui/ui/merge.slint:1`](../../ui/dr-ui/ui/merge.slint#L1) |
| FR-MRG-8 | [`core/dr-pano/src/xfeat.rs:1`](../../core/dr-pano/src/xfeat.rs#L1), [`core/dr-segment/examples/onnx_probe.rs:1`](../../core/dr-segment/examples/onnx_probe.rs#L1) |
| FR-NC-1 | [`core/dr-sync-nextcloud/src/auth.rs:132`](../../core/dr-sync-nextcloud/src/auth.rs#L132), [`core/dr-sync-nextcloud/src/auth.rs:44`](../../core/dr-sync-nextcloud/src/auth.rs#L44), [`core/dr-sync-nextcloud/src/provider.rs:1`](../../core/dr-sync-nextcloud/src/provider.rs#L1), [`core/dr-sync/src/account.rs:375`](../../core/dr-sync/src/account.rs#L375), [`ui/dr-ui/src/launch.rs:316`](../../ui/dr-ui/src/launch.rs#L316), [`ui/dr-ui/src/launch.rs:61`](../../ui/dr-ui/src/launch.rs#L61), [`ui/dr-ui/src/launch_ui.rs:446`](../../ui/dr-ui/src/launch_ui.rs#L446) |
| FR-NC-10 | [`core/dr-sync/src/account.rs:240`](../../core/dr-sync/src/account.rs#L240), [`ui/dr-ui/src/export.rs:1`](../../ui/dr-ui/src/export.rs#L1), [`ui/dr-ui/src/lib.rs:681`](../../ui/dr-ui/src/lib.rs#L681), [`ui/dr-ui/src/library/paths.rs:69`](../../ui/dr-ui/src/library/paths.rs#L69), [`ui/dr-ui/src/library/sidecar.rs:100`](../../ui/dr-ui/src/library/sidecar.rs#L100), [`ui/dr-ui/src/library/sidecar.rs:427`](../../ui/dr-ui/src/library/sidecar.rs#L427), [`ui/dr-ui/src/library/thumbnails_fetch.rs:449`](../../ui/dr-ui/src/library/thumbnails_fetch.rs#L449), [`ui/dr-ui/src/library_ui.rs:2057`](../../ui/dr-ui/src/library_ui.rs#L2057), [`ui/dr-ui/src/library_ui.rs:4249`](../../ui/dr-ui/src/library_ui.rs#L4249), [`ui/dr-ui/src/library_ui.rs:662`](../../ui/dr-ui/src/library_ui.rs#L662), [`ui/dr-ui/src/sidecar_cache.rs:1`](../../ui/dr-ui/src/sidecar_cache.rs#L1) |
| 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:1049`](../../core/dr-sync-nextcloud/src/lib.rs#L1049), [`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:106`](../../core/dr-sync/src/provider.rs#L106), [`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:106`](../../core/dr-sync/src/provider.rs#L106), [`ui/dr-ui/src/launch_ui.rs:345`](../../ui/dr-ui/src/launch_ui.rs#L345), [`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/library/mod.rs:1`](../../ui/dr-ui/src/library/mod.rs#L1), [`ui/dr-ui/src/library/sweep.rs:557`](../../ui/dr-ui/src/library/sweep.rs#L557), [`ui/dr-ui/src/library_ui.rs:1`](../../ui/dr-ui/src/library_ui.rs#L1), [`ui/dr-ui/src/library_ui.rs:4515`](../../ui/dr-ui/src/library_ui.rs#L4515), [`ui/dr-ui/src/library_ui.rs:6053`](../../ui/dr-ui/src/library_ui.rs#L6053), [`ui/dr-ui/ui/app.slint:429`](../../ui/dr-ui/ui/app.slint#L429), [`ui/dr-ui/ui/settings.slint:435`](../../ui/dr-ui/ui/settings.slint#L435), [`ui/dr-ui/ui/settings.slint:73`](../../ui/dr-ui/ui/settings.slint#L73) |
+| 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/library/mod.rs:1`](../../ui/dr-ui/src/library/mod.rs#L1), [`ui/dr-ui/src/library/sweep.rs:557`](../../ui/dr-ui/src/library/sweep.rs#L557), [`ui/dr-ui/src/library_ui.rs:1`](../../ui/dr-ui/src/library_ui.rs#L1), [`ui/dr-ui/src/library_ui.rs:4515`](../../ui/dr-ui/src/library_ui.rs#L4515), [`ui/dr-ui/src/library_ui.rs:6053`](../../ui/dr-ui/src/library_ui.rs#L6053), [`ui/dr-ui/ui/app.slint:430`](../../ui/dr-ui/ui/app.slint#L430), [`ui/dr-ui/ui/settings.slint:435`](../../ui/dr-ui/ui/settings.slint#L435), [`ui/dr-ui/ui/settings.slint:73`](../../ui/dr-ui/ui/settings.slint#L73) |
| 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:488`](../../ui/dr-ui/src/import.rs#L488) |
| FR-NC-6 | [`ui/dr-ui/src/activity.rs:1`](../../ui/dr-ui/src/activity.rs#L1) |
-| FR-NC-6a | [`core/dr-catalog/src/cache.rs:1`](../../core/dr-catalog/src/cache.rs#L1), [`core/dr-catalog/src/cache.rs:225`](../../core/dr-catalog/src/cache.rs#L225), [`core/dr-catalog/src/schema.rs:1182`](../../core/dr-catalog/src/schema.rs#L1182), [`core/dr-catalog/src/schema.rs:1637`](../../core/dr-catalog/src/schema.rs#L1637), [`core/dr-sync-folder/src/borrow.rs:1`](../../core/dr-sync-folder/src/borrow.rs#L1), [`core/dr-types/src/selector.rs:1`](../../core/dr-types/src/selector.rs#L1), [`core/dr-types/src/settings.rs:1`](../../core/dr-types/src/settings.rs#L1), [`ui/dr-ui/src/collections_ui/rename_menu.rs:61`](../../ui/dr-ui/src/collections_ui/rename_menu.rs#L61), [`ui/dr-ui/src/collections_ui/tree_sync.rs:107`](../../ui/dr-ui/src/collections_ui/tree_sync.rs#L107), [`ui/dr-ui/src/collections_ui/tree_sync.rs:36`](../../ui/dr-ui/src/collections_ui/tree_sync.rs#L36), [`ui/dr-ui/src/collections_ui/tree_sync.rs:377`](../../ui/dr-ui/src/collections_ui/tree_sync.rs#L377), [`ui/dr-ui/src/collections_ui/wiring_tree.rs:512`](../../ui/dr-ui/src/collections_ui/wiring_tree.rs#L512), [`ui/dr-ui/src/lib.rs:1572`](../../ui/dr-ui/src/lib.rs#L1572), [`ui/dr-ui/src/lib.rs:2721`](../../ui/dr-ui/src/lib.rs#L2721), [`ui/dr-ui/src/lib.rs:2792`](../../ui/dr-ui/src/lib.rs#L2792), [`ui/dr-ui/src/lib.rs:3010`](../../ui/dr-ui/src/lib.rs#L3010), [`ui/dr-ui/src/lib.rs:3011`](../../ui/dr-ui/src/lib.rs#L3011), [`ui/dr-ui/src/lib.rs:3050`](../../ui/dr-ui/src/lib.rs#L3050), [`ui/dr-ui/src/library/thumbnails_fetch.rs:118`](../../ui/dr-ui/src/library/thumbnails_fetch.rs#L118), [`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:574`](../../ui/dr-ui/src/library/thumbnails_fetch.rs#L574), [`ui/dr-ui/src/library/thumbnails_fetch.rs:711`](../../ui/dr-ui/src/library/thumbnails_fetch.rs#L711), [`ui/dr-ui/src/library/thumbnails_fetch.rs:726`](../../ui/dr-ui/src/library/thumbnails_fetch.rs#L726), [`ui/dr-ui/src/library/thumbnails_fetch.rs:95`](../../ui/dr-ui/src/library/thumbnails_fetch.rs#L95), [`ui/dr-ui/src/library_ui.rs:1482`](../../ui/dr-ui/src/library_ui.rs#L1482), [`ui/dr-ui/src/library_ui.rs:1555`](../../ui/dr-ui/src/library_ui.rs#L1555), [`ui/dr-ui/src/library_ui.rs:1656`](../../ui/dr-ui/src/library_ui.rs#L1656), [`ui/dr-ui/src/library_ui.rs:1711`](../../ui/dr-ui/src/library_ui.rs#L1711), [`ui/dr-ui/src/library_ui.rs:1846`](../../ui/dr-ui/src/library_ui.rs#L1846), [`ui/dr-ui/src/library_ui.rs:1964`](../../ui/dr-ui/src/library_ui.rs#L1964), [`ui/dr-ui/src/library_ui.rs:2731`](../../ui/dr-ui/src/library_ui.rs#L2731), [`ui/dr-ui/src/library_ui.rs:344`](../../ui/dr-ui/src/library_ui.rs#L344), [`ui/dr-ui/src/library_ui.rs:355`](../../ui/dr-ui/src/library_ui.rs#L355), [`ui/dr-ui/src/library_ui.rs:370`](../../ui/dr-ui/src/library_ui.rs#L370), [`ui/dr-ui/src/library_ui.rs:379`](../../ui/dr-ui/src/library_ui.rs#L379), [`ui/dr-ui/src/library_ui.rs:387`](../../ui/dr-ui/src/library_ui.rs#L387), [`ui/dr-ui/src/library_ui.rs:517`](../../ui/dr-ui/src/library_ui.rs#L517), [`ui/dr-ui/src/library_ui.rs:527`](../../ui/dr-ui/src/library_ui.rs#L527), [`ui/dr-ui/src/library_ui.rs:542`](../../ui/dr-ui/src/library_ui.rs#L542), [`ui/dr-ui/src/library_ui.rs:589`](../../ui/dr-ui/src/library_ui.rs#L589), [`ui/dr-ui/src/library_ui.rs:604`](../../ui/dr-ui/src/library_ui.rs#L604), [`ui/dr-ui/src/library_ui.rs:678`](../../ui/dr-ui/src/library_ui.rs#L678), [`ui/dr-ui/src/library_ui.rs:6945`](../../ui/dr-ui/src/library_ui.rs#L6945), [`ui/dr-ui/src/library_ui.rs:6963`](../../ui/dr-ui/src/library_ui.rs#L6963), [`ui/dr-ui/src/library_ui.rs:709`](../../ui/dr-ui/src/library_ui.rs#L709), [`ui/dr-ui/src/library_ui.rs:721`](../../ui/dr-ui/src/library_ui.rs#L721), [`ui/dr-ui/src/settings_store.rs:1`](../../ui/dr-ui/src/settings_store.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:1`](../../ui/dr-ui/src/settings_ui.rs#L1), [`ui/dr-ui/src/settings_ui.rs:542`](../../ui/dr-ui/src/settings_ui.rs#L542), [`ui/dr-ui/ui/app.slint:1649`](../../ui/dr-ui/ui/app.slint#L1649), [`ui/dr-ui/ui/app.slint:3202`](../../ui/dr-ui/ui/app.slint#L3202), [`ui/dr-ui/ui/app.slint:582`](../../ui/dr-ui/ui/app.slint#L582), [`ui/dr-ui/ui/app.slint:590`](../../ui/dr-ui/ui/app.slint#L590), [`ui/dr-ui/ui/app.slint:596`](../../ui/dr-ui/ui/app.slint#L596), [`ui/dr-ui/ui/collections.slint:1037`](../../ui/dr-ui/ui/collections.slint#L1037), [`ui/dr-ui/ui/collections.slint:1048`](../../ui/dr-ui/ui/collections.slint#L1048), [`ui/dr-ui/ui/collections.slint:1127`](../../ui/dr-ui/ui/collections.slint#L1127), [`ui/dr-ui/ui/collections.slint:272`](../../ui/dr-ui/ui/collections.slint#L272), [`ui/dr-ui/ui/collections.slint:424`](../../ui/dr-ui/ui/collections.slint#L424), [`ui/dr-ui/ui/collections.slint:433`](../../ui/dr-ui/ui/collections.slint#L433), [`ui/dr-ui/ui/collections.slint:436`](../../ui/dr-ui/ui/collections.slint#L436), [`ui/dr-ui/ui/collections.slint:482`](../../ui/dr-ui/ui/collections.slint#L482), [`ui/dr-ui/ui/collections.slint:52`](../../ui/dr-ui/ui/collections.slint#L52), [`ui/dr-ui/ui/collections.slint:720`](../../ui/dr-ui/ui/collections.slint#L720), [`ui/dr-ui/ui/collections.slint:877`](../../ui/dr-ui/ui/collections.slint#L877), [`ui/dr-ui/ui/collections.slint:91`](../../ui/dr-ui/ui/collections.slint#L91), [`ui/dr-ui/ui/icons.slint:262`](../../ui/dr-ui/ui/icons.slint#L262), [`ui/dr-ui/ui/settings.slint:114`](../../ui/dr-ui/ui/settings.slint#L114), [`ui/dr-ui/ui/settings.slint:656`](../../ui/dr-ui/ui/settings.slint#L656) |
+| FR-NC-6a | [`core/dr-catalog/src/cache.rs:1`](../../core/dr-catalog/src/cache.rs#L1), [`core/dr-catalog/src/cache.rs:225`](../../core/dr-catalog/src/cache.rs#L225), [`core/dr-catalog/src/schema.rs:1182`](../../core/dr-catalog/src/schema.rs#L1182), [`core/dr-catalog/src/schema.rs:1637`](../../core/dr-catalog/src/schema.rs#L1637), [`core/dr-sync-folder/src/borrow.rs:1`](../../core/dr-sync-folder/src/borrow.rs#L1), [`core/dr-types/src/selector.rs:1`](../../core/dr-types/src/selector.rs#L1), [`core/dr-types/src/settings.rs:1`](../../core/dr-types/src/settings.rs#L1), [`ui/dr-ui/src/collections_ui/rename_menu.rs:75`](../../ui/dr-ui/src/collections_ui/rename_menu.rs#L75), [`ui/dr-ui/src/collections_ui/tree_sync.rs:111`](../../ui/dr-ui/src/collections_ui/tree_sync.rs#L111), [`ui/dr-ui/src/collections_ui/tree_sync.rs:385`](../../ui/dr-ui/src/collections_ui/tree_sync.rs#L385), [`ui/dr-ui/src/collections_ui/tree_sync.rs:38`](../../ui/dr-ui/src/collections_ui/tree_sync.rs#L38), [`ui/dr-ui/src/collections_ui/wiring_tree.rs:555`](../../ui/dr-ui/src/collections_ui/wiring_tree.rs#L555), [`ui/dr-ui/src/lib.rs:1572`](../../ui/dr-ui/src/lib.rs#L1572), [`ui/dr-ui/src/lib.rs:2721`](../../ui/dr-ui/src/lib.rs#L2721), [`ui/dr-ui/src/lib.rs:2792`](../../ui/dr-ui/src/lib.rs#L2792), [`ui/dr-ui/src/lib.rs:3010`](../../ui/dr-ui/src/lib.rs#L3010), [`ui/dr-ui/src/lib.rs:3011`](../../ui/dr-ui/src/lib.rs#L3011), [`ui/dr-ui/src/lib.rs:3050`](../../ui/dr-ui/src/lib.rs#L3050), [`ui/dr-ui/src/library/thumbnails_fetch.rs:118`](../../ui/dr-ui/src/library/thumbnails_fetch.rs#L118), [`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:574`](../../ui/dr-ui/src/library/thumbnails_fetch.rs#L574), [`ui/dr-ui/src/library/thumbnails_fetch.rs:711`](../../ui/dr-ui/src/library/thumbnails_fetch.rs#L711), [`ui/dr-ui/src/library/thumbnails_fetch.rs:726`](../../ui/dr-ui/src/library/thumbnails_fetch.rs#L726), [`ui/dr-ui/src/library/thumbnails_fetch.rs:95`](../../ui/dr-ui/src/library/thumbnails_fetch.rs#L95), [`ui/dr-ui/src/library_ui.rs:1482`](../../ui/dr-ui/src/library_ui.rs#L1482), [`ui/dr-ui/src/library_ui.rs:1555`](../../ui/dr-ui/src/library_ui.rs#L1555), [`ui/dr-ui/src/library_ui.rs:1656`](../../ui/dr-ui/src/library_ui.rs#L1656), [`ui/dr-ui/src/library_ui.rs:1711`](../../ui/dr-ui/src/library_ui.rs#L1711), [`ui/dr-ui/src/library_ui.rs:1846`](../../ui/dr-ui/src/library_ui.rs#L1846), [`ui/dr-ui/src/library_ui.rs:1964`](../../ui/dr-ui/src/library_ui.rs#L1964), [`ui/dr-ui/src/library_ui.rs:2731`](../../ui/dr-ui/src/library_ui.rs#L2731), [`ui/dr-ui/src/library_ui.rs:344`](../../ui/dr-ui/src/library_ui.rs#L344), [`ui/dr-ui/src/library_ui.rs:355`](../../ui/dr-ui/src/library_ui.rs#L355), [`ui/dr-ui/src/library_ui.rs:370`](../../ui/dr-ui/src/library_ui.rs#L370), [`ui/dr-ui/src/library_ui.rs:379`](../../ui/dr-ui/src/library_ui.rs#L379), [`ui/dr-ui/src/library_ui.rs:387`](../../ui/dr-ui/src/library_ui.rs#L387), [`ui/dr-ui/src/library_ui.rs:517`](../../ui/dr-ui/src/library_ui.rs#L517), [`ui/dr-ui/src/library_ui.rs:527`](../../ui/dr-ui/src/library_ui.rs#L527), [`ui/dr-ui/src/library_ui.rs:542`](../../ui/dr-ui/src/library_ui.rs#L542), [`ui/dr-ui/src/library_ui.rs:589`](../../ui/dr-ui/src/library_ui.rs#L589), [`ui/dr-ui/src/library_ui.rs:604`](../../ui/dr-ui/src/library_ui.rs#L604), [`ui/dr-ui/src/library_ui.rs:678`](../../ui/dr-ui/src/library_ui.rs#L678), [`ui/dr-ui/src/library_ui.rs:6945`](../../ui/dr-ui/src/library_ui.rs#L6945), [`ui/dr-ui/src/library_ui.rs:6963`](../../ui/dr-ui/src/library_ui.rs#L6963), [`ui/dr-ui/src/library_ui.rs:709`](../../ui/dr-ui/src/library_ui.rs#L709), [`ui/dr-ui/src/library_ui.rs:721`](../../ui/dr-ui/src/library_ui.rs#L721), [`ui/dr-ui/src/settings_store.rs:1`](../../ui/dr-ui/src/settings_store.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:1`](../../ui/dr-ui/src/settings_ui.rs#L1), [`ui/dr-ui/src/settings_ui.rs:542`](../../ui/dr-ui/src/settings_ui.rs#L542), [`ui/dr-ui/ui/app.slint:1566`](../../ui/dr-ui/ui/app.slint#L1566), [`ui/dr-ui/ui/app.slint:3119`](../../ui/dr-ui/ui/app.slint#L3119), [`ui/dr-ui/ui/app.slint:558`](../../ui/dr-ui/ui/app.slint#L558), [`ui/dr-ui/ui/collections.slint:1037`](../../ui/dr-ui/ui/collections.slint#L1037), [`ui/dr-ui/ui/collections.slint:1048`](../../ui/dr-ui/ui/collections.slint#L1048), [`ui/dr-ui/ui/collections.slint:1127`](../../ui/dr-ui/ui/collections.slint#L1127), [`ui/dr-ui/ui/collections.slint:1228`](../../ui/dr-ui/ui/collections.slint#L1228), [`ui/dr-ui/ui/collections.slint:1236`](../../ui/dr-ui/ui/collections.slint#L1236), [`ui/dr-ui/ui/collections.slint:272`](../../ui/dr-ui/ui/collections.slint#L272), [`ui/dr-ui/ui/collections.slint:424`](../../ui/dr-ui/ui/collections.slint#L424), [`ui/dr-ui/ui/collections.slint:433`](../../ui/dr-ui/ui/collections.slint#L433), [`ui/dr-ui/ui/collections.slint:436`](../../ui/dr-ui/ui/collections.slint#L436), [`ui/dr-ui/ui/collections.slint:482`](../../ui/dr-ui/ui/collections.slint#L482), [`ui/dr-ui/ui/collections.slint:52`](../../ui/dr-ui/ui/collections.slint#L52), [`ui/dr-ui/ui/collections.slint:720`](../../ui/dr-ui/ui/collections.slint#L720), [`ui/dr-ui/ui/collections.slint:877`](../../ui/dr-ui/ui/collections.slint#L877), [`ui/dr-ui/ui/collections.slint:91`](../../ui/dr-ui/ui/collections.slint#L91), [`ui/dr-ui/ui/icons.slint:262`](../../ui/dr-ui/ui/icons.slint#L262), [`ui/dr-ui/ui/settings.slint:114`](../../ui/dr-ui/ui/settings.slint#L114), [`ui/dr-ui/ui/settings.slint:656`](../../ui/dr-ui/ui/settings.slint#L656) |
| FR-NC-6b | [`ui/dr-ui/src/library_ui.rs:1711`](../../ui/dr-ui/src/library_ui.rs#L1711), [`ui/dr-ui/src/memory.rs:1`](../../ui/dr-ui/src/memory.rs#L1) |
-| FR-NC-6c | [`core/dr-catalog/src/cache.rs:225`](../../core/dr-catalog/src/cache.rs#L225), [`core/dr-sync-folder/src/borrow.rs:1`](../../core/dr-sync-folder/src/borrow.rs#L1), [`core/dr-sync-folder/src/lib.rs:197`](../../core/dr-sync-folder/src/lib.rs#L197), [`core/dr-sync-folder/src/lib.rs:73`](../../core/dr-sync-folder/src/lib.rs#L73), [`core/dr-sync-folder/src/lib.rs:818`](../../core/dr-sync-folder/src/lib.rs#L818), [`core/dr-sync-folder/src/lib.rs:857`](../../core/dr-sync-folder/src/lib.rs#L857), [`core/dr-sync-folder/src/vfs.rs:1`](../../core/dr-sync-folder/src/vfs.rs#L1), [`core/dr-sync-nextcloud/src/desktop_client.rs:172`](../../core/dr-sync-nextcloud/src/desktop_client.rs#L172), [`core/dr-sync-nextcloud/src/desktop_client.rs:35`](../../core/dr-sync-nextcloud/src/desktop_client.rs#L35), [`core/dr-sync/src/capability.rs:41`](../../core/dr-sync/src/capability.rs#L41), [`core/dr-sync/src/error.rs:39`](../../core/dr-sync/src/error.rs#L39), [`core/dr-sync/src/lib.rs:158`](../../core/dr-sync/src/lib.rs#L158), [`core/dr-sync/src/types.rs:101`](../../core/dr-sync/src/types.rs#L101), [`core/dr-types/src/lib.rs:122`](../../core/dr-types/src/lib.rs#L122), [`core/dr-types/src/lib.rs:204`](../../core/dr-types/src/lib.rs#L204), [`ui/dr-ui/src/activity.rs:1`](../../ui/dr-ui/src/activity.rs#L1), [`ui/dr-ui/src/collections_ui/tree_sync.rs:107`](../../ui/dr-ui/src/collections_ui/tree_sync.rs#L107), [`ui/dr-ui/src/collections_ui/tree_sync.rs:36`](../../ui/dr-ui/src/collections_ui/tree_sync.rs#L36), [`ui/dr-ui/src/collections_ui/tree_sync.rs:377`](../../ui/dr-ui/src/collections_ui/tree_sync.rs#L377), [`ui/dr-ui/src/derived_sync.rs:1042`](../../ui/dr-ui/src/derived_sync.rs#L1042), [`ui/dr-ui/src/derived_sync.rs:642`](../../ui/dr-ui/src/derived_sync.rs#L642), [`ui/dr-ui/src/library/sidecar.rs:531`](../../ui/dr-ui/src/library/sidecar.rs#L531), [`ui/dr-ui/src/library/sweep.rs:677`](../../ui/dr-ui/src/library/sweep.rs#L677), [`ui/dr-ui/src/library/thumbnails_fetch.rs:215`](../../ui/dr-ui/src/library/thumbnails_fetch.rs#L215), [`ui/dr-ui/src/library/thumbnails_fetch.rs:305`](../../ui/dr-ui/src/library/thumbnails_fetch.rs#L305), [`ui/dr-ui/src/library_ui.rs:1482`](../../ui/dr-ui/src/library_ui.rs#L1482), [`ui/dr-ui/src/library_ui.rs:1555`](../../ui/dr-ui/src/library_ui.rs#L1555), [`ui/dr-ui/src/library_ui.rs:1754`](../../ui/dr-ui/src/library_ui.rs#L1754), [`ui/dr-ui/src/remote.rs:40`](../../ui/dr-ui/src/remote.rs#L40), [`ui/dr-ui/src/repairs.rs:1140`](../../ui/dr-ui/src/repairs.rs#L1140), [`ui/dr-ui/ui/collections.slint:272`](../../ui/dr-ui/ui/collections.slint#L272), [`ui/dr-ui/ui/collections.slint:877`](../../ui/dr-ui/ui/collections.slint#L877), [`ui/dr-ui/ui/icons.slint:262`](../../ui/dr-ui/ui/icons.slint#L262) |
+| FR-NC-6c | [`core/dr-catalog/src/cache.rs:225`](../../core/dr-catalog/src/cache.rs#L225), [`core/dr-sync-folder/src/borrow.rs:1`](../../core/dr-sync-folder/src/borrow.rs#L1), [`core/dr-sync-folder/src/lib.rs:197`](../../core/dr-sync-folder/src/lib.rs#L197), [`core/dr-sync-folder/src/lib.rs:73`](../../core/dr-sync-folder/src/lib.rs#L73), [`core/dr-sync-folder/src/lib.rs:818`](../../core/dr-sync-folder/src/lib.rs#L818), [`core/dr-sync-folder/src/lib.rs:857`](../../core/dr-sync-folder/src/lib.rs#L857), [`core/dr-sync-folder/src/vfs.rs:1`](../../core/dr-sync-folder/src/vfs.rs#L1), [`core/dr-sync-nextcloud/src/desktop_client.rs:172`](../../core/dr-sync-nextcloud/src/desktop_client.rs#L172), [`core/dr-sync-nextcloud/src/desktop_client.rs:35`](../../core/dr-sync-nextcloud/src/desktop_client.rs#L35), [`core/dr-sync/src/capability.rs:41`](../../core/dr-sync/src/capability.rs#L41), [`core/dr-sync/src/error.rs:39`](../../core/dr-sync/src/error.rs#L39), [`core/dr-sync/src/lib.rs:158`](../../core/dr-sync/src/lib.rs#L158), [`core/dr-sync/src/types.rs:101`](../../core/dr-sync/src/types.rs#L101), [`core/dr-types/src/lib.rs:122`](../../core/dr-types/src/lib.rs#L122), [`core/dr-types/src/lib.rs:204`](../../core/dr-types/src/lib.rs#L204), [`ui/dr-ui/src/activity.rs:1`](../../ui/dr-ui/src/activity.rs#L1), [`ui/dr-ui/src/collections_ui/tree_sync.rs:111`](../../ui/dr-ui/src/collections_ui/tree_sync.rs#L111), [`ui/dr-ui/src/collections_ui/tree_sync.rs:385`](../../ui/dr-ui/src/collections_ui/tree_sync.rs#L385), [`ui/dr-ui/src/collections_ui/tree_sync.rs:38`](../../ui/dr-ui/src/collections_ui/tree_sync.rs#L38), [`ui/dr-ui/src/derived_sync.rs:1042`](../../ui/dr-ui/src/derived_sync.rs#L1042), [`ui/dr-ui/src/derived_sync.rs:642`](../../ui/dr-ui/src/derived_sync.rs#L642), [`ui/dr-ui/src/library/sidecar.rs:531`](../../ui/dr-ui/src/library/sidecar.rs#L531), [`ui/dr-ui/src/library/sweep.rs:677`](../../ui/dr-ui/src/library/sweep.rs#L677), [`ui/dr-ui/src/library/thumbnails_fetch.rs:215`](../../ui/dr-ui/src/library/thumbnails_fetch.rs#L215), [`ui/dr-ui/src/library/thumbnails_fetch.rs:305`](../../ui/dr-ui/src/library/thumbnails_fetch.rs#L305), [`ui/dr-ui/src/library_ui.rs:1482`](../../ui/dr-ui/src/library_ui.rs#L1482), [`ui/dr-ui/src/library_ui.rs:1555`](../../ui/dr-ui/src/library_ui.rs#L1555), [`ui/dr-ui/src/library_ui.rs:1754`](../../ui/dr-ui/src/library_ui.rs#L1754), [`ui/dr-ui/src/remote.rs:40`](../../ui/dr-ui/src/remote.rs#L40), [`ui/dr-ui/src/repairs.rs:1140`](../../ui/dr-ui/src/repairs.rs#L1140), [`ui/dr-ui/ui/collections.slint:272`](../../ui/dr-ui/ui/collections.slint#L272), [`ui/dr-ui/ui/collections.slint:877`](../../ui/dr-ui/ui/collections.slint#L877), [`ui/dr-ui/ui/icons.slint:262`](../../ui/dr-ui/ui/icons.slint#L262) |
| FR-NC-6d | [`core/dr-sync-folder/src/borrow.rs:1`](../../core/dr-sync-folder/src/borrow.rs#L1), [`core/dr-sync-folder/src/lib.rs:1`](../../core/dr-sync-folder/src/lib.rs#L1), [`core/dr-sync-folder/src/vfs.rs:1`](../../core/dr-sync-folder/src/vfs.rs#L1) |
| FR-NC-7 | [`core/dr-catalog/src/face_shard.rs:1`](../../core/dr-catalog/src/face_shard.rs#L1), [`core/dr-sync-nextcloud/src/lib.rs:120`](../../core/dr-sync-nextcloud/src/lib.rs#L120), [`ui/dr-ui/src/derived_sync.rs:1`](../../ui/dr-ui/src/derived_sync.rs#L1), [`ui/dr-ui/src/library/sweep.rs:557`](../../ui/dr-ui/src/library/sweep.rs#L557), [`ui/dr-ui/src/library_ui.rs:4515`](../../ui/dr-ui/src/library_ui.rs#L4515), [`ui/dr-ui/ui/settings.slint:435`](../../ui/dr-ui/ui/settings.slint#L435) |
| FR-NC-7a | [`core/dr-ingest/src/layout.rs:1`](../../core/dr-ingest/src/layout.rs#L1), [`core/dr-sync/src/upload.rs:1`](../../core/dr-sync/src/upload.rs#L1), [`core/dr-sync/src/upload.rs:40`](../../core/dr-sync/src/upload.rs#L40), [`core/dr-types/src/settings.rs:377`](../../core/dr-types/src/settings.rs#L377), [`ui/dr-ui/src/import.rs:1`](../../ui/dr-ui/src/import.rs#L1), [`ui/dr-ui/src/import.rs:97`](../../ui/dr-ui/src/import.rs#L97), [`ui/dr-ui/src/import_ui.rs:1`](../../ui/dr-ui/src/import_ui.rs#L1), [`ui/dr-ui/src/lib.rs:1790`](../../ui/dr-ui/src/lib.rs#L1790), [`ui/dr-ui/ui/import.slint:5`](../../ui/dr-ui/ui/import.slint#L5) |
@@ -142,21 +142,21 @@ A tag naming an ID `requirements.md` does not define — what renumbering produc
| FR-RAW-3 | [`core/dr-decode/src/lib.rs:155`](../../core/dr-decode/src/lib.rs#L155), [`core/dr-decode/src/lib.rs:546`](../../core/dr-decode/src/lib.rs#L546), [`core/dr-decode/src/locate.rs:1435`](../../core/dr-decode/src/locate.rs#L1435) |
| FR-RAW-4 | [`core/dr-decode/src/error.rs:1`](../../core/dr-decode/src/error.rs#L1), [`core/dr-decode/src/error.rs:30`](../../core/dr-decode/src/error.rs#L30), [`ui/dr-ui/src/lib.rs:269`](../../ui/dr-ui/src/lib.rs#L269) |
| FR-RAW-5 | [`core/dr-decode/src/lib.rs:183`](../../core/dr-decode/src/lib.rs#L183), [`core/dr-gpu/src/demosaic.rs:34`](../../core/dr-gpu/src/demosaic.rs#L34), [`core/dr-gpu/src/demosaic.rs:734`](../../core/dr-gpu/src/demosaic.rs#L734), [`core/dr-gpu/src/demosaic.rs:813`](../../core/dr-gpu/src/demosaic.rs#L813), [`core/dr-gpu/src/demosaic.rs:937`](../../core/dr-gpu/src/demosaic.rs#L937) |
-| 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:109`](../../ui/dr-ui/src/lib.rs#L109), [`ui/dr-ui/src/lib.rs:124`](../../ui/dr-ui/src/lib.rs#L124), [`ui/dr-ui/src/lib.rs:146`](../../ui/dr-ui/src/lib.rs#L146), [`ui/dr-ui/src/lib.rs:3201`](../../ui/dr-ui/src/lib.rs#L3201), [`ui/dr-ui/src/lib.rs:3220`](../../ui/dr-ui/src/lib.rs#L3220), [`ui/dr-ui/src/lib.rs:3247`](../../ui/dr-ui/src/lib.rs#L3247), [`ui/dr-ui/src/lib.rs:3298`](../../ui/dr-ui/src/lib.rs#L3298), [`ui/dr-ui/src/lib.rs:3331`](../../ui/dr-ui/src/lib.rs#L3331), [`ui/dr-ui/src/masks_ui.rs:1537`](../../ui/dr-ui/src/masks_ui.rs#L1537), [`ui/dr-ui/src/settings_ui.rs:179`](../../ui/dr-ui/src/settings_ui.rs#L179), [`ui/dr-ui/ui/adjust.slint:974`](../../ui/dr-ui/ui/adjust.slint#L974), [`ui/dr-ui/ui/app.slint:1049`](../../ui/dr-ui/ui/app.slint#L1049), [`ui/dr-ui/ui/app.slint:2881`](../../ui/dr-ui/ui/app.slint#L2881), [`ui/dr-ui/ui/app.slint:945`](../../ui/dr-ui/ui/app.slint#L945), [`ui/dr-ui/ui/identity.slint:246`](../../ui/dr-ui/ui/identity.slint#L246), [`ui/dr-ui/ui/library.slint:1076`](../../ui/dr-ui/ui/library.slint#L1076), [`ui/dr-ui/ui/settings.slint:122`](../../ui/dr-ui/ui/settings.slint#L122), [`ui/dr-ui/ui/settings.slint:681`](../../ui/dr-ui/ui/settings.slint#L681), [`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:155`](../../ui/dr-ui/src/collections_ui/drag.rs#L155), [`ui/dr-ui/src/collections_ui/drag.rs:165`](../../ui/dr-ui/src/collections_ui/drag.rs#L165), [`ui/dr-ui/src/collections_ui/press.rs:452`](../../ui/dr-ui/src/collections_ui/press.rs#L452), [`ui/dr-ui/src/collections_ui/wiring_grid.rs:116`](../../ui/dr-ui/src/collections_ui/wiring_grid.rs#L116), [`ui/dr-ui/src/collections_ui/wiring_grid.rs:133`](../../ui/dr-ui/src/collections_ui/wiring_grid.rs#L133), [`ui/dr-ui/src/collections_ui/wiring_grid.rs:395`](../../ui/dr-ui/src/collections_ui/wiring_grid.rs#L395), [`ui/dr-ui/src/collections_ui/wiring_tree.rs:265`](../../ui/dr-ui/src/collections_ui/wiring_tree.rs#L265), [`ui/dr-ui/src/gestures.rs:1`](../../ui/dr-ui/src/gestures.rs#L1), [`ui/dr-ui/src/lib.rs:109`](../../ui/dr-ui/src/lib.rs#L109), [`ui/dr-ui/src/library_ui.rs:6822`](../../ui/dr-ui/src/library_ui.rs#L6822), [`ui/dr-ui/src/library_ui.rs:8316`](../../ui/dr-ui/src/library_ui.rs#L8316), [`ui/dr-ui/ui/app.slint:1033`](../../ui/dr-ui/ui/app.slint#L1033), [`ui/dr-ui/ui/app.slint:110`](../../ui/dr-ui/ui/app.slint#L110), [`ui/dr-ui/ui/app.slint:635`](../../ui/dr-ui/ui/app.slint#L635), [`ui/dr-ui/ui/app.slint:649`](../../ui/dr-ui/ui/app.slint#L649), [`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:1287`](../../ui/dr-ui/ui/library.slint#L1287), [`ui/dr-ui/ui/library.slint:1294`](../../ui/dr-ui/ui/library.slint#L1294), [`ui/dr-ui/ui/library.slint:1391`](../../ui/dr-ui/ui/library.slint#L1391), [`ui/dr-ui/ui/library.slint:2621`](../../ui/dr-ui/ui/library.slint#L2621), [`ui/dr-ui/ui/library.slint:4370`](../../ui/dr-ui/ui/library.slint#L4370), [`ui/dr-ui/ui/library.slint:965`](../../ui/dr-ui/ui/library.slint#L965), [`ui/dr-ui/ui/library.slint:998`](../../ui/dr-ui/ui/library.slint#L998), [`ui/dr-ui/ui/presets.slint:19`](../../ui/dr-ui/ui/presets.slint#L19), [`ui/dr-ui/ui/settings.slint:136`](../../ui/dr-ui/ui/settings.slint#L136) |
-| 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:265`](../../ui/dr-ui/src/collections_ui/wiring_tree.rs#L265), [`ui/dr-ui/src/develop/masks.rs:360`](../../ui/dr-ui/src/develop/masks.rs#L360), [`ui/dr-ui/src/develop/repairs.rs:49`](../../ui/dr-ui/src/develop/repairs.rs#L49), [`ui/dr-ui/src/library_ui.rs:5778`](../../ui/dr-ui/src/library_ui.rs#L5778), [`ui/dr-ui/src/masks_ui.rs:1629`](../../ui/dr-ui/src/masks_ui.rs#L1629), [`ui/dr-ui/src/masks_ui.rs:1651`](../../ui/dr-ui/src/masks_ui.rs#L1651), [`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:2424`](../../ui/dr-ui/ui/app.slint#L2424), [`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:1216`](../../ui/dr-ui/ui/masks.slint#L1216), [`ui/dr-ui/ui/widgets.slint:71`](../../ui/dr-ui/ui/widgets.slint#L71) |
-| 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:155`](../../ui/dr-ui/src/collections_ui/drag.rs#L155), [`ui/dr-ui/src/collections_ui/drag.rs:165`](../../ui/dr-ui/src/collections_ui/drag.rs#L165), [`ui/dr-ui/src/collections_ui/press.rs:257`](../../ui/dr-ui/src/collections_ui/press.rs#L257), [`ui/dr-ui/src/collections_ui/press.rs:277`](../../ui/dr-ui/src/collections_ui/press.rs#L277), [`ui/dr-ui/src/collections_ui/press.rs:452`](../../ui/dr-ui/src/collections_ui/press.rs#L452), [`ui/dr-ui/src/collections_ui/press.rs:489`](../../ui/dr-ui/src/collections_ui/press.rs#L489), [`ui/dr-ui/src/collections_ui/press.rs:53`](../../ui/dr-ui/src/collections_ui/press.rs#L53), [`ui/dr-ui/src/collections_ui/tree_sync.rs:333`](../../ui/dr-ui/src/collections_ui/tree_sync.rs#L333), [`ui/dr-ui/src/collections_ui/wiring_grid.rs:116`](../../ui/dr-ui/src/collections_ui/wiring_grid.rs#L116), [`ui/dr-ui/src/collections_ui/wiring_grid.rs:133`](../../ui/dr-ui/src/collections_ui/wiring_grid.rs#L133), [`ui/dr-ui/src/collections_ui/wiring_grid.rs:249`](../../ui/dr-ui/src/collections_ui/wiring_grid.rs#L249), [`ui/dr-ui/src/collections_ui/wiring_grid.rs:395`](../../ui/dr-ui/src/collections_ui/wiring_grid.rs#L395), [`ui/dr-ui/src/collections_ui/wiring_grid.rs:422`](../../ui/dr-ui/src/collections_ui/wiring_grid.rs#L422), [`ui/dr-ui/src/collections_ui/wiring_grid.rs:546`](../../ui/dr-ui/src/collections_ui/wiring_grid.rs#L546), [`ui/dr-ui/src/collections_ui/wiring_tree.rs:265`](../../ui/dr-ui/src/collections_ui/wiring_tree.rs#L265), [`ui/dr-ui/src/collections_ui/wiring_tree.rs:319`](../../ui/dr-ui/src/collections_ui/wiring_tree.rs#L319), [`ui/dr-ui/src/develop/framing.rs:444`](../../ui/dr-ui/src/develop/framing.rs#L444), [`ui/dr-ui/src/develop/framing.rs:469`](../../ui/dr-ui/src/develop/framing.rs#L469), [`ui/dr-ui/src/develop/framing.rs:480`](../../ui/dr-ui/src/develop/framing.rs#L480), [`ui/dr-ui/src/develop/framing.rs:494`](../../ui/dr-ui/src/develop/framing.rs#L494), [`ui/dr-ui/src/develop/framing.rs:668`](../../ui/dr-ui/src/develop/framing.rs#L668), [`ui/dr-ui/src/develop/framing.rs:699`](../../ui/dr-ui/src/develop/framing.rs#L699), [`ui/dr-ui/src/develop/framing.rs:720`](../../ui/dr-ui/src/develop/framing.rs#L720), [`ui/dr-ui/src/develop_ui.rs:804`](../../ui/dr-ui/src/develop_ui.rs#L804), [`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:1284`](../../ui/dr-ui/src/lib.rs#L1284), [`ui/dr-ui/src/lib.rs:1572`](../../ui/dr-ui/src/lib.rs#L1572), [`ui/dr-ui/src/lib.rs:2573`](../../ui/dr-ui/src/lib.rs#L2573), [`ui/dr-ui/src/lib.rs:2792`](../../ui/dr-ui/src/lib.rs#L2792), [`ui/dr-ui/src/lib.rs:2852`](../../ui/dr-ui/src/lib.rs#L2852), [`ui/dr-ui/src/lib.rs:3011`](../../ui/dr-ui/src/lib.rs#L3011), [`ui/dr-ui/src/lib.rs:3451`](../../ui/dr-ui/src/lib.rs#L3451), [`ui/dr-ui/src/lib.rs:461`](../../ui/dr-ui/src/lib.rs#L461), [`ui/dr-ui/src/lib.rs:490`](../../ui/dr-ui/src/lib.rs#L490), [`ui/dr-ui/src/library/thumbnails_fetch.rs:711`](../../ui/dr-ui/src/library/thumbnails_fetch.rs#L711), [`ui/dr-ui/src/library/thumbnails_fetch.rs:726`](../../ui/dr-ui/src/library/thumbnails_fetch.rs#L726), [`ui/dr-ui/src/library_ui.rs:387`](../../ui/dr-ui/src/library_ui.rs#L387), [`ui/dr-ui/src/library_ui.rs:527`](../../ui/dr-ui/src/library_ui.rs#L527), [`ui/dr-ui/src/library_ui.rs:5778`](../../ui/dr-ui/src/library_ui.rs#L5778), [`ui/dr-ui/src/library_ui.rs:5790`](../../ui/dr-ui/src/library_ui.rs#L5790), [`ui/dr-ui/src/library_ui.rs:5860`](../../ui/dr-ui/src/library_ui.rs#L5860), [`ui/dr-ui/src/library_ui.rs:5992`](../../ui/dr-ui/src/library_ui.rs#L5992), [`ui/dr-ui/src/library_ui.rs:6020`](../../ui/dr-ui/src/library_ui.rs#L6020), [`ui/dr-ui/src/library_ui.rs:604`](../../ui/dr-ui/src/library_ui.rs#L604), [`ui/dr-ui/src/library_ui.rs:6963`](../../ui/dr-ui/src/library_ui.rs#L6963), [`ui/dr-ui/src/settings_ui.rs:157`](../../ui/dr-ui/src/settings_ui.rs#L157), [`ui/dr-ui/src/settings_ui.rs:542`](../../ui/dr-ui/src/settings_ui.rs#L542), [`ui/dr-ui/ui/app.slint:210`](../../ui/dr-ui/ui/app.slint#L210), [`ui/dr-ui/ui/app.slint:2119`](../../ui/dr-ui/ui/app.slint#L2119), [`ui/dr-ui/ui/app.slint:2241`](../../ui/dr-ui/ui/app.slint#L2241), [`ui/dr-ui/ui/app.slint:2648`](../../ui/dr-ui/ui/app.slint#L2648), [`ui/dr-ui/ui/app.slint:2781`](../../ui/dr-ui/ui/app.slint#L2781), [`ui/dr-ui/ui/app.slint:3252`](../../ui/dr-ui/ui/app.slint#L3252), [`ui/dr-ui/ui/app.slint:611`](../../ui/dr-ui/ui/app.slint#L611), [`ui/dr-ui/ui/app.slint:640`](../../ui/dr-ui/ui/app.slint#L640), [`ui/dr-ui/ui/app.slint:649`](../../ui/dr-ui/ui/app.slint#L649), [`ui/dr-ui/ui/app.slint:753`](../../ui/dr-ui/ui/app.slint#L753), [`ui/dr-ui/ui/collections.slint:75`](../../ui/dr-ui/ui/collections.slint#L75), [`ui/dr-ui/ui/gestures.slint:1`](../../ui/dr-ui/ui/gestures.slint#L1), [`ui/dr-ui/ui/library.slint:1053`](../../ui/dr-ui/ui/library.slint#L1053), [`ui/dr-ui/ui/library.slint:1262`](../../ui/dr-ui/ui/library.slint#L1262), [`ui/dr-ui/ui/library.slint:1287`](../../ui/dr-ui/ui/library.slint#L1287), [`ui/dr-ui/ui/library.slint:1294`](../../ui/dr-ui/ui/library.slint#L1294), [`ui/dr-ui/ui/library.slint:1327`](../../ui/dr-ui/ui/library.slint#L1327), [`ui/dr-ui/ui/library.slint:1384`](../../ui/dr-ui/ui/library.slint#L1384), [`ui/dr-ui/ui/library.slint:1391`](../../ui/dr-ui/ui/library.slint#L1391), [`ui/dr-ui/ui/library.slint:2621`](../../ui/dr-ui/ui/library.slint#L2621), [`ui/dr-ui/ui/library.slint:4224`](../../ui/dr-ui/ui/library.slint#L4224), [`ui/dr-ui/ui/library.slint:4311`](../../ui/dr-ui/ui/library.slint#L4311), [`ui/dr-ui/ui/library.slint:4370`](../../ui/dr-ui/ui/library.slint#L4370), [`ui/dr-ui/ui/library.slint:965`](../../ui/dr-ui/ui/library.slint#L965), [`ui/dr-ui/ui/library.slint:992`](../../ui/dr-ui/ui/library.slint#L992), [`ui/dr-ui/ui/library.slint:998`](../../ui/dr-ui/ui/library.slint#L998), [`ui/dr-ui/ui/settings.slint:114`](../../ui/dr-ui/ui/settings.slint#L114), [`ui/dr-ui/ui/settings.slint:656`](../../ui/dr-ui/ui/settings.slint#L656) |
-| FR-UI-5 | [`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:849`](../../ui/dr-ui/src/develop_ui.rs#L849), [`ui/dr-ui/src/lib.rs:3395`](../../ui/dr-ui/src/lib.rs#L3395), [`ui/dr-ui/src/lib.rs:3602`](../../ui/dr-ui/src/lib.rs#L3602), [`ui/dr-ui/src/masks_ui.rs:1584`](../../ui/dr-ui/src/masks_ui.rs#L1584), [`ui/dr-ui/ui/app.slint:2608`](../../ui/dr-ui/ui/app.slint#L2608), [`ui/dr-ui/ui/app.slint:2648`](../../ui/dr-ui/ui/app.slint#L2648), [`ui/dr-ui/ui/collections.slint:4`](../../ui/dr-ui/ui/collections.slint#L4), [`ui/dr-ui/ui/session.slint:75`](../../ui/dr-ui/ui/session.slint#L75) |
+| 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:109`](../../ui/dr-ui/src/lib.rs#L109), [`ui/dr-ui/src/lib.rs:124`](../../ui/dr-ui/src/lib.rs#L124), [`ui/dr-ui/src/lib.rs:146`](../../ui/dr-ui/src/lib.rs#L146), [`ui/dr-ui/src/lib.rs:3201`](../../ui/dr-ui/src/lib.rs#L3201), [`ui/dr-ui/src/lib.rs:3220`](../../ui/dr-ui/src/lib.rs#L3220), [`ui/dr-ui/src/lib.rs:3247`](../../ui/dr-ui/src/lib.rs#L3247), [`ui/dr-ui/src/lib.rs:3298`](../../ui/dr-ui/src/lib.rs#L3298), [`ui/dr-ui/src/lib.rs:3331`](../../ui/dr-ui/src/lib.rs#L3331), [`ui/dr-ui/src/masks_ui.rs:1537`](../../ui/dr-ui/src/masks_ui.rs#L1537), [`ui/dr-ui/src/settings_ui.rs:179`](../../ui/dr-ui/src/settings_ui.rs#L179), [`ui/dr-ui/ui/adjust.slint:974`](../../ui/dr-ui/ui/adjust.slint#L974), [`ui/dr-ui/ui/app.slint:2798`](../../ui/dr-ui/ui/app.slint#L2798), [`ui/dr-ui/ui/app.slint:862`](../../ui/dr-ui/ui/app.slint#L862), [`ui/dr-ui/ui/app.slint:966`](../../ui/dr-ui/ui/app.slint#L966), [`ui/dr-ui/ui/identity.slint:246`](../../ui/dr-ui/ui/identity.slint#L246), [`ui/dr-ui/ui/library.slint:1076`](../../ui/dr-ui/ui/library.slint#L1076), [`ui/dr-ui/ui/settings.slint:122`](../../ui/dr-ui/ui/settings.slint#L122), [`ui/dr-ui/ui/settings.slint:681`](../../ui/dr-ui/ui/settings.slint#L681), [`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:155`](../../ui/dr-ui/src/collections_ui/drag.rs#L155), [`ui/dr-ui/src/collections_ui/drag.rs:165`](../../ui/dr-ui/src/collections_ui/drag.rs#L165), [`ui/dr-ui/src/collections_ui/press.rs:452`](../../ui/dr-ui/src/collections_ui/press.rs#L452), [`ui/dr-ui/src/collections_ui/wiring_grid.rs:116`](../../ui/dr-ui/src/collections_ui/wiring_grid.rs#L116), [`ui/dr-ui/src/collections_ui/wiring_grid.rs:133`](../../ui/dr-ui/src/collections_ui/wiring_grid.rs#L133), [`ui/dr-ui/src/collections_ui/wiring_grid.rs:402`](../../ui/dr-ui/src/collections_ui/wiring_grid.rs#L402), [`ui/dr-ui/src/collections_ui/wiring_tree.rs:284`](../../ui/dr-ui/src/collections_ui/wiring_tree.rs#L284), [`ui/dr-ui/src/gestures.rs:1`](../../ui/dr-ui/src/gestures.rs#L1), [`ui/dr-ui/src/lib.rs:109`](../../ui/dr-ui/src/lib.rs#L109), [`ui/dr-ui/src/library_ui.rs:6822`](../../ui/dr-ui/src/library_ui.rs#L6822), [`ui/dr-ui/src/library_ui.rs:8316`](../../ui/dr-ui/src/library_ui.rs#L8316), [`ui/dr-ui/ui/app.slint:111`](../../ui/dr-ui/ui/app.slint#L111), [`ui/dr-ui/ui/app.slint:586`](../../ui/dr-ui/ui/app.slint#L586), [`ui/dr-ui/ui/app.slint:950`](../../ui/dr-ui/ui/app.slint#L950), [`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:1287`](../../ui/dr-ui/ui/library.slint#L1287), [`ui/dr-ui/ui/library.slint:1294`](../../ui/dr-ui/ui/library.slint#L1294), [`ui/dr-ui/ui/library.slint:1391`](../../ui/dr-ui/ui/library.slint#L1391), [`ui/dr-ui/ui/library.slint:2621`](../../ui/dr-ui/ui/library.slint#L2621), [`ui/dr-ui/ui/library.slint:4370`](../../ui/dr-ui/ui/library.slint#L4370), [`ui/dr-ui/ui/library.slint:965`](../../ui/dr-ui/ui/library.slint#L965), [`ui/dr-ui/ui/library.slint:998`](../../ui/dr-ui/ui/library.slint#L998), [`ui/dr-ui/ui/presets.slint:19`](../../ui/dr-ui/ui/presets.slint#L19), [`ui/dr-ui/ui/settings.slint:136`](../../ui/dr-ui/ui/settings.slint#L136) |
+| 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:284`](../../ui/dr-ui/src/collections_ui/wiring_tree.rs#L284), [`ui/dr-ui/src/develop/masks.rs:360`](../../ui/dr-ui/src/develop/masks.rs#L360), [`ui/dr-ui/src/develop/repairs.rs:49`](../../ui/dr-ui/src/develop/repairs.rs#L49), [`ui/dr-ui/src/library_ui.rs:5778`](../../ui/dr-ui/src/library_ui.rs#L5778), [`ui/dr-ui/src/masks_ui.rs:1629`](../../ui/dr-ui/src/masks_ui.rs#L1629), [`ui/dr-ui/src/masks_ui.rs:1651`](../../ui/dr-ui/src/masks_ui.rs#L1651), [`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:2341`](../../ui/dr-ui/ui/app.slint#L2341), [`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:1216`](../../ui/dr-ui/ui/masks.slint#L1216), [`ui/dr-ui/ui/widgets.slint:71`](../../ui/dr-ui/ui/widgets.slint#L71) |
+| 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:155`](../../ui/dr-ui/src/collections_ui/drag.rs#L155), [`ui/dr-ui/src/collections_ui/drag.rs:165`](../../ui/dr-ui/src/collections_ui/drag.rs#L165), [`ui/dr-ui/src/collections_ui/press.rs:257`](../../ui/dr-ui/src/collections_ui/press.rs#L257), [`ui/dr-ui/src/collections_ui/press.rs:277`](../../ui/dr-ui/src/collections_ui/press.rs#L277), [`ui/dr-ui/src/collections_ui/press.rs:452`](../../ui/dr-ui/src/collections_ui/press.rs#L452), [`ui/dr-ui/src/collections_ui/press.rs:489`](../../ui/dr-ui/src/collections_ui/press.rs#L489), [`ui/dr-ui/src/collections_ui/press.rs:53`](../../ui/dr-ui/src/collections_ui/press.rs#L53), [`ui/dr-ui/src/collections_ui/tree_sync.rs:337`](../../ui/dr-ui/src/collections_ui/tree_sync.rs#L337), [`ui/dr-ui/src/collections_ui/wiring_grid.rs:116`](../../ui/dr-ui/src/collections_ui/wiring_grid.rs#L116), [`ui/dr-ui/src/collections_ui/wiring_grid.rs:133`](../../ui/dr-ui/src/collections_ui/wiring_grid.rs#L133), [`ui/dr-ui/src/collections_ui/wiring_grid.rs:253`](../../ui/dr-ui/src/collections_ui/wiring_grid.rs#L253), [`ui/dr-ui/src/collections_ui/wiring_grid.rs:402`](../../ui/dr-ui/src/collections_ui/wiring_grid.rs#L402), [`ui/dr-ui/src/collections_ui/wiring_grid.rs:429`](../../ui/dr-ui/src/collections_ui/wiring_grid.rs#L429), [`ui/dr-ui/src/collections_ui/wiring_grid.rs:558`](../../ui/dr-ui/src/collections_ui/wiring_grid.rs#L558), [`ui/dr-ui/src/collections_ui/wiring_tree.rs:284`](../../ui/dr-ui/src/collections_ui/wiring_tree.rs#L284), [`ui/dr-ui/src/collections_ui/wiring_tree.rs:341`](../../ui/dr-ui/src/collections_ui/wiring_tree.rs#L341), [`ui/dr-ui/src/develop/framing.rs:444`](../../ui/dr-ui/src/develop/framing.rs#L444), [`ui/dr-ui/src/develop/framing.rs:469`](../../ui/dr-ui/src/develop/framing.rs#L469), [`ui/dr-ui/src/develop/framing.rs:480`](../../ui/dr-ui/src/develop/framing.rs#L480), [`ui/dr-ui/src/develop/framing.rs:494`](../../ui/dr-ui/src/develop/framing.rs#L494), [`ui/dr-ui/src/develop/framing.rs:668`](../../ui/dr-ui/src/develop/framing.rs#L668), [`ui/dr-ui/src/develop/framing.rs:699`](../../ui/dr-ui/src/develop/framing.rs#L699), [`ui/dr-ui/src/develop/framing.rs:720`](../../ui/dr-ui/src/develop/framing.rs#L720), [`ui/dr-ui/src/develop_ui.rs:804`](../../ui/dr-ui/src/develop_ui.rs#L804), [`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:1284`](../../ui/dr-ui/src/lib.rs#L1284), [`ui/dr-ui/src/lib.rs:1572`](../../ui/dr-ui/src/lib.rs#L1572), [`ui/dr-ui/src/lib.rs:2573`](../../ui/dr-ui/src/lib.rs#L2573), [`ui/dr-ui/src/lib.rs:2792`](../../ui/dr-ui/src/lib.rs#L2792), [`ui/dr-ui/src/lib.rs:2852`](../../ui/dr-ui/src/lib.rs#L2852), [`ui/dr-ui/src/lib.rs:3011`](../../ui/dr-ui/src/lib.rs#L3011), [`ui/dr-ui/src/lib.rs:3451`](../../ui/dr-ui/src/lib.rs#L3451), [`ui/dr-ui/src/lib.rs:461`](../../ui/dr-ui/src/lib.rs#L461), [`ui/dr-ui/src/lib.rs:490`](../../ui/dr-ui/src/lib.rs#L490), [`ui/dr-ui/src/library/thumbnails_fetch.rs:711`](../../ui/dr-ui/src/library/thumbnails_fetch.rs#L711), [`ui/dr-ui/src/library/thumbnails_fetch.rs:726`](../../ui/dr-ui/src/library/thumbnails_fetch.rs#L726), [`ui/dr-ui/src/library_ui.rs:387`](../../ui/dr-ui/src/library_ui.rs#L387), [`ui/dr-ui/src/library_ui.rs:527`](../../ui/dr-ui/src/library_ui.rs#L527), [`ui/dr-ui/src/library_ui.rs:5778`](../../ui/dr-ui/src/library_ui.rs#L5778), [`ui/dr-ui/src/library_ui.rs:5790`](../../ui/dr-ui/src/library_ui.rs#L5790), [`ui/dr-ui/src/library_ui.rs:5860`](../../ui/dr-ui/src/library_ui.rs#L5860), [`ui/dr-ui/src/library_ui.rs:5992`](../../ui/dr-ui/src/library_ui.rs#L5992), [`ui/dr-ui/src/library_ui.rs:6020`](../../ui/dr-ui/src/library_ui.rs#L6020), [`ui/dr-ui/src/library_ui.rs:604`](../../ui/dr-ui/src/library_ui.rs#L604), [`ui/dr-ui/src/library_ui.rs:6963`](../../ui/dr-ui/src/library_ui.rs#L6963), [`ui/dr-ui/src/settings_ui.rs:157`](../../ui/dr-ui/src/settings_ui.rs#L157), [`ui/dr-ui/src/settings_ui.rs:542`](../../ui/dr-ui/src/settings_ui.rs#L542), [`ui/dr-ui/ui/app.slint:2036`](../../ui/dr-ui/ui/app.slint#L2036), [`ui/dr-ui/ui/app.slint:211`](../../ui/dr-ui/ui/app.slint#L211), [`ui/dr-ui/ui/app.slint:2158`](../../ui/dr-ui/ui/app.slint#L2158), [`ui/dr-ui/ui/app.slint:2565`](../../ui/dr-ui/ui/app.slint#L2565), [`ui/dr-ui/ui/app.slint:2698`](../../ui/dr-ui/ui/app.slint#L2698), [`ui/dr-ui/ui/app.slint:3169`](../../ui/dr-ui/ui/app.slint#L3169), [`ui/dr-ui/ui/app.slint:562`](../../ui/dr-ui/ui/app.slint#L562), [`ui/dr-ui/ui/app.slint:591`](../../ui/dr-ui/ui/app.slint#L591), [`ui/dr-ui/ui/app.slint:670`](../../ui/dr-ui/ui/app.slint#L670), [`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/gestures.slint:1`](../../ui/dr-ui/ui/gestures.slint#L1), [`ui/dr-ui/ui/library.slint:1053`](../../ui/dr-ui/ui/library.slint#L1053), [`ui/dr-ui/ui/library.slint:1262`](../../ui/dr-ui/ui/library.slint#L1262), [`ui/dr-ui/ui/library.slint:1287`](../../ui/dr-ui/ui/library.slint#L1287), [`ui/dr-ui/ui/library.slint:1294`](../../ui/dr-ui/ui/library.slint#L1294), [`ui/dr-ui/ui/library.slint:1327`](../../ui/dr-ui/ui/library.slint#L1327), [`ui/dr-ui/ui/library.slint:1384`](../../ui/dr-ui/ui/library.slint#L1384), [`ui/dr-ui/ui/library.slint:1391`](../../ui/dr-ui/ui/library.slint#L1391), [`ui/dr-ui/ui/library.slint:2621`](../../ui/dr-ui/ui/library.slint#L2621), [`ui/dr-ui/ui/library.slint:4224`](../../ui/dr-ui/ui/library.slint#L4224), [`ui/dr-ui/ui/library.slint:4311`](../../ui/dr-ui/ui/library.slint#L4311), [`ui/dr-ui/ui/library.slint:4370`](../../ui/dr-ui/ui/library.slint#L4370), [`ui/dr-ui/ui/library.slint:965`](../../ui/dr-ui/ui/library.slint#L965), [`ui/dr-ui/ui/library.slint:992`](../../ui/dr-ui/ui/library.slint#L992), [`ui/dr-ui/ui/library.slint:998`](../../ui/dr-ui/ui/library.slint#L998), [`ui/dr-ui/ui/settings.slint:114`](../../ui/dr-ui/ui/settings.slint#L114), [`ui/dr-ui/ui/settings.slint:656`](../../ui/dr-ui/ui/settings.slint#L656) |
+| FR-UI-5 | [`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:849`](../../ui/dr-ui/src/develop_ui.rs#L849), [`ui/dr-ui/src/lib.rs:3395`](../../ui/dr-ui/src/lib.rs#L3395), [`ui/dr-ui/src/lib.rs:3602`](../../ui/dr-ui/src/lib.rs#L3602), [`ui/dr-ui/src/masks_ui.rs:1584`](../../ui/dr-ui/src/masks_ui.rs#L1584), [`ui/dr-ui/ui/app.slint:2525`](../../ui/dr-ui/ui/app.slint#L2525), [`ui/dr-ui/ui/app.slint:2565`](../../ui/dr-ui/ui/app.slint#L2565), [`ui/dr-ui/ui/collections.slint:4`](../../ui/dr-ui/ui/collections.slint#L4), [`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:395`](../../core/dr-pipeline/src/framing.rs#L395), [`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:3220`](../../ui/dr-ui/src/lib.rs#L3220), [`ui/dr-ui/ui/adjust.slint:974`](../../ui/dr-ui/ui/adjust.slint#L974), [`ui/dr-ui/ui/app.slint:2364`](../../ui/dr-ui/ui/app.slint#L2364), [`ui/dr-ui/ui/settings.slint:681`](../../ui/dr-ui/ui/settings.slint#L681), [`ui/dr-ui/ui/toolrail.slint:89`](../../ui/dr-ui/ui/toolrail.slint#L89) |
+| FR-UI-7 | [`core/dr-pipeline/src/descriptor.rs:195`](../../core/dr-pipeline/src/descriptor.rs#L195), [`core/dr-pipeline/src/framing.rs:395`](../../core/dr-pipeline/src/framing.rs#L395), [`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:3220`](../../ui/dr-ui/src/lib.rs#L3220), [`ui/dr-ui/ui/adjust.slint:974`](../../ui/dr-ui/ui/adjust.slint#L974), [`ui/dr-ui/ui/app.slint:2281`](../../ui/dr-ui/ui/app.slint#L2281), [`ui/dr-ui/ui/settings.slint:681`](../../ui/dr-ui/ui/settings.slint#L681), [`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:216`](../../ui/dr-ui/src/derived_sync.rs#L216), [`ui/dr-ui/src/derived_sync.rs:81`](../../ui/dr-ui/src/derived_sync.rs#L81), [`ui/dr-ui/src/derived_sync.rs:894`](../../ui/dr-ui/src/derived_sync.rs#L894), [`ui/dr-ui/src/derived_sync.rs:904`](../../ui/dr-ui/src/derived_sync.rs#L904), [`ui/dr-ui/src/derived_sync.rs:986`](../../ui/dr-ui/src/derived_sync.rs#L986), [`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.rs:1007`](../../ui/dr-ui/src/library_ui.rs#L1007), [`ui/dr-ui/src/library_ui.rs:195`](../../ui/dr-ui/src/library_ui.rs#L195), [`ui/dr-ui/src/library_ui.rs:2192`](../../ui/dr-ui/src/library_ui.rs#L2192), [`ui/dr-ui/src/library_ui.rs:2381`](../../ui/dr-ui/src/library_ui.rs#L2381), [`ui/dr-ui/src/library_ui.rs:2398`](../../ui/dr-ui/src/library_ui.rs#L2398), [`ui/dr-ui/src/library_ui.rs:2496`](../../ui/dr-ui/src/library_ui.rs#L2496), [`ui/dr-ui/src/library_ui.rs:5811`](../../ui/dr-ui/src/library_ui.rs#L5811), [`ui/dr-ui/src/library_ui.rs:5851`](../../ui/dr-ui/src/library_ui.rs#L5851), [`ui/dr-ui/src/library_ui.rs:5880`](../../ui/dr-ui/src/library_ui.rs#L5880), [`ui/dr-ui/src/library_ui.rs:6169`](../../ui/dr-ui/src/library_ui.rs#L6169), [`ui/dr-ui/src/library_ui.rs:6405`](../../ui/dr-ui/src/library_ui.rs#L6405), [`ui/dr-ui/src/library_ui.rs:7179`](../../ui/dr-ui/src/library_ui.rs#L7179), [`ui/dr-ui/src/library_ui.rs:935`](../../ui/dr-ui/src/library_ui.rs#L935), [`ui/dr-ui/src/library_ui.rs:968`](../../ui/dr-ui/src/library_ui.rs#L968), [`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:2781`](../../ui/dr-ui/ui/app.slint#L2781), [`ui/dr-ui/ui/app.slint:2819`](../../ui/dr-ui/ui/app.slint#L2819) |
+| 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:2698`](../../ui/dr-ui/ui/app.slint#L2698), [`ui/dr-ui/ui/app.slint:2736`](../../ui/dr-ui/ui/app.slint#L2736) |
| NFR-A11Y-3 | [`ui/dr-ui/src/histogram.rs:356`](../../ui/dr-ui/src/histogram.rs#L356), [`ui/dr-ui/ui/histogram.slint:137`](../../ui/dr-ui/ui/histogram.slint#L137), [`ui/dr-ui/ui/library.slint:761`](../../ui/dr-ui/ui/library.slint#L761), [`ui/dr-ui/ui/library.slint:909`](../../ui/dr-ui/ui/library.slint#L909), [`ui/dr-ui/ui/peaking.slint:1`](../../ui/dr-ui/ui/peaking.slint#L1) |
| 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) |
-| NFR-ARCH-3 | [`ui/dr-ui/src/develop_ui.rs:343`](../../ui/dr-ui/src/develop_ui.rs#L343), [`ui/dr-ui/src/export.rs:1822`](../../ui/dr-ui/src/export.rs#L1822), [`ui/dr-ui/src/export.rs:1849`](../../ui/dr-ui/src/export.rs#L1849), [`ui/dr-ui/src/export.rs:419`](../../ui/dr-ui/src/export.rs#L419), [`ui/dr-ui/src/export.rs:445`](../../ui/dr-ui/src/export.rs#L445), [`ui/dr-ui/ui/app.slint:1189`](../../ui/dr-ui/ui/app.slint#L1189), [`ui/dr-ui/ui/library.slint:4332`](../../ui/dr-ui/ui/library.slint#L4332) |
+| NFR-ARCH-3 | [`ui/dr-ui/src/develop_ui.rs:343`](../../ui/dr-ui/src/develop_ui.rs#L343), [`ui/dr-ui/src/export.rs:1822`](../../ui/dr-ui/src/export.rs#L1822), [`ui/dr-ui/src/export.rs:1849`](../../ui/dr-ui/src/export.rs#L1849), [`ui/dr-ui/src/export.rs:419`](../../ui/dr-ui/src/export.rs#L419), [`ui/dr-ui/src/export.rs:445`](../../ui/dr-ui/src/export.rs#L445), [`ui/dr-ui/ui/app.slint:1106`](../../ui/dr-ui/ui/app.slint#L1106), [`ui/dr-ui/ui/library.slint:4332`](../../ui/dr-ui/ui/library.slint#L4332) |
| NFR-ARCH-4 | [`core/dr-catalog/src/error.rs:1`](../../core/dr-catalog/src/error.rs#L1), [`core/dr-export/src/error.rs:1`](../../core/dr-export/src/error.rs#L1), [`core/dr-thumbs/src/error.rs:1`](../../core/dr-thumbs/src/error.rs#L1), [`core/dr-xmp/src/lib.rs:798`](../../core/dr-xmp/src/lib.rs#L798), [`platform/dr-plat/src/storage.rs:148`](../../platform/dr-plat/src/storage.rs#L148), [`ui/dr-ui/src/export.rs:521`](../../ui/dr-ui/src/export.rs#L521) |
| NFR-COMPAT-1 | [`core/dr-gpu/src/lib.rs:286`](../../core/dr-gpu/src/lib.rs#L286) |
-| NFR-OPS-1 | [`core/dr-gpu/src/lib.rs:339`](../../core/dr-gpu/src/lib.rs#L339), [`platform/dr-plat/src/diagnostics.rs:1`](../../platform/dr-plat/src/diagnostics.rs#L1), [`platform/dr-plat/src/diagnostics/bundle.rs:1`](../../platform/dr-plat/src/diagnostics/bundle.rs#L1), [`platform/dr-plat/src/state.rs:1`](../../platform/dr-plat/src/state.rs#L1), [`ui/dr-ui/src/lib.rs:1462`](../../ui/dr-ui/src/lib.rs#L1462), [`ui/dr-ui/ui/app.slint:114`](../../ui/dr-ui/ui/app.slint#L114), [`ui/dr-ui/ui/app.slint:1512`](../../ui/dr-ui/ui/app.slint#L1512), [`ui/dr-ui/ui/settings.slint:1015`](../../ui/dr-ui/ui/settings.slint#L1015), [`ui/dr-ui/ui/settings.slint:154`](../../ui/dr-ui/ui/settings.slint#L154) |
+| NFR-OPS-1 | [`core/dr-gpu/src/lib.rs:339`](../../core/dr-gpu/src/lib.rs#L339), [`platform/dr-plat/src/diagnostics.rs:1`](../../platform/dr-plat/src/diagnostics.rs#L1), [`platform/dr-plat/src/diagnostics/bundle.rs:1`](../../platform/dr-plat/src/diagnostics/bundle.rs#L1), [`platform/dr-plat/src/state.rs:1`](../../platform/dr-plat/src/state.rs#L1), [`ui/dr-ui/src/lib.rs:1462`](../../ui/dr-ui/src/lib.rs#L1462), [`ui/dr-ui/ui/app.slint:115`](../../ui/dr-ui/ui/app.slint#L115), [`ui/dr-ui/ui/app.slint:1429`](../../ui/dr-ui/ui/app.slint#L1429), [`ui/dr-ui/ui/settings.slint:1015`](../../ui/dr-ui/ui/settings.slint#L1015), [`ui/dr-ui/ui/settings.slint:154`](../../ui/dr-ui/ui/settings.slint#L154) |
| NFR-OPS-2 | [`platform/dr-plat/src/crash.rs:1`](../../platform/dr-plat/src/crash.rs#L1) |
| NFR-OPS-3 | [`core/dr-types/src/settings.rs:1`](../../core/dr-types/src/settings.rs#L1), [`ui/dr-ui/src/settings_store.rs:1`](../../ui/dr-ui/src/settings_store.rs#L1) |
| NFR-P1 | [`core/dr-catalog/src/lib.rs:1`](../../core/dr-catalog/src/lib.rs#L1), [`core/dr-catalog/src/scan.rs:1`](../../core/dr-catalog/src/scan.rs#L1), [`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), [`tools/bench/src/catalog_open.rs:1`](../../tools/bench/src/catalog_open.rs#L1) |
diff --git a/docs/gestures.md b/docs/gestures.md
index 2220ab4..9e24278 100644
--- a/docs/gestures.md
+++ b/docs/gestures.md
@@ -25,7 +25,7 @@ Sampling a neutral is the first move of the tonal pass — every colour judgemen
Anchored on the fingers' midpoint, and on the pointer, so the gesture reads as magnifying the picture rather than sliding it about. Double-tap is the way to an exact 1:1; this is the way to everything in between.
-`ui/dr-ui/ui/app.slint:2109`
+`ui/dr-ui/ui/app.slint:2026`
### Move a magnified photograph about
@@ -34,7 +34,7 @@ Anchored on the fingers' midpoint, and on the pointer, so the gesture reads as m
Only once there is something outside the viewport to reach, which is why the cursor becomes a hand exactly then. The view is clamped to the frame: panning past the edge would show undefined area beside the photograph, and that reads as a rendering fault rather than as the end of the picture.
-`ui/dr-ui/ui/app.slint:2200`
+`ui/dr-ui/ui/app.slint:2117`
### Paint a mask by hand
@@ -43,7 +43,7 @@ Only once there is something outside the viewport to reach, which is why the cur
A model's mask stops inside a shoulder and leaks into the hair, and no single edge control fixes two errors that go opposite ways. The whole stroke is one step in the history, so taking a mark back costs one press however long it took to make.
-`ui/dr-ui/ui/app.slint:2287`
+`ui/dr-ui/ui/app.slint:2204`
### Take back the last change
@@ -53,7 +53,7 @@ A model's mask stops inside a shoulder and leaks into the hair, and no single ed
A whole drag is one step, so undo takes back a decision rather than a frame of a gesture. The list is there because arriving six steps back costs what arriving from one does.
-`ui/dr-ui/ui/app.slint:2508`
+`ui/dr-ui/ui/app.slint:2425`
### Do it again after taking it back
@@ -61,7 +61,7 @@ A whole drag is one step, so undo takes back a decision rather than a frame of a
- **Pointer** — Click it, or press Redo in the History header
- **Keyboard** — Ctrl+Shift+Z
-`ui/dr-ui/ui/app.slint:2521`
+`ui/dr-ui/ui/app.slint:2438`
### Copy the settings from this photograph
@@ -71,7 +71,7 @@ A whole drag is one step, so undo takes back a decision rather than a frame of a
The panel is the copy that has to work: a tablet has no modifier key to hold and no menu bar to hang the action from. The shortcut is an accelerator for a control that is on screen either way.
-`ui/dr-ui/ui/app.slint:2554`
+`ui/dr-ui/ui/app.slint:2471`
### Paste the settings onto this photograph
@@ -81,7 +81,7 @@ The panel is the copy that has to work: a tablet has no modifier key to hold and
The button names what would be pasted — "3 adjustments", and whether the crop is coming with it — which the shortcut cannot say. Both paste the same scope.
-`ui/dr-ui/ui/app.slint:2566`
+`ui/dr-ui/ui/app.slint:2483`
### Change which group of adjustments is on screen
@@ -91,7 +91,7 @@ The button names what would be pasted — "3 adjustments", and whether the crop
The groups are whatever the operation set declares itself to be about, so there are as many as the pipeline has and no key can be assigned to one of them by name. Stepping is the binding that survives a node being added.
-`ui/dr-ui/ui/app.slint:2594`
+`ui/dr-ui/ui/app.slint:2511`
### Look at the photograph at 1:1
@@ -101,7 +101,7 @@ The groups are whatever the operation set declares itself to be about, so there
Noise reduction and capture sharpening are judgements about single pixels, and a fitted view averages several of the file's into each one on screen — so the frame looks softer than it is and the correction goes too far. The point and the magnification survive opening the next photograph, which is what makes checking the same eye across forty portraits forty keystrokes rather than forty pans.
-`ui/dr-ui/ui/app.slint:2629`
+`ui/dr-ui/ui/app.slint:2546`
### Move to the next or previous photograph
@@ -111,7 +111,7 @@ Noise reduction and capture sharpening are judgements about single pixels, and a
The edit on screen is saved on the way out, so stepping through a folder is as much a departure as going back to the grid and loses nothing.
-`ui/dr-ui/ui/app.slint:2681`
+`ui/dr-ui/ui/app.slint:2598`
### See the photograph before you edited it
@@ -121,7 +121,7 @@ The edit on screen is saved on the way out, so stepping through a folder is as m
Held rather than toggled, and no split screen: a split halves the working image on the tablet the column was sized for, and the comparison photographers describe making is a flick back and forth. It takes no history step, so checking whether a frame is overcooked costs nothing to undo afterwards.
-`ui/dr-ui/ui/app.slint:2805`
+`ui/dr-ui/ui/app.slint:2722`
### Put one control back to its default
diff --git a/ui/dr-ui/src/collections_ui/rename_menu.rs b/ui/dr-ui/src/collections_ui/rename_menu.rs
index 77157e7..9d40538 100644
--- a/ui/dr-ui/src/collections_ui/rename_menu.rs
+++ b/ui/dr-ui/src/collections_ui/rename_menu.rs
@@ -11,9 +11,9 @@ use dr_catalog::collections::{self as coll, CollectionKind};
use dr_catalog::Catalog;
use dr_types::CollectionId;
use rusqlite::OptionalExtension as _;
-use slint::Model as _;
+use slint::{ComponentHandle as _, Model as _};
-use crate::AppWindow;
+use crate::{AppWindow, Collections};
use super::controller::{delete_warning, menu_detail, CollectionsController};
use super::tree_sync::{direct_holdings, refresh_tree};
@@ -50,13 +50,27 @@ pub(super) fn open_row_menu(
*ctl.menu_for.borrow_mut() = Some(id);
ctl.menu_confirming.set(false);
- window.set_collection_menu_confirming(false);
- window.set_collection_menu_title(name.as_str().into());
- window.set_collection_menu_detail(menu_detail(holds, children).into());
- window.set_collection_menu_nested(parent.is_some());
- window.set_collection_menu_smart(kind == CollectionKind::Smart as i64);
- window.set_collection_menu_confirm_detail(delete_warning(&name, holds, children).into());
- window.set_collection_menu_delete_label("Delete".into());
+ window
+ .global::()
+ .set_collection_menu_confirming(false);
+ window
+ .global::()
+ .set_collection_menu_title(name.as_str().into());
+ window
+ .global::()
+ .set_collection_menu_detail(menu_detail(holds, children).into());
+ window
+ .global::()
+ .set_collection_menu_nested(parent.is_some());
+ window
+ .global::()
+ .set_collection_menu_smart(kind == CollectionKind::Smart as i64);
+ window
+ .global::()
+ .set_collection_menu_confirm_detail(delete_warning(&name, holds, children).into());
+ window
+ .global::()
+ .set_collection_menu_delete_label("Delete".into());
// TRACES: FR-NC-6a
// Read off the row the sidebar already drew rather than recomputed: the
@@ -67,9 +81,16 @@ pub(super) fn open_row_menu(
.borrow()
.iter()
.position(|&c| c == id)
- .and_then(|row| window.get_collection_rows().row_data(row))
+ .and_then(|row| {
+ window
+ .global::()
+ .get_collection_rows()
+ .row_data(row)
+ })
.is_some_and(|r| r.pinned);
- window.set_collection_menu_pinned(pinned);
+ window
+ .global::()
+ .set_collection_menu_pinned(pinned);
}
/// Shut the row menu, both halves.
@@ -80,8 +101,12 @@ pub(super) fn open_row_menu(
pub(super) fn close_row_menu(window: &AppWindow, ctl: &Rc) {
*ctl.menu_for.borrow_mut() = None;
ctl.menu_confirming.set(false);
- window.set_collection_menu_title(slint::SharedString::new());
- window.set_collection_menu_confirming(false);
+ window
+ .global::()
+ .set_collection_menu_title(slint::SharedString::new());
+ window
+ .global::()
+ .set_collection_menu_confirming(false);
}
/// Close the rename field, whatever the outcome.
@@ -92,7 +117,7 @@ pub(super) fn close_row_menu(window: &AppWindow, ctl: &Rc
/// close, or closes one that Rust still believes is open.
pub(super) fn close_rename(window: &AppWindow, ctl: &Rc) {
*ctl.renaming.borrow_mut() = None;
- window.set_collection_renaming(0);
+ window.global::().set_collection_renaming(0);
}
/// What a committed rename did.
@@ -185,7 +210,9 @@ pub(super) fn create_child(
match coll::create(catalog.connection(), &name, parent, CollectionKind::Manual) {
Ok(id) => {
- window.set_collection_error(slint::SharedString::new());
+ window
+ .global::()
+ .set_collection_error(slint::SharedString::new());
// A new child is useless if its parent is collapsed.
if let Some(p) = parent {
ctl.collapsed.borrow_mut().remove(&p);
@@ -203,10 +230,14 @@ pub(super) fn create_child(
// field on a row that already exists.
refresh_tree(window, ctl, catalog);
*ctl.renaming.borrow_mut() = Some(id);
- window.set_collection_renaming(id.0 as i32);
+ window
+ .global::()
+ .set_collection_renaming(id.0 as i32);
log::info!("created collection {} ({name})", id.0);
}
- Err(e) => window.set_collection_error(format!("creating collection: {e}").into()),
+ Err(e) => window
+ .global::()
+ .set_collection_error(format!("creating collection: {e}").into()),
}
}
diff --git a/ui/dr-ui/src/collections_ui/trash.rs b/ui/dr-ui/src/collections_ui/trash.rs
index 0881a33..8eb7b34 100644
--- a/ui/dr-ui/src/collections_ui/trash.rs
+++ b/ui/dr-ui/src/collections_ui/trash.rs
@@ -12,7 +12,7 @@ use dr_catalog::Catalog;
use dr_types::ImageId;
use slint::ComponentHandle;
-use crate::AppWindow;
+use crate::{AppWindow, Collections};
use super::controller::CollectionsController;
use super::tree_sync::refresh_tree;
@@ -31,7 +31,9 @@ pub(super) fn start_trash(
reload: &Rc,
) {
let Some(conn) = session() else {
- window.set_collection_error("Open a library first.".into());
+ window
+ .global::()
+ .set_collection_error("Open a library first.".into());
return;
};
@@ -41,7 +43,9 @@ pub(super) fn start_trash(
match crate::trash::plan_trash(cat, &conn.account.root, images) {
Ok(m) => m,
Err(e) => {
- window.set_collection_error(format!("planning delete: {e}").into());
+ window
+ .global::()
+ .set_collection_error(format!("planning delete: {e}").into());
return;
}
}
@@ -97,7 +101,9 @@ pub(super) fn start_restore(
reload: &Rc,
) {
let Some(conn) = session() else {
- window.set_collection_error("Open a library first.".into());
+ window
+ .global::()
+ .set_collection_error("Open a library first.".into());
return;
};
@@ -107,7 +113,9 @@ pub(super) fn start_restore(
match crate::trash::plan_restore(cat, images) {
Ok(m) => m,
Err(e) => {
- window.set_collection_error(format!("planning restore: {e}").into());
+ window
+ .global::()
+ .set_collection_error(format!("planning restore: {e}").into());
return;
}
}
@@ -116,7 +124,7 @@ pub(super) fn start_restore(
if moves.is_empty() {
// Said out loud rather than passed over in silence: a button that does
// nothing visible reads as broken, and the reason here is specific.
- window.set_collection_error(
+ window.global::().set_collection_error(
"Nothing to restore — no record of where these came from.".into(),
);
return;
@@ -227,7 +235,8 @@ pub(super) fn drain_trash(
}
w.set_library_status(status.into());
if let Some(first) = failed.first() {
- w.set_collection_error(first.as_str().into());
+ w.global::()
+ .set_collection_error(first.as_str().into());
}
let borrow = catalog.borrow();
@@ -264,8 +273,8 @@ fn stop_trash(ctl: &Rc) {
/// it.
pub fn refresh_trash(window: &AppWindow, catalog: &Catalog) {
let (n, bytes) = dr_catalog::trash::summary(catalog.connection()).unwrap_or((0, 0));
- window.set_trash_count(n as i32);
- window.set_trash_label(if n == 0 {
+ window.global::().set_trash_count(n as i32);
+ window.global::().set_trash_label(if n == 0 {
slint::SharedString::new()
} else {
format!("{n} · {}", format_bytes(bytes)).into()
diff --git a/ui/dr-ui/src/collections_ui/tree_sync.rs b/ui/dr-ui/src/collections_ui/tree_sync.rs
index 2786d87..6c48aef 100644
--- a/ui/dr-ui/src/collections_ui/tree_sync.rs
+++ b/ui/dr-ui/src/collections_ui/tree_sync.rs
@@ -11,9 +11,9 @@ use std::rc::Rc;
use dr_catalog::collections::{self as coll, CollectionKind};
use dr_catalog::Catalog;
use dr_types::{CollectionId, ImageId};
-use slint::Model as _;
+use slint::{ComponentHandle as _, Model as _};
-use crate::{AppWindow, CollectionRow};
+use crate::{AppWindow, CollectionRow, Collections};
use super::controller::CollectionsController;
@@ -27,7 +27,9 @@ pub fn refresh_tree(window: &AppWindow, ctl: &Rc, catalog
let rows = match coll::tree(catalog.connection()) {
Ok(r) => r,
Err(e) => {
- window.set_collection_error(format!("reading collections: {e}").into());
+ window
+ .global::()
+ .set_collection_error(format!("reading collections: {e}").into());
return;
}
};
@@ -95,7 +97,9 @@ pub fn refresh_tree(window: &AppWindow, ctl: &Rc, catalog
*ctl.row_smart.borrow_mut() = smart;
*ctl.row_has_children.borrow_mut() = has_kids;
*ctl.row_nested.borrow_mut() = nested;
- window.set_collection_rows(slint::ModelRc::new(slint::VecModel::from(out)));
+ window
+ .global::()
+ .set_collection_rows(slint::ModelRc::new(slint::VecModel::from(out)));
// The rows are what `sync_reorderable` reads, so it has to be told they
// changed: a collection that gains a child, or one that is deleted out from
@@ -251,7 +255,7 @@ pub fn sync_selection(window: &AppWindow, ctl: &Rc, ids:
/// looking at, and a scope change costs no extra query.
pub(super) fn sync_reorderable(window: &AppWindow) {
let id = window.get_collection_selected();
- let rows = window.get_collection_rows();
+ let rows = window.global::().get_collection_rows();
let manual = id > 0
&& (0..rows.row_count())
.filter_map(|i| rows.row_data(i))
@@ -346,7 +350,9 @@ pub(super) fn refresh_membership(
let rows = match coll::membership_of(catalog.connection(), &chosen) {
Ok(r) => r,
Err(e) => {
- window.set_collection_error(format!("reading collections: {e}").into());
+ window
+ .global::()
+ .set_collection_error(format!("reading collections: {e}").into());
Vec::new()
}
};
@@ -367,7 +373,9 @@ pub(super) fn refresh_membership(
})
.collect();
- window.set_membership_rows(slint::ModelRc::new(slint::VecModel::from(out)));
+ window
+ .global::()
+ .set_membership_rows(slint::ModelRc::new(slint::VecModel::from(out)));
}
#[cfg(test)]
diff --git a/ui/dr-ui/src/collections_ui/wiring_grid.rs b/ui/dr-ui/src/collections_ui/wiring_grid.rs
index 24d23b2..dcc4f23 100644
--- a/ui/dr-ui/src/collections_ui/wiring_grid.rs
+++ b/ui/dr-ui/src/collections_ui/wiring_grid.rs
@@ -16,7 +16,7 @@ use dr_types::{CollectionId, ImageId};
use slint::{ComponentHandle, Model as _};
use crate::library;
-use crate::AppWindow;
+use crate::{AppWindow, Collections};
use super::controller::{decide_drop, CollectionsController, Drop};
use super::drag::{arm_hold, arm_spring, collapse_spring_opened, compose_drag_image};
@@ -213,7 +213,9 @@ fn wire_selection(
let current = match library::read_member_order(cat, scope) {
Ok(current) => current,
Err(e) => {
- w.set_collection_error(format!("reading the collection's order: {e}").into());
+ w.global::().set_collection_error(
+ format!("reading the collection's order: {e}").into(),
+ );
return;
}
};
@@ -221,7 +223,8 @@ fn wire_selection(
match coll::set_order(cat.connection(), scope, &wanted) {
Ok(()) => {
- w.set_collection_error(slint::SharedString::new());
+ w.global::()
+ .set_collection_error(slint::SharedString::new());
w.set_library_status(
format!(
"{} photograph{} moved",
@@ -240,7 +243,8 @@ fn wire_selection(
}
Err(e) => {
drop(borrow);
- w.set_collection_error(format!("reordering: {e}").into());
+ w.global::()
+ .set_collection_error(format!("reordering: {e}").into());
}
}
});
@@ -339,7 +343,8 @@ fn wire_selection_filing(
let borrow = catalog.borrow();
let Some(cat) = borrow.as_ref() else {
- w.set_collection_error("Open a library first.".into());
+ w.global::()
+ .set_collection_error("Open a library first.".into());
return;
};
@@ -361,7 +366,8 @@ fn wire_selection_filing(
match made {
Ok(added) => {
- w.set_collection_error(slint::SharedString::new());
+ w.global::()
+ .set_collection_error(slint::SharedString::new());
w.set_library_status(
format!(
"{added} photograph{} in {name}",
@@ -386,7 +392,8 @@ fn wire_selection_filing(
}
Err(e) => {
drop(borrow);
- w.set_collection_error(format!("making a collection: {e}").into());
+ w.global::()
+ .set_collection_error(format!("making a collection: {e}").into());
}
}
});
@@ -449,7 +456,8 @@ fn wire_selection_filing(
match result {
Ok(filed) => {
- w.set_collection_error(slint::SharedString::new());
+ w.global::()
+ .set_collection_error(slint::SharedString::new());
// The honest count, as the drop reports it: claiming all
// twelve when nine were already there teaches the user to
// distrust every number the app shows them.
@@ -474,7 +482,9 @@ fn wire_selection_filing(
drop(borrow);
reload();
}
- Err(e) => w.set_collection_error(format!("filing: {e}").into()),
+ Err(e) => w
+ .global::()
+ .set_collection_error(format!("filing: {e}").into()),
}
});
}
@@ -528,11 +538,13 @@ fn wire_drag(
// that cares to read it; the drop itself uses the remembered press, since
// it is handed only the target.
{
- window.on_collection_drag_payload(move |id| {
- let mut data = slint::DataTransfer::default();
- data.set_user_data(Rc::new(CollectionId(id as u64)));
- data
- });
+ window
+ .global::()
+ .on_collection_drag_payload(move |id| {
+ let mut data = slint::DataTransfer::default();
+ data.set_user_data(Rc::new(CollectionId(id as u64)));
+ data
+ });
}
{
@@ -608,24 +620,26 @@ fn wire_drag(
let weak = window.as_weak();
let ctl = ctl.clone();
let catalog_for_spring = catalog.clone();
- window.on_collection_drag_over(move |id, over| {
- let Some(w) = weak.upgrade() else { return };
- let id = CollectionId(id as u64);
+ window
+ .global::()
+ .on_collection_drag_over(move |id, over| {
+ let Some(w) = weak.upgrade() else { return };
+ let id = CollectionId(id as u64);
- if !over {
- // Left this row. Cancel its pending expansion rather than
- // letting it fire over whatever the pointer moved on to.
- if *ctl.hover_id.borrow() == Some(id) {
- *ctl.hover_id.borrow_mut() = None;
- *ctl.spring_timer.borrow_mut() = None;
+ if !over {
+ // Left this row. Cancel its pending expansion rather than
+ // letting it fire over whatever the pointer moved on to.
+ if *ctl.hover_id.borrow() == Some(id) {
+ *ctl.hover_id.borrow_mut() = None;
+ *ctl.spring_timer.borrow_mut() = None;
+ }
+ return;
}
- return;
- }
- *ctl.hover_id.borrow_mut() = Some(id);
- let row = ctl.row_ids.borrow().iter().position(|&c| c == id);
- arm_spring(&w, &ctl, &catalog_for_spring, row);
- });
+ *ctl.hover_id.borrow_mut() = Some(id);
+ let row = ctl.row_ids.borrow().iter().position(|&c| c == id);
+ arm_spring(&w, &ctl, &catalog_for_spring, row);
+ });
}
// A drop. Slint hit-tested the release and `can-drop` already refused a
@@ -636,77 +650,85 @@ fn wire_drag(
let catalog = catalog.clone();
// No model refresh or reload here on purpose — see the note at the end
// of this handler. `drag-finished` owns those.
- window.on_collection_dropped(move |id| {
- let Some(w) = weak.upgrade() else { return };
- let id = CollectionId(id as u64);
- let carried = ctl.dragging.borrow().clone();
- // Taken, not read: a remembered press must be spent by the drop it
- // belongs to, or a later empty drop — a file dragged in from
- // outside, say — would move a collection nobody touched.
- let pressed = ctl.dragging_collection.borrow_mut().take();
+ window
+ .global::()
+ .on_collection_dropped(move |id| {
+ let Some(w) = weak.upgrade() else { return };
+ let id = CollectionId(id as u64);
+ let carried = ctl.dragging.borrow().clone();
+ // Taken, not read: a remembered press must be spent by the drop it
+ // belongs to, or a later empty drop — a file dragged in from
+ // outside, say — would move a collection nobody touched.
+ let pressed = ctl.dragging_collection.borrow_mut().take();
- let carried = match decide_drop(&carried, pressed, id) {
- Drop::Nothing => return,
- Drop::Reparent(source) => {
- let result = {
- let borrow = catalog.borrow();
- let Some(cat) = borrow.as_ref() else { return };
- coll::set_parent(cat.connection(), source, Some(id))
- };
- match result {
- Ok(()) => {
- w.set_collection_error(slint::SharedString::new());
- w.set_library_status("Moved collection".into());
+ let carried = match decide_drop(&carried, pressed, id) {
+ Drop::Nothing => return,
+ Drop::Reparent(source) => {
+ let result = {
let borrow = catalog.borrow();
- if let Some(cat) = borrow.as_ref() {
- refresh_tree(&w, &ctl, cat);
+ let Some(cat) = borrow.as_ref() else { return };
+ coll::set_parent(cat.connection(), source, Some(id))
+ };
+ match result {
+ Ok(()) => {
+ w.global::()
+ .set_collection_error(slint::SharedString::new());
+ w.set_library_status("Moved collection".into());
+ let borrow = catalog.borrow();
+ if let Some(cat) = borrow.as_ref() {
+ refresh_tree(&w, &ctl, cat);
+ }
}
+ // The catalog refuses a cycle rather than letting the
+ // tree walk spin. Saying so is better than a drop that
+ // silently does nothing.
+ Err(e) => w
+ .global::()
+ .set_collection_error(format!("moving collection: {e}").into()),
}
- // The catalog refuses a cycle rather than letting the
- // tree walk spin. Saying so is better than a drop that
- // silently does nothing.
- Err(e) => w.set_collection_error(format!("moving collection: {e}").into()),
+ return;
}
- return;
+ Drop::FileImages(images) => images,
+ };
+
+ // Scoped so the borrow is released before the spring cleanup below,
+ // which needs the catalog itself.
+ let result = {
+ let borrow = catalog.borrow();
+ let Some(cat) = borrow.as_ref() else { return };
+ coll::add_images(cat.connection(), id, &carried)
+ };
+
+ match result {
+ Ok(added) => {
+ w.global::()
+ .set_collection_error(slint::SharedString::new());
+ // "Added 3 of 12" is the honest report when nine were
+ // already there; claiming 12 would teach the user to
+ // distrust the count.
+ let msg = if added == carried.len() {
+ format!("Added {added} to collection")
+ } else {
+ format!(
+ "Added {added} of {} — the rest were already there",
+ carried.len()
+ )
+ };
+ w.set_library_status(msg.into());
+ }
+ Err(e) => w
+ .global::()
+ .set_collection_error(format!("adding to collection: {e}").into()),
}
- Drop::FileImages(images) => images,
- };
- // Scoped so the borrow is released before the spring cleanup below,
- // which needs the catalog itself.
- let result = {
- let borrow = catalog.borrow();
- let Some(cat) = borrow.as_ref() else { return };
- coll::add_images(cat.connection(), id, &carried)
- };
-
- match result {
- Ok(added) => {
- w.set_collection_error(slint::SharedString::new());
- // "Added 3 of 12" is the honest report when nine were
- // already there; claiming 12 would teach the user to
- // distrust the count.
- let msg = if added == carried.len() {
- format!("Added {added} to collection")
- } else {
- format!(
- "Added {added} of {} — the rest were already there",
- carried.len()
- )
- };
- w.set_library_status(msg.into());
- }
- Err(e) => w.set_collection_error(format!("adding to collection: {e}").into()),
- }
-
- // Recorded, not acted on. Every visible consequence — rebuilding
- // the tree, refreshing the badges, rereading the grid — happens in
- // `drag-finished`, because all three replace models that Slint is
- // *currently walking* to deliver this very event. Tearing down a
- // live `DropArea` from inside its own `dropped` handler is the same
- // hazard `sync_rows` in lib.rs documents for the adjust panel.
- *ctl.dropped_on.borrow_mut() = Some(id);
- });
+ // Recorded, not acted on. Every visible consequence — rebuilding
+ // the tree, refreshing the badges, rereading the grid — happens in
+ // `drag-finished`, because all three replace models that Slint is
+ // *currently walking* to deliver this very event. Tearing down a
+ // live `DropArea` from inside its own `dropped` handler is the same
+ // hazard `sync_rows` in lib.rs documents for the adjust panel.
+ *ctl.dropped_on.borrow_mut() = Some(id);
+ });
}
// The drag ended: dropped, or abandoned. This is where the consequences of
@@ -784,7 +806,7 @@ fn wire_trash(
let weak = window.as_weak();
let ctl = ctl.clone();
let session = session.clone();
- window.on_trash_dropped(move || {
+ window.global::().on_trash_dropped(move || {
let Some(w) = weak.upgrade() else { return };
let carried = ctl.dragging.borrow().clone();
if carried.is_empty() {
@@ -795,7 +817,8 @@ fn wire_trash(
// still being walked to deliver this event.
*ctl.trash_requested.borrow_mut() = Some(carried);
let _ = session;
- w.set_collection_error(slint::SharedString::new());
+ w.global::()
+ .set_collection_error(slint::SharedString::new());
});
}
@@ -808,7 +831,7 @@ fn wire_trash(
let catalog = catalog.clone();
let session = session.clone();
let reload = on_scope_changed.clone();
- window.on_trash_restore(move || {
+ window.global::().on_trash_restore(move || {
let Some(w) = weak.upgrade() else { return };
let chosen = ctl.selected();
if chosen.is_empty() {
@@ -887,7 +910,7 @@ fn wire_trash_from_grid(
let catalog = catalog.clone();
let session = session.clone();
let reload = on_scope_changed.clone();
- window.on_trash_empty(move || {
+ window.global::().on_trash_empty(move || {
let Some(w) = weak.upgrade() else { return };
let conn = match session() {
@@ -904,7 +927,8 @@ fn wire_trash_from_grid(
let listed = match dr_catalog::trash::list(cat.connection(), usize::MAX) {
Ok(l) => l,
Err(e) => {
- w.set_collection_error(format!("reading trash: {e}").into());
+ w.global::()
+ .set_collection_error(format!("reading trash: {e}").into());
return;
}
};
diff --git a/ui/dr-ui/src/collections_ui/wiring_tree.rs b/ui/dr-ui/src/collections_ui/wiring_tree.rs
index e416e4a..eac0c9f 100644
--- a/ui/dr-ui/src/collections_ui/wiring_tree.rs
+++ b/ui/dr-ui/src/collections_ui/wiring_tree.rs
@@ -13,7 +13,7 @@ use dr_catalog::Catalog;
use dr_types::{CollectionId, ImageId};
use slint::{ComponentHandle, Model as _};
-use crate::AppWindow;
+use crate::{AppWindow, Collections};
use super::controller::{
decide_delete, decide_release, CollectionsController, DeleteStep, Release,
@@ -58,7 +58,7 @@ pub(super) fn wire_tree_navigation(
} else if id == 0 {
String::new()
} else {
- let rows = w.get_collection_rows();
+ let rows = w.global::().get_collection_rows();
(0..rows.row_count())
.filter_map(|i| rows.row_data(i))
.find(|r| r.id == id)
@@ -66,7 +66,8 @@ pub(super) fn wire_tree_navigation(
.unwrap_or_default()
};
w.set_collection_selected(id);
- w.set_collection_scope_label(label.into());
+ w.global::()
+ .set_collection_scope_label(label.into());
sync_reorderable(&w);
reload();
});
@@ -76,20 +77,22 @@ pub(super) fn wire_tree_navigation(
let weak = window.as_weak();
let ctl = ctl.clone();
let catalog = catalog.clone();
- window.on_collection_toggle(move |id| {
- let Some(w) = weak.upgrade() else { return };
- let id = CollectionId(id as u64);
- {
- let mut collapsed = ctl.collapsed.borrow_mut();
- if !collapsed.remove(&id) {
- collapsed.insert(id);
+ window
+ .global::()
+ .on_collection_toggle(move |id| {
+ let Some(w) = weak.upgrade() else { return };
+ let id = CollectionId(id as u64);
+ {
+ let mut collapsed = ctl.collapsed.borrow_mut();
+ if !collapsed.remove(&id) {
+ collapsed.insert(id);
+ }
}
- }
- let borrow = catalog.borrow();
- if let Some(cat) = borrow.as_ref() {
- refresh_tree(&w, &ctl, cat);
- }
- });
+ let borrow = catalog.borrow();
+ if let Some(cat) = borrow.as_ref() {
+ refresh_tree(&w, &ctl, cat);
+ }
+ });
}
}
@@ -103,11 +106,12 @@ pub(super) fn wire_create(
let weak = window.as_weak();
let ctl = ctl.clone();
let catalog = catalog.clone();
- window.on_collection_new(move || {
+ window.global::().on_collection_new(move || {
let Some(w) = weak.upgrade() else { return };
let borrow = catalog.borrow();
let Some(cat) = borrow.as_ref() else {
- w.set_collection_error("Open a library first.".into());
+ w.global::()
+ .set_collection_error("Open a library first.".into());
return;
};
@@ -133,76 +137,88 @@ pub(super) fn wire_rename(
{
let weak = window.as_weak();
let ctl = ctl.clone();
- window.on_collection_rename_start(move |id| {
- let Some(w) = weak.upgrade() else { return };
- // `F2` arrives with whatever the sidebar has selected, which may be
- // "All photographs" (0) or the trash (-1). Neither has a name to
- // change, so the key does nothing rather than opening a field on a
- // row that is not a collection.
- if id <= 0 {
- return;
- }
- let id = CollectionId(id as u64);
+ window
+ .global::()
+ .on_collection_rename_start(move |id| {
+ let Some(w) = weak.upgrade() else { return };
+ // `F2` arrives with whatever the sidebar has selected, which may be
+ // "All photographs" (0) or the trash (-1). Neither has a name to
+ // change, so the key does nothing rather than opening a field on a
+ // row that is not a collection.
+ if id <= 0 {
+ return;
+ }
+ let id = CollectionId(id as u64);
- // A saved filter is renameable like any other — its *membership* is
- // computed, its name is not — so there is no kind check here.
- *ctl.renaming.borrow_mut() = Some(id);
- w.set_collection_renaming(id.0 as i32);
- w.set_collection_error(slint::SharedString::new());
- });
+ // A saved filter is renameable like any other — its *membership* is
+ // computed, its name is not — so there is no kind check here.
+ *ctl.renaming.borrow_mut() = Some(id);
+ w.global::()
+ .set_collection_renaming(id.0 as i32);
+ w.global::()
+ .set_collection_error(slint::SharedString::new());
+ });
}
{
let weak = window.as_weak();
let ctl = ctl.clone();
let catalog = catalog.clone();
- window.on_collection_rename_commit(move |id, name| {
- let Some(w) = weak.upgrade() else { return };
- let id = CollectionId(id as u64);
+ window
+ .global::()
+ .on_collection_rename_commit(move |id, name| {
+ let Some(w) = weak.upgrade() else { return };
+ let id = CollectionId(id as u64);
- // The field reports a commit when it loses focus as well as on
- // Enter, so a second one can arrive for a rename already closed —
- // Enter commits, and the focus the field then gives up commits
- // again. Ignored rather than reapplied: the second would bump the
- // revision for no change and beat a real edit on another device.
- if *ctl.renaming.borrow() != Some(id) {
- return;
- }
+ // The field reports a commit when it loses focus as well as on
+ // Enter, so a second one can arrive for a rename already closed —
+ // Enter commits, and the focus the field then gives up commits
+ // again. Ignored rather than reapplied: the second would bump the
+ // revision for no change and beat a real edit on another device.
+ if *ctl.renaming.borrow() != Some(id) {
+ return;
+ }
- let borrow = catalog.borrow();
- let Some(cat) = borrow.as_ref() else { return };
+ let borrow = catalog.borrow();
+ let Some(cat) = borrow.as_ref() else { return };
- match apply_rename(cat.connection(), id, name.as_str()) {
- Ok(Rename::Applied(name)) => {
- close_rename(&w, &ctl);
- w.set_collection_error(slint::SharedString::new());
- refresh_tree(&w, &ctl, cat);
- // The header names the collection being shown, so a rename
- // of the current scope has to reach it too.
- if *ctl.scope.borrow() == Some(id) {
- w.set_collection_scope_label(name.as_str().into());
+ match apply_rename(cat.connection(), id, name.as_str()) {
+ Ok(Rename::Applied(name)) => {
+ close_rename(&w, &ctl);
+ w.global::()
+ .set_collection_error(slint::SharedString::new());
+ refresh_tree(&w, &ctl, cat);
+ // The header names the collection being shown, so a rename
+ // of the current scope has to reach it too.
+ if *ctl.scope.borrow() == Some(id) {
+ w.global::()
+ .set_collection_scope_label(name.as_str().into());
+ }
+ log::info!("renamed collection {} to {name}", id.0);
+ }
+ Ok(Rename::Unchanged) => close_rename(&w, &ctl),
+ Err(e) => {
+ // The field stays open on what the user typed. Closing it
+ // would drop their text and leave the old name showing,
+ // with only a line of red to explain where it went.
+ w.global::()
+ .set_collection_error(format!("renaming: {e}").into());
}
- log::info!("renamed collection {} to {name}", id.0);
}
- Ok(Rename::Unchanged) => close_rename(&w, &ctl),
- Err(e) => {
- // The field stays open on what the user typed. Closing it
- // would drop their text and leave the old name showing,
- // with only a line of red to explain where it went.
- w.set_collection_error(format!("renaming: {e}").into());
- }
- }
- });
+ });
}
{
let weak = window.as_weak();
let ctl = ctl.clone();
- window.on_collection_rename_cancel(move || {
- let Some(w) = weak.upgrade() else { return };
- close_rename(&w, &ctl);
- w.set_collection_error(slint::SharedString::new());
- });
+ window
+ .global::()
+ .on_collection_rename_cancel(move || {
+ let Some(w) = weak.upgrade() else { return };
+ close_rename(&w, &ctl);
+ w.global::()
+ .set_collection_error(slint::SharedString::new());
+ });
}
}
@@ -237,7 +253,8 @@ pub(super) fn wire_remove(
match coll::remove_images(cat.connection(), scope, &chosen) {
Ok(n) => {
- w.set_collection_error(slint::SharedString::new());
+ w.global::()
+ .set_collection_error(slint::SharedString::new());
// Named explicitly as a membership change: the images are
// still in the library, and a user who reads this as a
// delete will not trust the feature again.
@@ -249,7 +266,9 @@ pub(super) fn wire_remove(
sync_badges(&w, cat, &visible());
reload();
}
- Err(e) => w.set_collection_error(format!("removing: {e}").into()),
+ Err(e) => w
+ .global::()
+ .set_collection_error(format!("removing: {e}").into()),
}
});
}
@@ -276,44 +295,47 @@ pub(super) fn wire_row_drag(
{
let weak = window.as_weak();
let ctl = ctl.clone();
- window.on_collection_row_press(move |id, down| {
- let Some(w) = weak.upgrade() else { return };
- let id = CollectionId(id as u64);
+ window
+ .global::()
+ .on_collection_row_press(move |id, down| {
+ let Some(w) = weak.upgrade() else { return };
+ let id = CollectionId(id as u64);
- if !down {
- // Let go. A drag that began has already been dealt with by the
- // drop; a hold that did not move is a request for the menu.
- *ctl.row_hold_timer.borrow_mut() = None;
- let held = ctl.lifted.borrow_mut().take();
- let dragged = ctl.drag_began.replace(false);
- w.set_collection_lifted(0);
- if let Release::OpenMenu(held) = decide_release(held, dragged) {
- w.invoke_collection_menu(held.0 as i32);
+ if !down {
+ // Let go. A drag that began has already been dealt with by the
+ // drop; a hold that did not move is a request for the menu.
+ *ctl.row_hold_timer.borrow_mut() = None;
+ let held = ctl.lifted.borrow_mut().take();
+ let dragged = ctl.drag_began.replace(false);
+ w.global::().set_collection_lifted(0);
+ if let Release::OpenMenu(held) = decide_release(held, dragged) {
+ w.global::()
+ .invoke_collection_menu(held.0 as i32);
+ }
+ return;
}
- return;
- }
- // A drag of this row, if one follows, carries this collection.
- ctl.note_row_press(id);
- ctl.drag_began.set(false);
+ // A drag of this row, if one follows, carries this collection.
+ ctl.note_row_press(id);
+ ctl.drag_began.set(false);
- let timer = slint::Timer::default();
- let weak = w.as_weak();
- let ctl_cb = ctl.clone();
- timer.start(
- slint::TimerMode::SingleShot,
- std::time::Duration::from_millis(HOLD_DELAY_MS),
- move || {
- let Some(w) = weak.upgrade() else { return };
- // Picked up, not yet acted on. The menu waits for the
- // release, because opening it here would put a sheet over
- // the tree the user may be about to drag this row across.
- *ctl_cb.lifted.borrow_mut() = Some(id);
- w.set_collection_lifted(id.0 as i32);
- },
- );
- *ctl.row_hold_timer.borrow_mut() = Some(timer);
- });
+ let timer = slint::Timer::default();
+ let weak = w.as_weak();
+ let ctl_cb = ctl.clone();
+ timer.start(
+ slint::TimerMode::SingleShot,
+ std::time::Duration::from_millis(HOLD_DELAY_MS),
+ move || {
+ let Some(w) = weak.upgrade() else { return };
+ // Picked up, not yet acted on. The menu waits for the
+ // release, because opening it here would put a sheet over
+ // the tree the user may be about to drag this row across.
+ *ctl_cb.lifted.borrow_mut() = Some(id);
+ w.global::().set_collection_lifted(id.0 as i32);
+ },
+ );
+ *ctl.row_hold_timer.borrow_mut() = Some(timer);
+ });
}
// TRACES: FR-CAT-7 | FR-UI-4
@@ -326,40 +348,44 @@ pub(super) fn wire_row_drag(
{
let weak = window.as_weak();
let ctl = ctl.clone();
- window.on_collection_drag_active(move |id, active| {
- let Some(w) = weak.upgrade() else { return };
- let id = CollectionId(id as u64);
+ window
+ .global::()
+ .on_collection_drag_active(move |id, active| {
+ let Some(w) = weak.upgrade() else { return };
+ let id = CollectionId(id as u64);
- if !active {
- w.set_collection_root_drop_allowed(false);
- w.set_collection_lifted(0);
- *ctl.lifted.borrow_mut() = None;
- return;
- }
+ if !active {
+ w.global::()
+ .set_collection_root_drop_allowed(false);
+ w.global::().set_collection_lifted(0);
+ *ctl.lifted.borrow_mut() = None;
+ return;
+ }
- // The hold may not have fired — a pointer drag needs no hold — so
- // the pick-up is recorded here as well as there, and the row lifts
- // either way.
- ctl.drag_began.set(true);
- ctl.note_row_press(id);
- *ctl.lifted.borrow_mut() = Some(id);
- w.set_collection_lifted(id.0 as i32);
- // The hold has been spent on a drag; nothing may fire behind it.
- *ctl.row_hold_timer.borrow_mut() = None;
+ // The hold may not have fired — a pointer drag needs no hold — so
+ // the pick-up is recorded here as well as there, and the row lifts
+ // either way.
+ ctl.drag_began.set(true);
+ ctl.note_row_press(id);
+ *ctl.lifted.borrow_mut() = Some(id);
+ w.global::().set_collection_lifted(id.0 as i32);
+ // The hold has been spent on a drag; nothing may fire behind it.
+ *ctl.row_hold_timer.borrow_mut() = None;
- // Only a nested collection has a top level to be returned to, and
- // only a collection drag — never photographs — means anything
- // there at all.
- let carrying_images = !ctl.dragging.borrow().is_empty();
- let nested = ctl
- .row_ids
- .borrow()
- .iter()
- .position(|&c| c == id)
- .and_then(|row| ctl.row_nested.borrow().get(row).copied())
- .unwrap_or(false);
- w.set_collection_root_drop_allowed(nested && !carrying_images);
- });
+ // Only a nested collection has a top level to be returned to, and
+ // only a collection drag — never photographs — means anything
+ // there at all.
+ let carrying_images = !ctl.dragging.borrow().is_empty();
+ let nested = ctl
+ .row_ids
+ .borrow()
+ .iter()
+ .position(|&c| c == id)
+ .and_then(|row| ctl.row_nested.borrow().get(row).copied())
+ .unwrap_or(false);
+ w.global::()
+ .set_collection_root_drop_allowed(nested && !carrying_images);
+ });
}
// TRACES: FR-CAT-7
@@ -375,30 +401,35 @@ pub(super) fn wire_row_drag(
let weak = window.as_weak();
let ctl = ctl.clone();
let catalog = catalog.clone();
- window.on_collection_dropped_on_root(move || {
- let Some(w) = weak.upgrade() else { return };
- let source = ctl.dragging_collection.borrow_mut().take();
- let Some(source) = source else { return };
- // Photographs cannot land here. Guarded as well as refused in
- // `can-drop`, so a payload that somehow arrives does nothing
- // rather than reparenting whatever row was last pressed.
- if !ctl.dragging.borrow().is_empty() {
- return;
- }
-
- let borrow = catalog.borrow();
- let Some(cat) = borrow.as_ref() else { return };
- let moved = coll::set_parent(cat.connection(), source, None);
- match moved {
- Ok(()) => {
- w.set_collection_error(slint::SharedString::new());
- w.set_library_status("Moved to the top level".into());
- refresh_tree(&w, &ctl, cat);
- log::info!("promoted collection {} by drag", source.0);
+ window
+ .global::()
+ .on_collection_dropped_on_root(move || {
+ let Some(w) = weak.upgrade() else { return };
+ let source = ctl.dragging_collection.borrow_mut().take();
+ let Some(source) = source else { return };
+ // Photographs cannot land here. Guarded as well as refused in
+ // `can-drop`, so a payload that somehow arrives does nothing
+ // rather than reparenting whatever row was last pressed.
+ if !ctl.dragging.borrow().is_empty() {
+ return;
}
- Err(e) => w.set_collection_error(format!("moving collection: {e}").into()),
- }
- });
+
+ let borrow = catalog.borrow();
+ let Some(cat) = borrow.as_ref() else { return };
+ let moved = coll::set_parent(cat.connection(), source, None);
+ match moved {
+ Ok(()) => {
+ w.global::()
+ .set_collection_error(slint::SharedString::new());
+ w.set_library_status("Moved to the top level".into());
+ refresh_tree(&w, &ctl, cat);
+ log::info!("promoted collection {} by drag", source.0);
+ }
+ Err(e) => w
+ .global::()
+ .set_collection_error(format!("moving collection: {e}").into()),
+ }
+ });
}
}
@@ -421,12 +452,14 @@ pub(super) fn wire_row_menu(
let weak = window.as_weak();
let ctl = ctl.clone();
let catalog = catalog.clone();
- window.on_collection_menu(move |id| {
- let Some(w) = weak.upgrade() else { return };
- let borrow = catalog.borrow();
- let Some(cat) = borrow.as_ref() else { return };
- open_row_menu(&w, &ctl, cat, CollectionId(id as u64));
- });
+ window
+ .global::()
+ .on_collection_menu(move |id| {
+ let Some(w) = weak.upgrade() else { return };
+ let borrow = catalog.borrow();
+ let Some(cat) = borrow.as_ref() else { return };
+ open_row_menu(&w, &ctl, cat, CollectionId(id as u64));
+ });
}
// Rename, from the menu into the row's own inline field.
@@ -440,15 +473,18 @@ pub(super) fn wire_row_menu(
{
let weak = window.as_weak();
let ctl = ctl.clone();
- window.on_collection_menu_rename(move || {
- let Some(w) = weak.upgrade() else { return };
- let Some(id) = *ctl.menu_for.borrow() else {
- return;
- };
- close_row_menu(&w, &ctl);
- *ctl.renaming.borrow_mut() = Some(id);
- w.set_collection_renaming(id.0 as i32);
- });
+ window
+ .global::()
+ .on_collection_menu_rename(move || {
+ let Some(w) = weak.upgrade() else { return };
+ let Some(id) = *ctl.menu_for.borrow() else {
+ return;
+ };
+ close_row_menu(&w, &ctl);
+ *ctl.renaming.borrow_mut() = Some(id);
+ w.global::()
+ .set_collection_renaming(id.0 as i32);
+ });
}
// A new collection nested inside this one.
@@ -460,16 +496,18 @@ pub(super) fn wire_row_menu(
let weak = window.as_weak();
let ctl = ctl.clone();
let catalog = catalog.clone();
- window.on_collection_menu_new_child(move || {
- let Some(w) = weak.upgrade() else { return };
- let Some(parent) = *ctl.menu_for.borrow() else {
- return;
- };
- let borrow = catalog.borrow();
- let Some(cat) = borrow.as_ref() else { return };
- close_row_menu(&w, &ctl);
- create_child(&w, &ctl, cat, Some(parent));
- });
+ window
+ .global::()
+ .on_collection_menu_new_child(move || {
+ let Some(w) = weak.upgrade() else { return };
+ let Some(parent) = *ctl.menu_for.borrow() else {
+ return;
+ };
+ let borrow = catalog.borrow();
+ let Some(cat) = borrow.as_ref() else { return };
+ close_row_menu(&w, &ctl);
+ create_child(&w, &ctl, cat, Some(parent));
+ });
}
// TRACES: FR-CAT-7
@@ -485,28 +523,33 @@ pub(super) fn wire_row_menu(
let weak = window.as_weak();
let ctl = ctl.clone();
let catalog = catalog.clone();
- window.on_collection_menu_promote(move || {
- let Some(w) = weak.upgrade() else { return };
- let Some(id) = *ctl.menu_for.borrow() else {
- return;
- };
- let borrow = catalog.borrow();
- let Some(cat) = borrow.as_ref() else { return };
+ window
+ .global::()
+ .on_collection_menu_promote(move || {
+ let Some(w) = weak.upgrade() else { return };
+ let Some(id) = *ctl.menu_for.borrow() else {
+ return;
+ };
+ let borrow = catalog.borrow();
+ let Some(cat) = borrow.as_ref() else { return };
- match coll::set_parent(cat.connection(), id, None) {
- Ok(()) => {
- w.set_collection_error(slint::SharedString::new());
- w.set_library_status("Moved to the top level".into());
- close_row_menu(&w, &ctl);
- refresh_tree(&w, &ctl, cat);
- log::info!("promoted collection {} to the top level", id.0);
+ match coll::set_parent(cat.connection(), id, None) {
+ Ok(()) => {
+ w.global::()
+ .set_collection_error(slint::SharedString::new());
+ w.set_library_status("Moved to the top level".into());
+ close_row_menu(&w, &ctl);
+ refresh_tree(&w, &ctl, cat);
+ log::info!("promoted collection {} to the top level", id.0);
+ }
+ // Left open on failure, showing the collection it failed on:
+ // closing would leave a red line referring to a row the user
+ // can no longer tell was the one they aimed at.
+ Err(e) => w
+ .global::()
+ .set_collection_error(format!("moving collection: {e}").into()),
}
- // Left open on failure, showing the collection it failed on:
- // closing would leave a red line referring to a row the user
- // can no longer tell was the one they aimed at.
- Err(e) => w.set_collection_error(format!("moving collection: {e}").into()),
- }
- });
+ });
}
// TRACES: FR-NC-6a
@@ -518,14 +561,16 @@ pub(super) fn wire_row_menu(
{
let weak = window.as_weak();
let ctl = ctl.clone();
- window.on_collection_menu_offline(move || {
- let Some(w) = weak.upgrade() else { return };
- let Some(id) = *ctl.menu_for.borrow() else {
- return;
- };
- close_row_menu(&w, &ctl);
- w.invoke_collection_offline_menu(id.0 as i32);
- });
+ window
+ .global::()
+ .on_collection_menu_offline(move || {
+ let Some(w) = weak.upgrade() else { return };
+ let Some(id) = *ctl.menu_for.borrow() else {
+ return;
+ };
+ close_row_menu(&w, &ctl);
+ w.invoke_collection_offline_menu(id.0 as i32);
+ });
}
// TRACES: FR-CAT-7
@@ -536,66 +581,75 @@ pub(super) fn wire_row_menu(
let catalog = catalog.clone();
let reload = on_scope_changed.clone();
let visible = visible_ids.clone();
- window.on_collection_menu_delete(move || {
- let Some(w) = weak.upgrade() else { return };
- let Some(id) = *ctl.menu_for.borrow() else {
- return;
- };
- let borrow = catalog.borrow();
- let Some(cat) = borrow.as_ref() else { return };
+ window
+ .global::()
+ .on_collection_menu_delete(move || {
+ let Some(w) = weak.upgrade() else { return };
+ let Some(id) = *ctl.menu_for.borrow() else {
+ return;
+ };
+ let borrow = catalog.borrow();
+ let Some(cat) = borrow.as_ref() else { return };
- let (holds, children) = direct_holdings(cat.connection(), id).unwrap_or((0, 0));
- if decide_delete(holds, children, ctl.menu_confirming.get()) == DeleteStep::Confirm {
- // Asked once. The sheet swaps its other actions for the
- // warning, so the second press cannot be a mis-aimed first one.
- ctl.menu_confirming.set(true);
- w.set_collection_menu_confirming(true);
- w.set_collection_menu_delete_label("Delete anyway".into());
- return;
- }
+ let (holds, children) = direct_holdings(cat.connection(), id).unwrap_or((0, 0));
+ if decide_delete(holds, children, ctl.menu_confirming.get()) == DeleteStep::Confirm
+ {
+ // Asked once. The sheet swaps its other actions for the
+ // warning, so the second press cannot be a mis-aimed first one.
+ ctl.menu_confirming.set(true);
+ w.global::()
+ .set_collection_menu_confirming(true);
+ w.global::()
+ .set_collection_menu_delete_label("Delete anyway".into());
+ return;
+ }
- // Hoisted out of the `match` rather than called in the scrutinee:
- // the borrow `cat` comes from lives as long as the match does, and
- // the arm below has to release it before rereading the grid.
- let deleted = coll::delete(cat.connection(), id);
- match deleted {
- Ok(()) => {
- w.set_collection_error(slint::SharedString::new());
- close_row_menu(&w, &ctl);
+ // Hoisted out of the `match` rather than called in the scrutinee:
+ // the borrow `cat` comes from lives as long as the match does, and
+ // the arm below has to release it before rereading the grid.
+ let deleted = coll::delete(cat.connection(), id);
+ match deleted {
+ Ok(()) => {
+ w.global::()
+ .set_collection_error(slint::SharedString::new());
+ close_row_menu(&w, &ctl);
- // The grid was showing what no longer exists.
- let was_scope = *ctl.scope.borrow() == Some(id);
- if was_scope {
- *ctl.scope.borrow_mut() = None;
- w.set_collection_selected(0);
- w.set_collection_scope_label(slint::SharedString::new());
- }
- refresh_tree(&w, &ctl, cat);
- // Named as a membership change, as the removal button is:
- // a user who reads this as a delete of their photographs
- // will not trust the feature again.
- w.set_library_status(if holds > 0 {
- format!(
+ // The grid was showing what no longer exists.
+ let was_scope = *ctl.scope.borrow() == Some(id);
+ if was_scope {
+ *ctl.scope.borrow_mut() = None;
+ w.set_collection_selected(0);
+ w.global::()
+ .set_collection_scope_label(slint::SharedString::new());
+ }
+ refresh_tree(&w, &ctl, cat);
+ // Named as a membership change, as the removal button is:
+ // a user who reads this as a delete of their photographs
+ // will not trust the feature again.
+ w.set_library_status(if holds > 0 {
+ format!(
"Deleted the collection; its {holds} photograph(s) stay in the library"
)
- .into()
- } else {
- slint::SharedString::from("Deleted the collection")
- });
- log::info!("deleted collection {}", id.0);
+ .into()
+ } else {
+ slint::SharedString::from("Deleted the collection")
+ });
+ log::info!("deleted collection {}", id.0);
- // The badge on every visible cell just lost a collection,
- // and a scope that has gone needs the grid rereading.
- let cells = visible();
- sync_badges(&w, cat, &cells);
- drop(borrow);
- if was_scope {
- reload();
+ // The badge on every visible cell just lost a collection,
+ // and a scope that has gone needs the grid rereading.
+ let cells = visible();
+ sync_badges(&w, cat, &cells);
+ drop(borrow);
+ if was_scope {
+ reload();
+ }
}
+ Err(e) => w
+ .global::()
+ .set_collection_error(format!("deleting: {e}").into()),
}
- Err(e) => w.set_collection_error(format!("deleting: {e}").into()),
- }
- });
+ });
}
// Dismiss. A pending confirmation is backed out of one step rather than
@@ -605,16 +659,20 @@ pub(super) fn wire_row_menu(
{
let weak = window.as_weak();
let ctl = ctl.clone();
- window.on_collection_menu_dismiss(move || {
- let Some(w) = weak.upgrade() else { return };
- if ctl.menu_confirming.get() {
- ctl.menu_confirming.set(false);
- w.set_collection_menu_confirming(false);
- w.set_collection_menu_delete_label("Delete".into());
- return;
- }
- close_row_menu(&w, &ctl);
- });
+ window
+ .global::()
+ .on_collection_menu_dismiss(move || {
+ let Some(w) = weak.upgrade() else { return };
+ if ctl.menu_confirming.get() {
+ ctl.menu_confirming.set(false);
+ w.global::()
+ .set_collection_menu_confirming(false);
+ w.global::()
+ .set_collection_menu_delete_label("Delete".into());
+ return;
+ }
+ close_row_menu(&w, &ctl);
+ });
}
}
@@ -635,7 +693,7 @@ pub(super) fn wire_membership(
let borrow = catalog.borrow();
let Some(cat) = borrow.as_ref() else { return };
refresh_membership(&w, &ctl, cat);
- w.set_membership_open(true);
+ w.global::().set_membership_open(true);
});
}
@@ -645,54 +703,62 @@ pub(super) fn wire_membership(
let catalog = catalog.clone();
let visible = visible_ids.clone();
let reload = on_scope_changed.clone();
- window.on_membership_remove(move |id| {
- let Some(w) = weak.upgrade() else { return };
- let target = CollectionId(id as u64);
- let chosen = ctl.selected();
- if chosen.is_empty() {
- return;
- }
- let borrow = catalog.borrow();
- let Some(cat) = borrow.as_ref() else { return };
-
- // Hoisted for the same reason the delete above is: the arm
- // releases the catalog borrow before it rereads the grid.
- let removed = coll::remove_images(cat.connection(), target, &chosen);
- match removed {
- Ok(n) => {
- w.set_collection_error(slint::SharedString::new());
- // The same wording the scoped button uses, and for the same
- // reason: this is a membership change, not a delete.
- w.set_library_status(
- format!("Removed {n} from that collection; still in the library").into(),
- );
- // The sheet stays open. Taking photographs out of several
- // collections is one job, and a sheet that closed after
- // each would have to be reopened — with the selection
- // still live — to finish it.
- refresh_membership(&w, &ctl, cat);
- refresh_tree(&w, &ctl, cat);
- let cells = visible();
- sync_badges(&w, cat, &cells);
- // Only the collection on screen changes what the grid
- // holds. Removing from another one leaves the grid right,
- // and rereading it would scroll the user's place away.
- let showing = *ctl.scope.borrow() == Some(target);
- drop(borrow);
- if showing {
- reload();
- }
+ window
+ .global::()
+ .on_membership_remove(move |id| {
+ let Some(w) = weak.upgrade() else { return };
+ let target = CollectionId(id as u64);
+ let chosen = ctl.selected();
+ if chosen.is_empty() {
+ return;
}
- Err(e) => w.set_collection_error(format!("removing: {e}").into()),
- }
- });
+ let borrow = catalog.borrow();
+ let Some(cat) = borrow.as_ref() else { return };
+
+ // Hoisted for the same reason the delete above is: the arm
+ // releases the catalog borrow before it rereads the grid.
+ let removed = coll::remove_images(cat.connection(), target, &chosen);
+ match removed {
+ Ok(n) => {
+ w.global::()
+ .set_collection_error(slint::SharedString::new());
+ // The same wording the scoped button uses, and for the same
+ // reason: this is a membership change, not a delete.
+ w.set_library_status(
+ format!("Removed {n} from that collection; still in the library")
+ .into(),
+ );
+ // The sheet stays open. Taking photographs out of several
+ // collections is one job, and a sheet that closed after
+ // each would have to be reopened — with the selection
+ // still live — to finish it.
+ refresh_membership(&w, &ctl, cat);
+ refresh_tree(&w, &ctl, cat);
+ let cells = visible();
+ sync_badges(&w, cat, &cells);
+ // Only the collection on screen changes what the grid
+ // holds. Removing from another one leaves the grid right,
+ // and rereading it would scroll the user's place away.
+ let showing = *ctl.scope.borrow() == Some(target);
+ drop(borrow);
+ if showing {
+ reload();
+ }
+ }
+ Err(e) => w
+ .global::()
+ .set_collection_error(format!("removing: {e}").into()),
+ }
+ });
}
{
let weak = window.as_weak();
- window.on_membership_dismiss(move || {
- let Some(w) = weak.upgrade() else { return };
- w.set_membership_open(false);
- });
+ window
+ .global::()
+ .on_membership_dismiss(move || {
+ let Some(w) = weak.upgrade() else { return };
+ w.global::().set_membership_open(false);
+ });
}
}
diff --git a/ui/dr-ui/ui/app.slint b/ui/dr-ui/ui/app.slint
index d9ed90f..0ee7046 100644
--- a/ui/dr-ui/ui/app.slint
+++ b/ui/dr-ui/ui/app.slint
@@ -10,7 +10,7 @@ import { IdentityScreen, IdentityPerson, IdentityFace } from "identity.slint";
import { LibraryGrid, LibraryCell, TimelineBar, PhotoRoll, KeywordRow, PersonChip } from "library.slint";
import { GestureRow } from "gestures.slint";
import { Button, PanelHeading, Label, Value, Caption, Panel, EmptyState, ProgressBar, ActivityRow } from "widgets.slint";
-import { CollectionsPanel, CollectionRow, OfflinePrompt, CollectionMenu,
+import { CollectionsPanel, CollectionRow, Collections, OfflinePrompt, CollectionMenu,
MembershipSheet, MembershipRow } from "collections.slint";
import { HistogramPanel, HistogramView, Levels } from "histogram.slint";
import { RecoveryPrompt } from "recovery.slint";
@@ -31,6 +31,7 @@ export { ViewMode, GradientHandle, HandleRole, SpotHandle, SpotRole }
// exports appears in the generated API. `session.slint` says why the develop
// panels take their wiring this way and why there is one global per family.
export { Develop, Capture, Levels, Peaking, Adjustments, Framing, Transfer, Masking, Repair, Steps }
+export { Collections }
/// Which top-level screen is on display. Exactly one at a time — replacing
/// the `show-launch` / `show-library` / `show-identity` booleans, with
@@ -539,75 +540,25 @@ export component AppWindow inherits Window {
// --- collections (FR-CAT-7) ---
//
- // The sidebar's tree, flattened in Rust: Slint cannot instantiate a
- // component recursively, so depth arrives as an integer per row.
- in-out property <[CollectionRow]> collection-rows;
+ // State that belongs to the sidebar itself — the tree, the row menu,
+ // drag and drop between rows, the trash row — has moved to the
+ // `Collections` global in `collections.slint`. What is left here is
+ // shared with the library grid, whose Rust wiring still reaches it on
+ // the window.
/// Which collection scopes the grid. 0 is the whole library.
in property collection-selected: 0;
- in property collection-scope-label: "";
- in property collection-error: "";
/// Whether the sidebar is shown at all. Closed by default in the compact
/// layout, where 232px of the window is most of the photograph (FR-UI-1),
/// and openable from the grid header either way — see `panel-visible` for
- /// how a default and a user's answer to it are kept apart.
+ /// how a default and a user's answer to it are kept apart. Owned by
+ /// `run()`'s panel-layout wiring rather than the sidebar's own global,
+ /// because it seeds from the saved layout before the sidebar exists.
in property collections-visible: true;
-
- /// Which collection is being renamed in the sidebar, by id. 0 is none.
- in property collection-renaming: 0;
-
callback collection-select(int);
- callback collection-toggle(int);
- callback collection-new();
- callback collection-menu(int);
-
- // --- the row menu the gesture above opens (FR-CAT-7) -------------------
- //
- // Rust owns every one of these. What the menu offers depends on counts it
- // has to query — whether the collection is nested, what deleting would
- // take — and the confirmation step is a policy decision, not a local bit
- // the sheet can flip for itself.
- /// The collection the menu is about. Empty closes it.
- in property collection-menu-title;
- /// "12 photographs · 2 collections inside".
- in property collection-menu-detail;
- /// Whether it has a parent, and so somewhere to be promoted out to.
- in property collection-menu-nested: false;
- /// Whether it is a saved filter, which cannot hold a nested collection.
- in property collection-menu-smart: false;
- /// Whether a delete has been asked once and awaits confirmation.
- in property collection-menu-confirming: false;
- /// What the delete would take with it, and what survives it.
- in property collection-menu-confirm-detail;
- in property collection-menu-delete-label;
- /// TRACES: FR-NC-6a
- /// Whether the collection the menu is about is kept on this device.
- in property collection-menu-pinned: false;
- callback collection-menu-rename();
- callback collection-menu-new-child();
- /// Move it back to the top level. The inverse of the drag that nests one,
- /// which until now had no gesture at all.
- callback collection-menu-promote();
- /// TRACES: FR-NC-6a
- /// Hand the offline question over to the handler the tray on the row
- /// already uses, rather than a second route to the same prompt.
- callback collection-menu-offline();
- callback collection-menu-delete();
- callback collection-menu-dismiss();
/// TRACES: FR-NC-6a
/// Ask about a collection's local copies: the tray on a row, or a long
/// press anywhere on it.
callback collection-offline-menu(int);
- /// A row is held or released — the long press is timed in Rust.
- callback collection-row-press(int, bool);
- // --- picking a collection up (FR-UI-3, FR-UI-4) ------------------------
- /// Which collection the hold has picked up, by id. 0 is none.
- in property collection-lifted: 0;
- /// A row's drag crossed the threshold, or ended.
- callback collection-drag-active(int, bool);
- /// Whether "All photographs" would take the drag currently in flight.
- in property collection-root-drop-allowed: false;
- /// A collection was dropped on "All photographs": out to the top level.
- callback collection-dropped-on-root();
/// TRACES: FR-CAT-7 | FR-UI-4
/// File the grid's selection in a collection without dragging it there:
/// the target's id, and whether to take the images out of the collection
@@ -646,38 +597,6 @@ export component AppWindow inherits Window {
in-out property library-held-row: -1;
/// A press on a cell ended, so the long-press timer can be cancelled.
callback library-cell-press-ended();
- /// TRACES: FR-UI-2 | FR-UI-4
- /// Two taps on a cell: in selection mode, the far end of a range.
- /// Renaming started on a row, by id — a double-click, or `F2`.
- callback collection-rename-start(int);
- /// A rename was committed: the collection's id and the new name.
- callback collection-rename-commit(int, string);
- /// Renaming was abandoned with Escape.
- callback collection-rename-cancel();
- /// Row index and collection id under the pointer. The id is what the
- /// drop highlight follows: a spring expansion rebuilds the row model
- /// mid-drag, and an index would then point at a different collection.
- /// A drag is dwelling over a collection, or has left it: id, and whether
- /// it is over. Drives the spring-loaded expansion, timed in Rust.
- callback collection-drag-over(int, bool);
- /// Images were dropped on a collection, by id. Slint hit-tests the release,
- /// so this is the collection actually under the pointer.
- callback collection-dropped(int);
- /// Payload for dragging a collection onto another to reparent it.
- pure callback collection-drag-payload(int) -> data-transfer;
-
- // --- trash (FR-CAT-15) ---
- //
- // Not a collection: a drop here moves the file into a trash folder on the
- // server, where a collection drop only adds a reference.
- in property trash-count: 0;
- in property trash-label: "";
- /// A soft delete: move the dragged images to the trash folder.
- callback trash-dropped();
- /// A hard delete: permanently remove everything in the trash.
- callback trash-empty();
- /// Put the selected trashed images back where they came from.
- callback trash-restore();
// --- drag and drop ---
//
@@ -703,14 +622,12 @@ export component AppWindow inherits Window {
// --- where the selection is filed (FR-CAT-7) ---------------------------
//
// `library-remove-from-collection` can only ever mean the collection the
- // grid is scoped to — it is the only one that button can name. This sheet
- // is the other half: which collections the selection is actually in, and
- // the way out of any of them without navigating there first.
- in property membership-open: false;
- in property <[MembershipRow]> membership-rows;
+ // grid is scoped to — it is the only one that button can name. Opens the
+ // membership sheet, whose state (`Collections.membership-open` and
+ // `.membership-rows`) is on the sidebar's own global — only the library
+ // side knows the selection has changed enough to be worth recomputing
+ // the sheet against.
callback library-open-membership();
- callback membership-remove(int);
- callback membership-dismiss();
// The keyboard cursor: where the arrows are in the library, as an image
// ordinal. Rust owns it — clamping it needs the library's length, and
@@ -1287,12 +1204,12 @@ in property panel-visible: true;
// menu's own confirmation is a step Back must be able to take
// one at a time, which is why the dismiss handlers in Rust
// back out of a pending delete rather than closing outright.
- if (root.collection-menu-title != "") {
- root.collection-menu-dismiss();
+ if (Collections.collection-menu-title != "") {
+ Collections.collection-menu-dismiss();
return accept;
}
- if (root.membership-open) {
- root.membership-dismiss();
+ if (Collections.membership-open) {
+ Collections.membership-dismiss();
return accept;
}
if (root.offline-prompt-title != "") {
@@ -1641,10 +1558,10 @@ in property panel-visible: true;
CollectionsPanel {
width: 100%;
height: 100%;
- rows: root.collection-rows;
+ rows: Collections.collection-rows;
selected-id: root.collection-selected;
total-images: root.library-total;
- error: root.collection-error;
+ error: Collections.collection-error;
// TRACES: FR-NC-6a
// The two actions that were in the library header and
@@ -1657,32 +1574,32 @@ in property panel-visible: true;
change-library() => { root.library-change(); }
select(id) => { root.collection-select(id); }
- toggle(id) => { root.collection-toggle(id); }
- new-collection() => { root.collection-new(); }
- row-menu(id) => { root.collection-menu(id); }
+ toggle(id) => { Collections.collection-toggle(id); }
+ new-collection() => { Collections.collection-new(); }
+ row-menu(id) => { Collections.collection-menu(id); }
offline-menu(id) => { root.collection-offline-menu(id); }
- row-press(id, down) => { root.collection-row-press(id, down); }
- lifted-id: root.collection-lifted;
- drag-active(id, on) => { root.collection-drag-active(id, on); }
- root-drop-allowed: root.collection-root-drop-allowed;
- dropped-on-root() => { root.collection-dropped-on-root(); }
+ row-press(id, down) => { Collections.collection-row-press(id, down); }
+ lifted-id: Collections.collection-lifted;
+ drag-active(id, on) => { Collections.collection-drag-active(id, on); }
+ root-drop-allowed: Collections.collection-root-drop-allowed;
+ dropped-on-root() => { Collections.collection-dropped-on-root(); }
- renaming-id: root.collection-renaming;
- rename-start(id) => { root.collection-rename-start(id); }
+ renaming-id: Collections.collection-renaming;
+ rename-start(id) => { Collections.collection-rename-start(id); }
rename-commit(id, name) => {
- root.collection-rename-commit(id, name);
+ Collections.collection-rename-commit(id, name);
}
- rename-cancel() => { root.collection-rename-cancel(); }
- trash-count: root.trash-count;
- trash-label: root.trash-label;
+ rename-cancel() => { Collections.collection-rename-cancel(); }
+ trash-count: Collections.trash-count;
+ trash-label: Collections.trash-label;
selected-count: root.library-selected-count;
- dropped-on(id) => { root.collection-dropped(id); }
- collection-drag-payload(id) => { return root.collection-drag-payload(id); }
- dropped-on-trash() => { root.trash-dropped(); }
- empty-trash() => { root.trash-empty(); }
- restore-selected() => { root.trash-restore(); }
- drag-over(id, over) => { root.collection-drag-over(id, over); }
+ dropped-on(id) => { Collections.collection-dropped(id); }
+ collection-drag-payload(id) => { return Collections.collection-drag-payload(id); }
+ dropped-on-trash() => { Collections.trash-dropped(); }
+ empty-trash() => { Collections.trash-empty(); }
+ restore-selected() => { Collections.trash-restore(); }
+ drag-over(id, over) => { Collections.collection-drag-over(id, over); }
}
}
@@ -1737,7 +1654,7 @@ in property panel-visible: true;
window-label: root.library-window-label;
offset: root.library-offset;
selected-count: root.library-selected-count;
- scope-label: root.collection-scope-label;
+ scope-label: Collections.collection-scope-label;
settings-armed: Transfer.armed;
paste-settings-to-selection => {
root.paste-settings-to-selection();
@@ -1804,7 +1721,7 @@ in property panel-visible: true;
held-row <=> root.library-held-row;
// The sidebar's rows, not a second model: the sheet files
// into the same tree the sidebar draws.
- collections: root.collection-rows;
+ collections: Collections.collection-rows;
file-in-collection(id, moves) => {
root.library-file-in-collection(id, moves);
}
@@ -1856,7 +1773,7 @@ in property panel-visible: true;
// trash, neither of which has a name to change — Rust drops
// those rather than the binding trying to reason about it.
rename-scope() => {
- root.collection-rename-start(root.collection-selected);
+ Collections.collection-rename-start(root.collection-selected);
}
filter-min-rating-changed(n) => {
root.library-filter-min-rating-changed(n);
@@ -3261,30 +3178,30 @@ in property panel-visible: true;
MembershipSheet {
width: 100%;
height: 100%;
- open: root.membership-open;
+ open: Collections.membership-open;
selected-count: root.library-selected-count;
- rows: root.membership-rows;
- remove(id) => { root.membership-remove(id); }
- dismiss() => { root.membership-dismiss(); }
+ rows: Collections.membership-rows;
+ remove(id) => { Collections.membership-remove(id); }
+ dismiss() => { Collections.membership-dismiss(); }
}
CollectionMenu {
width: 100%;
height: 100%;
- title: root.collection-menu-title;
- detail: root.collection-menu-detail;
- nested: root.collection-menu-nested;
- smart: root.collection-menu-smart;
- confirming: root.collection-menu-confirming;
- confirm-detail: root.collection-menu-confirm-detail;
- delete-label: root.collection-menu-delete-label;
- pinned: root.collection-menu-pinned;
- rename() => { root.collection-menu-rename(); }
- new-child() => { root.collection-menu-new-child(); }
- promote() => { root.collection-menu-promote(); }
- offline() => { root.collection-menu-offline(); }
- delete() => { root.collection-menu-delete(); }
- dismiss() => { root.collection-menu-dismiss(); }
+ title: Collections.collection-menu-title;
+ detail: Collections.collection-menu-detail;
+ nested: Collections.collection-menu-nested;
+ smart: Collections.collection-menu-smart;
+ confirming: Collections.collection-menu-confirming;
+ confirm-detail: Collections.collection-menu-confirm-detail;
+ delete-label: Collections.collection-menu-delete-label;
+ pinned: Collections.collection-menu-pinned;
+ rename() => { Collections.collection-menu-rename(); }
+ new-child() => { Collections.collection-menu-new-child(); }
+ promote() => { Collections.collection-menu-promote(); }
+ offline() => { Collections.collection-menu-offline(); }
+ delete() => { Collections.collection-menu-delete(); }
+ dismiss() => { Collections.collection-menu-dismiss(); }
}
// Last, and therefore over everything including the settings page and
diff --git a/ui/dr-ui/ui/collections.slint b/ui/dr-ui/ui/collections.slint
index cf7583b..c4072ed 100644
--- a/ui/dr-ui/ui/collections.slint
+++ b/ui/dr-ui/ui/collections.slint
@@ -1179,6 +1179,124 @@ export struct MembershipRow {
detail: string,
}
+// TRACES: FR-CAT-7 | FR-CAT-15
+// The collections sidebar's own state: the tree, the row menu, renaming,
+// drag and drop between rows, the trash row, and the membership sheet this
+// file also declares.
+//
+// A global rather than properties and callbacks on the window root — see
+// `session.slint` for why the develop panels stopped taking their wiring
+// through the window root; the same reasoning applies here. What the sidebar
+// shares with the library grid (a photograph dragged out of a cell, the
+// selection a "file in collection" gesture acts on) stays on the window,
+// because Rust on the library side still reaches it there.
+export global Collections {
+ // --- collections (FR-CAT-7) ---
+ //
+ // The sidebar's tree, flattened in Rust: Slint cannot instantiate a
+ // component recursively, so depth arrives as an integer per row.
+ in-out property <[CollectionRow]> collection-rows;
+ in property collection-scope-label: "";
+ in property collection-error: "";
+
+ /// Which collection is being renamed in the sidebar, by id. 0 is none.
+ in property collection-renaming: 0;
+
+ callback collection-toggle(int);
+ callback collection-new();
+ callback collection-menu(int);
+
+ // --- the row menu the gesture above opens (FR-CAT-7) -------------------
+ //
+ // Rust owns every one of these. What the menu offers depends on counts it
+ // has to query — whether the collection is nested, what deleting would
+ // take — and the confirmation step is a policy decision, not a local bit
+ // the sheet can flip for itself.
+ /// The collection the menu is about. Empty closes it.
+ in property collection-menu-title;
+ /// "12 photographs · 2 collections inside".
+ in property collection-menu-detail;
+ /// Whether it has a parent, and so somewhere to be promoted out to.
+ in property collection-menu-nested: false;
+ /// Whether it is a saved filter, which cannot hold a nested collection.
+ in property collection-menu-smart: false;
+ /// Whether a delete has been asked once and awaits confirmation.
+ in property collection-menu-confirming: false;
+ /// What the delete would take with it, and what survives it.
+ in property collection-menu-confirm-detail;
+ in property collection-menu-delete-label;
+ /// TRACES: FR-NC-6a
+ /// Whether the collection the menu is about is kept on this device.
+ in property collection-menu-pinned: false;
+ callback collection-menu-rename();
+ callback collection-menu-new-child();
+ /// Move it back to the top level. The inverse of the drag that nests one,
+ /// which until now had no gesture at all.
+ callback collection-menu-promote();
+ /// TRACES: FR-NC-6a
+ /// Hand the offline question over to the handler the tray on the row
+ /// already uses, rather than a second route to the same prompt.
+ callback collection-menu-offline();
+ callback collection-menu-delete();
+ callback collection-menu-dismiss();
+ /// A row is held or released — the long press is timed in Rust.
+ callback collection-row-press(int, bool);
+ // --- picking a collection up (FR-UI-3, FR-UI-4) ------------------------
+ /// Which collection the hold has picked up, by id. 0 is none.
+ in property collection-lifted: 0;
+ /// A row's drag crossed the threshold, or ended.
+ callback collection-drag-active(int, bool);
+ /// Whether "All photographs" would take the drag currently in flight.
+ in property collection-root-drop-allowed: false;
+ /// A collection was dropped on "All photographs": out to the top level.
+ callback collection-dropped-on-root();
+ /// TRACES: FR-UI-2 | FR-UI-4
+ /// Renaming started on a row, by id — a double-click, or `F2`.
+ callback collection-rename-start(int);
+ /// A rename was committed: the collection's id and the new name.
+ callback collection-rename-commit(int, string);
+ /// Renaming was abandoned with Escape.
+ callback collection-rename-cancel();
+ /// Row index and collection id under the pointer. The id is what the
+ /// drop highlight follows: a spring expansion rebuilds the row model
+ /// mid-drag, and an index would then point at a different collection.
+ /// A drag is dwelling over a collection, or has left it: id, and whether
+ /// it is over. Drives the spring-loaded expansion, timed in Rust.
+ callback collection-drag-over(int, bool);
+ /// Images were dropped on a collection, by id. Slint hit-tests the release,
+ /// so this is the collection actually under the pointer.
+ callback collection-dropped(int);
+ /// Payload for dragging a collection onto another to reparent it.
+ pure callback collection-drag-payload(int) -> data-transfer;
+
+ // --- trash (FR-CAT-15) ---
+ //
+ // Not a collection: a drop here moves the file into a trash folder on the
+ // server, where a collection drop only adds a reference.
+ in property trash-count: 0;
+ in property trash-label: "";
+ /// A soft delete: move the dragged images to the trash folder.
+ callback trash-dropped();
+ /// A hard delete: permanently remove everything in the trash.
+ callback trash-empty();
+ /// Put the selected trashed images back where they came from.
+ callback trash-restore();
+
+ // --- where the selection is filed (FR-CAT-7) ---------------------------
+ //
+ // The library's "Remove from collection" can only ever mean the
+ // collection the grid is scoped to — it is the only one that button can
+ // name. This sheet is the other half: which collections the selection is
+ // actually in, and the way out of any of them without navigating there
+ // first. Opened from the library grid via the window's own
+ // `library-open-membership`, because only the library side knows the
+ // selection has changed enough to be worth recomputing against.
+ in property membership-open: false;
+ in property <[MembershipRow]> membership-rows;
+ callback membership-remove(int);
+ callback membership-dismiss();
+}
+
// Where the selection is filed, and the way out of any of it.
//
// The library's "Remove from collection" button takes the selection out of the