feat(canvas): 交互可读性 - 优化连线、字号与工作条

This commit is contained in:
ddCat
2026-09-19 22:29:41 +08:00
parent db9e18da1e
commit ec5abc967e
12 changed files with 210 additions and 57 deletions

View File

@@ -19,6 +19,7 @@ import { nanoid } from "nanoid";
import { canvasAppearanceBaseTheme, canvasAppearanceForTheme, DEFAULT_CANVAS_BACKGROUND_MODE, normalizeCanvasAppearance, resolveCanvasAppearance, writeCanvasAppearanceDefault, type CanvasAppearance } from "@/lib/canvas/canvas-appearance";
import { canvasThemes, type CanvasBackgroundMode } from "@/lib/canvas-theme";
import { persistCanvasMediaPerformanceMode, readCanvasMediaPerformanceMode } from "@/lib/canvas/canvas-performance-mode";
import { filterCanvasDisplayConnections, persistCanvasHideNodeConnections, readCanvasHideNodeConnections } from "@/lib/canvas/canvas-connection-visibility";
import { summarizeCanvasContext } from "@/lib/canvas/canvas-context-summary";
import { refreshCanvasCharacterReferenceNodes } from "@/lib/canvas/canvas-character-reference";
import { useAssetStore } from "@/stores/use-asset-store";
@@ -304,6 +305,7 @@ function InfiniteCanvasPage() {
const [showImageInfo, setShowImageInfo] = useState(false);
const [canvasTool, setCanvasTool] = useState<CanvasToolMode>("box-select");
const [mediaPerformanceMode, setMediaPerformanceMode] = useState<CanvasMediaPerformanceMode>(readCanvasMediaPerformanceMode);
const [hideNodeConnections, setHideNodeConnections] = useState(readCanvasHideNodeConnections);
const [projectLoaded, setProjectLoaded] = useState(false);
const workspaceMode: CanvasWorkspaceMode = "professional";
const [clearConfirmOpen, setClearConfirmOpen] = useState(false);
@@ -348,6 +350,10 @@ function InfiniteCanvasPage() {
persistCanvasMediaPerformanceMode(mediaPerformanceMode);
}, [mediaPerformanceMode]);
useEffect(() => {
persistCanvasHideNodeConnections(hideNodeConnections);
}, [hideNodeConnections]);
useEffect(() => {
didInitialCenterRef.current = false;
setNodeStackOrder([]);
@@ -1434,6 +1440,17 @@ function InfiniteCanvasPage() {
scriptEditorNodeId,
dialogNodeId,
});
const visibleDisplayConnections = useMemo(
() => filterCanvasDisplayConnections(displayConnections, {
enabled: hideNodeConnections,
hoveredNodeId,
selectedNodeIds,
activeNodeId,
selectedConnectionId,
}),
[activeNodeId, displayConnections, hideNodeConnections, hoveredNodeId, selectedConnectionId, selectedNodeIds],
);
useEffect(() => {
setNodes((current) => {
let changed = false;
@@ -2513,7 +2530,7 @@ function InfiniteCanvasPage() {
containerRef={containerRef}
viewport={viewport}
theme={theme}
displayConnections={displayConnections}
displayConnections={visibleDisplayConnections}
selectedConnectionId={selectedConnectionId}
relatedConnectionIds={relatedHighlight.connectionIds}
scriptScrollTopById={scriptScrollTopById}
@@ -2547,7 +2564,7 @@ function InfiniteCanvasPage() {
projectId={projectId}
viewportScale={viewport.k}
connectionLayerBounds={connectionLayerBounds}
displayConnections={displayConnections}
displayConnections={visibleDisplayConnections}
selectedConnectionId={selectedConnectionId}
relatedConnectionIds={relatedHighlight.connectionIds}
scriptScrollTopById={scriptScrollTopById}
@@ -2890,6 +2907,8 @@ function InfiniteCanvasPage() {
onScaleChange={setZoomScale}
onFitContent={fitCanvasContent}
onAutoArrange={autoArrangeCanvasNodes}
hideNodeConnections={hideNodeConnections}
onHideNodeConnectionsChange={setHideNodeConnections}
isMiniMapOpen={isMiniMapOpen}
onToggleMiniMap={() => setIsMiniMapOpen((value) => !value)}
onOpenShortcuts={() => setShortcutRequestNonce((value) => value + 1)}