From 33dc7e87494409b8b4ca0bf381d174296ece5a6d Mon Sep 17 00:00:00 2001 From: Victor Giers Date: Mon, 27 Apr 2026 00:32:05 +0200 Subject: [PATCH] Feature: Implement and integrate transform preview change handling --- src/app/App.tsx | 16 +++++++++++++++- src/viewport-three/ViewportCanvas.tsx | 4 ++-- .../app-project-persistence.integration.test.tsx | 2 ++ .../app-scene-transition.integration.test.tsx | 2 ++ ...eraction-links.inspector.integration.test.tsx | 2 ++ tests/unit/light-volume.integration.test.tsx | 2 ++ tests/unit/path-inspector.integration.test.tsx | 2 ++ .../unit/path-point-editing.integration.test.tsx | 2 ++ .../player-start-inspector.integration.test.tsx | 2 ++ .../unit/terrain-foundation.integration.test.tsx | 2 ++ .../transform-foundation.integration.test.tsx | 2 ++ tests/unit/viewport-canvas.test.tsx | 2 ++ tests/unit/water-volume.integration.test.tsx | 2 ++ 13 files changed, 39 insertions(+), 3 deletions(-) diff --git a/src/app/App.tsx b/src/app/App.tsx index 9d710f50..e208a9ce 100644 --- a/src/app/App.tsx +++ b/src/app/App.tsx @@ -4601,7 +4601,13 @@ export function App({ store, initialStatusMessage }: AppProps) { if (event.key === "Enter") { event.preventDefault(); - commitTransformSession(transformSession); + const latestTransformSession = + latestActiveTransformSessionRef.current; + commitTransformSession( + latestTransformSession?.id === transformSession.id + ? latestTransformSession + : transformSession + ); return; } @@ -14239,8 +14245,16 @@ export function App({ store, initialStatusMessage }: AppProps) { onWhiteboxSnapStepDraftChange={setWhiteboxSnapStepDraft} onWhiteboxSnapStepBlur={handleWhiteboxSnapStepBlur} onTransformSessionChange={(nextTransformSession) => { + latestActiveTransformSessionRef.current = + nextTransformSession.kind === "active" + ? nextTransformSession + : null; store.setTransformSession(nextTransformSession); }} + onTransformPreviewChange={(nextTransformSession) => { + latestActiveTransformSessionRef.current = + nextTransformSession; + }} onTransformCommit={commitTransformSession} onTransformCancel={() => cancelTransformSession()} onSelectionChange={(selection) => diff --git a/src/viewport-three/ViewportCanvas.tsx b/src/viewport-three/ViewportCanvas.tsx index 6245c0ef..c5e15dbe 100644 --- a/src/viewport-three/ViewportCanvas.tsx +++ b/src/viewport-three/ViewportCanvas.tsx @@ -73,7 +73,7 @@ interface ViewportCanvasProps { onCameraStateChange(cameraState: ViewportPanelCameraState): void; onToolPreviewChange(toolPreview: ViewportToolPreview): void; onTransformSessionChange(transformSession: TransformSessionState): void; - onTransformPreviewChange(transformSession: ActiveTransformSession): void; + onTransformPreviewChange?(transformSession: ActiveTransformSession): void; onTransformCommit(transformSession: ActiveTransformSession): void; onTransformCancel(): void; } @@ -110,7 +110,7 @@ export function ViewportCanvas({ onCameraStateChange, onToolPreviewChange, onTransformSessionChange, - onTransformPreviewChange, + onTransformPreviewChange = () => undefined, onTransformCommit, onTransformCancel }: ViewportCanvasProps) { diff --git a/tests/unit/app-project-persistence.integration.test.tsx b/tests/unit/app-project-persistence.integration.test.tsx index a1dd33cc..119fb8fb 100644 --- a/tests/unit/app-project-persistence.integration.test.tsx +++ b/tests/unit/app-project-persistence.integration.test.tsx @@ -22,6 +22,7 @@ const { MockViewportHost, viewportHostInstances } = vi.hoisted(() => { setCreationPreviewChangeHandler: ReturnType; setCreationCommitHandler: ReturnType; setTransformSessionChangeHandler: ReturnType; + setTransformPreviewChangeHandler: ReturnType; setTransformCancelHandler: ReturnType; setWhiteboxHoverLabelChangeHandler: ReturnType; setWhiteboxSelectionMode: ReturnType; @@ -51,6 +52,7 @@ const { MockViewportHost, viewportHostInstances } = vi.hoisted(() => { setCreationPreviewChangeHandler = vi.fn(); setCreationCommitHandler = vi.fn(); setTransformSessionChangeHandler = vi.fn(); + setTransformPreviewChangeHandler = vi.fn(); setTransformCommitHandler = vi.fn(); setTransformCancelHandler = vi.fn(); setWhiteboxHoverLabelChangeHandler = vi.fn(); diff --git a/tests/unit/app-scene-transition.integration.test.tsx b/tests/unit/app-scene-transition.integration.test.tsx index 1f29c772..9d3d752a 100644 --- a/tests/unit/app-scene-transition.integration.test.tsx +++ b/tests/unit/app-scene-transition.integration.test.tsx @@ -31,6 +31,7 @@ const { MockViewportHost, viewportHostInstances } = vi.hoisted(() => { setCreationPreviewChangeHandler: ReturnType; setCreationCommitHandler: ReturnType; setTransformSessionChangeHandler: ReturnType; + setTransformPreviewChangeHandler: ReturnType; setTransformCancelHandler: ReturnType; setWhiteboxHoverLabelChangeHandler: ReturnType; setWhiteboxSelectionMode: ReturnType; @@ -60,6 +61,7 @@ const { MockViewportHost, viewportHostInstances } = vi.hoisted(() => { setCreationPreviewChangeHandler = vi.fn(); setCreationCommitHandler = vi.fn(); setTransformSessionChangeHandler = vi.fn(); + setTransformPreviewChangeHandler = vi.fn(); setTransformCommitHandler = vi.fn(); setTransformCancelHandler = vi.fn(); setWhiteboxHoverLabelChangeHandler = vi.fn(); diff --git a/tests/unit/interaction-links.inspector.integration.test.tsx b/tests/unit/interaction-links.inspector.integration.test.tsx index 6f18bf5e..c01a06a7 100644 --- a/tests/unit/interaction-links.inspector.integration.test.tsx +++ b/tests/unit/interaction-links.inspector.integration.test.tsx @@ -22,6 +22,7 @@ const { MockViewportHost, viewportHostInstances } = vi.hoisted(() => { setCreationPreviewChangeHandler: ReturnType; setCreationCommitHandler: ReturnType; setTransformSessionChangeHandler: ReturnType; + setTransformPreviewChangeHandler: ReturnType; setTransformCommitHandler: ReturnType; setTransformCancelHandler: ReturnType; setWhiteboxHoverLabelChangeHandler: ReturnType; @@ -52,6 +53,7 @@ const { MockViewportHost, viewportHostInstances } = vi.hoisted(() => { setCreationPreviewChangeHandler = vi.fn(); setCreationCommitHandler = vi.fn(); setTransformSessionChangeHandler = vi.fn(); + setTransformPreviewChangeHandler = vi.fn(); setTransformCommitHandler = vi.fn(); setTransformCancelHandler = vi.fn(); setWhiteboxHoverLabelChangeHandler = vi.fn(); diff --git a/tests/unit/light-volume.integration.test.tsx b/tests/unit/light-volume.integration.test.tsx index d46771dd..cad8e1ad 100644 --- a/tests/unit/light-volume.integration.test.tsx +++ b/tests/unit/light-volume.integration.test.tsx @@ -31,6 +31,7 @@ const { MockViewportHost, viewportHostInstances } = vi.hoisted(() => { setCreationPreviewChangeHandler: ReturnType; setCreationCommitHandler: ReturnType; setTransformSessionChangeHandler: ReturnType; + setTransformPreviewChangeHandler: ReturnType; setTransformCancelHandler: ReturnType; setWhiteboxHoverLabelChangeHandler: ReturnType; setWhiteboxSelectionMode: ReturnType; @@ -61,6 +62,7 @@ const { MockViewportHost, viewportHostInstances } = vi.hoisted(() => { setCreationPreviewChangeHandler = vi.fn(); setCreationCommitHandler = vi.fn(); setTransformSessionChangeHandler = vi.fn(); + setTransformPreviewChangeHandler = vi.fn(); setTransformCancelHandler = vi.fn(); setWhiteboxHoverLabelChangeHandler = vi.fn(); setWhiteboxSelectionMode = vi.fn(); diff --git a/tests/unit/path-inspector.integration.test.tsx b/tests/unit/path-inspector.integration.test.tsx index 6ecab95f..4fa90181 100644 --- a/tests/unit/path-inspector.integration.test.tsx +++ b/tests/unit/path-inspector.integration.test.tsx @@ -21,6 +21,7 @@ const { MockViewportHost, viewportHostInstances } = vi.hoisted(() => { setCreationPreviewChangeHandler: ReturnType; setCreationCommitHandler: ReturnType; setTransformSessionChangeHandler: ReturnType; + setTransformPreviewChangeHandler: ReturnType; setTransformCommitHandler: ReturnType; setTransformCancelHandler: ReturnType; setWhiteboxHoverLabelChangeHandler: ReturnType; @@ -51,6 +52,7 @@ const { MockViewportHost, viewportHostInstances } = vi.hoisted(() => { setCreationPreviewChangeHandler = vi.fn(); setCreationCommitHandler = vi.fn(); setTransformSessionChangeHandler = vi.fn(); + setTransformPreviewChangeHandler = vi.fn(); setTransformCommitHandler = vi.fn(); setTransformCancelHandler = vi.fn(); setWhiteboxHoverLabelChangeHandler = vi.fn(); diff --git a/tests/unit/path-point-editing.integration.test.tsx b/tests/unit/path-point-editing.integration.test.tsx index 00b78553..9f47747a 100644 --- a/tests/unit/path-point-editing.integration.test.tsx +++ b/tests/unit/path-point-editing.integration.test.tsx @@ -32,6 +32,7 @@ const { MockViewportHost, viewportHostInstances } = vi.hoisted(() => { setCreationPreviewChangeHandler: ReturnType; setCreationCommitHandler: ReturnType; setTransformSessionChangeHandler: ReturnType; + setTransformPreviewChangeHandler: ReturnType; setTransformCommitHandler: ReturnType; setTransformCancelHandler: ReturnType; setWhiteboxHoverLabelChangeHandler: ReturnType; @@ -65,6 +66,7 @@ const { MockViewportHost, viewportHostInstances } = vi.hoisted(() => { setCreationPreviewChangeHandler = vi.fn(); setCreationCommitHandler = vi.fn(); setTransformSessionChangeHandler = vi.fn(); + setTransformPreviewChangeHandler = vi.fn(); setTransformCommitHandler = vi.fn(); setTransformCancelHandler = vi.fn(); setWhiteboxHoverLabelChangeHandler = vi.fn(); diff --git a/tests/unit/player-start-inspector.integration.test.tsx b/tests/unit/player-start-inspector.integration.test.tsx index e6247180..f4a390b2 100644 --- a/tests/unit/player-start-inspector.integration.test.tsx +++ b/tests/unit/player-start-inspector.integration.test.tsx @@ -22,6 +22,7 @@ const { MockViewportHost, viewportHostInstances } = vi.hoisted(() => { setCreationPreviewChangeHandler: ReturnType; setCreationCommitHandler: ReturnType; setTransformSessionChangeHandler: ReturnType; + setTransformPreviewChangeHandler: ReturnType; setTransformCommitHandler: ReturnType; setTransformCancelHandler: ReturnType; setWhiteboxHoverLabelChangeHandler: ReturnType; @@ -52,6 +53,7 @@ const { MockViewportHost, viewportHostInstances } = vi.hoisted(() => { setCreationPreviewChangeHandler = vi.fn(); setCreationCommitHandler = vi.fn(); setTransformSessionChangeHandler = vi.fn(); + setTransformPreviewChangeHandler = vi.fn(); setTransformCommitHandler = vi.fn(); setTransformCancelHandler = vi.fn(); setWhiteboxHoverLabelChangeHandler = vi.fn(); diff --git a/tests/unit/terrain-foundation.integration.test.tsx b/tests/unit/terrain-foundation.integration.test.tsx index d21669d8..5ab9d458 100644 --- a/tests/unit/terrain-foundation.integration.test.tsx +++ b/tests/unit/terrain-foundation.integration.test.tsx @@ -21,6 +21,7 @@ const { MockViewportHost, viewportHostInstances } = vi.hoisted(() => { setCreationPreviewChangeHandler: ReturnType; setCreationCommitHandler: ReturnType; setTransformSessionChangeHandler: ReturnType; + setTransformPreviewChangeHandler: ReturnType; setTransformCommitHandler: ReturnType; setTransformCancelHandler: ReturnType; setWhiteboxHoverLabelChangeHandler: ReturnType; @@ -51,6 +52,7 @@ const { MockViewportHost, viewportHostInstances } = vi.hoisted(() => { setCreationPreviewChangeHandler = vi.fn(); setCreationCommitHandler = vi.fn(); setTransformSessionChangeHandler = vi.fn(); + setTransformPreviewChangeHandler = vi.fn(); setTransformCommitHandler = vi.fn(); setTransformCancelHandler = vi.fn(); setWhiteboxHoverLabelChangeHandler = vi.fn(); diff --git a/tests/unit/transform-foundation.integration.test.tsx b/tests/unit/transform-foundation.integration.test.tsx index 03b5bf40..1aabb3bb 100644 --- a/tests/unit/transform-foundation.integration.test.tsx +++ b/tests/unit/transform-foundation.integration.test.tsx @@ -38,6 +38,7 @@ const { MockViewportHost, viewportHostInstances } = vi.hoisted(() => { setCreationPreviewChangeHandler: ReturnType; setCreationCommitHandler: ReturnType; setTransformSessionChangeHandler: ReturnType; + setTransformPreviewChangeHandler: ReturnType; setTransformCommitHandler: ReturnType; setTransformCancelHandler: ReturnType; setWhiteboxHoverLabelChangeHandler: ReturnType; @@ -71,6 +72,7 @@ const { MockViewportHost, viewportHostInstances } = vi.hoisted(() => { setCreationPreviewChangeHandler = vi.fn(); setCreationCommitHandler = vi.fn(); setTransformSessionChangeHandler = vi.fn(); + setTransformPreviewChangeHandler = vi.fn(); setTransformCommitHandler = vi.fn(); setTransformCancelHandler = vi.fn(); setWhiteboxHoverLabelChangeHandler = vi.fn(); diff --git a/tests/unit/viewport-canvas.test.tsx b/tests/unit/viewport-canvas.test.tsx index e681f31a..bf93b007 100644 --- a/tests/unit/viewport-canvas.test.tsx +++ b/tests/unit/viewport-canvas.test.tsx @@ -42,6 +42,7 @@ const { MockViewportHost, viewportHostInstances } = vi.hoisted(() => { setCreationPreviewChangeHandler: ReturnType; setCreationCommitHandler: ReturnType; setTransformSessionChangeHandler: ReturnType; + setTransformPreviewChangeHandler: ReturnType; setTransformCommitHandler: ReturnType; setTransformCancelHandler: ReturnType; setTerrainBrushCommitHandler: ReturnType; @@ -74,6 +75,7 @@ const { MockViewportHost, viewportHostInstances } = vi.hoisted(() => { setCreationPreviewChangeHandler = vi.fn(); setCreationCommitHandler = vi.fn(); setTransformSessionChangeHandler = vi.fn(); + setTransformPreviewChangeHandler = vi.fn(); setTransformCommitHandler = vi.fn(); setTransformCancelHandler = vi.fn(); setTerrainBrushCommitHandler = vi.fn(); diff --git a/tests/unit/water-volume.integration.test.tsx b/tests/unit/water-volume.integration.test.tsx index 673456f5..3ca7a637 100644 --- a/tests/unit/water-volume.integration.test.tsx +++ b/tests/unit/water-volume.integration.test.tsx @@ -28,6 +28,7 @@ const { MockViewportHost, viewportHostInstances } = vi.hoisted(() => { setCreationPreviewChangeHandler: ReturnType; setCreationCommitHandler: ReturnType; setTransformSessionChangeHandler: ReturnType; + setTransformPreviewChangeHandler: ReturnType; setTransformCancelHandler: ReturnType; setWhiteboxHoverLabelChangeHandler: ReturnType; setWhiteboxSelectionMode: ReturnType; @@ -57,6 +58,7 @@ const { MockViewportHost, viewportHostInstances } = vi.hoisted(() => { setCreationPreviewChangeHandler = vi.fn(); setCreationCommitHandler = vi.fn(); setTransformSessionChangeHandler = vi.fn(); + setTransformPreviewChangeHandler = vi.fn(); setTransformCommitHandler = vi.fn(); setTransformCancelHandler = vi.fn(); setWhiteboxHoverLabelChangeHandler = vi.fn();