Test: Prevent viewport refocus when scene document changes without focus request
This commit is contained in:
@@ -10,6 +10,7 @@ import {
|
|||||||
import type { ArmedTerrainBrushState } from "../../src/core/terrain-brush";
|
import type { ArmedTerrainBrushState } from "../../src/core/terrain-brush";
|
||||||
import { createBoxBrush } from "../../src/document/brushes";
|
import { createBoxBrush } from "../../src/document/brushes";
|
||||||
import { createEmptySceneDocument } from "../../src/document/scene-document";
|
import { createEmptySceneDocument } from "../../src/document/scene-document";
|
||||||
|
import { createTerrain } from "../../src/document/terrains";
|
||||||
import { createRuntimeClockState } from "../../src/runtime-three/runtime-project-time";
|
import { createRuntimeClockState } from "../../src/runtime-three/runtime-project-time";
|
||||||
import { buildRuntimeSceneFromDocument } from "../../src/runtime-three/runtime-scene-build";
|
import { buildRuntimeSceneFromDocument } from "../../src/runtime-three/runtime-scene-build";
|
||||||
import { ViewportCanvas } from "../../src/viewport-three/ViewportCanvas";
|
import { ViewportCanvas } from "../../src/viewport-three/ViewportCanvas";
|
||||||
@@ -482,4 +483,126 @@ describe("ViewportCanvas", () => {
|
|||||||
screen.getByTestId("viewport-terrain-brush-preview-topLeft")
|
screen.getByTestId("viewport-terrain-brush-preview-topLeft")
|
||||||
).toHaveTextContent("terrain · paint · layer 3");
|
).toHaveTextContent("terrain · paint · layer 3");
|
||||||
});
|
});
|
||||||
|
|
||||||
|
it("does not refocus the viewport when the scene document changes without a new focus request", async () => {
|
||||||
|
const baseSceneDocument = createEmptySceneDocument();
|
||||||
|
const focusedTerrain = createTerrain({
|
||||||
|
id: "terrain-focused"
|
||||||
|
});
|
||||||
|
const focusedSceneDocument = {
|
||||||
|
...baseSceneDocument,
|
||||||
|
terrains: {
|
||||||
|
[focusedTerrain.id]: focusedTerrain
|
||||||
|
}
|
||||||
|
};
|
||||||
|
const updatedSceneDocument = {
|
||||||
|
...focusedSceneDocument,
|
||||||
|
terrains: {
|
||||||
|
[focusedTerrain.id]: createTerrain({
|
||||||
|
...focusedTerrain,
|
||||||
|
heights: focusedTerrain.heights.map((height, index) =>
|
||||||
|
index === 0 ? height + 1 : height
|
||||||
|
)
|
||||||
|
})
|
||||||
|
}
|
||||||
|
};
|
||||||
|
const cameraState = createDefaultViewportPanelCameraState();
|
||||||
|
const onCameraStateChange = vi.fn(
|
||||||
|
(_cameraState: ViewportPanelCameraState) => undefined
|
||||||
|
);
|
||||||
|
const onToolPreviewChange = vi.fn(
|
||||||
|
(_toolPreview: ViewportToolPreview) => undefined
|
||||||
|
);
|
||||||
|
const onTransformSessionChange = vi.fn(
|
||||||
|
(_transformSession: TransformSessionState) => undefined
|
||||||
|
);
|
||||||
|
const onTransformCommit = vi.fn(
|
||||||
|
(_transformSession: ActiveTransformSession) => undefined
|
||||||
|
);
|
||||||
|
const onTransformCancel = vi.fn(() => undefined);
|
||||||
|
const onSelectionChange = vi.fn();
|
||||||
|
|
||||||
|
const { rerender } = render(
|
||||||
|
<ViewportCanvas
|
||||||
|
panelId="topLeft"
|
||||||
|
world={focusedSceneDocument.world}
|
||||||
|
sceneDocument={focusedSceneDocument}
|
||||||
|
editorSimulationScene={null}
|
||||||
|
editorSimulationClock={null}
|
||||||
|
projectAssets={focusedSceneDocument.assets}
|
||||||
|
loadedModelAssets={{}}
|
||||||
|
loadedImageAssets={{}}
|
||||||
|
whiteboxSelectionMode="object"
|
||||||
|
whiteboxSnapEnabled
|
||||||
|
whiteboxSnapStep={1}
|
||||||
|
viewportGridVisible={true}
|
||||||
|
selection={{ kind: "terrains", ids: [focusedTerrain.id] }}
|
||||||
|
activeSelectionId={focusedTerrain.id}
|
||||||
|
terrainBrushState={null}
|
||||||
|
toolMode="select"
|
||||||
|
toolPreview={{ kind: "none" }}
|
||||||
|
transformSession={createInactiveTransformSession()}
|
||||||
|
cameraState={cameraState}
|
||||||
|
viewMode="perspective"
|
||||||
|
displayMode="authoring"
|
||||||
|
layoutMode="single"
|
||||||
|
isActivePanel
|
||||||
|
focusRequestId={1}
|
||||||
|
focusSelection={{ kind: "terrains", ids: [focusedTerrain.id] }}
|
||||||
|
onSelectionChange={onSelectionChange}
|
||||||
|
onTerrainBrushCommit={vi.fn(() => true)}
|
||||||
|
onCommitCreation={vi.fn(() => true)}
|
||||||
|
onCameraStateChange={onCameraStateChange}
|
||||||
|
onToolPreviewChange={onToolPreviewChange}
|
||||||
|
onTransformSessionChange={onTransformSessionChange}
|
||||||
|
onTransformCommit={onTransformCommit}
|
||||||
|
onTransformCancel={onTransformCancel}
|
||||||
|
/>
|
||||||
|
);
|
||||||
|
|
||||||
|
await waitFor(() => {
|
||||||
|
expect(viewportHostInstances).toHaveLength(1);
|
||||||
|
expect(viewportHostInstances[0].focusSelection).toHaveBeenCalledTimes(1);
|
||||||
|
});
|
||||||
|
|
||||||
|
rerender(
|
||||||
|
<ViewportCanvas
|
||||||
|
panelId="topLeft"
|
||||||
|
world={updatedSceneDocument.world}
|
||||||
|
sceneDocument={updatedSceneDocument}
|
||||||
|
editorSimulationScene={null}
|
||||||
|
editorSimulationClock={null}
|
||||||
|
projectAssets={updatedSceneDocument.assets}
|
||||||
|
loadedModelAssets={{}}
|
||||||
|
loadedImageAssets={{}}
|
||||||
|
whiteboxSelectionMode="object"
|
||||||
|
whiteboxSnapEnabled
|
||||||
|
whiteboxSnapStep={1}
|
||||||
|
viewportGridVisible={true}
|
||||||
|
selection={{ kind: "terrains", ids: [focusedTerrain.id] }}
|
||||||
|
activeSelectionId={focusedTerrain.id}
|
||||||
|
terrainBrushState={null}
|
||||||
|
toolMode="select"
|
||||||
|
toolPreview={{ kind: "none" }}
|
||||||
|
transformSession={createInactiveTransformSession()}
|
||||||
|
cameraState={cameraState}
|
||||||
|
viewMode="perspective"
|
||||||
|
displayMode="authoring"
|
||||||
|
layoutMode="single"
|
||||||
|
isActivePanel
|
||||||
|
focusRequestId={1}
|
||||||
|
focusSelection={{ kind: "terrains", ids: [focusedTerrain.id] }}
|
||||||
|
onSelectionChange={onSelectionChange}
|
||||||
|
onTerrainBrushCommit={vi.fn(() => true)}
|
||||||
|
onCommitCreation={vi.fn(() => true)}
|
||||||
|
onCameraStateChange={onCameraStateChange}
|
||||||
|
onToolPreviewChange={onToolPreviewChange}
|
||||||
|
onTransformSessionChange={onTransformSessionChange}
|
||||||
|
onTransformCommit={onTransformCommit}
|
||||||
|
onTransformCancel={onTransformCancel}
|
||||||
|
/>
|
||||||
|
);
|
||||||
|
|
||||||
|
expect(viewportHostInstances[0].focusSelection).toHaveBeenCalledTimes(1);
|
||||||
|
});
|
||||||
});
|
});
|
||||||
|
|||||||
Reference in New Issue
Block a user