Skip to content

feat(desktop): full frame + plate crop together in Plates, customizable (Fixes #155) - #156

Merged
badbread merged 5 commits into
mainfrom
feat/155-plate-image-display
Jul 14, 2026
Merged

feat(desktop): full frame + plate crop together in Plates, customizable (Fixes #155)#156
badbread merged 5 commits into
mainfrom
feat/155-plate-image-display

Conversation

@badbread

Copy link
Copy Markdown
Owner

Follow-on to #149. Plate previews now show both the full camera frame and the plate crop, laid out per view, with the choice persisted client-side.

Layouts

  • Compact/gallery thumbs (gallery, grouped, timeline): full frame with the crop pinned as a bordered inset in the chosen corner.
  • List rows: full frame + crop side-by-side.
  • Detail popup: keeps the prominent crop above the clip; hidden in full-frame-only mode.

Customization — new "Display" toolbar popover (persisted via PlatesPrefs, shared_preferences):

  • Show: full frame + crop / full only / plate crop only (default: both)
  • Crop corner: TL / TR / BL / BR (default: bottom-right), used in the compact/gallery layouts.

Everything falls back to the full frame when a read has no bbox or the crop fails.

Verification

  • flutter analyze — no new issues (one pre-existing unrelated import info).
  • flutter build windows --release — clean.

⚠️ Stacked on #154 (base branch feat/143-plate-popup-custom-controls). GitHub will auto-retarget this to main once #154 merges. Merge #154 first.

Fixes #155

Base automatically changed from feat/143-plate-popup-custom-controls to main July 14, 2026 22:28
badbread added 5 commits July 14, 2026 15:30
…mizable (Fixes #155)

Plate previews showed either the full camera frame or the plate crop; now they
can show both, laid out per view, with the choice persisted client-side.

- New client prefs (PlatesPrefs): image display (both / full-only / crop-only,
  default both) and crop corner (default bottom-right).
- _PlateThumb reworked: renders the full frame, the crop, or both — pinning the
  crop as a bordered corner inset in the compact/gallery thumbs, and laying the
  two out side-by-side in the list rows (which have the horizontal room). Every
  mode falls back to the full frame when a read has no bbox / the crop fails.
- Threaded through all four views (list, gallery, grouped, timeline) and the
  detail popup (which hides the crop block in full-frame-only mode).
- New "Display" toolbar popover to pick the mode and crop corner.

Signed-off-by: badbread <badbread@users.noreply.github.com>
…crop + frame step

Refinements from testing the #155 feature:
- Use the horizontal room: much larger thumbs in list / grouped / timeline,
  with the full frame + crop laid out side-by-side there (not a tiny inset).
- New crop-size preference (Small / Medium / Large) in the Display popover —
  scales the pinned inset in gallery cards, the crop column in the list, and
  the crop height in the detail popup.
- Detail popup: the prominent plate crop now fetches its own snapshot when a
  tile hasn't cached one (it was cache-only, so it silently blanked when the
  popup was opened cold), is centered above the clip, and honors crop size.
- Plate clip player: add back/forward one-frame step buttons to our transport.

Signed-off-by: badbread <badbread@users.noreply.github.com>
… clip player no longer auto-restarts on pause

Two fixes from testing:
- Side-by-side (list/grouped/timeline) rendered the full frame in the wide
  fixed box via BoxFit.cover, so a read with no crop showed a stretched-looking
  wide horizontal slice. Now the full frame renders at its natural 16:9 aspect
  with a fixed-width crop slot beside it (a subtle placeholder when there's no
  crop), sized to content so rows still align.
- The plate clip player's cold-load watchdog was armed AFTER play(), so the
  initial playing=true fired before it existed and never cancelled it. It then
  fired ~seconds later, saw a user pause as a "stall", and re-opened the clip
  from the start (also clobbering frame-step seeks). Latch `_everPlayed` so the
  watchdog only ever retries a stalled INITIAL load, never after playback began.

Signed-off-by: badbread <badbread@users.noreply.github.com>
…ting

- Clip player: force exact seeks (mpv hr-seek=yes). Without it a small backward
  seek snapped to the same keyframe (frame-back did nothing) while forward
  crossed into the next frame — so the one-frame buttons only worked forward.
- Plates watchlist: the per-read star now opens a Watch/Ignore chooser (kind +
  optional label + notify) instead of silently adding as a watch, and each
  watchlist entry has an Edit action (reuses the chooser, upserts by plate).
  Backend already supported kind/label/notify + upsert; this was client-only.

Signed-off-by: badbread <badbread@users.noreply.github.com>
…live misread hint

The Watch/Ignore chooser (per-read add and entry edit) now embeds the global
match-fuzziness slider with the same live 'accepted misreads' preview the panel
shows — using the plate being added/edited as the example — so you can tune
tolerance in context. Admin-only; hidden when the LPR config isn't loaded.

Signed-off-by: badbread <badbread@users.noreply.github.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Plates: show full frame + plate crop together, with per-view layout and display toggles

1 participant