feat: add a selectBoxOnDrag prop which allows select box to be triggered without an additional key press.

This commit is contained in:
Jack Fishwick
2022-11-22 10:55:06 +00:00
parent 6bbc004315
commit 685ff76ee8
5 changed files with 19 additions and 10 deletions
@@ -44,6 +44,7 @@ const FlowRenderer = ({
onMoveStart, onMoveStart,
onMoveEnd, onMoveEnd,
selectionKeyCode, selectionKeyCode,
selectBoxOnDrag,
multiSelectionKeyCode, multiSelectionKeyCode,
zoomActivationKeyCode, zoomActivationKeyCode,
elementsSelectable, elementsSelectable,
@@ -84,7 +85,6 @@ const FlowRenderer = ({
onMove={onMove} onMove={onMove}
onMoveStart={onMoveStart} onMoveStart={onMoveStart}
onMoveEnd={onMoveEnd} onMoveEnd={onMoveEnd}
selectionKeyPressed={selectionKeyPressed}
elementsSelectable={elementsSelectable} elementsSelectable={elementsSelectable}
zoomOnScroll={zoomOnScroll} zoomOnScroll={zoomOnScroll}
zoomOnPinch={zoomOnPinch} zoomOnPinch={zoomOnPinch}
@@ -103,7 +103,7 @@ const FlowRenderer = ({
noPanClassName={noPanClassName} noPanClassName={noPanClassName}
> >
{children} {children}
<UserSelection selectionKeyPressed={selectionKeyPressed} /> <UserSelection selectionKeyPressed={selectionKeyPressed || (selectBoxOnDrag && !panOnDrag)} />
{nodesSelectionActive && ( {nodesSelectionActive && (
<NodesSelection <NodesSelection
onSelectionContextMenu={onSelectionContextMenu} onSelectionContextMenu={onSelectionContextMenu}
@@ -56,6 +56,7 @@ const GraphView = ({
connectionLineComponent, connectionLineComponent,
connectionLineContainerStyle, connectionLineContainerStyle,
selectionKeyCode, selectionKeyCode,
selectBoxOnDrag,
multiSelectionKeyCode, multiSelectionKeyCode,
zoomActivationKeyCode, zoomActivationKeyCode,
deleteKeyCode, deleteKeyCode,
@@ -110,6 +111,7 @@ const GraphView = ({
onPaneScroll={onPaneScroll} onPaneScroll={onPaneScroll}
deleteKeyCode={deleteKeyCode} deleteKeyCode={deleteKeyCode}
selectionKeyCode={selectionKeyCode} selectionKeyCode={selectionKeyCode}
selectBoxOnDrag={selectBoxOnDrag}
multiSelectionKeyCode={multiSelectionKeyCode} multiSelectionKeyCode={multiSelectionKeyCode}
zoomActivationKeyCode={zoomActivationKeyCode} zoomActivationKeyCode={zoomActivationKeyCode}
elementsSelectable={elementsSelectable} elementsSelectable={elementsSelectable}
@@ -99,6 +99,7 @@ const ReactFlow = forwardRef<ReactFlowRefType, ReactFlowProps>(
connectionLineContainerStyle, connectionLineContainerStyle,
deleteKeyCode = 'Backspace', deleteKeyCode = 'Backspace',
selectionKeyCode = 'Shift', selectionKeyCode = 'Shift',
selectBoxOnDrag = false,
multiSelectionKeyCode = 'Meta', multiSelectionKeyCode = 'Meta',
zoomActivationKeyCode = 'Meta', zoomActivationKeyCode = 'Meta',
snapToGrid = false, snapToGrid = false,
@@ -193,6 +194,7 @@ const ReactFlow = forwardRef<ReactFlowRefType, ReactFlowProps>(
connectionLineComponent={connectionLineComponent} connectionLineComponent={connectionLineComponent}
connectionLineContainerStyle={connectionLineContainerStyle} connectionLineContainerStyle={connectionLineContainerStyle}
selectionKeyCode={selectionKeyCode} selectionKeyCode={selectionKeyCode}
selectBoxOnDrag={selectBoxOnDrag}
deleteKeyCode={deleteKeyCode} deleteKeyCode={deleteKeyCode}
multiSelectionKeyCode={multiSelectionKeyCode} multiSelectionKeyCode={multiSelectionKeyCode}
zoomActivationKeyCode={zoomActivationKeyCode} zoomActivationKeyCode={zoomActivationKeyCode}
+12 -8
View File
@@ -16,8 +16,13 @@ import type { Viewport, ReactFlowState } from '../../types';
type ZoomPaneProps = Omit< type ZoomPaneProps = Omit<
FlowRendererProps, FlowRendererProps,
'deleteKeyCode' | 'selectionKeyCode' | 'multiSelectionKeyCode' | 'noDragClassName' | 'disableKeyboardA11y' | 'deleteKeyCode'
> & { selectionKeyPressed: boolean }; | 'selectionKeyCode'
| 'multiSelectionKeyCode'
| 'noDragClassName'
| 'disableKeyboardA11y'
| 'selectBoxOnDrag'
>;
const viewChanged = (prevViewport: Viewport, eventViewport: any): boolean => const viewChanged = (prevViewport: Viewport, eventViewport: any): boolean =>
prevViewport.x !== eventViewport.x || prevViewport.y !== eventViewport.y || prevViewport.zoom !== eventViewport.k; prevViewport.x !== eventViewport.x || prevViewport.y !== eventViewport.y || prevViewport.zoom !== eventViewport.k;
@@ -46,7 +51,6 @@ const ZoomPane = ({
panOnScrollSpeed = 0.5, panOnScrollSpeed = 0.5,
panOnScrollMode = PanOnScrollMode.Free, panOnScrollMode = PanOnScrollMode.Free,
zoomOnDoubleClick = true, zoomOnDoubleClick = true,
selectionKeyPressed,
elementsSelectable, elementsSelectable,
panOnDrag = true, panOnDrag = true,
defaultViewport, defaultViewport,
@@ -151,9 +155,9 @@ const ZoomPane = ({
useEffect(() => { useEffect(() => {
if (d3Zoom) { if (d3Zoom) {
if (selectionKeyPressed && !isZoomingOrPanning.current) { if (store.getState().userSelectionActive && !isZoomingOrPanning.current) {
d3Zoom.on('zoom', null); d3Zoom.on('zoom', null);
} else if (!selectionKeyPressed) { } else if (!store.getState().userSelectionActive) {
d3Zoom.on('zoom', (event: D3ZoomEvent<HTMLDivElement, any>) => { d3Zoom.on('zoom', (event: D3ZoomEvent<HTMLDivElement, any>) => {
const { onViewportChange } = store.getState(); const { onViewportChange } = store.getState();
@@ -168,7 +172,7 @@ const ZoomPane = ({
}); });
} }
} }
}, [selectionKeyPressed, d3Zoom, onMove]); }, [store, d3Zoom, onMove]);
useEffect(() => { useEffect(() => {
if (d3Zoom) { if (d3Zoom) {
@@ -238,7 +242,7 @@ const ZoomPane = ({
} }
// during a selection we prevent all other interactions // during a selection we prevent all other interactions
if (selectionKeyPressed) { if (store.getState().userSelectionActive) {
return false; return false;
} }
@@ -276,13 +280,13 @@ const ZoomPane = ({
}); });
} }
}, [ }, [
store,
d3Zoom, d3Zoom,
zoomOnScroll, zoomOnScroll,
zoomOnPinch, zoomOnPinch,
panOnScroll, panOnScroll,
zoomOnDoubleClick, zoomOnDoubleClick,
panOnDrag, panOnDrag,
selectionKeyPressed,
elementsSelectable, elementsSelectable,
zoomActivationKeyPressed, zoomActivationKeyPressed,
]); ]);
@@ -94,6 +94,7 @@ export type ReactFlowProps = HTMLAttributes<HTMLDivElement> & {
connectionMode?: ConnectionMode; connectionMode?: ConnectionMode;
deleteKeyCode?: KeyCode | null; deleteKeyCode?: KeyCode | null;
selectionKeyCode?: KeyCode | null; selectionKeyCode?: KeyCode | null;
selectBoxOnDrag?: boolean;
multiSelectionKeyCode?: KeyCode | null; multiSelectionKeyCode?: KeyCode | null;
zoomActivationKeyCode?: KeyCode | null; zoomActivationKeyCode?: KeyCode | null;
snapToGrid?: boolean; snapToGrid?: boolean;