getFinshboneNodes method

List<Widget> getFinshboneNodes(
  1. IMindMapNode node,
  2. double width,
  3. double height
)

Implementation

List<Widget> getFinshboneNodes(
  IMindMapNode node,
  double width,
  double height,
) {
  List<Widget> list = [];
  if (widget.getMindMap()?.getFishboneMapType() ==
      FishboneMapType.rightToLeft) {
    if (node.getNodeType() == NodeType.root) {
      List<IMindMapNode> items = [];
      for (var item in node.getLeftItems()) {
        items.add(item);
      }
      for (int i = 0; i < node.getRightItems().length; i++) {
        IMindMapNode item = node
            .getRightItems()[node.getRightItems().length - i - 1];
        items.add(item);
      }
      double w = 0;
      int ii = 0;
      for (IMindMapNode item in items) {
        if (ii == 0) {
          w = (item.getSize()?.width ?? 0) / 2;
        } else {
          w = w < (item.getSize()?.width ?? 0) / 2
              ? (item.getSize()?.width ?? 0) / 2
              : w;
        }
        ii++;
        if (ii > 1) {
          break;
        }
      }

      double right = width - (node.getSize()?.width ?? 0) - w;
      double dragX = right - node.getHSpace();
      double tw = 0;
      int index = 0;

      for (IMindMapNode item in items) {
        double w1 = (item.getSize()?.width ?? 0) / 2;
        double h = item.getFishboneHeight();
        if (index % 2 == 0) {
          item.setFishboneNodeMode(FishboneNodeMode.down);
          item.setFishbonePosition(
            Offset(
              right - h - w1,
              height +
                  h +
                  (widget.getMindMap()?.getRootNode().getLinkWidth() ?? 0) +
                  (widget.getMindMap()?.getRootNode().getLinkWidth() ?? 0),
            ),
          );
          list.add(
            Positioned(
              left: right - h - w1,
              top:
                  height +
                  h +
                  (widget.getMindMap()?.getRootNode().getLinkWidth() ?? 0) +
                  (widget.getMindMap()?.getRootNode().getLinkWidth() ?? 0),
              child: item as Widget,
            ),
          );
          //add drag
          if (item == items.first) {
            list.add(
              Positioned(
                left: right,
                top: height - node.getVSpace() / 2,
                child: FishboneNodeDrag(
                  node: item,
                  isLast: true,
                  width: node.getFishbonePosition().dx - right,
                  height: node.getVSpace().toDouble() + node.getLinkWidth(),
                ),
              ),
            );
          }
          list.add(
            Positioned(
              left: right - node.getHSpace(),
              top: height - node.getVSpace() / 2,
              child: FishboneNodeDrag(
                node: item,
                isLast: false,
                width: node.getHSpace().toDouble(),
                height: node.getVSpace().toDouble() + node.getLinkWidth(),
              ),
            ),
          );

          //add child
          List<IMindMapNode> children = [];
          children.addAll(item.getRightItems());
          children.addAll(item.getLeftItems());
          double ctop =
              height +
              item.getVSpace() +
              (widget.getMindMap()?.getRootNode().getLinkWidth() ?? 0);
          for (IMindMapNode child in children) {
            double cright =
                right -
                (ctop -
                    height -
                    (widget.getMindMap()?.getRootNode().getLinkWidth() ??
                        0)) -
                (child.getSize()?.height ?? 0) -
                child.getFishboneHeight() -
                item.getHSpace();
            child.setFishbonePosition(
              Offset(cright - (child.getSize()?.width ?? 0), ctop),
            );
            list.add(
              Positioned(
                left: cright - (child.getSize()?.width ?? 0),
                top: ctop,
                child: child as Widget,
              ),
            );
            //add drag
            list.add(
              Positioned(
                left: cright - (child.getSize()?.width ?? 0),
                top: ctop - item.getVSpace(),
                child: FishboneNodeDrag(
                  node: child,
                  isLast: false,
                  width: child.getSize()?.width ?? 0,
                  height: item.getVSpace().toDouble(),
                ),
              ),
            );
            if (child == children.last) {
              list.add(
                Positioned(
                  left: cright - (child.getSize()?.width ?? 0),
                  top: ctop + (child.getSize()?.height ?? 0),
                  child: FishboneNodeDrag(
                    node: child,
                    isLast: true,
                    width: child.getSize()?.width ?? 0,
                    height: item.getVSpace().toDouble(),
                  ),
                ),
              );
            }
            list.addAll(getFinshboneNodes(child, width, height));
            ctop =
                ctop +
                (child.getSize()?.height ?? 0) +
                child.getFishboneHeight();
          }

          tw = item.getFishboneWidth() + (item.getSize()?.width ?? 0) / 2;
          right = right - node.getHSpace();

          //w = left + h + w1;
        } else {
          item.setFishboneNodeMode(FishboneNodeMode.up);
          item.setFishbonePosition(
            Offset(
              right - h - w1,
              height -
                  h -
                  (item.getSize()?.height ?? 0) -
                  (widget.getMindMap()?.getRootNode().getLinkWidth() ?? 0),
            ),
          );
          list.add(
            Positioned(
              left: right - h - w1,
              top:
                  height -
                  h -
                  (item.getSize()?.height ?? 0) -
                  (widget.getMindMap()?.getRootNode().getLinkWidth() ?? 0),
              child: item as Widget,
            ),
          );

          //add child
          List<IMindMapNode> children = [];
          children.addAll(item.getRightItems());
          children.addAll(item.getLeftItems());
          double ctop =
              height -
              h +
              item.getVSpace() -
              (widget.getMindMap()?.getRootNode().getLinkWidth() ?? 0);
          for (IMindMapNode child in children) {
            double cright = right - (height - ctop) - item.getHSpace();
            child.setFishbonePosition(
              Offset(cright - (child.getSize()?.width ?? 0), ctop),
            );
            list.add(
              Positioned(
                left: cright - (child.getSize()?.width ?? 0),
                top: ctop,
                child: child as Widget,
              ),
            );
            //add drag
            list.add(
              Positioned(
                left: cright - (child.getSize()?.width ?? 0),
                top: ctop - item.getVSpace(),
                child: FishboneNodeDrag(
                  node: child,
                  isLast: false,
                  width: child.getSize()?.width ?? 0,
                  height: item.getVSpace().toDouble(),
                ),
              ),
            );
            if (child == children.last) {
              list.add(
                Positioned(
                  left: cright - (child.getSize()?.width ?? 0),
                  top: ctop + (child.getSize()?.height ?? 0),
                  child: FishboneNodeDrag(
                    node: child,
                    isLast: true,
                    width: child.getSize()?.width ?? 0,
                    height: item.getVSpace().toDouble(),
                  ),
                ),
              );
            }
            list.addAll(getFinshboneNodes(child, width, height));
            ctop =
                ctop +
                (child.getSize()?.height ?? 0) +
                child.getFishboneHeight();
          }
          tw =
              tw <
                  item.getFishboneWidth() +
                      node.getHSpace() +
                      (item.getSize()?.width ?? 0) / 2
              ? item.getFishboneWidth() +
                    node.getHSpace() +
                    (item.getSize()?.width ?? 0) / 2
              : tw;
          right = right - tw;

          //add drag
          list.add(
            Positioned(
              left: right,
              top: height - node.getVSpace() / 2,
              child: FishboneNodeDrag(
                node: item,
                isLast: false,
                width: dragX - right,
                height: node.getVSpace().toDouble() + node.getLinkWidth(),
              ),
            ),
          );

          dragX = right - node.getHSpace();
        }
        index++;
        //list.addAll(getFinshboneNodes(item));
      }
    } else {
      double top =
          node.getFishbonePosition().dy +
          (node.getSize()?.height ?? 0) +
          node.getVSpace();
      double right =
          node.getFishbonePosition().dx +
          (node.getSize()?.width ?? 0) -
          node.getHSpace();
      List<IMindMapNode> items = [];
      items.addAll(node.getRightItems());
      items.addAll(node.getLeftItems());
      for (var item in items) {
        item.setFishbonePosition(
          Offset(right - (item.getSize()?.width ?? 0), top),
        );
        list.add(
          Positioned(
            left: right - (item.getSize()?.width ?? 0),
            top: top,
            child: item as Widget,
          ),
        );
        //add drag
        list.add(
          Positioned(
            left: right - (item.getSize()?.width ?? 0),
            top: top - item.getVSpace(),
            child: FishboneNodeDrag(
              node: item,
              isLast: false,
              width: item.getSize()?.width ?? 0,
              height: item.getVSpace().toDouble(),
            ),
          ),
        );
        if (item == items.last) {
          list.add(
            Positioned(
              left: right - (item.getSize()?.width ?? 0),
              top: top + (item.getSize()?.height ?? 0),
              child: FishboneNodeDrag(
                node: item,
                isLast: true,
                width: item.getSize()?.width ?? 0,
                height: item.getVSpace().toDouble(),
              ),
            ),
          );
        }
        list.addAll(getFinshboneNodes(item, width, height));
        top = top + (item.getSize()?.height ?? 0) + item.getFishboneHeight();
      }
    }
  } else {
    if (node.getNodeType() == NodeType.root) {
      List<IMindMapNode> items = [];
      for (var item in node.getRightItems()) {
        items.add(item);
      }
      for (int i = 0; i < node.getLeftItems().length; i++) {
        IMindMapNode item = node
            .getLeftItems()[node.getLeftItems().length - i - 1];
        items.add(item);
      }
      double w = 0;
      int ii = 0;
      for (IMindMapNode item in items) {
        if (ii == 0) {
          w = (item.getSize()?.width ?? 0) / 2;
        } else {
          w = w < (item.getSize()?.width ?? 0) / 2
              ? (item.getSize()?.width ?? 0) / 2
              : w;
        }
        ii++;
        if (ii > 1) {
          break;
        }
      }

      double left = (node.getSize()?.width ?? 0) + w;
      double dragX = (node.getSize()?.width ?? 0);
      double tw = 0;
      int index = 0;

      for (IMindMapNode item in items) {
        double w1 = (item.getSize()?.width ?? 0) / 2;
        double h = item.getFishboneHeight();
        if (index % 2 == 0) {
          item.setFishboneNodeMode(FishboneNodeMode.up);
          item.setFishbonePosition(
            Offset(
              left + h - w1,
              height -
                  h -
                  (item.getSize()?.height ?? 0) -
                  (widget.getMindMap()?.getRootNode().getLinkWidth() ?? 0),
            ),
          );
          list.add(
            Positioned(
              left: left + h - w1,
              top:
                  height -
                  h -
                  (item.getSize()?.height ?? 0) -
                  (widget.getMindMap()?.getRootNode().getLinkWidth() ?? 0),
              child: item as Widget,
            ),
          );

          //add drag
          list.add(
            Positioned(
              left: dragX,
              top: height - node.getVSpace() / 2,
              child: FishboneNodeDrag(
                node: item,
                isLast: false,
                width: left - dragX,
                height: node.getVSpace() + node.getLinkWidth(),
              ),
            ),
          );
          if (item == items.last) {
            list.add(
              Positioned(
                left: left,
                top: height - node.getVSpace() / 2,
                child: FishboneNodeDrag(
                  node: item,
                  isLast: false,
                  width: width - dragX,
                  height: node.getVSpace() + node.getLinkWidth(),
                ),
              ),
            );
          }
          dragX = left + node.getHSpace();
          //add child
          List<IMindMapNode> children = [];
          children.addAll(item.getRightItems());
          children.addAll(item.getLeftItems());
          double ctop =
              height -
              h +
              item.getVSpace() -
              (widget.getMindMap()?.getRootNode().getLinkWidth() ?? 0);
          for (IMindMapNode child in children) {
            double cleft = left + (height - ctop) + item.getHSpace();
            child.setFishbonePosition(Offset(cleft, ctop));
            list.add(
              Positioned(left: cleft, top: ctop, child: child as Widget),
            );

            //add drag
            list.add(
              Positioned(
                left: cleft,
                top: ctop - item.getVSpace(),
                child: FishboneNodeDrag(
                  node: child,
                  isLast: false,
                  width: child.getSize()?.width ?? 0,
                  height: item.getVSpace().toDouble(),
                ),
              ),
            );
            if (child == children.last) {
              list.add(
                Positioned(
                  left: cleft,
                  top: ctop + (child.getSize()?.height ?? 0),
                  child: FishboneNodeDrag(
                    node: child,
                    isLast: true,
                    width: child.getSize()?.width ?? 0,
                    height: item.getVSpace().toDouble(),
                  ),
                ),
              );
            }
            list.addAll(getFinshboneNodes(child, width, height));
            ctop =
                ctop +
                (child.getSize()?.height ?? 0) +
                child.getFishboneHeight();
          }

          tw = item.getFishboneWidth() + (item.getSize()?.width ?? 0) / 2;
          left = left + node.getHSpace();

          //w = left + h + w1;
        } else {
          item.setFishboneNodeMode(FishboneNodeMode.down);
          item.setFishbonePosition(
            Offset(
              left + h - w1,
              height +
                  h +
                  (widget.getMindMap()?.getRootNode().getLinkWidth() ?? 0) +
                  (widget.getMindMap()?.getRootNode().getLinkWidth() ?? 0),
            ),
          );
          list.add(
            Positioned(
              left: left + h - w1,
              top:
                  height +
                  h +
                  (widget.getMindMap()?.getRootNode().getLinkWidth() ?? 0) +
                  (widget.getMindMap()?.getRootNode().getLinkWidth() ?? 0),
              child: item as Widget,
            ),
          );

          //add drag
          list.add(
            Positioned(
              left: left - node.getHSpace(),
              top: height - node.getVSpace() / 2,
              child: FishboneNodeDrag(
                node: item,
                isLast: false,
                width: node.getHSpace().toDouble(),
                height: node.getVSpace().toDouble() + node.getLinkWidth(),
              ),
            ),
          );
          if (item == items.last) {
            list.add(
              Positioned(
                left: left,
                top: height - node.getVSpace() / 2,
                child: FishboneNodeDrag(
                  node: item,
                  isLast: false,
                  width: width - dragX - node.getHSpace(),
                  height: node.getVSpace() + node.getLinkWidth(),
                ),
              ),
            );
          }
          //add child
          List<IMindMapNode> children = [];
          children.addAll(item.getRightItems());
          children.addAll(item.getLeftItems());
          double ctop =
              height +
              item.getVSpace() +
              (widget.getMindMap()?.getRootNode().getLinkWidth() ?? 0);
          for (IMindMapNode child in children) {
            double cleft =
                left +
                (ctop -
                    height -
                    (widget.getMindMap()?.getRootNode().getLinkWidth() ??
                        0)) +
                (child.getSize()?.height ?? 0) +
                child.getFishboneHeight() +
                item.getHSpace();
            child.setFishbonePosition(Offset(cleft, ctop));
            list.add(
              Positioned(left: cleft, top: ctop, child: child as Widget),
            );
            list.addAll(getFinshboneNodes(child, width, height));

            //add drag
            list.add(
              Positioned(
                left: cleft,
                top: ctop - item.getVSpace(),
                child: FishboneNodeDrag(
                  node: child,
                  isLast: false,
                  width: child.getSize()?.width ?? 0,
                  height: item.getVSpace().toDouble(),
                ),
              ),
            );
            if (child == children.last) {
              list.add(
                Positioned(
                  left: cleft,
                  top: ctop + (child.getSize()?.height ?? 0),
                  child: FishboneNodeDrag(
                    node: child,
                    isLast: true,
                    width: child.getSize()?.width ?? 0,
                    height: item.getVSpace().toDouble(),
                  ),
                ),
              );
            }
            ctop =
                ctop +
                (child.getSize()?.height ?? 0) +
                child.getFishboneHeight();
          }
          tw =
              tw <
                  item.getFishboneWidth() +
                      node.getHSpace() +
                      (item.getSize()?.width ?? 0) / 2
              ? item.getFishboneWidth() +
                    node.getHSpace() +
                    (item.getSize()?.width ?? 0) / 2
              : tw;
          left = left + tw;
        }
        index++;
        //list.addAll(getFinshboneNodes(item));
      }
    } else {
      double top =
          node.getFishbonePosition().dy +
          (node.getSize()?.height ?? 0) +
          node.getVSpace();
      double left = node.getFishbonePosition().dx + node.getHSpace();
      List<IMindMapNode> items = [];
      items.addAll(node.getRightItems());
      items.addAll(node.getLeftItems());
      for (var item in items) {
        item.setFishbonePosition(Offset(left, top));
        list.add(Positioned(left: left, top: top, child: item as Widget));
        list.addAll(getFinshboneNodes(item, width, height));

        //add drag
        list.add(
          Positioned(
            left: left,
            top: top - item.getVSpace(),
            child: FishboneNodeDrag(
              node: item,
              isLast: false,
              width: item.getSize()?.width ?? 0,
              height: item.getVSpace().toDouble(),
            ),
          ),
        );
        if (item == items.last) {
          list.add(
            Positioned(
              left: left,
              top: top + (item.getSize()?.height ?? 0),
              child: FishboneNodeDrag(
                node: item,
                isLast: true,
                width: item.getSize()?.width ?? 0,
                height: item.getVSpace().toDouble(),
              ),
            ),
          );
        }

        top = top + (item.getSize()?.height ?? 0) + item.getFishboneHeight();
      }
    }
  }
  return list;
}