Simplify viewport caption and update tool preview handling

This commit is contained in:
2026-04-02 23:01:41 +02:00
parent 783b63b3e5
commit a8f965cf0e
2 changed files with 36 additions and 17 deletions

View File

@@ -205,24 +205,17 @@ function formatDiagnosticCount(count: number, label: string): string {
function getViewportCaption(
toolMode: "select" | "box-create" | "play",
layoutMode: ViewportLayoutMode,
activePanelId: ViewportPanelId,
activePanelState: { viewMode: ViewportViewMode; displayMode: ViewportDisplayMode },
brushCount: number
layoutMode: ViewportLayoutMode
): string {
if (toolMode === "play") {
return "Runner is active.";
}
const layoutLabel = getViewportLayoutModeLabel(layoutMode);
const panelLabel = getViewportPanelLabel(activePanelId);
const panelSummary = `${getViewportViewModeLabel(activePanelState.viewMode)} / ${getViewportDisplayModeLabel(activePanelState.displayMode)}`;
if (toolMode === "box-create") {
return `${brushCount} box brush${brushCount === 1 ? "" : "es"} loaded. ${layoutLabel} active. Box Create uses the active panel. Active panel: ${panelLabel} (${panelSummary}).`;
return `${getViewportLayoutModeLabel(layoutMode)} active. Hover any viewport to update the shared preview; click to place.`;
}
return `${brushCount} box brush${brushCount === 1 ? "" : "es"} loaded. ${layoutLabel} active. Active panel: ${panelLabel} (${panelSummary}).`;
return `${getViewportLayoutModeLabel(layoutMode)} active.`;
}
function createVec2Draft(vector: Vec2): Vec2Draft {
@@ -736,6 +729,7 @@ export function App({ store, initialStatusMessage }: AppProps) {
const activePanelState = editorState.viewportPanels[activePanelId];
const activePanelLabel = getViewportPanelLabel(activePanelId);
const activePanelDisplaySummary = `${getViewportViewModeLabel(activePanelState.viewMode)} / ${getViewportDisplayModeLabel(activePanelState.displayMode)}`;
const viewportToolPreview = editorState.viewportTransientState.toolPreview;
const entityList = getEntityInstances(editorState.document.entities);
const entityDisplayList = getSortedEntityDisplayLabels(editorState.document.entities, editorState.document.assets);
const primaryPlayerStart = getPrimaryPlayerStartEntity(editorState.document.entities);
@@ -1304,6 +1298,14 @@ export function App({ store, initialStatusMessage }: AppProps) {
return;
}
if (
nextLayoutMode === "single" &&
editorState.viewportTransientState.toolPreview.kind === "box-create" &&
editorState.viewportTransientState.toolPreview.sourcePanelId !== activePanelId
) {
store.clearViewportToolPreview(editorState.viewportTransientState.toolPreview.sourcePanelId);
}
blurActiveTextEntry();
store.setViewportLayoutMode(nextLayoutMode);
setStatusMessage(`Switched the viewport to ${getViewportLayoutModeLabel(nextLayoutMode)}.`);
@@ -1326,6 +1328,14 @@ export function App({ store, initialStatusMessage }: AppProps) {
blurActiveTextEntry();
store.setViewportPanelViewMode(panelId, nextViewMode);
if (
editorState.viewportTransientState.toolPreview.kind === "box-create" &&
editorState.viewportTransientState.toolPreview.sourcePanelId === panelId
) {
store.clearViewportToolPreview(panelId);
}
setStatusMessage(`Set the ${getViewportPanelLabel(panelId)} panel to ${getViewportViewModeLabel(nextViewMode)} view.`);
};
@@ -4082,9 +4092,7 @@ export function App({ store, initialStatusMessage }: AppProps) {
<div className="viewport-region__header">
<div className="viewport-region__meta">
<div className="viewport-region__title">Viewport</div>
<div className="viewport-region__caption">
{getViewportCaption(editorState.toolMode, layoutMode, activePanelId, activePanelState, brushList.length)}
</div>
<div className="viewport-region__caption">{getViewportCaption(editorState.toolMode, layoutMode)}</div>
<div className="viewport-region__active-panel" data-testid="viewport-active-panel">
Active panel: {activePanelLabel} ({activePanelDisplaySummary})
</div>
@@ -4119,6 +4127,7 @@ export function App({ store, initialStatusMessage }: AppProps) {
loadedImageAssets={loadedImageAssets}
selection={editorState.selection}
toolMode={editorState.toolMode}
toolPreview={viewportToolPreview}
focusRequestId={focusRequest.panelId === panelId ? focusRequest.id : 0}
focusSelection={focusRequest.selection}
onActivatePanel={handleActivateViewportPanel}

View File

@@ -8,6 +8,7 @@ import {
type ViewportPanelState
} from "./viewport-layout";
import { VIEWPORT_VIEW_MODES, getViewportViewModeLabel, type ViewportViewMode } from "./viewport-view-modes";
import type { ViewportToolPreview } from "./viewport-transient-state";
import type { LoadedModelAsset } from "../assets/gltf-model-import";
import type { LoadedImageAsset } from "../assets/image-assets";
import type { ProjectAssetRecord } from "../assets/project-assets";
@@ -29,11 +30,13 @@ interface ViewportPanelProps {
loadedImageAssets: Record<string, LoadedImageAsset>;
selection: EditorSelection;
toolMode: ToolMode;
toolPreview: ViewportToolPreview;
focusRequestId: number;
focusSelection: EditorSelection;
onActivatePanel(panelId: ViewportPanelId): void;
onSetPanelViewMode(panelId: ViewportPanelId, viewMode: ViewportViewMode): void;
onSetPanelDisplayMode(panelId: ViewportPanelId, displayMode: ViewportDisplayMode): void;
onToolPreviewChange(toolPreview: ViewportToolPreview): void;
onSelectionChange(selection: EditorSelection): void;
onCreateBoxBrush(center: Vec3): void;
}
@@ -50,11 +53,13 @@ export function ViewportPanel({
loadedImageAssets,
selection,
toolMode,
toolPreview,
focusRequestId,
focusSelection,
onActivatePanel,
onSetPanelViewMode,
onSetPanelDisplayMode,
onToolPreviewChange,
onSelectionChange,
onCreateBoxBrush
}: ViewportPanelProps) {
@@ -62,7 +67,7 @@ export function ViewportPanel({
return (
<section
className={`viewport-panel ${layoutMode === "single" ? "viewport-panel--single" : "viewport-panel--quad"} ${isActive ? "viewport-panel--active" : ""}`}
className={`viewport-panel ${layoutMode === "single" ? "viewport-panel--single" : "viewport-panel--quad viewport-panel--compact"} ${isActive ? "viewport-panel--active" : ""}`}
data-testid={`viewport-panel-${panelId}`}
data-active={isActive ? "true" : "false"}
aria-hidden={shouldShow ? undefined : true}
@@ -77,9 +82,11 @@ export function ViewportPanel({
<div className="viewport-panel__title">{getViewportPanelLabel(panelId)}</div>
{isActive ? <div className="viewport-panel__active-badge">Active</div> : null}
</div>
<div className="viewport-panel__subtitle">
{getViewportViewModeLabel(panelState.viewMode)} / {getViewportDisplayModeLabel(panelState.displayMode)}
</div>
{layoutMode === "quad" ? null : (
<div className="viewport-panel__subtitle">
{getViewportViewModeLabel(panelState.viewMode)} / {getViewportDisplayModeLabel(panelState.displayMode)}
</div>
)}
</div>
<div className="viewport-panel__controls">
@@ -124,13 +131,16 @@ export function ViewportPanel({
loadedImageAssets={loadedImageAssets}
selection={selection}
toolMode={toolMode}
toolPreview={toolPreview}
viewMode={panelState.viewMode}
displayMode={panelState.displayMode}
layoutMode={layoutMode}
isActivePanel={isActive}
focusRequestId={focusRequestId}
focusSelection={focusSelection}
onSelectionChange={onSelectionChange}
onCreateBoxBrush={onCreateBoxBrush}
onToolPreviewChange={onToolPreviewChange}
/>
</section>
);