fix: Reactive key bindings for delete, select etc.
# What's changed? * Use ref for keycodes from store to reactively listen to keyboard events and trigger delete etc.
This commit is contained in:
@@ -4,8 +4,9 @@ import useWindow from './useWindow'
|
|||||||
import { KeyCode } from '~/types'
|
import { KeyCode } from '~/types'
|
||||||
import { isInputDOMNode } from '~/utils'
|
import { isInputDOMNode } from '~/utils'
|
||||||
|
|
||||||
export default (keyCode: KeyCode, onChange?: (keyPressed: boolean) => void): Ref<boolean> => {
|
export default (keyCode: Ref<KeyCode>, onChange?: (keyPressed: boolean) => void): Ref<boolean> => {
|
||||||
const window = useWindow()
|
const window = useWindow()
|
||||||
|
|
||||||
const isPressed = controlledRef<boolean>(false, {
|
const isPressed = controlledRef<boolean>(false, {
|
||||||
onBeforeChange(val, oldVal) {
|
onBeforeChange(val, oldVal) {
|
||||||
if (val === oldVal) return false
|
if (val === oldVal) return false
|
||||||
@@ -16,23 +17,21 @@ export default (keyCode: KeyCode, onChange?: (keyPressed: boolean) => void): Ref
|
|||||||
})
|
})
|
||||||
|
|
||||||
onKeyPressed(
|
onKeyPressed(
|
||||||
(e) => !isInputDOMNode(e) && (e.key === keyCode || e.keyCode === keyCode),
|
(e) => !isInputDOMNode(e) && (e.key === keyCode.value || e.keyCode === keyCode.value),
|
||||||
(e) => {
|
(e) => {
|
||||||
e.preventDefault()
|
e.preventDefault()
|
||||||
isPressed.value = true
|
isPressed.value = true
|
||||||
},
|
},
|
||||||
)
|
)
|
||||||
|
|
||||||
onKeyDown(
|
onKeyDown(
|
||||||
(e) => !isInputDOMNode(e) && (e.key === keyCode || e.keyCode === keyCode),
|
(e) => !isInputDOMNode(e) && (e.key === keyCode.value || e.keyCode === keyCode.value),
|
||||||
(e) => {
|
(e) => {
|
||||||
e.preventDefault()
|
e.preventDefault()
|
||||||
isPressed.value = true
|
isPressed.value = true
|
||||||
},
|
},
|
||||||
)
|
)
|
||||||
|
|
||||||
onKeyUp(
|
onKeyUp(
|
||||||
(e) => !isInputDOMNode(e) && (e.key === keyCode || e.keyCode === keyCode),
|
(e) => !isInputDOMNode(e) && (e.key === keyCode.value || e.keyCode === keyCode.value),
|
||||||
(e) => {
|
(e) => {
|
||||||
e.preventDefault()
|
e.preventDefault()
|
||||||
isPressed.value = false
|
isPressed.value = false
|
||||||
|
|||||||
@@ -5,7 +5,7 @@ import { getConnectedEdges } from '../../utils'
|
|||||||
import NodesSelection from '../../components/NodesSelection/NodesSelection.vue'
|
import NodesSelection from '../../components/NodesSelection/NodesSelection.vue'
|
||||||
import UserSelection from '../../components/UserSelection/UserSelection.vue'
|
import UserSelection from '../../components/UserSelection/UserSelection.vue'
|
||||||
|
|
||||||
const { id, store } = useVueFlow()
|
const { id, store, deleteKeyCode, selectionKeyCode, multiSelectionKeyCode } = useVueFlow()
|
||||||
|
|
||||||
const onClick = (event: MouseEvent) => {
|
const onClick = (event: MouseEvent) => {
|
||||||
store.hooks.paneClick.trigger(event)
|
store.hooks.paneClick.trigger(event)
|
||||||
@@ -17,7 +17,7 @@ const onContextMenu = (event: MouseEvent) => store.hooks.paneContextMenu.trigger
|
|||||||
|
|
||||||
const onWheel = (event: WheelEvent) => store.hooks.paneScroll.trigger(event)
|
const onWheel = (event: WheelEvent) => store.hooks.paneScroll.trigger(event)
|
||||||
|
|
||||||
useKeyPress(store.deleteKeyCode, (keyPressed) => {
|
useKeyPress(deleteKeyCode, (keyPressed) => {
|
||||||
const selectedNodes = store.getSelectedNodes
|
const selectedNodes = store.getSelectedNodes
|
||||||
const selectedEdges = store.getSelectedEdges
|
const selectedEdges = store.getSelectedEdges
|
||||||
if (keyPressed && (selectedNodes || selectedEdges)) {
|
if (keyPressed && (selectedNodes || selectedEdges)) {
|
||||||
@@ -37,11 +37,11 @@ useKeyPress(store.deleteKeyCode, (keyPressed) => {
|
|||||||
}
|
}
|
||||||
})
|
})
|
||||||
|
|
||||||
useKeyPress(store.multiSelectionKeyCode, (keyPressed) => {
|
useKeyPress(multiSelectionKeyCode, (keyPressed) => {
|
||||||
store.multiSelectionActive = keyPressed
|
store.multiSelectionActive = keyPressed
|
||||||
})
|
})
|
||||||
|
|
||||||
const selectionKeyPressed = useKeyPress(store.selectionKeyCode, (keyPressed) => {
|
const selectionKeyPressed = useKeyPress(selectionKeyCode, (keyPressed) => {
|
||||||
if (store.userSelectionActive && keyPressed) return
|
if (store.userSelectionActive && keyPressed) return
|
||||||
store.userSelectionActive = keyPressed && store.elementsSelectable
|
store.userSelectionActive = keyPressed && store.elementsSelectable
|
||||||
})
|
})
|
||||||
|
|||||||
@@ -7,7 +7,7 @@ import { clamp, clampPosition } from '../../utils'
|
|||||||
import SelectionPane from '../SelectionPane/SelectionPane.vue'
|
import SelectionPane from '../SelectionPane/SelectionPane.vue'
|
||||||
import Transform from './Transform.vue'
|
import Transform from './Transform.vue'
|
||||||
|
|
||||||
const { id, store } = useVueFlow()
|
const { id, store, zoomActivationKeyCode, selectionKeyCode } = useVueFlow()
|
||||||
const viewportEl = templateRef<HTMLDivElement>('viewport', null)
|
const viewportEl = templateRef<HTMLDivElement>('viewport', null)
|
||||||
|
|
||||||
const viewChanged = (prevTransform: FlowTransform, eventTransform: ZoomTransform): boolean =>
|
const viewChanged = (prevTransform: FlowTransform, eventTransform: ZoomTransform): boolean =>
|
||||||
@@ -54,7 +54,7 @@ onMounted(() => {
|
|||||||
viewport: { x: updatedTransform.x, y: updatedTransform.y, zoom: updatedTransform.k },
|
viewport: { x: updatedTransform.x, y: updatedTransform.y, zoom: updatedTransform.k },
|
||||||
})
|
})
|
||||||
|
|
||||||
const selectionKeyPressed = useKeyPress(store.selectionKeyCode, (keyPress) => {
|
const selectionKeyPressed = useKeyPress(selectionKeyCode, (keyPress) => {
|
||||||
if (keyPress) {
|
if (keyPress) {
|
||||||
d3Zoom.on('zoom', null)
|
d3Zoom.on('zoom', null)
|
||||||
} else {
|
} else {
|
||||||
@@ -66,7 +66,7 @@ onMounted(() => {
|
|||||||
}
|
}
|
||||||
})
|
})
|
||||||
|
|
||||||
const zoomKeyPressed = useKeyPress(store.zoomActivationKeyCode)
|
const zoomKeyPressed = useKeyPress(zoomActivationKeyCode)
|
||||||
|
|
||||||
d3Zoom.on('start', (event: D3ZoomEvent<HTMLDivElement, any>) => {
|
d3Zoom.on('start', (event: D3ZoomEvent<HTMLDivElement, any>) => {
|
||||||
const flowTransform = eventToFlowTransform(event.transform)
|
const flowTransform = eventToFlowTransform(event.transform)
|
||||||
|
|||||||
Reference in New Issue
Block a user