From 17ffdda0b86905ffe6499f6fdc85bb15537461fb Mon Sep 17 00:00:00 2001 From: ddCat <2695092045@qq.com> Date: Sat, 19 Sep 2026 00:08:41 +0800 Subject: [PATCH] =?UTF-8?q?fix(canvas):=20=E5=9B=BE=E7=89=87=E5=B7=A5?= =?UTF-8?q?=E5=85=B7=20-=20=E7=A7=BB=E9=99=A4=E7=8B=AC=E7=AB=8B=E5=9B=BE?= =?UTF-8?q?=E7=89=87=E7=BC=96=E8=BE=91=E5=85=A5=E5=8F=A3=E5=B9=B6=E4=BF=9D?= =?UTF-8?q?=E7=95=99=E8=BF=9E=E7=BA=BF=E7=94=9F=E6=88=90?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: lmj15657306288-ui --- .../components/canvas/canvas-image-toolbar-tools.tsx | 12 +----------- .../canvas/canvas-node-image-edit-dialog.tsx | 2 +- web/src/components/canvas/canvas-node-toolbar.tsx | 6 ++---- .../pages/canvas/canvas-project-media-dialogs.tsx | 6 +++--- web/src/pages/canvas/project.tsx | 5 +---- web/src/pages/canvas/shared.tsx | 2 +- web/src/pages/canvas/use-canvas-media-tools.ts | 6 ------ 7 files changed, 9 insertions(+), 30 deletions(-) diff --git a/web/src/components/canvas/canvas-image-toolbar-tools.tsx b/web/src/components/canvas/canvas-image-toolbar-tools.tsx index 4fafaaf84..475a9d664 100644 --- a/web/src/components/canvas/canvas-image-toolbar-tools.tsx +++ b/web/src/components/canvas/canvas-image-toolbar-tools.tsx @@ -4,7 +4,7 @@ import { Brush, Camera, Copy, FileText, Globe2, Grid2x2, Layers3, Lock, LockOpen import type { CanvasNodeData } from "@/types/canvas"; import type { NodeToolbarGroup } from "@/lib/canvas/tool-registry"; -type ImageNodeActionToolId = "copyPrompt" | "reversePrompt" | "replace" | "resize" | "annotation" | "annotationEdit" | "textEdit" | "maskEdit" | "imageEdit" | "removeBackground" | "layerDecomposition" | "emotion" | "portraitTexture" | "crop" | "split" | "upscale" | "superResolve" | "angle" | "lighting" | "panorama" | "view"; +type ImageNodeActionToolId = "copyPrompt" | "reversePrompt" | "replace" | "resize" | "annotation" | "annotationEdit" | "textEdit" | "maskEdit" | "removeBackground" | "layerDecomposition" | "emotion" | "portraitTexture" | "crop" | "split" | "upscale" | "superResolve" | "angle" | "lighting" | "panorama" | "view"; type ImageToolHandlers = { onUpload: (node: CanvasNodeData) => void; @@ -13,7 +13,6 @@ type ImageToolHandlers = { onAnnotationEdit: (node: CanvasNodeData) => void; onTextEdit: (node: CanvasNodeData) => void; onMaskEdit: (node: CanvasNodeData) => void; - onImageEdit: (node: CanvasNodeData) => void; onRemoveBackground: (node: CanvasNodeData) => void; onLayerDecomposition: (node: CanvasNodeData) => void; onEmotion: (node: CanvasNodeData) => void; @@ -117,15 +116,6 @@ const imageToolDefinitions: ImageToolDefinition[] = [ order: 15, run: (node, handlers) => handlers.onTextEdit(node), }, - { - id: "imageEdit", - label: "图片编辑", - description: "用文字描述要修改的内容,生成新图片", - icon: () => , - group: "primary", - order: 20, - run: (node, handlers) => handlers.onImageEdit(node), - }, { id: "removeBackground", label: "去除背景", diff --git a/web/src/components/canvas/canvas-node-image-edit-dialog.tsx b/web/src/components/canvas/canvas-node-image-edit-dialog.tsx index 2c0e95bd4..12717765c 100644 --- a/web/src/components/canvas/canvas-node-image-edit-dialog.tsx +++ b/web/src/components/canvas/canvas-node-image-edit-dialog.tsx @@ -31,7 +31,7 @@ export function CanvasNodeImageEditDialog({ }, [config, open, dataUrl]); return ( - +
待编辑图片 diff --git a/web/src/components/canvas/canvas-node-toolbar.tsx b/web/src/components/canvas/canvas-node-toolbar.tsx index f629492ca..5dee9017b 100644 --- a/web/src/components/canvas/canvas-node-toolbar.tsx +++ b/web/src/components/canvas/canvas-node-toolbar.tsx @@ -37,7 +37,6 @@ type CanvasNodeToolbarProps = { onDownload: (node: CanvasNodeData) => void; onSaveAsset: (node: CanvasNodeData) => void; onMaskEdit: (node: CanvasNodeData) => void; - onImageEdit: (node: CanvasNodeData) => void; onRemoveBackground: (node: CanvasNodeData) => void; onLayerDecomposition: (node: CanvasNodeData) => void; onEmotion: (node: CanvasNodeData) => void; @@ -103,7 +102,6 @@ export function CanvasNodeToolbar({ onDownload, onSaveAsset, onMaskEdit, - onImageEdit, onRemoveBackground, onLayerDecomposition, onEmotion, @@ -231,13 +229,13 @@ export function CanvasNodeToolbar({ } copyText(prompt, "提示词已复制"); }; - const imageTools = buildImageToolbarTools(node, { onUpload, onToggleFreeResize, onAnnotate, onAnnotationEdit, onTextEdit, onMaskEdit, onImageEdit, onRemoveBackground, onLayerDecomposition, onEmotion, onPortraitTexture, onCrop, onUpscale, onSuperResolve, onAngle, onLighting, onPanorama, onViewImage, onCopyPrompt: copyImagePrompt, onReversePrompt }); + const imageTools = buildImageToolbarTools(node, { onUpload, onToggleFreeResize, onAnnotate, onAnnotationEdit, onTextEdit, onMaskEdit, onRemoveBackground, onLayerDecomposition, onEmotion, onPortraitTexture, onCrop, onUpscale, onSuperResolve, onAngle, onLighting, onPanorama, onViewImage, onCopyPrompt: copyImagePrompt, onReversePrompt }); // 构建 ToolContext——供注册表解析工具 const nodeHoverHandlers = { onNodeInfo: onInfo, onNodeDelete: onDelete, onNodeRetry: onRetry, onNodeEditText: onEditText, onNodeDecreaseFont: onDecreaseFont, onNodeIncreaseFont: onIncreaseFont, onNodeToggleDialog: onToggleDialog, onNodeAnnotate: onAnnotate, onNodeGenerateImage: onGenerateImage, onNodeUpload: onUpload, onNodeDownload: onDownload, - onNodeSaveAsset: onSaveAsset, onNodeMaskEdit: onMaskEdit, onNodeImageEdit: onImageEdit, onNodeRemoveBackground: onRemoveBackground, onNodeEmotion: onEmotion, onNodePortraitTexture: onPortraitTexture, onNodeCrop: onCrop, + onNodeSaveAsset: onSaveAsset, onNodeMaskEdit: onMaskEdit, onNodeRemoveBackground: onRemoveBackground, onNodeEmotion: onEmotion, onNodePortraitTexture: onPortraitTexture, onNodeCrop: onCrop, onNodeSplit: (target) => onSplit(target, { rows: 2, columns: 2 }), onNodeUpscale: onUpscale, onNodeSuperResolve: onSuperResolve, onNodeAngle: onAngle, onNodeViewImage: onViewImage, onNodeExtractVideoFrames: onExtractVideoFrames, onNodeExtractAudioFromVideo: onExtractAudioFromVideo, onNodeTrimVideoSegments: onTrimVideoSegments, onNodeReversePrompt: onReversePrompt, onNodeToggleFreeResize: onToggleFreeResize, onNodeSubtitles: onSubtitles, onNodeTimeline: onTimeline, onNodeToggleLocked: onToggleLocked, onNodeCopyPrompt: copyImagePrompt, diff --git a/web/src/pages/canvas/canvas-project-media-dialogs.tsx b/web/src/pages/canvas/canvas-project-media-dialogs.tsx index 55fcbc311..6df9bf4dd 100644 --- a/web/src/pages/canvas/canvas-project-media-dialogs.tsx +++ b/web/src/pages/canvas/canvas-project-media-dialogs.tsx @@ -31,7 +31,7 @@ type CanvasProjectMediaDialogsProps = { onAnnotationEdit: (node: CanvasNodeData, payload: CanvasImageAnnotationPayload) => void; onMaskEdit: (node: CanvasNodeData, payload: CanvasImageMaskEditPayload) => void; onUpscale: (node: CanvasNodeData, params: CanvasImageUpscaleParams) => void; - onImageEdit: (node: CanvasNodeData, payload: CanvasImageEditPayload) => void; + onImageOperation: (node: CanvasNodeData, payload: CanvasImageEditPayload) => void; onLayerDecomposition: (node: CanvasNodeData, payload: CanvasImageLayerDecompositionPayload) => void; onDetectText: () => Promise; onTextEdit: (node: CanvasNodeData, payload: CanvasImageTextEditPayload) => void; @@ -61,7 +61,7 @@ export function CanvasProjectMediaDialogs({ onAnnotationEdit, onMaskEdit, onUpscale, - onImageEdit, + onImageOperation, onLayerDecomposition, onDetectText, onTextEdit, @@ -74,7 +74,7 @@ export function CanvasProjectMediaDialogs({ {annotationEditNode?.metadata?.content ? { if (typeof payload !== "string") onAnnotationEdit(annotationEditNode, payload); }} /> : null} {maskEditNode?.metadata?.content ? onMaskEdit(maskEditNode, payload)} /> : null} {upscaleNode?.metadata?.content ? onUpscale(upscaleNode, params)} /> : null} - {imageEditNode?.metadata?.content ? onImageEdit(imageEditNode, payload)} /> : null} + {imageEditNode?.metadata?.content ? onImageOperation(imageEditNode, payload)} /> : null} {layerDecompositionNode?.metadata?.content ? onLayerDecomposition(layerDecompositionNode, payload)} /> : null} {textEditNode?.metadata?.content ? onTextEdit(textEditNode, payload)} /> : null} diff --git a/web/src/pages/canvas/project.tsx b/web/src/pages/canvas/project.tsx index 61928006a..056630207 100644 --- a/web/src/pages/canvas/project.tsx +++ b/web/src/pages/canvas/project.tsx @@ -875,7 +875,6 @@ function InfiniteCanvasPage() { setMaskEditNodeId, setImageEditNodeId, setImageEditPreset, - openImageEditNode, openBackgroundRemoval, openLayerDecomposition, decomposeImageLayers, @@ -2171,7 +2170,6 @@ function InfiniteCanvasPage() { onFocusOutput={(nodeId) => focusCanvasImageNode(nodeId)} onReorderReferenceColumns={(fromColumnId, toColumnId) => reorderBatchReferenceColumns(contentNode.id, fromColumnId, toColumnId)} onMoveReferenceCell={(sourceRowId, sourceColumnIndex, targetRowId, targetColumnIndex) => moveBatchReferenceCell(contentNode.id, sourceRowId, sourceColumnIndex, targetRowId, targetColumnIndex)} - onReplaceReference={replaceCanvasNodeMedia} onUploadReference={(rowId, columnIndex, file) => { void handleUploadBatchReference(contentNode.id, rowId, columnIndex, file); }} onConnectStart={(event, handleId) => handleConnectStart(event, contentNode.id, "target", handleId)} onConnectDrop={(event, handleId) => handleConnectDrop(event, contentNode.id, handleId)} @@ -2838,7 +2836,6 @@ function InfiniteCanvasPage() { onAnnotate={(node) => setAnnotationNodeId(node.id)} onAnnotationEdit={openAnnotationEditNode} onMaskEdit={(node) => setMaskEditNodeId(node.id)} - onImageEdit={openImageEditNode} onRemoveBackground={openBackgroundRemoval} onLayerDecomposition={openLayerDecomposition} onTextEdit={openTextEditNode} @@ -3181,7 +3178,7 @@ function InfiniteCanvasPage() { onAnnotate={(node, dataUrl) => void saveAnnotatedImageNode(node, dataUrl)} onAnnotationEdit={(node, payload) => void editAnnotatedImageNode(node, payload)} onMaskEdit={(node, payload) => void maskEditImageNode(node, payload)} - onImageEdit={(node, payload) => void editImageNode(node, payload)} + onImageOperation={(node, payload) => void editImageNode(node, payload)} onLayerDecomposition={(node, payload) => void decomposeImageLayers(node, payload)} onDetectText={() => { const node = textEditNodeId ? nodeById.get(textEditNodeId) : null; diff --git a/web/src/pages/canvas/shared.tsx b/web/src/pages/canvas/shared.tsx index 9bd3a9a67..5d6718d71 100644 --- a/web/src/pages/canvas/shared.tsx +++ b/web/src/pages/canvas/shared.tsx @@ -282,7 +282,7 @@ export default function SharedCanvasPage() { }} onHoverStart={keepToolbar} onHoverEnd={hideToolbar} onConnectStart={unauthorized} onResize={() => undefined} onContentChange={unauthorized} onRetry={unauthorized} onOpenTaskDetails={unauthorized} onViewImage={(target) => setInfoNodeId(target.id)} onContextMenu={(event, nodeId) => openContextMenu(event, nodeId)} />)} - setInfoNodeId(node.id)} onEditText={unauthorized} onDecreaseFont={unauthorized} onIncreaseFont={unauthorized} onToggleDialog={unauthorized} onAnnotate={unauthorized} onAnnotationEdit={unauthorized} onTextEdit={unauthorized} onGenerateImage={unauthorized} onUpload={unauthorized} onDownload={unauthorized} onSaveAsset={unauthorized} onMaskEdit={unauthorized} onImageEdit={unauthorized} onRemoveBackground={unauthorized} onLayerDecomposition={unauthorized} onEmotion={unauthorized} onPortraitTexture={unauthorized} onCrop={unauthorized} onSplit={unauthorized} onUpscale={unauthorized} onSuperResolve={unauthorized} onAngle={unauthorized} onLighting={unauthorized} onPanorama={unauthorized} onViewImage={unauthorized} onExtractVideoFrames={unauthorized} onExtractAudioFromVideo={unauthorized} onTrimVideoSegments={unauthorized} extractingVideoFrames={false} extractingAudio={false} trimmingVideo={false} onSubtitles={unauthorized} onTimeline={unauthorized} onReversePrompt={unauthorized} onRetry={unauthorized} onToggleFreeResize={unauthorized} onToggleLocked={unauthorized} onDelete={unauthorized} /> + setInfoNodeId(node.id)} onEditText={unauthorized} onDecreaseFont={unauthorized} onIncreaseFont={unauthorized} onToggleDialog={unauthorized} onAnnotate={unauthorized} onAnnotationEdit={unauthorized} onTextEdit={unauthorized} onGenerateImage={unauthorized} onUpload={unauthorized} onDownload={unauthorized} onSaveAsset={unauthorized} onMaskEdit={unauthorized} onRemoveBackground={unauthorized} onLayerDecomposition={unauthorized} onEmotion={unauthorized} onPortraitTexture={unauthorized} onCrop={unauthorized} onSplit={unauthorized} onUpscale={unauthorized} onSuperResolve={unauthorized} onAngle={unauthorized} onLighting={unauthorized} onPanorama={unauthorized} onViewImage={unauthorized} onExtractVideoFrames={unauthorized} onExtractAudioFromVideo={unauthorized} onTrimVideoSegments={unauthorized} extractingVideoFrames={false} extractingAudio={false} trimmingVideo={false} onSubtitles={unauthorized} onTimeline={unauthorized} onReversePrompt={unauthorized} onRetry={unauthorized} onToggleFreeResize={unauthorized} onToggleLocked={unauthorized} onDelete={unauthorized} />
访客操作仅在当前页面临时生效
diff --git a/web/src/pages/canvas/use-canvas-media-tools.ts b/web/src/pages/canvas/use-canvas-media-tools.ts index a2b59e8b7..14da960be 100644 --- a/web/src/pages/canvas/use-canvas-media-tools.ts +++ b/web/src/pages/canvas/use-canvas-media-tools.ts @@ -962,11 +962,6 @@ export function useCanvasMediaTools({ } }, [bindGenerationTask, effectiveConfig, finishGenerationRequest, isAiConfigReady, message, nodesRef, persistMediaNodes, projectId, setConnections, setDialogNodeId, setNodes, setRunningNodeId, setSelectedConnectionId, setSelectedNodeIds, startGenerationRequest]); - const openImageEditNode = useCallback((node: CanvasNodeData) => { - setImageEditPreset(null); - setImageEditNodeId(node.id); - }, []); - const openBackgroundRemoval = useCallback((node: CanvasNodeData) => { setImageEditPreset("remove-background"); setImageEditNodeId(node.id); @@ -1247,7 +1242,6 @@ export function useCanvasMediaTools({ setMaskEditNodeId, setImageEditNodeId, setImageEditPreset, - openImageEditNode, openBackgroundRemoval, openLayerDecomposition, decomposeImageLayers,