diff --git a/components/canvas/nodes/ImageNode.tsx b/components/canvas/nodes/ImageNode.tsx index 31e4bd401..fce0a005a 100644 --- a/components/canvas/nodes/ImageNode.tsx +++ b/components/canvas/nodes/ImageNode.tsx @@ -283,7 +283,6 @@ export function ImageNode({ node, isSelected }: ImageNodeProps) { const [isAddingToChat, setIsAddingToChat] = useState(false); const [isCompareMode, setIsCompareMode] = useState(false); const [compareSplitPercent, setCompareSplitPercent] = useState(50); - const [isCompareDragging, setIsCompareDragging] = useState(false); // 文件输入的 ref const fileInputRef = useRef(null); @@ -379,17 +378,32 @@ export function ImageNode({ node, isSelected }: ImageNodeProps) { setIsEditingTitle(false); setPromptDialogOpen(false); setIsCompareMode(false); - setIsCompareDragging(false); } }, [isSelected]); useEffect(() => { if (!hasCompareSource || isThisNodePicking) { setIsCompareMode(false); - setIsCompareDragging(false); } }, [hasCompareSource, isThisNodePicking]); + useEffect(() => { + if (!isCompareMode) return; + + const handlePointerDownOutside = (event: PointerEvent) => { + const target = event.target as Node | null; + if (!target) return; + const container = containerRef.current; + if (container && container.contains(target)) return; + setIsCompareMode(false); + }; + + document.addEventListener("pointerdown", handlePointerDownOutside, true); + return () => { + document.removeEventListener("pointerdown", handlePointerDownOutside, true); + }; + }, [isCompareMode]); + useEffect(() => { if (!isEditingTitle) { setDraftTitle(getImageNodeTitle(data, node.id)); @@ -1575,12 +1589,16 @@ export function ImageNode({ node, isSelected }: ImageNodeProps) {
{isCompareMode && hasCompareSource ? (
{ + event.stopPropagation(); + updateCompareSplitByClientX(event.clientX); + }} + onPointerMove={(event) => { + updateCompareSplitByClientX(event.clientX); + }} > - - { - event.stopPropagation(); - setIsCompareDragging(true); - }} - onPointerUp={(event) => { - event.stopPropagation(); - setIsCompareDragging(false); - }} - onPointerCancel={() => { - setIsCompareDragging(false); - }} - onClick={(event) => { - event.stopPropagation(); - }} - onInput={(event) => { - const value = Number((event.target as HTMLInputElement).value); - if (!Number.isNaN(value)) { - setCompareSplitPercent(Math.max(0, Math.min(100, value))); - } - }} - onChange={(event) => { - const value = Number(event.target.value); - if (!Number.isNaN(value)) { - setCompareSplitPercent(Math.max(0, Math.min(100, value))); - } - }} - /> +
原图
@@ -1716,7 +1694,7 @@ export function ImageNode({ node, isSelected }: ImageNodeProps) { {isSelected && !isMultiSelected && hasCompareSource && !isThisNodePicking && (