feat: Add cb to useKeyPress

This commit is contained in:
Braks
2021-08-18 09:51:10 +02:00
parent f6f7564894
commit 5ed1094dfe
2 changed files with 31 additions and 23 deletions
+18 -19
View File
@@ -2,15 +2,14 @@ import { D3ZoomEvent, zoom, zoomIdentity, ZoomTransform } from 'd3-zoom';
import { select, pointer } from 'd3-selection'; import { select, pointer } from 'd3-selection';
import { clamp } from '../../utils'; import { clamp } from '../../utils';
import { FlowTransform, TranslateExtent, PanOnScrollMode, KeyCode, RevueFlowStore } from '../../types'; import { FlowTransform, TranslateExtent, PanOnScrollMode, KeyCode, RevueFlowStore } from '../../types';
import { computed, defineComponent, inject, onUpdated, PropType, ref } from 'vue'; import { defineComponent, inject, PropType, ref, watchPostEffect } from 'vue';
import useKeyPress from '../../hooks/useKeyPress'; import useKeyPress from '../../hooks/useKeyPress';
import useResizeHandler from '../../hooks/useResizeHandler'; import useResizeHandler from '../../hooks/useResizeHandler';
import { RevueFlowHooks } from '../../hooks/RevueFlowHooks'; import { RevueFlowHooks } from '../../hooks/RevueFlowHooks';
import { templateRef, whenever } from '@vueuse/core'; import { templateRef } from '@vueuse/core';
import { ZoomBehavior } from 'd3'; import { ZoomBehavior } from 'd3';
interface ZoomPaneProps { interface ZoomPaneProps {
selectionKeyPressed: boolean;
elementsSelectable?: boolean; elementsSelectable?: boolean;
zoomOnScroll?: boolean; zoomOnScroll?: boolean;
zoomOnPinch?: boolean; zoomOnPinch?: boolean;
@@ -59,10 +58,10 @@ export default defineComponent({
required: false, required: false,
default: true default: true
}, },
selectionKeyPressed: { selectionKeyCode: {
type: Boolean as PropType<ZoomPaneProps['selectionKeyPressed']>, type: [Number, String] as PropType<ZoomPaneProps['selectionKeyCode']>,
required: false, required: false,
default: false default: undefined
}, },
elementsSelectable: { elementsSelectable: {
type: Boolean as PropType<ZoomPaneProps['elementsSelectable']>, type: Boolean as PropType<ZoomPaneProps['elementsSelectable']>,
@@ -157,21 +156,19 @@ export default defineComponent({
} }
}); });
d3Zoom.on('zoom', (event: D3ZoomEvent<HTMLDivElement, any>) => { useKeyPress(props.selectionKeyCode, (keyPress) => {
store.transform = [event.transform.x, event.transform.y, event.transform.k]; if (keyPress) {
hooks.move.trigger(eventToFlowTransform(event.transform));
});
const selectionKeyPressed = computed(() => props.selectionKeyPressed);
whenever(selectionKeyPressed, () => {
if (selectionKeyPressed.value) {
d3Zoom.on('zoom', null); d3Zoom.on('zoom', null);
} else {
d3Zoom.on('zoom', (event: D3ZoomEvent<HTMLDivElement, any>) => {
store.transform = [event.transform.x, event.transform.y, event.transform.k];
hooks.move.trigger(eventToFlowTransform(event.transform));
});
} }
}); });
const zoomActivationKeyPressed = useKeyPress(props.zoomActivationKeyCode); useKeyPress(props.zoomActivationKeyCode, (keyPress) => {
whenever(zoomActivationKeyPressed, () => { if (props.panOnScroll && keyPress) {
if (props.panOnScroll) {
store.d3Selection store.d3Selection
?.on('wheel', (event: WheelEvent) => { ?.on('wheel', (event: WheelEvent) => {
event.preventDefault(); event.preventDefault();
@@ -209,7 +206,10 @@ export default defineComponent({
}); });
}; };
watchPostEffect(() => store.d3Zoom && applyZoomFilter(store.d3Zoom));
const applyZoomFilter = (d3Zoom: ZoomBehavior<Element, unknown>) => { const applyZoomFilter = (d3Zoom: ZoomBehavior<Element, unknown>) => {
const keyPress = useKeyPress(props.selectionKeyCode);
d3Zoom.filter((event: MouseEvent) => { d3Zoom.filter((event: MouseEvent) => {
const zoomScroll = props.zoomOnScroll; const zoomScroll = props.zoomOnScroll;
const pinchZoom = props.zoomOnPinch && event.ctrlKey; const pinchZoom = props.zoomOnPinch && event.ctrlKey;
@@ -220,7 +220,7 @@ export default defineComponent({
} }
// during a selection we prevent all other interactions // during a selection we prevent all other interactions
if (props.selectionKeyPressed) { if (keyPress.value) {
return false; return false;
} }
@@ -267,7 +267,6 @@ export default defineComponent({
}; };
init(); init();
onUpdated(() => init());
return () => ( return () => (
<div ref="zoom-pane" class="revue-flow__renderer revue-flow__zoompane"> <div ref="zoom-pane" class="revue-flow__renderer revue-flow__zoompane">
+13 -4
View File
@@ -1,9 +1,16 @@
import { ref, Ref } from 'vue'; import { Ref } from 'vue';
import { KeyCode } from '../types'; import { KeyCode } from '../types';
import { onKeyStroke, useEventListener } from '@vueuse/core'; import { controlledRef, onKeyStroke, useEventListener } from '@vueuse/core';
export default (keyCode?: KeyCode): Ref<boolean> => { export default (keyCode?: KeyCode, cb?: (keyPress: boolean) => void): Ref<boolean> => {
const keyPressed = ref<boolean>(false); const keyPressed = controlledRef<boolean>(false, {
onBeforeChange(val, oldVal) {
if (val === oldVal) return false;
},
onChanged() {
if (cb && typeof cb === 'function') cb(keyPressed.value);
}
});
onKeyStroke( onKeyStroke(
(event) => event.key === keyCode || event.keyCode === keyCode, (event) => event.key === keyCode || event.keyCode === keyCode,
@@ -34,5 +41,7 @@ export default (keyCode?: KeyCode): Ref<boolean> => {
keyPressed.value = false; keyPressed.value = false;
}); });
if (cb && typeof cb === 'function') cb(keyPressed.value);
return keyPressed; return keyPressed;
}; };