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;
}