diff --git a/web/src/components/canvas/canvas-node-hover-toolbar.tsx b/web/src/components/canvas/canvas-node-hover-toolbar.tsx index 269143c70..a2dc2ab3e 100644 --- a/web/src/components/canvas/canvas-node-hover-toolbar.tsx +++ b/web/src/components/canvas/canvas-node-hover-toolbar.tsx @@ -1,9 +1,10 @@ import { useEffect, useLayoutEffect, useMemo, useRef, useState, type CSSProperties, type ReactNode, type RefObject } from "react"; import { App, Button, Dropdown, Input, Modal, Segmented, Tag } from "antd"; -import { Download, Ellipsis, FolderPlus, GalleryHorizontalEnd, Image as ImageIcon, Info, LoaderCircle, Lock, Maximize2, MessageSquare, Minus, Music2, Plus, RefreshCw, Settings2, Trash2, Unlock, Upload, UserRound, Video } from "lucide-react"; +import { Ellipsis, Lock, Plus, Settings2, Unlock } from "lucide-react"; import { canvasThemes } from "@/lib/canvas-theme"; import { canvasDockStyle } from "@/lib/canvas/canvas-aceternity-style"; +import { defaultToolbarPrefs, readToolbarPrefs, resolveToolbarTools, type ToolContext, type ToolbarHandlers } from "@/lib/canvas/tool-registry"; import { subscribeCanvasViewportPreview } from "@/lib/canvas/canvas-live-viewport"; import { canvasNodeAssetCategory } from "@/lib/canvas/canvas-node-asset"; import { formatBytes, getDataUrlByteSize } from "@/lib/image-utils"; @@ -232,28 +233,55 @@ export function CanvasNodeHoverToolbar({ setImageToolSettingsOpen(true); } - const baseToolbarTools: ToolbarTool[] = [ - { id: "info", title: isCharacterReference ? "查看角色详情" : "查看节点信息", label: isCharacterReference ? "角色详情" : "信息", icon: isCharacterReference ? : , onClick: () => onInfo(node) }, - { id: "delete", title: "移除节点", label: "删除", icon: , onClick: () => onDelete(node), danger: true }, - ]; - const nodeToolbarTools: ToolbarTool[] = [ - ...(canRetry ? [{ id: "retry", title: "重新生成", label: "重试", icon: , onClick: () => onRetry(node) }] : []), - ...(hasVideo && !simpleMode ? [{ id: "extractLastFrame", title: extractingVideoFrame ? "正在截取尾帧" : "截取尾帧", label: extractingVideoFrame ? "截取中" : "尾帧", icon: extractingVideoFrame ? : , onClick: () => onExtractVideoLastFrame(node), disabled: extractingVideoFrame }] : []), - ...(hasImage || hasVideo || isEditableText ? [{ id: "saveAsset", title: "加入我的素材", label: "存素材", icon: , onClick: () => onSaveAsset(node) }] : []), - ...(hasImage || hasVideo || hasAudio ? [{ id: "download", title: hasAudio ? "下载音频" : hasVideo ? "下载视频" : "下载图片", label: "下载", icon: , onClick: () => onDownload(node) }] : []), - ...(canOpenDialog ? [{ id: "edit", title: isEditableText ? "调用文本模型生成内容" : "编辑", label: isEditableText ? "文本生成" : "编辑", icon: , onClick: () => onToggleDialog(node) }] : []), - ...(isEditableText ? [{ id: "editText", title: "放大编辑文本", label: "放大编辑", icon: , onClick: () => onEditText(node) }] : []), - ...(isEditableText ? [{ id: "generateImage", title: "用文本生图", label: "生图", icon: , onClick: () => onGenerateImage(node) }] : []), - ...(isConfig && !simpleMode ? [{ id: "config", title: "生成配置", label: "生成配置", icon: , onClick: () => onToggleDialog(node) }] : []), - ...(isEditableText && !simpleMode ? [{ id: "decreaseFont", title: "减小字号", label: "缩小", icon: , onClick: () => onDecreaseFont(node) }] : []), - ...(isEditableText && !simpleMode ? [{ id: "increaseFont", title: "增大字号", label: "放大", icon: , onClick: () => onIncreaseFont(node) }] : []), - ...(isImage && !hasImage ? [{ id: "uploadImage", title: "上传图片", label: "上传图片", icon: , onClick: () => onUpload(node) }] : []), - ...(isVideo ? [{ id: "uploadVideo", title: hasVideo ? "替换视频" : "上传视频", label: hasVideo ? "替换视频" : "上传视频", icon: