From 16c31a8ca155a7f8450e598535718707c5f65b57 Mon Sep 17 00:00:00 2001 From: ddCat <2695092045@qq.com> Date: Wed, 5 Aug 2026 14:23:57 +0800 Subject: [PATCH] =?UTF-8?q?fix(canvas):=20=E6=B7=BB=E5=8A=A0=E8=8A=82?= =?UTF-8?q?=E7=82=B9=E8=8F=9C=E5=8D=95=20-=20=E7=BB=9F=E4=B8=80=E5=91=BD?= =?UTF-8?q?=E4=BB=A4=E5=85=A5=E5=8F=A3=E5=B9=B6=E4=BF=AE=E5=A4=8D=E6=96=87?= =?UTF-8?q?=E5=AD=97=E6=BA=A2=E5=87=BA=E4=B8=8E=E5=88=86=E5=8C=BA=E6=8B=A5?= =?UTF-8?q?=E6=8C=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../components/canvas/canvas-context-menu.tsx | 62 ++++++------ .../canvas/canvas-create-command-grid.tsx | 49 --------- .../components/canvas/canvas-create-menu.tsx | 99 +++++++++++++++++++ web/src/components/canvas/canvas-toolbar.tsx | 26 ++--- .../definitions/add-node-menu-tools.tsx | 13 +-- web/src/lib/canvas/tool-registry/index.ts | 2 +- .../canvas/tool-registry/tool-definition.ts | 29 +++++- .../lib/canvas/tool-registry/tool-registry.ts | 4 +- .../canvas/canvas-project-context-menu.tsx | 2 + web/src/pages/canvas/project.tsx | 1 + web/src/styles/globals.css | 5 +- 11 files changed, 182 insertions(+), 110 deletions(-) delete mode 100644 web/src/components/canvas/canvas-create-command-grid.tsx create mode 100644 web/src/components/canvas/canvas-create-menu.tsx diff --git a/web/src/components/canvas/canvas-context-menu.tsx b/web/src/components/canvas/canvas-context-menu.tsx index b1dff8817..51d230c26 100644 --- a/web/src/components/canvas/canvas-context-menu.tsx +++ b/web/src/components/canvas/canvas-context-menu.tsx @@ -1,12 +1,13 @@ import { AnimatePresence, useReducedMotion } from "motion/react"; import { useEffect, useState, type CSSProperties, type ReactNode } from "react"; -import { ArrowLeft, Check, ChevronRight, Clapperboard, Clipboard, Copy, FolderOpen, FolderPlus, Image as ImageIcon, Layers3, Link2, Maximize2, Music2, PanelTop, Pencil, Plus, Redo2, Tags, Trash2, Type, Undo2, Upload, UserRound, Video } from "lucide-react"; +import { ArrowLeft, Check, ChevronRight, Clipboard, Copy, FolderOpen, FolderPlus, Image as ImageIcon, Layers3, Link2, Maximize2, PanelTop, Pencil, Plus, Redo2, Tags, Trash2, Undo2, Upload, UserRound } from "lucide-react"; +import { CanvasCreateMenu, type CanvasCreateCommand } from "@/components/canvas/canvas-create-menu"; import { aceternityMotion } from "@/lib/aceternity-motion"; import { SpotlightSurface } from "@/components/ui/aceternity/spotlight-surface"; -import { CanvasCreateCommandGrid, type CanvasCreateCommand } from "@/components/canvas/canvas-create-command-grid"; import { canvasThemes } from "@/lib/canvas-theme"; import { canvasNodeAssetCategory } from "@/lib/canvas/canvas-node-asset"; +import { resolveAddNodeMenuCommands, type AddNodeMenuContext } from "@/lib/canvas/tool-registry"; import { useThemeStore } from "@/stores/use-theme-store"; import { CanvasNodeType, type CanvasNodeData, type CanvasWorkspaceMode, type ContextMenuState, type Position } from "@/types/canvas"; @@ -32,6 +33,7 @@ type CanvasNodeContextMenuProps = { canPaste: boolean; onClose: () => void; onAddNode: (type: CanvasNodeType) => void; + onChooseStyle: () => void; onOpenDirector: (position: Position) => void; onUpload: () => void; onOpenAssets: () => void; @@ -63,6 +65,7 @@ export function CanvasNodeContextMenu({ canPaste, onClose, onAddNode, + onChooseStyle, onOpenDirector, onUpload, onOpenAssets, @@ -234,6 +237,7 @@ export function CanvasNodeContextMenu({ isProjectLinked={isProjectLinked} reducedMotion={Boolean(reducedMotion)} onAddNode={(type) => runAction(() => onAddNode(type))} + onChooseStyle={() => runAction(onChooseStyle)} onOpenDirector={() => runAction(() => onOpenDirector(menu.position))} onUpload={() => runAction(onUpload)} onOpenAssets={() => runAction(onOpenAssets)} @@ -245,27 +249,35 @@ export function CanvasNodeContextMenu({ ); } -function AddNodeContextMenu({ parentPosition, workspaceMode, isProjectLinked, reducedMotion, onAddNode, onOpenDirector, onUpload, onOpenAssets, onOpenProjectCharacters }: { parentPosition: { left: number; top: number }; workspaceMode: CanvasWorkspaceMode; isProjectLinked: boolean; reducedMotion: boolean; onAddNode: (type: CanvasNodeType) => void; onOpenDirector: () => void; onUpload: () => void; onOpenAssets: () => void; onOpenProjectCharacters: () => void }) { +function AddNodeContextMenu({ parentPosition, workspaceMode, isProjectLinked, reducedMotion, onAddNode, onChooseStyle, onOpenDirector, onUpload, onOpenAssets, onOpenProjectCharacters }: { parentPosition: { left: number; top: number }; workspaceMode: CanvasWorkspaceMode; isProjectLinked: boolean; reducedMotion: boolean; onAddNode: (type: CanvasNodeType) => void; onChooseStyle: () => void; onOpenDirector: () => void; onUpload: () => void; onOpenAssets: () => void; onOpenProjectCharacters: () => void }) { const theme = canvasThemes[useThemeStore((state) => state.theme)]; const left = getSubmenuLeft(parentPosition.left); - const simpleMode = workspaceMode === "simple"; - const nodeCommands: CanvasCreateCommand[] = [ - { id: "text", label: "文本", icon: , onClick: () => onAddNode(CanvasNodeType.Text) }, - { id: "drawing", label: "绘图", icon: , onClick: () => onAddNode(CanvasNodeType.Drawing) }, - { id: "script", label: "分镜脚本", icon: , badge: "核心", onClick: () => onAddNode(CanvasNodeType.Script) }, - ...(!simpleMode ? [{ id: "frame", label: "背板", icon: , onClick: () => onAddNode(CanvasNodeType.Frame) }] : []), - { id: "image", label: "图片", icon: , onClick: () => onAddNode(CanvasNodeType.Image) }, - { id: "video", label: "视频", icon: