update: Add injection keys
This commit is contained in:
@@ -2,50 +2,26 @@ import { ElementId, Elements, Position } from '../../src'
|
|||||||
|
|
||||||
const nodeWidth = 80
|
const nodeWidth = 80
|
||||||
const nodeGapWidth = nodeWidth * 2
|
const nodeGapWidth = nodeWidth * 2
|
||||||
const nodeStyle = { width: nodeWidth + 'px', fontSize: '11px', color: 'white' }
|
const nodeStyle = { width: `${nodeWidth}px`, fontSize: '11px', color: 'white' }
|
||||||
|
|
||||||
const sourceTargetPositions = [
|
const sourceTargetPositions = [
|
||||||
{ source: Position.Bottom, target: Position.Top },
|
{ source: Position.Bottom, target: Position.Top },
|
||||||
{ source: Position.Right, target: Position.Left }
|
{ source: Position.Right, target: Position.Left },
|
||||||
]
|
]
|
||||||
const nodeColors = [
|
const nodeColors = [
|
||||||
['#1e9e99', '#4cb3ac', '#6ec9c0', '#8ddfd4'],
|
['#1e9e99', '#4cb3ac', '#6ec9c0', '#8ddfd4'],
|
||||||
['#0f4c75', '#1b5d8b', '#276fa1', '#3282b8']
|
['#0f4c75', '#1b5d8b', '#276fa1', '#3282b8'],
|
||||||
]
|
]
|
||||||
const edgeTypes = ['default', 'step', 'smoothstep', 'straight']
|
const edgeTypes = ['default', 'step', 'smoothstep', 'straight']
|
||||||
const offsets = [
|
const offsets = [
|
||||||
{
|
{
|
||||||
x: 0,
|
x: 0,
|
||||||
y: -nodeGapWidth
|
y: -nodeGapWidth,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
x: nodeGapWidth,
|
x: nodeGapWidth,
|
||||||
y: -nodeGapWidth
|
y: -nodeGapWidth,
|
||||||
},
|
},
|
||||||
{
|
|
||||||
x: nodeGapWidth,
|
|
||||||
y: 0
|
|
||||||
},
|
|
||||||
{
|
|
||||||
x: nodeGapWidth,
|
|
||||||
y: nodeGapWidth
|
|
||||||
},
|
|
||||||
{
|
|
||||||
x: 0,
|
|
||||||
y: nodeGapWidth
|
|
||||||
},
|
|
||||||
{
|
|
||||||
x: -nodeGapWidth,
|
|
||||||
y: nodeGapWidth
|
|
||||||
},
|
|
||||||
{
|
|
||||||
x: -nodeGapWidth,
|
|
||||||
y: 0
|
|
||||||
},
|
|
||||||
{
|
|
||||||
x: -nodeGapWidth,
|
|
||||||
y: -nodeGapWidth
|
|
||||||
}
|
|
||||||
]
|
]
|
||||||
|
|
||||||
let id = 0
|
let id = 0
|
||||||
@@ -66,7 +42,7 @@ export function getElements(): Elements {
|
|||||||
const style = { ...nodeStyle, background: nodeColors[sourceTargetIndex][edgeTypeIndex] }
|
const style = { ...nodeStyle, background: nodeColors[sourceTargetIndex][edgeTypeIndex] }
|
||||||
const sourcePosition = {
|
const sourcePosition = {
|
||||||
x: offsetIndex * nodeWidth * 4,
|
x: offsetIndex * nodeWidth * 4,
|
||||||
y: edgeTypeIndex * 300 + sourceTargetIndex * edgeTypes.length * 300
|
y: edgeTypeIndex * 300 + sourceTargetIndex * edgeTypes.length * 300,
|
||||||
}
|
}
|
||||||
const sourceId = getNodeId()
|
const sourceId = getNodeId()
|
||||||
const sourceData = { label: `Source ${sourceId}` }
|
const sourceData = { label: `Source ${sourceId}` }
|
||||||
@@ -76,14 +52,14 @@ export function getElements(): Elements {
|
|||||||
data: sourceData,
|
data: sourceData,
|
||||||
position: sourcePosition,
|
position: sourcePosition,
|
||||||
sourcePosition: currSourceTargetPos.source,
|
sourcePosition: currSourceTargetPos.source,
|
||||||
targetPosition: currSourceTargetPos.target
|
targetPosition: currSourceTargetPos.target,
|
||||||
}
|
}
|
||||||
|
|
||||||
const targetId = getNodeId()
|
const targetId = getNodeId()
|
||||||
const targetData = { label: `Target ${targetId}` }
|
const targetData = { label: `Target ${targetId}` }
|
||||||
const targetPosition = {
|
const targetPosition = {
|
||||||
x: sourcePosition.x + currOffset.x,
|
x: sourcePosition.x + currOffset.x,
|
||||||
y: sourcePosition.y + currOffset.y
|
y: sourcePosition.y + currOffset.y,
|
||||||
}
|
}
|
||||||
const targetNode = {
|
const targetNode = {
|
||||||
id: targetId,
|
id: targetId,
|
||||||
@@ -91,7 +67,7 @@ export function getElements(): Elements {
|
|||||||
data: targetData,
|
data: targetData,
|
||||||
position: targetPosition,
|
position: targetPosition,
|
||||||
sourcePosition: currSourceTargetPos.source,
|
sourcePosition: currSourceTargetPos.source,
|
||||||
targetPosition: currSourceTargetPos.target
|
targetPosition: currSourceTargetPos.target,
|
||||||
}
|
}
|
||||||
|
|
||||||
initialElements.push(sourceNode)
|
initialElements.push(sourceNode)
|
||||||
|
|||||||
@@ -1,8 +1,8 @@
|
|||||||
<script lang="ts" setup>
|
<script lang="ts" setup>
|
||||||
import { CSSProperties } from 'vue'
|
import { CSSProperties } from 'vue'
|
||||||
import { ConnectionLineType, CustomConnectionLine, HandleElement, Node, Position, RevueFlowStore } from '~/types'
|
import { ConnectionLineType, CustomConnectionLine, HandleElement, Node, Position } from '~/types'
|
||||||
import { RevueFlowHooks } from '~/hooks/RevueFlowHooks'
|
|
||||||
import { getBezierPath, getSmoothStepPath } from '~/components/Edges/utils'
|
import { getBezierPath, getSmoothStepPath } from '~/components/Edges/utils'
|
||||||
|
import { Hooks, Store } from '~/context/symbols'
|
||||||
|
|
||||||
interface ConnectionLineProps {
|
interface ConnectionLineProps {
|
||||||
sourceNode: Node
|
sourceNode: Node
|
||||||
@@ -16,8 +16,8 @@ const props = withDefaults(defineProps<ConnectionLineProps>(), {
|
|||||||
connectionLineStyle: () => ({}),
|
connectionLineStyle: () => ({}),
|
||||||
})
|
})
|
||||||
|
|
||||||
const hooks = inject<RevueFlowHooks>('hooks')!
|
const hooks = inject(Hooks)!
|
||||||
const store = inject<RevueFlowStore>('store')!
|
const store = inject(Store)!
|
||||||
|
|
||||||
const sourceHandle =
|
const sourceHandle =
|
||||||
store.connectionHandleId && store.connectionHandleType
|
store.connectionHandleId && store.connectionHandleType
|
||||||
|
|||||||
@@ -1,10 +1,10 @@
|
|||||||
<script lang="ts" setup>
|
<script lang="ts" setup>
|
||||||
import EdgeAnchor from './EdgeAnchor.vue'
|
import EdgeAnchor from './EdgeAnchor.vue'
|
||||||
import { RevueFlowHooks } from '~/hooks/RevueFlowHooks'
|
|
||||||
import { getEdgePositions, getHandle, getSourceTargetNodes, isEdgeVisible } from '~/container/EdgeRenderer/utils'
|
import { getEdgePositions, getHandle, getSourceTargetNodes, isEdgeVisible } from '~/container/EdgeRenderer/utils'
|
||||||
import { isEdge } from '~/utils/graph'
|
import { isEdge } from '~/utils/graph'
|
||||||
import { ConnectionMode, Dimensions, Edge, EdgeType, Elements, Position, RevueFlowStore, Transform } from '~/types'
|
import { ConnectionMode, Dimensions, Edge, EdgeType, Elements, Position, Transform } from '~/types'
|
||||||
import { onMouseDown } from '~/components/Handle/utils'
|
import { onMouseDown } from '~/components/Handle/utils'
|
||||||
|
import { Hooks, Store } from '~/context/symbols'
|
||||||
|
|
||||||
interface EdgeProps {
|
interface EdgeProps {
|
||||||
type: EdgeType
|
type: EdgeType
|
||||||
@@ -25,8 +25,8 @@ const props = withDefaults(defineProps<EdgeProps>(), {
|
|||||||
onlyRenderVisibleElements: false,
|
onlyRenderVisibleElements: false,
|
||||||
})
|
})
|
||||||
|
|
||||||
const store = inject<RevueFlowStore>('store')!
|
const store = inject(Store)!
|
||||||
const hooks = inject<RevueFlowHooks>('hooks')!
|
const hooks = inject(Hooks)!
|
||||||
|
|
||||||
hooks.connect.on((connection) => {
|
hooks.connect.on((connection) => {
|
||||||
hooks.edgeUpdate.trigger({ edge: props.edge, connection })
|
hooks.edgeUpdate.trigger({ edge: props.edge, connection })
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
<script lang="ts" setup>
|
<script lang="ts" setup>
|
||||||
import { ElementId, Position, RevueFlowStore } from '~/types'
|
import { ElementId, Position } from '~/types'
|
||||||
import { onMouseDown, ValidConnectionFunc } from '~/components/Handle/utils'
|
import { onMouseDown, ValidConnectionFunc } from '~/components/Handle/utils'
|
||||||
import { RevueFlowHooks } from '~/hooks/RevueFlowHooks'
|
import { Hooks, Store } from '~/context/symbols'
|
||||||
|
|
||||||
interface HandleProps {
|
interface HandleProps {
|
||||||
id?: string
|
id?: string
|
||||||
@@ -18,8 +18,8 @@ const props = withDefaults(defineProps<HandleProps>(), {
|
|||||||
connectable: true,
|
connectable: true,
|
||||||
})
|
})
|
||||||
|
|
||||||
const store = inject<RevueFlowStore>('store')!
|
const store = inject(Store)!
|
||||||
const hooks = inject<RevueFlowHooks>('hooks')!
|
const hooks = inject(Hooks)!
|
||||||
const nodeId = inject<ElementId>('NodeIdContext')!
|
const nodeId = inject<ElementId>('NodeIdContext')!
|
||||||
|
|
||||||
const onMouseDownHandler = (event: MouseEvent) =>
|
const onMouseDownHandler = (event: MouseEvent) =>
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
<script lang="ts" setup>
|
<script lang="ts" setup>
|
||||||
import { DraggableEventListener } from '@braks/revue-draggable'
|
import { DraggableEventListener } from '@braks/revue-draggable'
|
||||||
import { RevueFlowHooks } from '~/hooks/RevueFlowHooks'
|
import { Node, NodeDimensionUpdate, NodeType } from '~/types'
|
||||||
import { Node, NodeDimensionUpdate, NodeType, RevueFlowStore } from '~/types'
|
import { Hooks, Store } from '~/context/symbols'
|
||||||
|
|
||||||
interface NodeProps {
|
interface NodeProps {
|
||||||
node: Node
|
node: Node
|
||||||
@@ -21,8 +21,8 @@ const props = withDefaults(defineProps<NodeProps>(), {
|
|||||||
selectNodesOnDrag: true,
|
selectNodesOnDrag: true,
|
||||||
})
|
})
|
||||||
|
|
||||||
const store = inject<RevueFlowStore>('store')!
|
const store = inject(Store)!
|
||||||
const hooks = inject<RevueFlowHooks>('hooks')!
|
const hooks = inject(Hooks)!
|
||||||
provide('NodeIdContext', props.node.id)
|
provide('NodeIdContext', props.node.id)
|
||||||
|
|
||||||
const nodeElement = templateRef<HTMLDivElement>('node-element', null)
|
const nodeElement = templateRef<HTMLDivElement>('node-element', null)
|
||||||
|
|||||||
@@ -1,8 +1,8 @@
|
|||||||
<script lang="ts" setup>
|
<script lang="ts" setup>
|
||||||
import { DraggableEventListener } from '@braks/revue-draggable'
|
import { DraggableEventListener } from '@braks/revue-draggable'
|
||||||
import { Node, RevueFlowStore } from '~/types'
|
import { Node } from '~/types'
|
||||||
import { RevueFlowHooks } from '~/hooks/RevueFlowHooks'
|
|
||||||
import { isNode } from '~/utils/graph'
|
import { isNode } from '~/utils/graph'
|
||||||
|
import { Hooks, Store } from '~/context/symbols'
|
||||||
|
|
||||||
interface NodesSelectionProps {
|
interface NodesSelectionProps {
|
||||||
onSelectionDragStart?: (event: MouseEvent, nodes: Node[]) => void
|
onSelectionDragStart?: (event: MouseEvent, nodes: Node[]) => void
|
||||||
@@ -13,8 +13,8 @@ interface NodesSelectionProps {
|
|||||||
|
|
||||||
const props = defineProps<NodesSelectionProps>()
|
const props = defineProps<NodesSelectionProps>()
|
||||||
|
|
||||||
const store = inject<RevueFlowStore>('store')!
|
const store = inject(Store)!
|
||||||
const hooks = inject<RevueFlowHooks>('hooks')!
|
const hooks = inject(Hooks)!
|
||||||
|
|
||||||
const selectedNodes = computed(() =>
|
const selectedNodes = computed(() =>
|
||||||
store.selectedElements
|
store.selectedElements
|
||||||
|
|||||||
@@ -1,9 +1,9 @@
|
|||||||
<script lang="ts" setup>
|
<script lang="ts" setup>
|
||||||
import SelectionRect from './SelectionRect.vue'
|
import SelectionRect from './SelectionRect.vue'
|
||||||
import { RevueFlowStore } from '~/types'
|
|
||||||
import { getMousePosition } from '~/components/UserSelection/utils'
|
import { getMousePosition } from '~/components/UserSelection/utils'
|
||||||
|
import { Store } from '~/context/symbols'
|
||||||
|
|
||||||
const store = inject<RevueFlowStore>('store')!
|
const store = inject(Store)!
|
||||||
const el = templateRef('user-selection', null)
|
const el = templateRef('user-selection', null)
|
||||||
|
|
||||||
const onMouseDown = (event: MouseEvent) => {
|
const onMouseDown = (event: MouseEvent) => {
|
||||||
|
|||||||
@@ -12,10 +12,10 @@ import {
|
|||||||
Transform,
|
Transform,
|
||||||
TranslateExtent,
|
TranslateExtent,
|
||||||
} from '~/types'
|
} from '~/types'
|
||||||
import { RevueFlowHooks } from '~/hooks/RevueFlowHooks'
|
|
||||||
import { clamp } from '~/utils'
|
import { clamp } from '~/utils'
|
||||||
import useKeyPress from '~/hooks/useKeyPress'
|
import useKeyPress from '~/hooks/useKeyPress'
|
||||||
// import { onLoadGetElements, onLoadProject, onLoadToObject } from '~/utils/graph'
|
import { Hooks } from '~/context/symbols'
|
||||||
|
import { onLoadGetElements, onLoadProject, onLoadToObject } from '~/utils/graph'
|
||||||
|
|
||||||
const viewChanged = (prevTransform: FlowTransform, eventTransform: ZoomTransform): boolean =>
|
const viewChanged = (prevTransform: FlowTransform, eventTransform: ZoomTransform): boolean =>
|
||||||
prevTransform.x !== eventTransform.x || prevTransform.y !== eventTransform.y || prevTransform.zoom !== eventTransform.k
|
prevTransform.x !== eventTransform.x || prevTransform.y !== eventTransform.y || prevTransform.zoom !== eventTransform.k
|
||||||
@@ -73,7 +73,7 @@ export default function (
|
|||||||
panOnScrollMode = PanOnScrollMode.Free,
|
panOnScrollMode = PanOnScrollMode.Free,
|
||||||
paneMoveable = true,
|
paneMoveable = true,
|
||||||
} = options
|
} = options
|
||||||
const hooks = inject<RevueFlowHooks>('hooks')!
|
const hooks = inject(Hooks)!
|
||||||
const prevTransform = ref<FlowTransform>({ x: 0, y: 0, zoom: 0 })
|
const prevTransform = ref<FlowTransform>({ x: 0, y: 0, zoom: 0 })
|
||||||
|
|
||||||
const clampedX = clamp(defaultPosition[0], translateExtent[0][0], translateExtent[1][0])
|
const clampedX = clamp(defaultPosition[0], translateExtent[0][0], translateExtent[1][0])
|
||||||
|
|||||||
@@ -4,15 +4,8 @@ import { getSourceTargetNodes } from './utils'
|
|||||||
import MarkerDefinitions from './MarkerDefinitions.vue'
|
import MarkerDefinitions from './MarkerDefinitions.vue'
|
||||||
import Edge from '~/components/Edges/Edge.vue'
|
import Edge from '~/components/Edges/Edge.vue'
|
||||||
import ConnectionLine from '~/components/ConnectionLine/ConnectionLine.vue'
|
import ConnectionLine from '~/components/ConnectionLine/ConnectionLine.vue'
|
||||||
import {
|
import { ConnectionLineType, ConnectionMode, CustomConnectionLine, Dimensions, EdgeType, Transform } from '~/types'
|
||||||
ConnectionLineType,
|
import { Store } from '~/context/symbols'
|
||||||
ConnectionMode,
|
|
||||||
CustomConnectionLine,
|
|
||||||
Dimensions,
|
|
||||||
EdgeType,
|
|
||||||
RevueFlowStore,
|
|
||||||
Transform,
|
|
||||||
} from '~/types'
|
|
||||||
|
|
||||||
interface EdgeRendererProps {
|
interface EdgeRendererProps {
|
||||||
edgeTypes: Record<string, EdgeType>
|
edgeTypes: Record<string, EdgeType>
|
||||||
@@ -36,7 +29,7 @@ const props = withDefaults(defineProps<EdgeRendererProps>(), {
|
|||||||
connectionLineType: ConnectionLineType.Bezier,
|
connectionLineType: ConnectionLineType.Bezier,
|
||||||
})
|
})
|
||||||
|
|
||||||
const store = inject<RevueFlowStore>('store')!
|
const store = inject(Store)!
|
||||||
|
|
||||||
const sourceNode = computed(() => store.nodes.find((n) => n.id === store.connectionNodeId))
|
const sourceNode = computed(() => store.nodes.find((n) => n.id === store.connectionNodeId))
|
||||||
const connectionLineVisible = computed(
|
const connectionLineVisible = computed(
|
||||||
|
|||||||
@@ -11,7 +11,6 @@ import {
|
|||||||
ConnectionMode,
|
ConnectionMode,
|
||||||
Elements,
|
Elements,
|
||||||
PanOnScrollMode,
|
PanOnScrollMode,
|
||||||
RevueFlowStore,
|
|
||||||
NodeType,
|
NodeType,
|
||||||
EdgeType,
|
EdgeType,
|
||||||
CustomConnectionLine,
|
CustomConnectionLine,
|
||||||
@@ -19,13 +18,14 @@ import {
|
|||||||
TranslateExtent,
|
TranslateExtent,
|
||||||
NodeExtent,
|
NodeExtent,
|
||||||
} from '~/types'
|
} from '~/types'
|
||||||
import { RevueFlowHooks, useRevueFlow } from '~/hooks/RevueFlowHooks'
|
|
||||||
import configureStore from '~/store/configure-store'
|
import configureStore from '~/store/configure-store'
|
||||||
import { initialState } from '~/store'
|
import { initialState } from '~/store'
|
||||||
import { DefaultNode, InputNode, OutputNode } from '~/components/Nodes'
|
import { DefaultNode, InputNode, OutputNode } from '~/components/Nodes'
|
||||||
import { BezierEdge, SmoothStepEdge, StepEdge, StraightEdge } from '~/components/Edges'
|
import { BezierEdge, SmoothStepEdge, StepEdge, StraightEdge } from '~/components/Edges'
|
||||||
import { createEdgeTypes } from '~/container/EdgeRenderer/utils'
|
import { createEdgeTypes } from '~/container/EdgeRenderer/utils'
|
||||||
import { createNodeTypes } from '~/container/NodeRenderer/utils'
|
import { createNodeTypes } from '~/container/NodeRenderer/utils'
|
||||||
|
import { useHooks } from '~/hooks/RevueFlowHooks'
|
||||||
|
import { Hooks, Store } from '~/context/symbols'
|
||||||
|
|
||||||
export interface FlowProps {
|
export interface FlowProps {
|
||||||
elements: Elements
|
elements: Elements
|
||||||
@@ -101,7 +101,7 @@ const props = withDefaults(defineProps<FlowProps>(), {
|
|||||||
paneMoveable: true,
|
paneMoveable: true,
|
||||||
edgeUpdaterRadius: 10,
|
edgeUpdaterRadius: 10,
|
||||||
})
|
})
|
||||||
const emit = defineEmits(Object.keys(useRevueFlow()))
|
const emit = defineEmits(Object.keys(useHooks()))
|
||||||
|
|
||||||
const defaultNodeTypes: Record<string, NodeType> = {
|
const defaultNodeTypes: Record<string, NodeType> = {
|
||||||
input: InputNode as NodeType,
|
input: InputNode as NodeType,
|
||||||
@@ -116,13 +116,13 @@ const defaultEdgeTypes: Record<string, EdgeType> = {
|
|||||||
smoothstep: SmoothStepEdge as EdgeType,
|
smoothstep: SmoothStepEdge as EdgeType,
|
||||||
}
|
}
|
||||||
|
|
||||||
let store = inject<RevueFlowStore>('store')!
|
let store = inject(Store)!
|
||||||
if (!store) {
|
if (!store) {
|
||||||
store = configureStore({
|
store = configureStore({
|
||||||
...initialState,
|
...initialState,
|
||||||
...props,
|
...props,
|
||||||
})()
|
})()
|
||||||
provide<RevueFlowStore>('store', store)
|
provide(Store, store)
|
||||||
}
|
}
|
||||||
|
|
||||||
const init = () => {
|
const init = () => {
|
||||||
@@ -138,8 +138,8 @@ onBeforeUnmount(() => store?.$dispose())
|
|||||||
onUpdated(() => init())
|
onUpdated(() => init())
|
||||||
init()
|
init()
|
||||||
|
|
||||||
const hooks = useRevueFlow().bind(emit)
|
const hooks = useHooks().bind(emit)
|
||||||
provide<RevueFlowHooks>('hooks', hooks)
|
provide(Hooks, hooks)
|
||||||
|
|
||||||
const nodeTypes = createNodeTypes({ ...defaultNodeTypes, ...props.nodeTypes })
|
const nodeTypes = createNodeTypes({ ...defaultNodeTypes, ...props.nodeTypes })
|
||||||
const edgeTypes = createEdgeTypes({ ...defaultEdgeTypes, ...props.edgeTypes })
|
const edgeTypes = createEdgeTypes({ ...defaultEdgeTypes, ...props.edgeTypes })
|
||||||
|
|||||||
@@ -1,7 +1,8 @@
|
|||||||
<script lang="ts" setup>
|
<script lang="ts" setup>
|
||||||
import Node from '~/components/Nodes/Node.vue'
|
import Node from '~/components/Nodes/Node.vue'
|
||||||
import { NodeType, Node as TNode, Transform, Dimensions, RevueFlowStore } from '~/types'
|
import { NodeType, Node as TNode, Transform, Dimensions } from '~/types'
|
||||||
import { getNodesInside } from '~/utils/graph'
|
import { getNodesInside } from '~/utils/graph'
|
||||||
|
import { Store } from '~/context/symbols'
|
||||||
|
|
||||||
interface NodeRendererProps {
|
interface NodeRendererProps {
|
||||||
nodeTypes: Record<string, NodeType>
|
nodeTypes: Record<string, NodeType>
|
||||||
@@ -14,7 +15,7 @@ const props = withDefaults(defineProps<NodeRendererProps>(), {
|
|||||||
dimensions: () => ({ width: 0, height: 0 }),
|
dimensions: () => ({ width: 0, height: 0 }),
|
||||||
})
|
})
|
||||||
|
|
||||||
const store = inject<RevueFlowStore>('store')!
|
const store = inject(Store)!
|
||||||
|
|
||||||
const getNodes = computed(() =>
|
const getNodes = computed(() =>
|
||||||
store.onlyRenderVisibleElements
|
store.onlyRenderVisibleElements
|
||||||
|
|||||||
@@ -1,10 +1,10 @@
|
|||||||
<script lang="ts" setup>
|
<script lang="ts" setup>
|
||||||
import { RevueFlowHooks } from '~/hooks/RevueFlowHooks'
|
|
||||||
import useKeyPress from '~/hooks/useKeyPress'
|
import useKeyPress from '~/hooks/useKeyPress'
|
||||||
import { KeyCode, RevueFlowStore } from '~/types'
|
import { KeyCode } from '~/types'
|
||||||
import useGlobalKeyHandler from '~/hooks/useGlobalKeyHandler'
|
import useGlobalKeyHandler from '~/hooks/useGlobalKeyHandler'
|
||||||
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'
|
||||||
|
import { Hooks, Store } from '~/context/symbols'
|
||||||
|
|
||||||
interface SelectionPaneProps {
|
interface SelectionPaneProps {
|
||||||
selectionKeyCode?: KeyCode
|
selectionKeyCode?: KeyCode
|
||||||
@@ -16,8 +16,8 @@ const props = withDefaults(defineProps<SelectionPaneProps>(), {
|
|||||||
deleteKeyCode: 'Backspace',
|
deleteKeyCode: 'Backspace',
|
||||||
multiSelectionKeyCode: 'Meta',
|
multiSelectionKeyCode: 'Meta',
|
||||||
})
|
})
|
||||||
const store = inject<RevueFlowStore>('store')!
|
const store = inject(Store)!
|
||||||
const hooks = inject<RevueFlowHooks>('hooks')!
|
const hooks = inject(Hooks)!
|
||||||
const keyPressed = useKeyPress(props.selectionKeyCode)
|
const keyPressed = useKeyPress(props.selectionKeyCode)
|
||||||
|
|
||||||
const onClick = (event: MouseEvent) => {
|
const onClick = (event: MouseEvent) => {
|
||||||
|
|||||||
@@ -1,8 +1,9 @@
|
|||||||
<script lang="ts" setup>
|
<script lang="ts" setup>
|
||||||
import { KeyCode, PanOnScrollMode, RevueFlowStore } from '~/types'
|
import { KeyCode, PanOnScrollMode } from '~/types'
|
||||||
import useZoom from '~/composables/useZoom'
|
import useZoom from '~/composables/useZoom'
|
||||||
import useResizeHandler from '~/hooks/useResizeHandler'
|
import useResizeHandler from '~/hooks/useResizeHandler'
|
||||||
import useZoomPanHelper from '~/hooks/useZoomPanHelper'
|
import useZoomPanHelper from '~/hooks/useZoomPanHelper'
|
||||||
|
import { Store } from '~/context/symbols'
|
||||||
|
|
||||||
interface ZoomPaneProps {
|
interface ZoomPaneProps {
|
||||||
selectionKeyCode?: KeyCode
|
selectionKeyCode?: KeyCode
|
||||||
@@ -31,7 +32,7 @@ const props = withDefaults(defineProps<ZoomPaneProps>(), {
|
|||||||
panOnScrollMode: PanOnScrollMode.Free,
|
panOnScrollMode: PanOnScrollMode.Free,
|
||||||
paneMoveable: true,
|
paneMoveable: true,
|
||||||
})
|
})
|
||||||
const store = inject<RevueFlowStore>('store')!
|
const store = inject(Store)!
|
||||||
const zoomPaneEl = templateRef<HTMLDivElement>('zoom-pane', null)
|
const zoomPaneEl = templateRef<HTMLDivElement>('zoom-pane', null)
|
||||||
const { transform, d3Selection, d3Zoom } = useZoom(zoomPaneEl, props, (initD3ZoomPayload) => store.initD3Zoom(initD3ZoomPayload))
|
const { transform, d3Selection, d3Zoom } = useZoom(zoomPaneEl, props, (initD3ZoomPayload) => store.initD3Zoom(initD3ZoomPayload))
|
||||||
|
|
||||||
|
|||||||
@@ -0,0 +1,5 @@
|
|||||||
|
import { InjectionKey } from 'vue'
|
||||||
|
import { FlowHooks, FlowStore } from '~/types'
|
||||||
|
|
||||||
|
export const Store: InjectionKey<FlowStore> = Symbol('store')
|
||||||
|
export const Hooks: InjectionKey<FlowHooks> = Symbol('hooks')
|
||||||
@@ -1,51 +1,8 @@
|
|||||||
// global hooks
|
// global hooks
|
||||||
import { EventHook } from '@vueuse/core'
|
import { Connection, Edge, Elements, FlowHooks, FlowTransform, Node, OnConnectStartParams, OnLoadParams } from '~/types'
|
||||||
import { Connection, Edge, Elements, FlowTransform, Node, OnConnectStartParams, OnLoadParams } from '../types'
|
|
||||||
|
|
||||||
export interface RevueFlowHooks {
|
export const useHooks = (): FlowHooks & { bind: (emit: (event: string, ...args: any[]) => void) => FlowHooks } => {
|
||||||
elementClick: EventHook<{ event: MouseEvent; element: Node | Edge }>
|
const eventHooks: FlowHooks = {
|
||||||
elementsRemove: EventHook<Elements>
|
|
||||||
nodeDoubleClick: EventHook<{ event: MouseEvent; node: Node }>
|
|
||||||
nodeClick: EventHook<{ event: MouseEvent; node: Node }>
|
|
||||||
nodeMouseEnter: EventHook<{ event: MouseEvent; node: Node }>
|
|
||||||
nodeMouseMove: EventHook<{ event: MouseEvent; node: Node }>
|
|
||||||
nodeMouseLeave: EventHook<{ event: MouseEvent; node: Node }>
|
|
||||||
nodeContextMenu: EventHook<{ event: MouseEvent; node: Node }>
|
|
||||||
nodeDragStart: EventHook<{ event: MouseEvent; node: Node }>
|
|
||||||
nodeDrag: EventHook<{ event: MouseEvent; node: Node }>
|
|
||||||
nodeDragStop: EventHook<{ event: MouseEvent; node: Node }>
|
|
||||||
connect: EventHook<Connection>
|
|
||||||
connectStart: EventHook<{
|
|
||||||
event: MouseEvent
|
|
||||||
params: OnConnectStartParams
|
|
||||||
}>
|
|
||||||
connectStop: EventHook<MouseEvent>
|
|
||||||
connectEnd: EventHook<MouseEvent>
|
|
||||||
load: EventHook<OnLoadParams>
|
|
||||||
move: EventHook<FlowTransform | undefined>
|
|
||||||
moveStart: EventHook<FlowTransform | undefined>
|
|
||||||
moveEnd: EventHook<FlowTransform | undefined>
|
|
||||||
selectionChange: EventHook<Elements | null>
|
|
||||||
selectionDragStart: EventHook<{ event: MouseEvent; nodes: Node[] }>
|
|
||||||
selectionDrag: EventHook<{ event: MouseEvent; nodes: Node[] }>
|
|
||||||
selectionDragStop: EventHook<{ event: MouseEvent; nodes: Node[] }>
|
|
||||||
selectionContextMenu: EventHook<{ event: MouseEvent; nodes: Node[] }>
|
|
||||||
paneScroll: EventHook<WheelEvent | undefined>
|
|
||||||
paneClick: EventHook<MouseEvent>
|
|
||||||
paneContextMenu: EventHook<MouseEvent>
|
|
||||||
edgeUpdate: EventHook<{ edge: Edge; connection: Connection }>
|
|
||||||
edgeContextMenu: EventHook<{ event: MouseEvent; edge: Edge }>
|
|
||||||
edgeMouseEnter: EventHook<{ event: MouseEvent; edge: Edge }>
|
|
||||||
edgeMouseMove: EventHook<{ event: MouseEvent; edge: Edge }>
|
|
||||||
edgeMouseLeave: EventHook<{ event: MouseEvent; edge: Edge }>
|
|
||||||
edgeDoubleClick: EventHook<{ event: MouseEvent; edge: Edge }>
|
|
||||||
edgeClick: EventHook<{ event: MouseEvent; edge: Edge }>
|
|
||||||
edgeUpdateStart: EventHook<{ event: MouseEvent; edge: Edge }>
|
|
||||||
edgeUpdateEnd: EventHook<{ event: MouseEvent; edge: Edge }>
|
|
||||||
}
|
|
||||||
|
|
||||||
export const useRevueFlow = (): RevueFlowHooks & { bind: (emit: (event: string, ...args: any[]) => void) => RevueFlowHooks } => {
|
|
||||||
const eventHooks: RevueFlowHooks = {
|
|
||||||
elementClick: createEventHook<{ event: MouseEvent; element: Node | Edge }>(),
|
elementClick: createEventHook<{ event: MouseEvent; element: Node | Edge }>(),
|
||||||
elementsRemove: createEventHook<Elements>(),
|
elementsRemove: createEventHook<Elements>(),
|
||||||
nodeDoubleClick: createEventHook<{ event: MouseEvent; node: Node }>(),
|
nodeDoubleClick: createEventHook<{ event: MouseEvent; node: Node }>(),
|
||||||
|
|||||||
@@ -1,6 +1,7 @@
|
|||||||
import useKeyPress from './useKeyPress'
|
import useKeyPress from './useKeyPress'
|
||||||
import { isNode, getConnectedEdges } from '~/utils/graph'
|
import { isNode, getConnectedEdges } from '~/utils/graph'
|
||||||
import { Elements, KeyCode, ElementId, FlowElement, RevueFlowStore } from '~/types'
|
import { Elements, KeyCode, ElementId, FlowElement } from '~/types'
|
||||||
|
import { Store } from '~/context/symbols'
|
||||||
|
|
||||||
interface HookParams {
|
interface HookParams {
|
||||||
deleteKeyCode: KeyCode
|
deleteKeyCode: KeyCode
|
||||||
@@ -9,7 +10,7 @@ interface HookParams {
|
|||||||
}
|
}
|
||||||
|
|
||||||
export default ({ deleteKeyCode, multiSelectionKeyCode, onElementsRemove = () => {} }: HookParams): void => {
|
export default ({ deleteKeyCode, multiSelectionKeyCode, onElementsRemove = () => {} }: HookParams): void => {
|
||||||
const store = inject<RevueFlowStore>('store')!
|
const store = inject(Store)!
|
||||||
|
|
||||||
useKeyPress(deleteKeyCode, (keyPressed) => {
|
useKeyPress(deleteKeyCode, (keyPressed) => {
|
||||||
if (keyPressed && store.selectedElements) {
|
if (keyPressed && store.selectedElements) {
|
||||||
|
|||||||
@@ -0,0 +1,45 @@
|
|||||||
|
// global hooks
|
||||||
|
import { EventHook } from '@vueuse/core'
|
||||||
|
import { Connection, Edge, Elements, FlowTransform, Node, OnConnectStartParams, OnLoadParams } from '../types'
|
||||||
|
|
||||||
|
export interface FlowHooks {
|
||||||
|
elementClick: EventHook<{ event: MouseEvent; element: Node | Edge }>
|
||||||
|
elementsRemove: EventHook<Elements>
|
||||||
|
nodeDoubleClick: EventHook<{ event: MouseEvent; node: Node }>
|
||||||
|
nodeClick: EventHook<{ event: MouseEvent; node: Node }>
|
||||||
|
nodeMouseEnter: EventHook<{ event: MouseEvent; node: Node }>
|
||||||
|
nodeMouseMove: EventHook<{ event: MouseEvent; node: Node }>
|
||||||
|
nodeMouseLeave: EventHook<{ event: MouseEvent; node: Node }>
|
||||||
|
nodeContextMenu: EventHook<{ event: MouseEvent; node: Node }>
|
||||||
|
nodeDragStart: EventHook<{ event: MouseEvent; node: Node }>
|
||||||
|
nodeDrag: EventHook<{ event: MouseEvent; node: Node }>
|
||||||
|
nodeDragStop: EventHook<{ event: MouseEvent; node: Node }>
|
||||||
|
connect: EventHook<Connection>
|
||||||
|
connectStart: EventHook<{
|
||||||
|
event: MouseEvent
|
||||||
|
params: OnConnectStartParams
|
||||||
|
}>
|
||||||
|
connectStop: EventHook<MouseEvent>
|
||||||
|
connectEnd: EventHook<MouseEvent>
|
||||||
|
load: EventHook<OnLoadParams>
|
||||||
|
move: EventHook<FlowTransform | undefined>
|
||||||
|
moveStart: EventHook<FlowTransform | undefined>
|
||||||
|
moveEnd: EventHook<FlowTransform | undefined>
|
||||||
|
selectionChange: EventHook<Elements | null>
|
||||||
|
selectionDragStart: EventHook<{ event: MouseEvent; nodes: Node[] }>
|
||||||
|
selectionDrag: EventHook<{ event: MouseEvent; nodes: Node[] }>
|
||||||
|
selectionDragStop: EventHook<{ event: MouseEvent; nodes: Node[] }>
|
||||||
|
selectionContextMenu: EventHook<{ event: MouseEvent; nodes: Node[] }>
|
||||||
|
paneScroll: EventHook<WheelEvent | undefined>
|
||||||
|
paneClick: EventHook<MouseEvent>
|
||||||
|
paneContextMenu: EventHook<MouseEvent>
|
||||||
|
edgeUpdate: EventHook<{ edge: Edge; connection: Connection }>
|
||||||
|
edgeContextMenu: EventHook<{ event: MouseEvent; edge: Edge }>
|
||||||
|
edgeMouseEnter: EventHook<{ event: MouseEvent; edge: Edge }>
|
||||||
|
edgeMouseMove: EventHook<{ event: MouseEvent; edge: Edge }>
|
||||||
|
edgeMouseLeave: EventHook<{ event: MouseEvent; edge: Edge }>
|
||||||
|
edgeDoubleClick: EventHook<{ event: MouseEvent; edge: Edge }>
|
||||||
|
edgeClick: EventHook<{ event: MouseEvent; edge: Edge }>
|
||||||
|
edgeUpdateStart: EventHook<{ event: MouseEvent; edge: Edge }>
|
||||||
|
edgeUpdateEnd: EventHook<{ event: MouseEvent; edge: Edge }>
|
||||||
|
}
|
||||||
@@ -6,3 +6,4 @@ export * from './handle'
|
|||||||
export * from './node'
|
export * from './node'
|
||||||
export * from './panel'
|
export * from './panel'
|
||||||
export * from './store'
|
export * from './store'
|
||||||
|
export * from './hooks'
|
||||||
|
|||||||
+2
-2
@@ -7,7 +7,7 @@ import { Node, NodeExtent, TranslateExtent } from './node'
|
|||||||
import { RevueFlowActions } from './actions'
|
import { RevueFlowActions } from './actions'
|
||||||
import { D3Selection, D3Zoom, D3ZoomHandler } from '~/types/panel'
|
import { D3Selection, D3Zoom, D3ZoomHandler } from '~/types/panel'
|
||||||
|
|
||||||
export interface RevueFlowState {
|
export interface FlowState {
|
||||||
dimensions: Dimensions
|
dimensions: Dimensions
|
||||||
transform: Transform
|
transform: Transform
|
||||||
nodes: Node[]
|
nodes: Node[]
|
||||||
@@ -51,4 +51,4 @@ export interface RevueFlowState {
|
|||||||
onConnectEnd?: OnConnectEndFunc
|
onConnectEnd?: OnConnectEndFunc
|
||||||
}
|
}
|
||||||
|
|
||||||
export type RevueFlowStore = Store<string, RevueFlowState, any, RevueFlowActions>
|
export type FlowStore = Store<string, FlowState, any, RevueFlowActions>
|
||||||
|
|||||||
Reference in New Issue
Block a user