diff --git a/components/canvas/CanvasWorkspace.tsx b/components/canvas/CanvasWorkspace.tsx index 9ce2e24..245413d 100644 --- a/components/canvas/CanvasWorkspace.tsx +++ b/components/canvas/CanvasWorkspace.tsx @@ -9,6 +9,8 @@ import { ImageNode } from "./nodes/ImageNode"; import { TextNode } from "./nodes/TextNode"; import { VideoNode } from "./nodes/VideoNode"; import { cn } from "@/lib/utils"; +import { Button } from "@/components/ui/button"; +import { Minus, Plus } from "lucide-react"; // 性能优化:判断节点是否在视口内 function isNodeInViewport( @@ -112,29 +114,31 @@ export function CanvasWorkspace() { // 处理滚轮缩放 const handleWheel = useCallback((e: React.WheelEvent) => { - if (e.ctrlKey || e.metaKey) { - e.preventDefault(); - const delta = e.deltaY > 0 ? 0.9 : 1.1; - const newZoom = Math.max(0.1, Math.min(4, viewport.zoom * delta)); - - // 以鼠标位置为中心缩放 - const rect = containerRef.current?.getBoundingClientRect(); - if (rect) { - const mouseX = e.clientX - rect.left; - const mouseY = e.clientY - rect.top; - - const scaleChange = newZoom / viewport.zoom; - const newX = mouseX - (mouseX - viewport.x) * scaleChange; - const newY = mouseY - (mouseY - viewport.y) * scaleChange; - - setViewport({ x: newX, y: newY, zoom: newZoom }); - } - } else { - // 普通滚动平移 + e.preventDefault(); + + // Shift + 滚轮 = 平移 + if (e.shiftKey) { setViewport({ - x: viewport.x - e.deltaX, - y: viewport.y - e.deltaY, + x: viewport.x - e.deltaY, + y: viewport.y - e.deltaX, }); + return; + } + + // 默认滚轮 = 缩放(以鼠标位置为中心) + const delta = e.deltaY > 0 ? 0.9 : 1.1; + const newZoom = Math.max(0.1, Math.min(4, viewport.zoom * delta)); + + const rect = containerRef.current?.getBoundingClientRect(); + if (rect) { + const mouseX = e.clientX - rect.left; + const mouseY = e.clientY - rect.top; + + const scaleChange = newZoom / viewport.zoom; + const newX = mouseX - (mouseX - viewport.x) * scaleChange; + const newY = mouseY - (mouseY - viewport.y) * scaleChange; + + setViewport({ x: newX, y: newY, zoom: newZoom }); } }, [viewport, setViewport]); @@ -267,9 +271,41 @@ export function CanvasWorkspace() { )} - {/* 缩放指示器 */} -
- {Math.round(viewport.zoom * 100)}% + {/* 缩放控制器 */} +
+ + +
);