feat(interaction): add zoomActiviationKeyCode #847
This commit is contained in:
@@ -46,7 +46,7 @@ const LayoutFlow = () => {
|
|||||||
|
|
||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
onLayout('TB');
|
onLayout('TB');
|
||||||
}, []);
|
}, [onLayout]);
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<div className="layoutflow">
|
<div className="layoutflow">
|
||||||
|
|||||||
@@ -37,6 +37,7 @@ const FlowRenderer = ({
|
|||||||
onMoveEnd,
|
onMoveEnd,
|
||||||
selectionKeyCode,
|
selectionKeyCode,
|
||||||
multiSelectionKeyCode,
|
multiSelectionKeyCode,
|
||||||
|
zoomActivationKeyCode,
|
||||||
elementsSelectable,
|
elementsSelectable,
|
||||||
zoomOnScroll,
|
zoomOnScroll,
|
||||||
panOnScroll,
|
panOnScroll,
|
||||||
@@ -99,6 +100,7 @@ const FlowRenderer = ({
|
|||||||
defaultPosition={defaultPosition}
|
defaultPosition={defaultPosition}
|
||||||
defaultZoom={defaultZoom}
|
defaultZoom={defaultZoom}
|
||||||
translateExtent={translateExtent}
|
translateExtent={translateExtent}
|
||||||
|
zoomActivationKeyCode={zoomActivationKeyCode}
|
||||||
>
|
>
|
||||||
{children}
|
{children}
|
||||||
<UserSelection selectionKeyPressed={selectionKeyPressed} />
|
<UserSelection selectionKeyPressed={selectionKeyPressed} />
|
||||||
|
|||||||
@@ -51,6 +51,7 @@ const GraphView = ({
|
|||||||
connectionLineComponent,
|
connectionLineComponent,
|
||||||
selectionKeyCode,
|
selectionKeyCode,
|
||||||
multiSelectionKeyCode,
|
multiSelectionKeyCode,
|
||||||
|
zoomActivationKeyCode,
|
||||||
onElementsRemove,
|
onElementsRemove,
|
||||||
deleteKeyCode,
|
deleteKeyCode,
|
||||||
onConnect,
|
onConnect,
|
||||||
@@ -205,6 +206,7 @@ const GraphView = ({
|
|||||||
deleteKeyCode={deleteKeyCode}
|
deleteKeyCode={deleteKeyCode}
|
||||||
selectionKeyCode={selectionKeyCode}
|
selectionKeyCode={selectionKeyCode}
|
||||||
multiSelectionKeyCode={multiSelectionKeyCode}
|
multiSelectionKeyCode={multiSelectionKeyCode}
|
||||||
|
zoomActivationKeyCode={zoomActivationKeyCode}
|
||||||
elementsSelectable={elementsSelectable}
|
elementsSelectable={elementsSelectable}
|
||||||
onMove={onMove}
|
onMove={onMove}
|
||||||
onMoveStart={onMoveStart}
|
onMoveStart={onMoveStart}
|
||||||
|
|||||||
@@ -82,6 +82,7 @@ export interface ReactFlowProps extends Omit<HTMLAttributes<HTMLDivElement>, 'on
|
|||||||
deleteKeyCode?: KeyCode;
|
deleteKeyCode?: KeyCode;
|
||||||
selectionKeyCode?: KeyCode;
|
selectionKeyCode?: KeyCode;
|
||||||
multiSelectionKeyCode?: KeyCode;
|
multiSelectionKeyCode?: KeyCode;
|
||||||
|
zoomActivationKeyCode?: KeyCode;
|
||||||
snapToGrid?: boolean;
|
snapToGrid?: boolean;
|
||||||
snapGrid?: [number, number];
|
snapGrid?: [number, number];
|
||||||
onlyRenderVisibleElements?: boolean;
|
onlyRenderVisibleElements?: boolean;
|
||||||
@@ -138,6 +139,7 @@ const ReactFlow = ({
|
|||||||
deleteKeyCode = 'Backspace',
|
deleteKeyCode = 'Backspace',
|
||||||
selectionKeyCode = 'Shift',
|
selectionKeyCode = 'Shift',
|
||||||
multiSelectionKeyCode = 'Meta',
|
multiSelectionKeyCode = 'Meta',
|
||||||
|
zoomActivationKeyCode = 'Meta',
|
||||||
snapToGrid = false,
|
snapToGrid = false,
|
||||||
snapGrid = [15, 15],
|
snapGrid = [15, 15],
|
||||||
onlyRenderVisibleElements = true,
|
onlyRenderVisibleElements = true,
|
||||||
@@ -194,6 +196,7 @@ const ReactFlow = ({
|
|||||||
onElementsRemove={onElementsRemove}
|
onElementsRemove={onElementsRemove}
|
||||||
deleteKeyCode={deleteKeyCode}
|
deleteKeyCode={deleteKeyCode}
|
||||||
multiSelectionKeyCode={multiSelectionKeyCode}
|
multiSelectionKeyCode={multiSelectionKeyCode}
|
||||||
|
zoomActivationKeyCode={zoomActivationKeyCode}
|
||||||
onConnect={onConnect}
|
onConnect={onConnect}
|
||||||
onConnectStart={onConnectStart}
|
onConnectStart={onConnectStart}
|
||||||
onConnectStop={onConnectStop}
|
onConnectStop={onConnectStop}
|
||||||
|
|||||||
@@ -1,12 +1,12 @@
|
|||||||
import React, { useEffect, useRef, ReactNode } from 'react';
|
import React, { useEffect, useRef, ReactNode } from 'react';
|
||||||
|
|
||||||
import { zoom, zoomIdentity } from 'd3-zoom';
|
import { zoom, zoomIdentity } from 'd3-zoom';
|
||||||
import { select } from 'd3-selection';
|
import { select } from 'd3-selection';
|
||||||
import { clamp } from '../../utils';
|
|
||||||
|
|
||||||
|
import { clamp } from '../../utils';
|
||||||
|
import useKeyPress from '../../hooks/useKeyPress';
|
||||||
import useResizeHandler from '../../hooks/useResizeHandler';
|
import useResizeHandler from '../../hooks/useResizeHandler';
|
||||||
import { useStoreState, useStoreActions, useStore } from '../../store/hooks';
|
import { useStoreState, useStoreActions, useStore } from '../../store/hooks';
|
||||||
import { FlowTransform, TranslateExtent, PanOnScrollMode } from '../../types';
|
import { FlowTransform, TranslateExtent, PanOnScrollMode, KeyCode } from '../../types';
|
||||||
|
|
||||||
interface ZoomPaneProps {
|
interface ZoomPaneProps {
|
||||||
selectionKeyPressed: boolean;
|
selectionKeyPressed: boolean;
|
||||||
@@ -23,6 +23,7 @@ interface ZoomPaneProps {
|
|||||||
onMove?: (flowTransform?: FlowTransform) => void;
|
onMove?: (flowTransform?: FlowTransform) => void;
|
||||||
onMoveStart?: (flowTransform?: FlowTransform) => void;
|
onMoveStart?: (flowTransform?: FlowTransform) => void;
|
||||||
onMoveEnd?: (flowTransform?: FlowTransform) => void;
|
onMoveEnd?: (flowTransform?: FlowTransform) => void;
|
||||||
|
zoomActivationKeyCode?: KeyCode;
|
||||||
children: ReactNode;
|
children: ReactNode;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -52,6 +53,7 @@ const ZoomPane = ({
|
|||||||
defaultPosition = [0, 0],
|
defaultPosition = [0, 0],
|
||||||
defaultZoom = 1,
|
defaultZoom = 1,
|
||||||
translateExtent,
|
translateExtent,
|
||||||
|
zoomActivationKeyCode,
|
||||||
children,
|
children,
|
||||||
}: ZoomPaneProps) => {
|
}: ZoomPaneProps) => {
|
||||||
const zoomPane = useRef<HTMLDivElement>(null);
|
const zoomPane = useRef<HTMLDivElement>(null);
|
||||||
@@ -65,6 +67,8 @@ const ZoomPane = ({
|
|||||||
const initD3Zoom = useStoreActions((actions) => actions.initD3Zoom);
|
const initD3Zoom = useStoreActions((actions) => actions.initD3Zoom);
|
||||||
const updateTransform = useStoreActions((actions) => actions.updateTransform);
|
const updateTransform = useStoreActions((actions) => actions.updateTransform);
|
||||||
|
|
||||||
|
const zoomActivationKeyPressed = useKeyPress(zoomActivationKeyCode);
|
||||||
|
|
||||||
useResizeHandler(zoomPane);
|
useResizeHandler(zoomPane);
|
||||||
|
|
||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
@@ -93,7 +97,7 @@ const ZoomPane = ({
|
|||||||
|
|
||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
if (d3Selection && d3Zoom) {
|
if (d3Selection && d3Zoom) {
|
||||||
if (panOnScroll) {
|
if (panOnScroll && !zoomActivationKeyPressed) {
|
||||||
d3Selection
|
d3Selection
|
||||||
.on('wheel', (event: any) => {
|
.on('wheel', (event: any) => {
|
||||||
event.preventDefault();
|
event.preventDefault();
|
||||||
@@ -117,7 +121,7 @@ const ZoomPane = ({
|
|||||||
d3Selection.on('wheel', null).on('wheel.zoom', d3ZoomHandler);
|
d3Selection.on('wheel', null).on('wheel.zoom', d3ZoomHandler);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}, [panOnScroll, panOnScrollMode, d3Selection, d3Zoom, d3ZoomHandler]);
|
}, [panOnScroll, panOnScrollMode, d3Selection, d3Zoom, d3ZoomHandler, zoomActivationKeyPressed]);
|
||||||
|
|
||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
if (d3Zoom) {
|
if (d3Zoom) {
|
||||||
|
|||||||
+23
-21
@@ -3,35 +3,37 @@ import { useState, useEffect } from 'react';
|
|||||||
import { isInputDOMNode } from '../utils';
|
import { isInputDOMNode } from '../utils';
|
||||||
import { KeyCode } from '../types';
|
import { KeyCode } from '../types';
|
||||||
|
|
||||||
export default (keyCode: KeyCode): boolean => {
|
export default (keyCode?: KeyCode): boolean => {
|
||||||
const [keyPressed, setKeyPressed] = useState(false);
|
const [keyPressed, setKeyPressed] = useState(false);
|
||||||
|
|
||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
const downHandler = (event: KeyboardEvent) => {
|
if (typeof keyCode !== 'undefined') {
|
||||||
if (!isInputDOMNode(event) && (event.key === keyCode || event.keyCode === keyCode)) {
|
const downHandler = (event: KeyboardEvent) => {
|
||||||
event.preventDefault();
|
if (!isInputDOMNode(event) && (event.key === keyCode || event.keyCode === keyCode)) {
|
||||||
|
event.preventDefault();
|
||||||
|
|
||||||
setKeyPressed(true);
|
setKeyPressed(true);
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
const upHandler = (event: KeyboardEvent) => {
|
const upHandler = (event: KeyboardEvent) => {
|
||||||
if (!isInputDOMNode(event) && (event.key === keyCode || event.keyCode === keyCode)) {
|
if (!isInputDOMNode(event) && (event.key === keyCode || event.keyCode === keyCode)) {
|
||||||
setKeyPressed(false);
|
setKeyPressed(false);
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
const resetHandler = () => setKeyPressed(false);
|
const resetHandler = () => setKeyPressed(false);
|
||||||
|
|
||||||
window.addEventListener('keydown', downHandler);
|
window.addEventListener('keydown', downHandler);
|
||||||
window.addEventListener('keyup', upHandler);
|
window.addEventListener('keyup', upHandler);
|
||||||
window.addEventListener('blur', resetHandler);
|
window.addEventListener('blur', resetHandler);
|
||||||
|
|
||||||
return () => {
|
return () => {
|
||||||
window.removeEventListener('keydown', downHandler);
|
window.removeEventListener('keydown', downHandler);
|
||||||
window.removeEventListener('keyup', upHandler);
|
window.removeEventListener('keyup', upHandler);
|
||||||
window.removeEventListener('blur', resetHandler);
|
window.removeEventListener('blur', resetHandler);
|
||||||
};
|
};
|
||||||
|
}
|
||||||
}, [keyCode, setKeyPressed]);
|
}, [keyCode, setKeyPressed]);
|
||||||
|
|
||||||
return keyPressed;
|
return keyPressed;
|
||||||
|
|||||||
+2
-2
@@ -16,11 +16,11 @@
|
|||||||
"alwaysStrict": true,
|
"alwaysStrict": true,
|
||||||
"noUnusedLocals": true,
|
"noUnusedLocals": true,
|
||||||
"noUnusedParameters": true,
|
"noUnusedParameters": true,
|
||||||
"noImplicitReturns": true,
|
"noImplicitReturns": false,
|
||||||
"noFallthroughCasesInSwitch": true,
|
"noFallthroughCasesInSwitch": true,
|
||||||
"allowSyntheticDefaultImports": true,
|
"allowSyntheticDefaultImports": true,
|
||||||
"esModuleInterop": true
|
"esModuleInterop": true
|
||||||
},
|
},
|
||||||
"include": ["src"],
|
"include": ["src"],
|
||||||
"exclude": ["node_modules", "build", "dist", "example", "rollup.config.js"]
|
"exclude": ["node_modules", "build", "dist", "example", "rollup.config.js"]
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user