diff --git a/src/viewport-three/ViewportPanel.tsx b/src/viewport-three/ViewportPanel.tsx index 05d67de6..4f1fd131 100644 --- a/src/viewport-three/ViewportPanel.tsx +++ b/src/viewport-three/ViewportPanel.tsx @@ -1,9 +1,11 @@ -import type { CSSProperties } from "react"; +import type { CSSProperties, MouseEvent as ReactMouseEvent } from "react"; import { ViewportCanvas } from "./ViewportCanvas"; import { getViewportDisplayModeLabel, + getViewportLayoutModeLabel, getViewportPanelLabel, + VIEWPORT_LAYOUT_MODES, type ViewportPanelCameraState, type ViewportDisplayMode, type ViewportLayoutMode, @@ -23,9 +25,14 @@ import type { LoadedModelAsset } from "../assets/gltf-model-import"; import type { LoadedImageAsset } from "../assets/image-assets"; import type { ProjectAssetRecord } from "../assets/project-assets"; import type { EditorSelection } from "../core/selection"; -import type { WhiteboxSelectionMode } from "../core/whitebox-selection-mode"; +import { + getWhiteboxSelectionModeLabel, + WHITEBOX_SELECTION_MODES, + type WhiteboxSelectionMode +} from "../core/whitebox-selection-mode"; import type { ActiveTransformSession, + TransformOperation, TransformSessionState } from "../core/transform-session"; import type { ToolMode } from "../core/tool-mode"; @@ -46,16 +53,22 @@ interface ViewportPanelProps { loadedImageAssets: Record; whiteboxSelectionMode: WhiteboxSelectionMode; whiteboxSnapEnabled: boolean; + whiteboxSnapStepDraft: string; whiteboxSnapStep: number; viewportGridVisible: boolean; selection: EditorSelection; toolMode: ToolMode; toolPreview: ViewportToolPreview; transformSession: TransformSessionState; + canTranslateSelectedTarget: boolean; + canRotateSelectedTarget: boolean; + canScaleSelectedTarget: boolean; cameraState: ViewportPanelCameraState; focusRequestId: number; focusSelection: EditorSelection; onActivatePanel(panelId: ViewportPanelId): void; + onOpenAddMenu(event: ReactMouseEvent): void; + onSetViewportLayoutMode(layoutMode: ViewportLayoutMode): void; onSetPanelViewMode( panelId: ViewportPanelId, viewMode: ViewportViewMode @@ -67,12 +80,33 @@ interface ViewportPanelProps { onCommitCreation(toolPreview: CreationViewportToolPreview): boolean; onCameraStateChange(cameraState: ViewportPanelCameraState): void; onToolPreviewChange(toolPreview: ViewportToolPreview): void; + onBeginTransformOperation(operation: TransformOperation): void; + onWhiteboxSelectionModeChange(mode: WhiteboxSelectionMode): void; + onViewportGridToggle(): void; + onWhiteboxSnapToggle(): void; + onWhiteboxSnapStepDraftChange(value: string): void; + onWhiteboxSnapStepBlur(): void; onTransformSessionChange(transformSession: TransformSessionState): void; onTransformCommit(transformSession: ActiveTransformSession): void; onTransformCancel(): void; onSelectionChange(selection: EditorSelection): void; } +const VIEWPORT_DISPLAY_MODES = ["normal", "authoring", "wireframe"] as const; + +function getPanelScopedTestId(panelId: ViewportPanelId, name: string): string { + return `viewport-panel-${panelId}-${name}`; +} + +function getSharedControlTestId( + panelId: ViewportPanelId, + isActive: boolean, + sharedId: string, + fallbackId = sharedId +): string { + return isActive ? sharedId : getPanelScopedTestId(panelId, fallbackId); +} + export function ViewportPanel({ panelId, panelState, @@ -87,21 +121,33 @@ export function ViewportPanel({ loadedImageAssets, whiteboxSelectionMode, whiteboxSnapEnabled, + whiteboxSnapStepDraft, whiteboxSnapStep, viewportGridVisible, selection, toolMode, toolPreview, transformSession, + canTranslateSelectedTarget, + canRotateSelectedTarget, + canScaleSelectedTarget, cameraState, focusRequestId, focusSelection, onActivatePanel, + onOpenAddMenu, + onSetViewportLayoutMode, onSetPanelViewMode, onSetPanelDisplayMode, onCommitCreation, onCameraStateChange, onToolPreviewChange, + onBeginTransformOperation, + onWhiteboxSelectionModeChange, + onViewportGridToggle, + onWhiteboxSnapToggle, + onWhiteboxSnapStepDraftChange, + onWhiteboxSnapStepBlur, onTransformSessionChange, onTransformCommit, onTransformCancel, @@ -109,6 +155,7 @@ export function ViewportPanel({ }: ViewportPanelProps) { const shouldShow = layoutMode === "quad" || isActive; const panelStyle = shouldShow ? style : { ...(style ?? {}), display: "none" }; + const transformButtonsDisabled = toolMode !== "select"; return (
onActivatePanel(panelId)} onFocusCapture={() => onActivatePanel(panelId)} > -
-
-
- {VIEWPORT_VIEW_MODES.map((viewMode) => ( - - ))} -
- -
- {(["normal", "authoring", "wireframe"] as const).map( - (displayMode) => ( - - ) - )} -
-
-
- + +
+
+ + +
+ {VIEWPORT_LAYOUT_MODES.map((mode) => ( + + ))} +
+ +
+ {VIEWPORT_VIEW_MODES.map((viewMode) => ( + + ))} +
+ +
+ {VIEWPORT_DISPLAY_MODES.map((displayMode) => ( + + ))} +
+ +
+ + + +
+
+
+ +
+
+ + + +
+ +
+ {WHITEBOX_SELECTION_MODES.map((mode) => ( + + ))} +
+
); }