Skip to content

Select and watch any camera angle via a data-driven view strip#67

Merged
danielchalmers merged 3 commits into
mainfrom
dynamic-camera-ui
Jul 9, 2026
Merged

Select and watch any camera angle via a data-driven view strip#67
danielchalmers merged 3 commits into
mainfrom
dynamic-camera-ui

Conversation

@danielchalmers

@danielchalmers danielchalmers commented Jul 9, 2026

Copy link
Copy Markdown
Owner

Why

HW4/AI4 vehicles (2025 Spring Update and later) record six cameras — the classic four plus the two B-pillars. Since #65/#66 the engine ingests and plays all of them, but the UI was still five hardcoded tiles wired to four fixed Flyleaf hosts, so pillar footage was invisible. This is the P1b step of the dynamic-cameras plan.

What

  • The selector strip is now an ItemsControl over CameraViewOptions: the grid tile plus one tile per camera the selected clip actually recorded, in canonical order. HW3 clips look exactly like before (Grid/Front/Rear/Left/Right); HW4 clips add Left Pillar and Right Pillar tiles with live previews.
  • Six Flyleaf hosts (one per recognized camera) live in the hidden pool; the code-behind re-parents each into its tile slot or the primary slot per view and parks the unused ones, replacing the hardcoded per-view layout table.
  • View ids are now the canonical camera names, so ActiveExportCameraName is the selected view directly and export works for pillar angles too.
  • CameraIdToView implements the community-documented event.json camera map (0 front, 3/4 repeaters, 5/6 pillars, 7 rear), so a Sentry event now auto-focuses the camera that actually triggered it (with a Front fallback when the clip lacks it).
  • Number keys select tiles by strip position: unchanged 1–5 on classic clips, 1–7 on six-camera clips.
  • Switching to a clip that lacks the watched camera falls back to Front.
  • The 2×2 grid view intentionally stays the classic four cameras; the adaptive grid is the planned P2 follow-up.

Verification

  • 252 tests pass (16 net-new: strip contents/order per clip camera set, pillar selection + fallbacks, event-id mapping, number-key handling).
  • Drove the built app via the UIA harness against synthetic six- and four-camera clips: pillar tiles render with live previews, keys 6/7 enlarge the pillars, an event with camera id 5 auto-focuses Left Pillar, grid view stays the classic 2×2, and a four-camera clip shrinks the strip back to five tiles with a Front fallback.

The camera selector was five hardcoded tiles (Grid/Front/Rear/Left/Right)
wired to four fixed Flyleaf hosts, so the B-pillar angles that HW4/AI4
vehicles record since the 2025 Spring Update were ingested and played by
the engine but unreachable in the UI.

The strip is now an ItemsControl over CameraViewOptions: the grid plus one
tile per camera the selected clip actually recorded, in canonical order.
Six hosts (one per recognized camera) live in a pool; the code-behind
re-parents each into its tile / the primary slot per view, and parks the
rest. View ids are now the canonical camera names, so export and the
event auto-focus map 1:1 onto camera files.

Along the way:
- event.json camera ids follow the community-documented map (0 front,
  3/4 repeaters, 5/6 pillars, 7 rear), so Sentry events auto-focus the
  camera that actually triggered them instead of always the front.
- Number keys 1-9 select tiles by strip position (1-7 on a six-camera
  clip); unavailable positions fall through unhandled.
- Switching to a clip that lacks the watched camera falls back to Front.
- The 2x2 grid view intentionally stays the classic four cameras; an
  adaptive grid is a separate follow-up.

Verified end-to-end against synthetic six-camera and four-camera clips:
pillar tiles appear with live previews, key 6/7 and event id 5 focus the
pillars, and the strip shrinks with a Front fallback on four-camera clips.
Per Daniel's style preference: no column-driven hard wraps. The comments I
added for the data-driven camera strip now break only at sentence
boundaries.
A <summary> containing nested inline tags reads badly crammed onto one line;
put the opening tag, content, and closing tag on their own lines.
@danielchalmers
danielchalmers merged commit bd9fb6e into main Jul 9, 2026
1 check passed
@danielchalmers
danielchalmers deleted the dynamic-camera-ui branch July 9, 2026 23:49
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.

1 participant