|
@@ -15,6 +15,7 @@ export type StepCtx<T> = {
|
|
parallelWidth?: number;
|
|
parallelWidth?: number;
|
|
// 树宽高
|
|
// 树宽高
|
|
treeSize?: { w: number; h: number };
|
|
treeSize?: { w: number; h: number };
|
|
|
|
+ refTrees?: Step<T>[];
|
|
// 相对于兄弟
|
|
// 相对于兄弟
|
|
offset: { x: number; y: number };
|
|
offset: { x: number; y: number };
|
|
treeOffset: { x: number; y: number };
|
|
treeOffset: { x: number; y: number };
|
|
@@ -85,11 +86,11 @@ export const traversalSteps = <T>({
|
|
);
|
|
);
|
|
|
|
|
|
// 查看是否是多对一的情况,如果是这current为所有多的step
|
|
// 查看是否是多对一的情况,如果是这current为所有多的step
|
|
- let currents = [current];
|
|
|
|
- if (children.length === 1 && children[0].parents.length > 1) {
|
|
|
|
- const steps = children[0].parents;
|
|
|
|
- currents = steps.filter((step) => step.box.level === level);
|
|
|
|
- }
|
|
|
|
|
|
+ let currents =
|
|
|
|
+ children.length === 1 && children[0].parents.length > 1
|
|
|
|
+ ? children[0].parents
|
|
|
|
+ : [current];
|
|
|
|
+ currents = currents.filter((c) => c.box.level === level);
|
|
checkeds.push(...currents);
|
|
checkeds.push(...currents);
|
|
|
|
|
|
const props = {
|
|
const props = {
|
|
@@ -100,7 +101,9 @@ export const traversalSteps = <T>({
|
|
levelSteps: cSteps,
|
|
levelSteps: cSteps,
|
|
};
|
|
};
|
|
|
|
|
|
- reverse || oper(props);
|
|
|
|
|
|
+ if (currents.length > 0) {
|
|
|
|
+ reverse || oper(props);
|
|
|
|
+ }
|
|
traversalSteps({
|
|
traversalSteps({
|
|
steps,
|
|
steps,
|
|
ctx,
|
|
ctx,
|
|
@@ -110,7 +113,10 @@ export const traversalSteps = <T>({
|
|
reverse,
|
|
reverse,
|
|
checkeds,
|
|
checkeds,
|
|
});
|
|
});
|
|
- reverse && oper(props);
|
|
|
|
|
|
+
|
|
|
|
+ if (currents.length > 0) {
|
|
|
|
+ reverse && oper(props);
|
|
|
|
+ }
|
|
}
|
|
}
|
|
};
|
|
};
|
|
|
|
|
|
@@ -149,17 +155,27 @@ const setStepsTreeSize = <T>(steps: Steps<T>, ctx: StepsCtx<T>) => {
|
|
}
|
|
}
|
|
const current = currents[0];
|
|
const current = currents[0];
|
|
const treeSize = { w: 0, h: 0 };
|
|
const treeSize = { w: 0, h: 0 };
|
|
|
|
+ const refTrees: Step<T>[] = [];
|
|
for (const child of current.children) {
|
|
for (const child of current.children) {
|
|
if (child.box.treeSize) {
|
|
if (child.box.treeSize) {
|
|
treeSize.w += child.box.treeSize.w;
|
|
treeSize.w += child.box.treeSize.w;
|
|
treeSize.h = Math.max(child.box.treeSize.w, treeSize.w);
|
|
treeSize.h = Math.max(child.box.treeSize.w, treeSize.w);
|
|
}
|
|
}
|
|
|
|
+ if (child.box.refTrees.length) {
|
|
|
|
+ refTrees.push(...child.box.refTrees);
|
|
|
|
+ } else {
|
|
|
|
+ refTrees.push(child);
|
|
|
|
+ }
|
|
}
|
|
}
|
|
treeSize.h += levelHeight;
|
|
treeSize.h += levelHeight;
|
|
|
|
|
|
if (currents.length === 1) {
|
|
if (currents.length === 1) {
|
|
// 一对一 一对多情况
|
|
// 一对一 一对多情况
|
|
- treeSize.w = Math.max(current.box.size.w, treeSize.w);
|
|
|
|
|
|
+ if (current.box.size.w >= treeSize.w) {
|
|
|
|
+ treeSize.w = current.box.size.w;
|
|
|
|
+ } else {
|
|
|
|
+ current.box.refTrees = refTrees;
|
|
|
|
+ }
|
|
current.box.treeSize = treeSize;
|
|
current.box.treeSize = treeSize;
|
|
} else {
|
|
} else {
|
|
// 多对一情况
|
|
// 多对一情况
|
|
@@ -167,10 +183,15 @@ const setStepsTreeSize = <T>(steps: Steps<T>, ctx: StepsCtx<T>) => {
|
|
for (const parallel of currents) {
|
|
for (const parallel of currents) {
|
|
parallelWidth += parallel.box.size.w;
|
|
parallelWidth += parallel.box.size.w;
|
|
}
|
|
}
|
|
- treeSize.w = Math.max(parallelWidth, treeSize.w);
|
|
|
|
|
|
+ if (parallelWidth >= treeSize.w) {
|
|
|
|
+ treeSize.w = parallelWidth;
|
|
|
|
+ } else {
|
|
|
|
+ currents[0].box.refTrees = refTrees;
|
|
|
|
+ }
|
|
currents[0].box.parallelWidth = parallelWidth;
|
|
currents[0].box.parallelWidth = parallelWidth;
|
|
currents[0].box.treeSize = treeSize;
|
|
currents[0].box.treeSize = treeSize;
|
|
}
|
|
}
|
|
|
|
+ // console.log(currents[0].raw.name, treeSize);
|
|
},
|
|
},
|
|
reverse: true,
|
|
reverse: true,
|
|
});
|
|
});
|
|
@@ -207,6 +228,7 @@ const setStepsOffset = <T>(steps: Steps<T>, ctx: StepsCtx<T>) => {
|
|
}
|
|
}
|
|
if (prevTreeBox) break;
|
|
if (prevTreeBox) break;
|
|
}
|
|
}
|
|
|
|
+
|
|
treeOffset.x += prevTreeBox.treeOffset.x + prevTreeBox.parallelWidth;
|
|
treeOffset.x += prevTreeBox.treeOffset.x + prevTreeBox.parallelWidth;
|
|
}
|
|
}
|
|
} else if (currents[0].parents.length) {
|
|
} else if (currents[0].parents.length) {
|
|
@@ -316,6 +338,7 @@ export const getStepsTreeCtx = <T>(
|
|
const box = { step } as any;
|
|
const box = { step } as any;
|
|
step.box = box;
|
|
step.box = box;
|
|
step.box.lines = [];
|
|
step.box.lines = [];
|
|
|
|
+ step.box.refTrees = [];
|
|
return box;
|
|
return box;
|
|
}),
|
|
}),
|
|
roots: roots,
|
|
roots: roots,
|