Part of #143.
Support multiple map views in their own movable windows within a single CAMP process,
so an operator can watch long-range and short-range views simultaneously (and place them
anywhere, including across monitors) without the overhead of a second CAMP instance.
From the #143 usability wishlist (item 6), refined in triage.
Background (verified in source)
- CAMP has one
QGraphicsScene (owned by AutonomousVehicleProject, m_scene) and one
ProjectView : QGraphicsView.
- Qt supports multiple
QGraphicsViews onto the same scene, each with an independent
transform (zoom/pan/center). So additional viewports come essentially for free and share
the existing scene + ROS subscriptions — no second instance, no duplicated data.
- Layer visibility is
QGraphicsItem::setVisible() on the shared scene, i.e. scene-global.
Qt has no per-view item visibility, so "different layers per view" is a much larger effort
(separate scenes or a custom per-view paint path) — split out as Phase 2 below.
Phase 1 — detachable map-view windows (this issue)
- A "New Map View" action spawns an additional
ProjectView as a top-level, movable
window bound to the same project/scene.
- Independent zoom / pan / center per window; shared layer visibility.
- Multiple windows allowed; each closeable. (Optional: persist window geometry.)
- Secondary windows are navigate + context menu only — pan/zoom/center plus the existing
context menu (goto / hover / copy-coordinates). Mission editing (add waypoint/trackline/
survey, etc.) stays driven from the main window's toolbar in v1; per-window editing toolbars
are a possible later addition.
- Verify before implementing: confirm
ProjectView carries no single-instance assumptions
(it takes setProject() / setStatusBar(), so it looks instantiable, but check for any
implicit singletons, static state, or mainwindow-coupling). Each view needs its own status
bar / cursor-coordinate readout.
Out of scope (v1)
- Picture-in-picture / inset (one view embedded in a corner of another) — optional later;
free-floating windows are the primary form.
Phase 2 — per-view independent layer sets (deferred, not committed)
Different layers visible in different views. Requires per-view scenes or a custom per-view
visibility/paint path (doubles render/memory for the separate-scenes approach). Gated on /
eased by the single render-path consolidation in #134. Deferred — recorded for context;
current judgement is the cost likely outweighs the value. Do not pull into Phase 1.
Authored-By: Claude Code Agent
Model: Claude Opus 4.8 (1M context)
Part of #143.
Support multiple map views in their own movable windows within a single CAMP process,
so an operator can watch long-range and short-range views simultaneously (and place them
anywhere, including across monitors) without the overhead of a second CAMP instance.
From the #143 usability wishlist (item 6), refined in triage.
Background (verified in source)
QGraphicsScene(owned byAutonomousVehicleProject,m_scene) and oneProjectView : QGraphicsView.QGraphicsViews onto the same scene, each with an independenttransform (zoom/pan/center). So additional viewports come essentially for free and share
the existing scene + ROS subscriptions — no second instance, no duplicated data.
QGraphicsItem::setVisible()on the shared scene, i.e. scene-global.Qt has no per-view item visibility, so "different layers per view" is a much larger effort
(separate scenes or a custom per-view paint path) — split out as Phase 2 below.
Phase 1 — detachable map-view windows (this issue)
ProjectViewas a top-level, movablewindow bound to the same project/scene.
context menu (goto / hover / copy-coordinates). Mission editing (add waypoint/trackline/
survey, etc.) stays driven from the main window's toolbar in v1; per-window editing toolbars
are a possible later addition.
ProjectViewcarries no single-instance assumptions(it takes
setProject()/setStatusBar(), so it looks instantiable, but check for anyimplicit singletons, static state, or
mainwindow-coupling). Each view needs its own statusbar / cursor-coordinate readout.
Out of scope (v1)
free-floating windows are the primary form.
Phase 2 — per-view independent layer sets (deferred, not committed)
Different layers visible in different views. Requires per-view scenes or a custom per-view
visibility/paint path (doubles render/memory for the separate-scenes approach). Gated on /
eased by the single render-path consolidation in #134. Deferred — recorded for context;
current judgement is the cost likely outweighs the value. Do not pull into Phase 1.
Authored-By:
Claude Code AgentModel:
Claude Opus 4.8 (1M context)