buildNodes method

  1. @override
List<CustomAnimatedPositioned> buildNodes(
  1. BuildContext context, {
  2. List<Node<E>>? nodesToDraw,
  3. bool hidden = false,
  4. int level = 1,
})
override

Build the nodes of the graph

Implementation

@override
List<CustomAnimatedPositioned> buildNodes(BuildContext context,
    {List<Node<E>>? nodesToDraw, bool hidden = false, int level = 1}) {
  final nodes = nodesToDraw ?? controller.nodes;
  final List<CustomAnimatedPositioned> nodeWidgets = [];

  for (Node<E> node in nodes) {
    final String nodeId = controller.idProvider(node.data);

    nodeWidgets.add(
      CustomAnimatedPositioned(
        key: ValueKey(nodeId),
        isBeingDragged: nodeId == draggedID,
        duration: nodeId == draggedID ? Duration.zero : widget.duration,
        curve: widget.curve,
        left: node.position.dx,
        top: node.position.dy,
        width: controller.boxSize.width,
        height: controller.boxSize.height,
        child: RepaintBoundary(
          child: Visibility(
            visible: !hidden,
            maintainAnimation: true,
            maintainSize: true,
            maintainState: true,
            child: GestureDetector(
              onTapDown: handleTapDown,
              onLongPress: () => showNodeMenu(context, node),
              onPanStart:
                  widget.isDraggable ? (_) => startDragging(node) : null,
              onPanUpdate: widget.isDraggable
                  ? (details) => updateDragging(node, details)
                  : null,
              onPanEnd:
                  widget.isDraggable ? (_) => finishDragging(node) : null,
              child: widget.builder(
                NodeBuilderDetails(
                  item: node.data,
                  level: level,
                  hideNodes: ({hide, center = true}) =>
                      toggleHideNodes(node, hide, center),
                  nodesHidden: node.hideNodes,
                  isBeingDragged: nodeId == draggedID,
                  isOverlapped: overlappingNodes.isNotEmpty &&
                      overlappingNodes.first.data == node.data,
                ),
              ),
            ),
          ),
        ),
      ),
    );
  }

  return nodeWidgets;
}