Repository navigation
Conversation
Motivation: In multi-canvas mode the first `_canvases` entry is the default target for views without an explicit `canvasId`. Reordering the same entries kept the `eventManagers` map identity in CanvasManager, so ViewManager did not rebuild and views could keep viewports/controllers bound to the former first canvas. Approach: CanvasManager.syncCanvasEntries now also replaces the `eventManagers` map when the presentation order changes, which makes ViewManager rebuild its viewports and controllers. An unchanged order still preserves map identity. Validation: extended the `Deck#multi-canvas presentation` test in test/modules/core/lib/deck.spec.ts to reorder canvases and check the default canvas, event manager and viewport size. Without the src change it fails (`eventManagers` identity unchanged); with it, it passes (`npx vitest run --project headless test/modules/core/lib/deck.spec.ts`). `yarn lint` passes. Full `yarn test-headless` had two unrelated failures (loading-widget, project-glsl timeout) that passed when re-run in isolation. Render/browser tests were not run. Report: visgl#10602 Signed-off-by: Pujitha Paladugu <10557236+pujitha24@users.noreply.github.com>
[Medium impact] Changes how canvas reordering triggers viewport refresh. The fix appears safe to merge, with a non-blocking gap in controller test coverage. Findings
Summary
|
| expect(deck.getEventManager('left')?.getElement()).toBe(eventRootB); | ||
| expect(deck.getViewports().find(viewport => viewport.id === 'left')?.width).toBe(32); | ||
| deck.setProps({_canvases: [canvasA, canvasB]}); | ||
| expect(deck.getEventManager('left')?.getElement()).toBe(eventRootA); |
There was a problem hiding this comment.
Controller movement remains untested
Neither view enables a controller, so this test cannot catch a controller left listening on the former canvas. getEventManager('left') reads the current canvas mapping, not the controller's event manager. Enable controller: true on the default view and check that its controller uses canvas B's event manager after reorder and canvas A's after restore.
Closes #10602
Background
Reordering
_canvaseschanges the default target for views without acanvasId, but theeventManagersmap kept its identity, so such views could keep viewports and controllers for the former first canvas.Change List
CanvasManager: replaceeventManagersmap when canvas order changesThis PR was written in part with the assistance of generative AI.
Note
Low Risk
Targeted fix to multi-canvas order handling with regression tests; no auth, data, or broad API changes.
Overview
Fixes multi-canvas setups where reordering
_canvasesleft views without acanvasIdbound to the wrong canvas becauseCanvasManagerkept the sameeventManagersobject when only presentation order changed.CanvasManagernow compares canvas order with_haveSameOrderand replaces theeventManagersmap when order changes (even if the sameEventManagerinstances are reused), so Deck/ViewManager see aneventManagersidentity change and rebuild default-target viewports and input routing. Tests assert reordering swaps the default canvas, refreshes theleftview’s event root and viewport width, and restores them when order is reverted.Reviewed by Cursor Bugbot for commit 08772d4. Bugbot is set up for automated code reviews on this repo. Configure here.