-
-
-
-
+
diff --git a/packages/core/src/container/VueFlow/VueFlow.vue b/packages/core/src/container/VueFlow/VueFlow.vue
index 4ae9084b..7400e244 100644
--- a/packages/core/src/container/VueFlow/VueFlow.vue
+++ b/packages/core/src/container/VueFlow/VueFlow.vue
@@ -42,6 +42,7 @@ const props = withDefaults(defineProps
(), {
disableKeyboardA11y: undefined,
edgesFocusable: undefined,
nodesFocusable: undefined,
+ selectionOnDrag: undefined,
})
const emit = defineEmits<{
@@ -77,6 +78,11 @@ const emit = defineEmits<{
(event: 'selectionDrag', selectionEvent: NodeDragEvent): void
(event: 'selectionDragStop', selectionEvent: NodeDragEvent): void
(event: 'selectionContextMenu', selectionEvent: { event: MouseEvent; nodes: GraphNode[] }): void
+ (event: 'selectionStart', selectionEvent: MouseEvent): void
+ (event: 'selectionEnd', selectionEvent: MouseEvent): void
+ (event: 'viewportChangeStart', viewport: ViewportTransform): void
+ (event: 'viewportChange', viewport: ViewportTransform): void
+ (event: 'viewportChangeEnd', viewport: ViewportTransform): void
(event: 'paneReady', paneEvent: VueFlowStore): void
(event: 'paneScroll', paneEvent: WheelEvent | undefined): void
(event: 'paneClick', paneEvent: MouseEvent): void
@@ -167,10 +173,12 @@ export default {
-
-
+
+
+
-
+
+
diff --git a/packages/core/src/container/index.ts b/packages/core/src/container/index.ts
index c000fc78..8a86e667 100644
--- a/packages/core/src/container/index.ts
+++ b/packages/core/src/container/index.ts
@@ -4,4 +4,4 @@ export { default as Marker } from './EdgeRenderer/Marker.vue'
export { default as MarkerDefinitions } from './EdgeRenderer/MarkerDefinitions.vue'
export { default as NodeRenderer } from './NodeRenderer/NodeRenderer.vue'
export { default as Viewport } from './Viewport/Viewport.vue'
-export { default as SelectionPane } from './SelectionPane/SelectionPane.vue'
+export { default as SelectionPane } from './Pane/SelectionPane.vue'
diff --git a/packages/core/src/store/hooks.ts b/packages/core/src/store/hooks.ts
index fc26d2bb..807afbc8 100644
--- a/packages/core/src/store/hooks.ts
+++ b/packages/core/src/store/hooks.ts
@@ -31,6 +31,11 @@ export const createHooks = (): FlowHooks => ({
selectionDrag: createEventHook(),
selectionDragStop: createEventHook(),
selectionContextMenu: createEventHook(),
+ selectionStart: createEventHook(),
+ selectionEnd: createEventHook(),
+ viewportChangeStart: createEventHook(),
+ viewportChange: createEventHook(),
+ viewportChangeEnd: createEventHook(),
paneScroll: createEventHook(),
paneClick: createEventHook(),
paneContextMenu: createEventHook(),
diff --git a/packages/core/src/store/state.ts b/packages/core/src/store/state.ts
index 9e6c6507..7fb5f114 100644
--- a/packages/core/src/store/state.ts
+++ b/packages/core/src/store/state.ts
@@ -1,5 +1,5 @@
import type { DefaultEdgeTypes, DefaultNodeTypes, FlowOptions, State } from '~/types'
-import { ConnectionLineType, ConnectionMode, PanOnScrollMode } from '~/types'
+import { ConnectionLineType, ConnectionMode, PanOnScrollMode, SelectionMode } from '~/types'
import {
BezierEdge,
DefaultNode,
@@ -56,6 +56,8 @@ const defaultState = (): State => ({
[Number.POSITIVE_INFINITY, Number.POSITIVE_INFINITY],
],
+ selectionMode: SelectionMode.Full,
+ paneDragging: false,
preventScrolling: true,
zoomOnScroll: true,
zoomOnPinch: true,
@@ -71,6 +73,8 @@ const defaultState = (): State => ({
nodesSelectionActive: false,
userSelectionActive: false,
+ userSelectionRect: null,
+
defaultMarkerColor: '#b1b1b7',
connectionLineStyle: {},
connectionLineType: ConnectionLineType.Bezier,
@@ -94,11 +98,13 @@ const defaultState = (): State => ({
nodesDraggable: true,
elementsSelectable: true,
selectNodesOnDrag: true,
+ selectionOnDrag: false,
multiSelectionActive: false,
selectionKeyCode: 'Shift',
multiSelectionKeyCode: 'Meta',
zoomActivationKeyCode: 'Meta',
deleteKeyCode: 'Backspace',
+ panActivationKeyCode: 'Space',
hooks: createHooks(),
diff --git a/packages/core/src/style.css b/packages/core/src/style.css
index 1cdfa51a..494752a0 100644
--- a/packages/core/src/style.css
+++ b/packages/core/src/style.css
@@ -24,6 +24,10 @@
&.dragging {
cursor: grabbing;
}
+
+ &.selection {
+ cursor: pointer;
+ }
}
.vue-flow__transformationpane {
@@ -36,8 +40,8 @@
z-index: 4;
}
-.vue-flow__selectionpane {
- z-index: 5;
+.vue-flow__selection {
+ z-index: 6;
}
.vue-flow__edge-labels {
diff --git a/packages/core/src/types/flow.ts b/packages/core/src/types/flow.ts
index e7b7da03..84707de6 100644
--- a/packages/core/src/types/flow.ts
+++ b/packages/core/src/types/flow.ts
@@ -3,7 +3,7 @@ import type { KeyFilter } from '@vueuse/core'
import type { DefaultEdgeOptions, Edge, EdgeUpdatable, GraphEdge } from './edge'
import type { CoordinateExtent, GraphNode, Node } from './node'
import type { ConnectionLineOptions, ConnectionLineType, ConnectionMode, Connector } from './connection'
-import type { PanOnScrollMode, Viewport } from './zoom'
+import type { PanOnScrollMode, ViewportTransform } from './zoom'
import type { EdgeTypesObject, NodeTypesObject } from './components'
import type { CustomEvent } from './hooks'
@@ -88,7 +88,11 @@ export type SnapGrid = [number, number]
export interface SelectionRect extends Rect {
startX: number
startY: number
- draw: boolean
+}
+
+export enum SelectionMode {
+ Partial = 'partial',
+ Full = 'full',
}
export interface FlowExportObject {
@@ -117,6 +121,7 @@ export interface FlowProps {
selectionKeyCode?: KeyFilter | null
multiSelectionKeyCode?: KeyFilter | null
zoomActivationKeyCode?: KeyFilter | null
+ panActivationKeyCode?: KeyFilter | null
snapToGrid?: boolean
snapGrid?: SnapGrid
onlyRenderVisibleElements?: boolean
@@ -126,10 +131,10 @@ export interface FlowProps {
elementsSelectable?: boolean
selectNodesOnDrag?: boolean
/** move pane on drag, replaced prop `paneMovable` */
- panOnDrag?: boolean
+ panOnDrag?: boolean | number[]
minZoom?: number
maxZoom?: number
- defaultViewport?: Viewport
+ defaultViewport?: ViewportTransform
translateExtent?: CoordinateExtent
nodeExtent?: CoordinateExtent
defaultMarkerColor?: string
@@ -141,6 +146,8 @@ export interface FlowProps {
zoomOnDoubleClick?: boolean
/** enable this to prevent vue flow from scrolling inside the container, i.e. allow for the page to scroll */
preventScrolling?: boolean
+ selectionOnDrag?: boolean
+ selectionMode?: SelectionMode
edgeUpdaterRadius?: number
fitViewOnInit?: boolean
/** allow connection with click handlers, i.e. support touch devices */
diff --git a/packages/core/src/types/hooks.ts b/packages/core/src/types/hooks.ts
index 915dd970..d0bba340 100644
--- a/packages/core/src/types/hooks.ts
+++ b/packages/core/src/types/hooks.ts
@@ -65,6 +65,11 @@ export interface FlowEvents {
selectionDrag: NodeDragEvent
selectionDragStop: NodeDragEvent
selectionContextMenu: { event: MouseEvent; nodes: GraphNode[] }
+ selectionStart: MouseEvent
+ selectionEnd: MouseEvent
+ viewportChangeStart: ViewportTransform
+ viewportChange: ViewportTransform
+ viewportChangeEnd: ViewportTransform
paneScroll: WheelEvent | undefined
paneClick: MouseEvent
paneContextMenu: MouseEvent
@@ -82,21 +87,6 @@ export interface FlowEvents {
edgeUpdateEnd: EdgeMouseEvent
}
-export type FlowHooks = Readonly<{
- [key in keyof FlowEvents]: EventHook