Press n or j to go to the next uncovered block, b, p or k for the previous block.
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 | 94x 12x 12x 12x 12x 10x 6x 6x 6x 6x 6x 6x 6x 6x 6x 4x 2x 6x 6x 3x 3x 3x 3x 3x 3x 3x 3x 7x 7x 7x 79x 79x 12x 12x 11x 11x 11x 79x 7x 7x 6x 8x 8x 8x | import type { Bounds, Point } from '../types';
import type { DirectedGraph } from '../graph/graph';
import { getRefId } from './subprocess-layout';
export interface BoundarySortContext {
hostBounds: Bounds;
graph: DirectedGraph;
boundsMap: Map<string, Bounds>;
}
export function addBoundaryEventEdges(
graph: DirectedGraph,
boundaryEvents: any[],
startOrder = 0
): void {
for (let i = 0; i < boundaryEvents.length; i++) {
const bEvent = boundaryEvents[i];
graph.addNode(bEvent.id, bEvent, startOrder + i);
const hostId = getRefId(bEvent.attachedToRef);
if (hostId && graph.getNode(hostId)) {
graph.addEdge({
id: `_attach_${bEvent.id}`,
source: hostId,
target: bEvent.id,
data: null,
order: startOrder + i,
});
}
}
}
export function sortBoundaryEventsByTarget(events: any[], ctx: BoundarySortContext): void {
const { hostBounds, graph, boundsMap } = ctx;
events.sort((a, b) => {
const targetA = graph.outEdges(a.id)[0]?.target;
const targetB = graph.outEdges(b.id)[0]?.target;
const boundsA = targetA ? boundsMap.get(targetA) : undefined;
const boundsB = targetB ? boundsMap.get(targetB) : undefined;
const yA = boundsA ? boundsA.y : 0;
const yB = boundsB ? boundsB.y : 0;
if (yA !== yB) {
return yB - yA;
}
return a.id.localeCompare(b.id);
});
const count = events.length;
if (count === 1) {
const x = Math.round(hostBounds.x + (hostBounds.width - 36) / 2);
const y = Math.round(hostBounds.y + hostBounds.height - 18);
boundsMap.set(events[0].id, { x, y, width: 36, height: 36 });
return;
}
const minX = hostBounds.x + 10;
const maxX = hostBounds.x + hostBounds.width - 46;
const step = (maxX - minX) / (count - 1);
for (let i = 0; i < count; i++) {
const x = Math.round(minX + i * step);
const y = Math.round(hostBounds.y + hostBounds.height - 18);
boundsMap.set(events[i].id, { x, y, width: 36, height: 36 });
}
}
export function placeBoundaries(
boundaryEvents: any[],
boundsMap: Map<string, Bounds>,
graph: DirectedGraph
): void {
const eventsByHost = new Map<string, any[]>();
for (const b of boundaryEvents) {
const hostId = b.attachedToRef?.id || b.attachedToRef;
if (hostId) {
const list = eventsByHost.get(hostId) || [];
list.push(b);
eventsByHost.set(hostId, list);
}
}
for (const [hostId, events] of eventsByHost.entries()) {
const hostBounds = boundsMap.get(hostId);
if (hostBounds) {
sortBoundaryEventsByTarget(events, { hostBounds, graph, boundsMap });
}
}
}
export function routeBoundaryExit(sourceBounds: Bounds, targetBounds: Bounds): Point[] {
const srcBottom: Point = {
x: Math.round(sourceBounds.x + sourceBounds.width / 2),
y: sourceBounds.y + sourceBounds.height,
};
const tgtEntry: Point = {
x: targetBounds.x,
y: Math.round(targetBounds.y + targetBounds.height / 2),
};
return [srcBottom, { x: srcBottom.x, y: tgtEntry.y }, tgtEntry];
}
|