refactor(nodes): stacking order

This commit is contained in:
moklick
2021-11-08 20:55:11 +01:00
parent b0bfefeef4
commit df25cb32f0
+15 -7
View File
@@ -2,11 +2,11 @@ import { ElementId, Node, NodeInternals, NodeInternalsItem, XYPosition } from '.
type XYPosAndTreeLevel = XYPosition & { treeLevel: number }; type XYPosAndTreeLevel = XYPosition & { treeLevel: number };
function addPositions(a: XYPosAndTreeLevel, b: XYPosition): XYPosAndTreeLevel { function addPositions(a: XYPosAndTreeLevel, b: XYPosAndTreeLevel): XYPosAndTreeLevel {
return { return {
x: (a.x ?? 0) + (b.x ?? 0), x: (a.x ?? 0) + (b.x ?? 0),
y: (a.y ?? 0) + (b.y ?? 0), y: (a.y ?? 0) + (b.y ?? 0),
treeLevel: a.treeLevel + 1, treeLevel: a.treeLevel + (b.treeLevel || 1),
}; };
} }
@@ -24,7 +24,11 @@ function getAbsolutePosAndTreeLevel(
return getAbsolutePosAndTreeLevel( return getAbsolutePosAndTreeLevel(
parentNode, parentNode,
nodeInternals, nodeInternals,
addPositions(result, parentNode.position || { x: 0, y: 0 }) addPositions(result, {
x: parentNode.position?.x || 0,
y: parentNode.position?.y || 0,
treeLevel: parentNode.treeLevel || 0,
})
); );
} }
export function createNodeInternals(nodes: Node[], nodeInternals: NodeInternals): NodeInternals { export function createNodeInternals(nodes: Node[], nodeInternals: NodeInternals): NodeInternals {
@@ -50,17 +54,21 @@ export function createNodeInternals(nodes: Node[], nodeInternals: NodeInternals)
nodes.forEach((node) => { nodes.forEach((node) => {
const updatedInternals: NodeInternalsItem = nextNodeInternals.get(node.id)!; const updatedInternals: NodeInternalsItem = nextNodeInternals.get(node.id)!;
if (node.parentNode) { if (node.parentNode || parentNodes[node.id]) {
const parentNodeInternal = nextNodeInternals.get(node.parentNode); if (node.parentNode) {
const parentNodeInternal = nextNodeInternals.get(node.parentNode);
if (parentNodeInternal) {
parentNodeInternal.isParentNode = true;
}
}
const positionAbsoluteAndTreeLevel = getAbsolutePosAndTreeLevel(node, nextNodeInternals, { const positionAbsoluteAndTreeLevel = getAbsolutePosAndTreeLevel(node, nextNodeInternals, {
...node.position, ...node.position,
treeLevel: updatedInternals.treeLevel || parentNodeInternal?.treeLevel || 0, treeLevel: updatedInternals.treeLevel || 1,
}); });
const { treeLevel, x, y } = positionAbsoluteAndTreeLevel; const { treeLevel, x, y } = positionAbsoluteAndTreeLevel;
nextNodeInternals.set(node.parentNode!, { ...nextNodeInternals.get(node.parentNode!), isParentNode: true });
updatedInternals.positionAbsolute = { updatedInternals.positionAbsolute = {
x, x,
y, y,