diff --git a/README.md b/README.md index e8ecb13f..d7b513e9 100644 --- a/README.md +++ b/README.md @@ -91,6 +91,7 @@ const BasicFlow = () => ; - `nodesDraggable`: default: `true` - `nodesConnectable`: default: `true` - `elementsSelectable`: default: `true` +- `zoomOnScroll`: default: `true` - `selectNodesOnDrag`: default: `true` - `minZoom`: default: `0.5` - `maxZoom`: default: `2` diff --git a/example/src/Interaction/index.js b/example/src/Interaction/index.js index 26281ec4..406405f0 100644 --- a/example/src/Interaction/index.js +++ b/example/src/Interaction/index.js @@ -18,6 +18,7 @@ const InteractionFlow = () => { const [isSelectable, setIsSelectable] = useState(false); const [isDraggable, setIsDraggable] = useState(false); const [isConnectable, setIsConnectable] = useState(false); + const [zoomOnScroll, setZoomOnScroll] = useState(true); return ( { elementsSelectable={isSelectable} nodesConnectable={isConnectable} nodesDraggable={isDraggable} + zoomOnScroll={zoomOnScroll} onConnect={onConnect} > @@ -67,6 +69,18 @@ const InteractionFlow = () => { /> +
+ +
); diff --git a/src/container/GraphView/index.tsx b/src/container/GraphView/index.tsx index cc939b2b..9758f65d 100644 --- a/src/container/GraphView/index.tsx +++ b/src/container/GraphView/index.tsx @@ -54,6 +54,7 @@ export interface GraphViewProps { defaultZoom: number; arrowHeadColor: string; markerEndId?: string; + zoomOnScroll: boolean; } const GraphView = memo( @@ -88,6 +89,7 @@ const GraphView = memo( defaultZoom, arrowHeadColor, markerEndId, + zoomOnScroll, }: GraphViewProps) => { const zoomPane = useRef(null); const rendererNode = useRef(null); @@ -158,7 +160,7 @@ const GraphView = memo( }; }, []); - useD3Zoom({ zoomPane, onMove, selectionKeyPressed }); + useD3Zoom({ zoomPane, onMove, selectionKeyPressed, zoomOnScroll }); useEffect(() => { if (d3Initialised && onLoad) { diff --git a/src/container/ReactFlow/index.tsx b/src/container/ReactFlow/index.tsx index 277b8b1d..e2bc9243 100644 --- a/src/container/ReactFlow/index.tsx +++ b/src/container/ReactFlow/index.tsx @@ -62,6 +62,7 @@ export interface ReactFlowProps extends Omit, 'on defaultZoom: number; arrowHeadColor: string; markerEndId?: string; + zoomOnScroll: boolean } const ReactFlow = ({ @@ -99,6 +100,7 @@ const ReactFlow = ({ defaultZoom, arrowHeadColor, markerEndId, + zoomOnScroll }: ReactFlowProps) => { const nodeTypesParsed = useMemo(() => createNodeTypes(nodeTypes), []); const edgeTypesParsed = useMemo(() => createEdgeTypes(edgeTypes), []); @@ -138,6 +140,7 @@ const ReactFlow = ({ defaultZoom={defaultZoom} arrowHeadColor={arrowHeadColor} markerEndId={markerEndId} + zoomOnScroll={zoomOnScroll} /> {onSelectionChange && } {children} @@ -174,6 +177,7 @@ ReactFlow.defaultProps = { maxZoom: 2, defaultZoom: 1, arrowHeadColor: '#bbb', + zoomOnScroll: true }; export default ReactFlow; diff --git a/src/hooks/useD3Zoom.ts b/src/hooks/useD3Zoom.ts index ec2028bd..7c920d20 100644 --- a/src/hooks/useD3Zoom.ts +++ b/src/hooks/useD3Zoom.ts @@ -6,10 +6,11 @@ import { useStoreState, useStoreActions } from '../store/hooks'; interface UseD3ZoomParams { zoomPane: MutableRefObject; selectionKeyPressed: boolean; + zoomOnScroll: boolean; onMove?: () => void; } -export default ({ zoomPane, onMove, selectionKeyPressed }: UseD3ZoomParams): void => { +export default ({ zoomPane, onMove, zoomOnScroll, selectionKeyPressed }: UseD3ZoomParams): void => { const d3Zoom = useStoreState((s) => s.d3Zoom); const initD3 = useStoreActions((actions) => actions.initD3); @@ -31,6 +32,10 @@ export default ({ zoomPane, onMove, selectionKeyPressed }: UseD3ZoomParams): voi return; } + if (!zoomOnScroll && event.sourceEvent.type === 'wheel') { + return; + } + updateTransform(event.transform); if (onMove) { @@ -39,5 +44,5 @@ export default ({ zoomPane, onMove, selectionKeyPressed }: UseD3ZoomParams): voi }); } } - }, [selectionKeyPressed, d3Zoom]); + }, [selectionKeyPressed, zoomOnScroll, d3Zoom]); };