Skip to content

Add independent native document panes and satellite windows - #62

Open
boazeggs wants to merge 73 commits into
OpenAEC-Foundation:mainfrom
boazeggs:codex/document-panes-ui
Open

boazeggs wants to merge 73 commits into
OpenAEC-Foundation:mainfrom
boazeggs:codex/document-panes-ui

Conversation

@boazeggs

@boazeggs boazeggs commented Nov 6, 2026 •

Copy link
Copy Markdown
Contributor

The native app previously displayed one document camera at a time. This change gives model views, route photos, station panoramas, drawings and sheets independent cameras and render state in tiled panes and native satellite windows. Selection, measurements, sources and section geometry remain shared.

Stacked on #53; merge #53 first to keep the integration review separate. Refs #16. This PR implements the pane/window scope below; #16 remains open for verified monitor placement restoration and physical Windows/macOS checks.

  • Split and resize panes, move tabs between panes, drag an inactive tab to an edge, and start dragging directly from the original document strip. A document has one owner, empty panes collapse and the model stays open.
  • Keep photo decode ownership, camera poses, blend and drawing layer switches per document. Late reads update their requesting pane. Drawing annotations and sheet paper/render caches work in inactive visible panes without copying shared definitions, images or pending jobs.
  • Tear tabs off into native windows and dock them back. Handle target motion both before and after the source release, freeze deferred target coordinates and reject stale drag callbacks. Closed windows release their pointer state. Screenshot capture follows the active document window.
  • Link individual photo/3D panes with ↔ or set_pane_linked. The scene shows measured photo camera poses; selecting a route-photo or station marker updates a photo in another linked pane while retaining the scene camera and focus. Same-pane selection still opens the photo normally. Split/tear-off operations retain the relevant pane link membership.
  • Save source references/transforms/visibility, pane ownership, link flags, document cameras, photo state, drawing layers and shared section through a bounded atomic writer. Startup reopens sources. Invalid/unsupported files are preserved; graceful exit flushes changes.
  • Bound GPU viewport slots to eight and share source geometry. API revision 17 adds the documented pane/window/link commands and matching MCP tools, including background-photo document/camera reporting.

Validation:

  • 803 native tests passed, 9 explicitly ignored, including all 41 MCP tests and translation checks. Full workspace build and workspace Clippy with --all-targets -- -D warnings passed.
  • Actual isolated Wayland input passed initial strip dragging, inactive-tab merging/splitting and native drag-back with one output and two 1280 × 720 outputs. The two-output probe moves the satellite to the second screen and its photo tab back to the first, keeping one owner and its camera.
  • Fresh-process restart probes restored model/photo/plan/elevation and A4/A3 sheet layouts, independent cameras, distinct layer switches and annotations, with zero changed pixels in all compared pane interiors.
  • Actual link-control clicks and photo following passed: enabling the measured-camera indicator changed 445 model pixels; selecting the other panorama changed 98,111 photo pixels while keeping the scene active and its camera unchanged. Links and both camera renders survived restart with zero changed interior pixels.
  • Real BLK2GO station decoding, linked selection and restart passed with the original source SHA-256 unchanged. The camera lies outside this tiny section's indicator comparison region; visible indicator pixels are checked with the synthetic fixture. No real scan data or scan photographs are committed.
  • Reproduction scripts, synthetic screenshots and JSON reports are in native/validation/document-panes/.

Current limits:

  • Startup docks satellite documents into the main window until their platform monitor identity/placement can be verified. Unsaved point edits remain outside this layout file (SuperCloud: bestanden uit Docs openen en de assistent (MCP) aansluiten #52).
  • The cross-window proof uses Wayland focus/motion transitions, with release and stationary motion in one test input frame. Physical Windows/macOS multi-monitor validation remains open.

DutchSailor and others added 30 commits May 22, 2026 09:37
Combines two tracks into one v0.4.0 release:
- Spoor B: replace in-memory pipeline with COPC streaming + CCCoreLib FFI kernel
- Spoor A: full adoption of @openaec/ui design tokens and components

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
First of five plans derived from the v0.4.0 design spec. This plan handles
only the UI rebrand: install @openaec/ui from GitHub, rename --theme-* to
--oaec-* throughout, remove the multi-theme switcher, single dark theme.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- Create src/styles/openaec-overrides.css with composite canvas-grid and ribbon-gradient tokens
- Import openaec-overrides.css between components.css and globals.css in main.tsx
- Strip all four multi-theme blocks from globals.css; replace with single [data-theme="light"] block using --oaec-* tokens
- Update @theme block RHS from --theme-* to --oaec-*
- Rename all remaining --theme-* references in utility sections to --oaec-* equivalents
- Replace hardcoded hex brand colours (#1d4ed8, #2563eb, #fff) with --oaec-accent / --oaec-accent-hover / --oaec-accent-text

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Remove the unscoped 'Input controls - Dark theme' block (~63 lines) from
Ribbon.css — .ribbon-input-group, .ribbon-input-label, .ribbon-color-input,
and the unscoped .ribbon-input/.ribbon-input-row rules were dead code
overridden by the scoped .ribbon-transform-inputs block. Clean stale hex
fallbacks from that scoped block (var(--oaec-bg-input, #0f172a) →
var(--oaec-bg-input), etc.). Update ErrorBoundary inline styles in main.tsx
to match the OpenAEC palette (#1a1a2e→#36363E, #ff6b6b/#ffa07a→#f87171,
#4a90d9→#D97706, #888→rgba(250,250,249,0.6)).

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
…stem

Plan 1 of 5 toward v0.4.0. Replaces multi-theme styling (--theme-*) with
@openaec/ui tokens (--oaec-*), removes the theme switcher UI and state,
adopts the OpenAEC dark palette with orange accent as the single theme.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Adds the missing orange File tab as leftmost ribbon-tab (matches the OpenAEC
standard from open-2d-studio); for v1 it triggers the Import handler. Overrides
five tokens in openaec-overrides.css to match the canonical style-book values
(@openaec/ui v0.1.0 is out of sync upstream): panels darker not lighter, borders
neutral grey not orange-tinted, secondary/muted text as warm neutrals.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
…rt/Export/About)

Implements the OpenAEC-standard backstage pattern from open-2d-studio. The
orange File tab in the ribbon now opens a full-viewport overlay with a sidebar
(Open / Import / Export / About) and a main content panel per active view.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
After the Authenticode and OpenPGP signing, sign-updates.sh writes a
minisign .sig beside the Windows setup and each AppImage with the
repository's updater key, and the .sig files go on the release. Once the
release is public, a last job makes latest.json with the release kit of
the installer: it checks every signature against UPDATER_PUBKEY and the
tag against native/Cargo.toml, and attaches latest.json last. The OpenAEC
Installer then checks the signature before a silent update
(OpenAEC-Foundation/OpenAEC-Blueprint#33).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.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.

3 participants