refactor(core): use separate svg container for edges

This commit is contained in:
braks
2023-06-15 22:35:25 +02:00
committed by Braks
parent 5f7d439ee2
commit 8e5d748013
2 changed files with 35 additions and 30 deletions
@@ -6,7 +6,7 @@ import ConnectionLine from '../../components/ConnectionLine'
import type { EdgeComponent, EdgeUpdatable, GraphEdge } from '../../types' import type { EdgeComponent, EdgeUpdatable, GraphEdge } from '../../types'
import { Slots } from '../../context' import { Slots } from '../../context'
import { useVueFlow } from '../../composables' import { useVueFlow } from '../../composables'
import { ErrorCode, VueFlowError, groupEdgesByZLevel } from '../../utils' import { ErrorCode, VueFlowError, getEdgeZIndex } from '../../utils'
import MarkerDefinitions from './MarkerDefinitions.vue' import MarkerDefinitions from './MarkerDefinitions.vue'
const slots = inject(Slots) const slots = inject(Slots)
@@ -15,26 +15,14 @@ const {
edgesUpdatable, edgesUpdatable,
edgesFocusable, edgesFocusable,
elementsSelectable, elementsSelectable,
getSelectedNodes,
findNode, findNode,
edges,
getEdges, getEdges,
getNodesInitialized,
getEdgeTypes, getEdgeTypes,
elevateEdgesOnSelect, elevateEdgesOnSelect,
dimensions, dimensions,
emits, emits,
} = useVueFlow() } = useVueFlow()
const groups = controlledComputed(
[
() => edges.value.map((e) => e.zIndex),
() => (elevateEdgesOnSelect.value ? [getSelectedNodes.value.length] : [0]),
() => (elevateEdgesOnSelect.value ? getNodesInitialized.value.map((n) => n.computedPosition.z) : []),
],
() => groupEdgesByZLevel(getEdges.value, findNode, elevateEdgesOnSelect.value),
)
function selectable(edgeSelectable?: boolean) { function selectable(edgeSelectable?: boolean) {
return typeof edgeSelectable === 'undefined' ? elementsSelectable.value : edgeSelectable return typeof edgeSelectable === 'undefined' ? elementsSelectable.value : edgeSelectable
} }
@@ -81,26 +69,25 @@ export default {
<template> <template>
<template v-if="dimensions.width && dimensions.height"> <template v-if="dimensions.width && dimensions.height">
<svg class="vue-flow__edges vue-flow__container">
<MarkerDefinitions />
</svg>
<svg <svg
v-for="group of groups" v-for="edge of getEdges"
:key="group.level" :key="edge.id"
class="vue-flow__edges vue-flow__container" class="vue-flow__edges vue-flow__container"
:style="`z-index: ${group.level}`" :style="{ zIndex: getEdgeZIndex(edge, findNode, elevateEdgesOnSelect) }"
> >
<MarkerDefinitions v-if="group.isMaxLevel" /> <EdgeWrapper
<g> :id="edge.id"
<EdgeWrapper :edge="edge"
v-for="edge of group.edges" :type="getType(edge.type, edge.template)"
:id="edge.id" :name="edge.type || 'default'"
:key="edge.id" :selectable="selectable(edge.selectable)"
:edge="edge" :updatable="updatable(edge.updatable)"
:type="getType(edge.type, edge.template)" :focusable="focusable(edge.focusable)"
:name="edge.type || 'default'" />
:selectable="selectable(edge.selectable)"
:updatable="updatable(edge.updatable)"
:focusable="focusable(edge.focusable)"
/>
</g>
</svg> </svg>
<ConnectionLine /> <ConnectionLine />
+18
View File
@@ -170,3 +170,21 @@ export function groupEdgesByZLevel(edges: GraphEdge[], findNode: Actions['findNo
} }
}) })
} }
export function getEdgeZIndex(edge: GraphEdge, findNode: Actions['findNode'], elevateEdgesOnSelect = false) {
const hasZIndex = isNumber(edge.zIndex)
let z = hasZIndex ? edge.zIndex! : 0
const source = findNode(edge.source)
const target = findNode(edge.target)
if (!source || !target) {
return 0
}
if (elevateEdgesOnSelect) {
z = hasZIndex ? edge.zIndex! : Math.max(source.computedPosition.z || 0, target.computedPosition.z || 0)
}
return z
}