feat(interaction): add zoomActiviationKeyCode #847

This commit is contained in:
moklick
2021-01-20 11:36:10 +01:00
parent 25ce4a835f
commit bd79577fa7
7 changed files with 42 additions and 29 deletions
+1 -1
View File
@@ -46,7 +46,7 @@ const LayoutFlow = () => {
useEffect(() => { useEffect(() => {
onLayout('TB'); onLayout('TB');
}, []); }, [onLayout]);
return ( return (
<div className="layoutflow"> <div className="layoutflow">
+2
View File
@@ -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} />
+2
View File
@@ -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}
+3
View File
@@ -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}
+9 -5
View File
@@ -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
View File
@@ -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
View File
@@ -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"]
} }