import { useMemo, type ReactNode } from "react"; import { Button, Checkbox, Modal, Space, Switch } from "antd"; import { Ellipsis, Settings2, Type } from "lucide-react"; import { FloatingDock, type FloatingDockEntry } from "@/components/ui/aceternity/floating-dock"; import { canvasThemes } from "@/lib/canvas-theme"; import { canvasDockStyle } from "@/lib/canvas/canvas-aceternity-style"; import { useThemeStore } from "@/stores/use-theme-store"; import type { ImageQuickToolId } from "./canvas-image-toolbar-tools"; export type ImageToolbarSettingsTool = { id: ImageQuickToolId; title: string; label: string; icon: ReactNode; active?: boolean; danger?: boolean; }; export function ImageToolSettingsModal({ open, tools, selectedIds, showLabels, onToggle, onShowLabelsChange, onCancel, onSave }: { open: boolean; tools: ImageToolbarSettingsTool[]; selectedIds: ImageQuickToolId[]; showLabels: boolean; onToggle: (id: ImageQuickToolId, visible: boolean) => void; onShowLabelsChange: (visible: boolean) => void; onCancel: () => void; onSave: () => void; }) { const maxSelected = 7; const theme = canvasThemes[useThemeStore((state) => state.theme)]; const selected = useMemo(() => new Set(selectedIds), [selectedIds]); const selectedTools = tools.filter((tool) => selected.has(tool.id)); const previewItems: FloatingDockEntry[] = [ ...selectedTools.map((tool) => ({ id: tool.id, label: tool.title, displayLabel: tool.label, icon: tool.icon, active: tool.active, danger: tool.danger })), { id: "more", label: "自定义节点工具", displayLabel: "更多", icon: }, ]; const updateSelectedTools = (values: ImageQuickToolId[]) => { const next = new Set(values); tools.forEach((tool) => { const visible = next.has(tool.id); if (selected.has(tool.id) !== visible) onToggle(tool.id, visible); }); }; return ( 自定义节点 Dock} open={open} centered onCancel={onCancel} destroyOnHidden styles={{ body: { padding: 0 }, footer: { marginTop: 0 } }} footer={取消保存设置} > 显示功能名 快捷工具{selectedTools.length}/{maxSelected} updateSelectedTools(values as ImageQuickToolId[])}> {tools.map((tool) => ( = maxSelected} /> {tool.icon} {tool.label} ))} ); }