crates/ui-egui/src/panels/grid.rs: the drag start moved into begin_photo_drag (PR #2722); kept it and added the primary-button condition.
docs: kept both sides (union).
A rule set is now tested cheapest rule first (numbers, choices and yes/no, then lists and
dates, then text and paths, then smart albums), worked out once per prepared filter and per
smart album, not per photo. Photos matched are the same; the editor still shows the user's order.
While a smart album tests itself, or a chain of smart albums reaches the depth limit, rules are
tested as written, since there an answer can depend on which album is asked first.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- docs/whats-new.md, docs/parity-checklist.md (LR-VIEW-SURVEY row and the
revision-history line): the active-photo ring in Compare, Reference,
Survey and the People view.
- tests_grid.rs: the ring comment matches the paint order.
Co-Authored-By: Claude <noreply@anthropic.com>
The active photo had a 2 px pure white outline and the other selected photos
grey 170, so on Silver and Paper's light grid the active ring vanished and the
two differed by lightness alone. The loading placeholder was a fixed dark grey
slab in every theme.
- theme.rs: new tokens `ring_active`, `ring_inner`, `ring_selected` and
`placeholder`, per theme; tests that every theme's rings stand 3:1 against
the grid and the square grid's cells, and that the placeholder follows the
theme's family
- panels/grid.rs: `selection_ring` draws the active ring as 3 pt (1 pt inner
line against the photo, 2 pt theme line) and the others as 1.5 pt; the grid
uses it for loaded and unloaded thumbnails, and the placeholder token
- panels/detail.rs: the filmstrip uses the same ring and rule
- panels/compare.rs: the compare placeholder uses the token
- tests_grid.rs, tests_filmstrip.rs: painted ring widths and colours in a
light theme, active versus selected versus unselected
- docs/parity-checklist.md, docs/whats-new.md: rows and entry
Co-Authored-By: Claude <noreply@anthropic.com>
The dragged label, the Move Photos question and the toast named a folder by its last name only, so two folders called Home (or two albums called Garden in different album folders) looked the same. When another row has the name, the label now adds the folder it is in. A name nothing else uses is unchanged.
The restore actions use the recorded folder without checking that it still
exists, so an upgrade creates it again rather than using the default folder.
album.setRules with replace (what the rules dialog sends) started from an empty filter and kept only the library folder, so a view of an album saved as a smart album matched the whole library after OK. It keeps the album too, unless the call gives album: null.
A right-button drag over a grid cell picked the photos up and, on an unselected photo, replaced the selection with it. A right-button release while photos were dragged dropped them on an album, folder or keyword row, or ended the drag. The drag now starts, ends and drops on the primary button only.
main split media.rs into media/ and moved render.rs's thumbnail tests to render/thumbnail_tests.rs
(#3103): thumb_job's video check moves with it to media/session.rs, the grid test to thumbnail_tests.rs.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01GfjNkJiMUagz3DN3zoV2rV
keyword.delete emptied the put-aside filter's keyword but kept the empty filter, so filters_off() stayed true and View > Enable Filters showed unchecked with nothing to bring back. commit_keywords now drops a put-aside filter that has become empty, as library.removeFolder already does.