positionNodes method

void positionNodes(
  1. Graph graph
)

Implementation

void positionNodes(Graph graph) {
  var doesNeedReverseOrder = needReverseOrder();

  var offset = getOffset(graph, doesNeedReverseOrder);
  var nodes = sortByLevel(graph, doesNeedReverseOrder);
  var firstLevel = getNodeData(nodes.first)?.depth ?? 0;
  var localMaxSize = findMaxSize(filterByLevel(nodes, firstLevel));
  var currentLevel = doesNeedReverseOrder ? firstLevel : 0;

  var globalPadding = 0.0;
  var localPadding = 0.0;
  nodes.forEach((node) {
    final depth = getNodeData(node)?.depth ?? 0;
    if (depth != currentLevel) {
      if (doesNeedReverseOrder) {
        globalPadding -= localPadding;
      } else {
        globalPadding += localPadding;
      }
      localPadding = 0.0;
      currentLevel = depth;

      localMaxSize = findMaxSize(filterByLevel(nodes, currentLevel));
    }

    final height = node.height;
    final width = node.width;
    switch (configuration.orientation) {
      case BuchheimWalkerConfiguration.ORIENTATION_TOP_BOTTOM:
        if (height > minNodeHeight) {
          final diff = height - minNodeHeight;
          localPadding = max(localPadding, diff);
        }
        break;
      case BuchheimWalkerConfiguration.ORIENTATION_BOTTOM_TOP:
        if (height < localMaxSize.height) {
          var diff = localMaxSize.height - height;
          node.position -= Offset(0, diff);
          localPadding = max(localPadding, diff);
        }
        break;
      case BuchheimWalkerConfiguration.ORIENTATION_LEFT_RIGHT:
        if (width > minNodeWidth) {
          final diff = width - minNodeWidth;
          localPadding = max(localPadding, diff);
        }
        break;
      case BuchheimWalkerConfiguration.ORIENTATION_RIGHT_LEFT:
        if (width < localMaxSize.width) {
          var diff = localMaxSize.width - width;
          node.position -= Offset(0, diff);
          localPadding = max(localPadding, diff);
        }
    }

    node.position = getPosition(node, globalPadding, offset);
  });
}