feat(zIndexMode): use it for edges too
This commit is contained in:
@@ -89,6 +89,7 @@ function EdgeWrapper<EdgeType extends Edge = Edge>({
|
|||||||
sourceNode,
|
sourceNode,
|
||||||
targetNode,
|
targetNode,
|
||||||
elevateOnSelect: store.elevateEdgesOnSelect,
|
elevateOnSelect: store.elevateEdgesOnSelect,
|
||||||
|
zIndexMode: store.zIndexMode,
|
||||||
});
|
});
|
||||||
|
|
||||||
return {
|
return {
|
||||||
|
|||||||
@@ -122,7 +122,7 @@ const getInitialState = ({
|
|||||||
edgesReconnectable: true,
|
edgesReconnectable: true,
|
||||||
elementsSelectable: true,
|
elementsSelectable: true,
|
||||||
elevateNodesOnSelect: true,
|
elevateNodesOnSelect: true,
|
||||||
elevateEdgesOnSelect: false,
|
elevateEdgesOnSelect: true,
|
||||||
selectNodesOnDrag: true,
|
selectNodesOnDrag: true,
|
||||||
|
|
||||||
multiSelectionActive: false,
|
multiSelectionActive: false,
|
||||||
|
|||||||
@@ -368,4 +368,13 @@ export type OnBeforeDeleteBase<NodeType extends NodeBase = NodeBase, EdgeType ex
|
|||||||
edges: EdgeType[];
|
edges: EdgeType[];
|
||||||
}) => Promise<boolean | { nodes: NodeType[]; edges: EdgeType[] }>;
|
}) => Promise<boolean | { nodes: NodeType[]; edges: EdgeType[] }>;
|
||||||
|
|
||||||
export type ZIndexMode = 'auto' | 'manual';
|
/**
|
||||||
|
* The `ZIndexMode` type is used to define how z-indexing is calculated for nodes and edges.
|
||||||
|
* `auto` mode will automatically manage z-indexing for selections and sub flows.
|
||||||
|
* `basic` mode will only manage z-indexing for selections.
|
||||||
|
* `manual` mode does not apply any automatic z-indexing.
|
||||||
|
*
|
||||||
|
* @public
|
||||||
|
* @default 'auto'
|
||||||
|
*/
|
||||||
|
export type ZIndexMode = 'auto' | 'basic' | 'manual';
|
||||||
|
|||||||
@@ -1,4 +1,13 @@
|
|||||||
import { Connection, InternalNodeBase, Transform, errorMessages, isEdgeBase, EdgeBase } from '../..';
|
import {
|
||||||
|
Connection,
|
||||||
|
InternalNodeBase,
|
||||||
|
Transform,
|
||||||
|
errorMessages,
|
||||||
|
isEdgeBase,
|
||||||
|
EdgeBase,
|
||||||
|
ZIndexMode,
|
||||||
|
isManualZIndexMode,
|
||||||
|
} from '../..';
|
||||||
import { getOverlappingArea, boxToRect, nodeToBox, getBoundsOfBoxes, devWarn } from '../general';
|
import { getOverlappingArea, boxToRect, nodeToBox, getBoundsOfBoxes, devWarn } from '../general';
|
||||||
|
|
||||||
// this is used for straight edges and simple smoothstep edges (LTR, RTL, BTT, TTB)
|
// this is used for straight edges and simple smoothstep edges (LTR, RTL, BTT, TTB)
|
||||||
@@ -28,6 +37,7 @@ export type GetEdgeZIndexParams = {
|
|||||||
selected?: boolean;
|
selected?: boolean;
|
||||||
zIndex?: number;
|
zIndex?: number;
|
||||||
elevateOnSelect?: boolean;
|
elevateOnSelect?: boolean;
|
||||||
|
zIndexMode?: ZIndexMode;
|
||||||
};
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -41,12 +51,19 @@ export function getElevatedEdgeZIndex({
|
|||||||
selected = false,
|
selected = false,
|
||||||
zIndex,
|
zIndex,
|
||||||
elevateOnSelect = false,
|
elevateOnSelect = false,
|
||||||
|
zIndexMode = 'auto',
|
||||||
}: GetEdgeZIndexParams): number {
|
}: GetEdgeZIndexParams): number {
|
||||||
|
const manualZIndexMode = isManualZIndexMode(zIndexMode);
|
||||||
|
|
||||||
if (zIndex !== undefined) {
|
if (zIndex !== undefined) {
|
||||||
return zIndex;
|
return zIndex;
|
||||||
}
|
}
|
||||||
const edgeZ = elevateOnSelect && selected ? 1000 : 0;
|
|
||||||
|
|
||||||
|
if (manualZIndexMode) {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
const edgeZ = elevateOnSelect && selected ? 1000 : 0;
|
||||||
const nodeZ = Math.max(
|
const nodeZ = Math.max(
|
||||||
sourceNode.parentId || (elevateOnSelect && sourceNode.selected) ? sourceNode.internals.z : 0,
|
sourceNode.parentId || (elevateOnSelect && sourceNode.selected) ? sourceNode.internals.z : 0,
|
||||||
targetNode.parentId || (elevateOnSelect && targetNode.selected) ? targetNode.internals.z : 0
|
targetNode.parentId || (elevateOnSelect && targetNode.selected) ? targetNode.internals.z : 0
|
||||||
|
|||||||
@@ -117,7 +117,7 @@ type UpdateNodesOptions<NodeType extends NodeBase> = {
|
|||||||
checkEquality?: boolean;
|
checkEquality?: boolean;
|
||||||
};
|
};
|
||||||
|
|
||||||
function isManualZIndexMode(zIndexMode?: ZIndexMode): boolean {
|
export function isManualZIndexMode(zIndexMode?: ZIndexMode): boolean {
|
||||||
return zIndexMode === 'manual';
|
return zIndexMode === 'manual';
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -129,7 +129,7 @@ export function adoptUserNodes<NodeType extends NodeBase>(
|
|||||||
): boolean {
|
): boolean {
|
||||||
const _options = mergeObjects(adoptUserNodesDefaultOptions, options);
|
const _options = mergeObjects(adoptUserNodesDefaultOptions, options);
|
||||||
|
|
||||||
let rootParentIndex = { i: -1 };
|
const rootParentIndex = { i: -1 };
|
||||||
let nodesInitialized = nodes.length > 0;
|
let nodesInitialized = nodes.length > 0;
|
||||||
const tmpLookup = new Map(nodeLookup);
|
const tmpLookup = new Map(nodeLookup);
|
||||||
const selectedNodeZ: number =
|
const selectedNodeZ: number =
|
||||||
@@ -229,7 +229,7 @@ function updateChildNode<NodeType extends NodeBase>(
|
|||||||
rootParentIndex &&
|
rootParentIndex &&
|
||||||
!parentNode.parentId &&
|
!parentNode.parentId &&
|
||||||
parentNode.internals.rootParentIndex === undefined &&
|
parentNode.internals.rootParentIndex === undefined &&
|
||||||
!isManualZIndexMode(zIndexMode)
|
zIndexMode === 'auto'
|
||||||
) {
|
) {
|
||||||
parentNode.internals.rootParentIndex = ++rootParentIndex.i;
|
parentNode.internals.rootParentIndex = ++rootParentIndex.i;
|
||||||
parentNode.internals.z = parentNode.internals.z + rootParentIndex.i * ROOT_PARENT_Z_INCREMENT;
|
parentNode.internals.z = parentNode.internals.z + rootParentIndex.i * ROOT_PARENT_Z_INCREMENT;
|
||||||
|
|||||||
Reference in New Issue
Block a user