doLayout method

  1. @override
void doLayout(
  1. Context context,
  2. Graph graph,
  3. num width,
  4. num height,
)
override

Implementation

@override
void doLayout(Context context, Graph graph, num width, num height) {
  if(graph.nodes.isEmpty){
    onLayoutEnd();
    return;
  }

  List<DagreNode> nodeList = [];
  Map<String, DagreNode> nodeMap = {};
  Map<String, GraphNode> nodeMap2 = {};
  for (var ele in graph.nodes) {
    Size size = sizeFun.call(ele);
    DagreNode node = DagreNode(ele.id, size.width, size.height);
    nodeList.add(node);
    nodeMap[ele.id] = node;
    nodeMap2[ele.id] = ele;
  }

  List<DagreEdge> edgeList = [];
  Map<String, Edge<GraphNode>> edgeMap = {};

  for (var e in graph.edges) {
    edgeMap[e.id] = e;
    var source = nodeMap[e.source.id];
    if (source == null) {
      throw FlutterError('无法找到Source');
    }
    var target = nodeMap[e.target.id];
    if (target == null) {
      throw FlutterError('无法找到Target');
    }
    DagreEdge edge = DagreEdge(
      e.id,
      source,
      target,
      minLen: e.minLen,
      weight: e.weight,
      labelOffset: e.labelOffset,
      width: e.width,
      height: e.height,
      labelPos: e.labelPos,
    );
    edgeList.add(edge);
  }

  DagreResult result = dg.layout(
    nodeList,
    edgeList,
    config,
    multiGraph: multiGraph,
    compoundGraph: compoundGraph,
    directedGraph: directedGraph,
  );

  result.nodePosMap.forEach((key, value) {
    var node = nodeMap2[key]!;
    var center = value.center;
    node.x = center.dx;
    node.y = center.dy;
    node.width = value.width;
    node.height = value.height;
  });

  result.edgePosMap.forEach((key, value) {
    var edge = edgeMap[key]!;
    edge.points.clear();
    edge.points.addAll(value.points);
    edge.x = value.x;
    edge.y = value.y;
  });
  onLayoutEnd();
}