Skip to content

Multiple detachable map-view windows (independent zoom/pan, shared scene) #150

Description

@rolker

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)

Metadata

Metadata

Assignees

No one assigned

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions