setHandleMode method
Implementation
EditResult setHandleMode(
String id,
String nodeId,
DiagramPathHandleMode mode,
) => _edit(id, (p) {
final index = _index(p, nodeId);
final node = p.nodes[index];
final nodes = [...p.nodes];
final previous = (index - 1 + nodes.length) % nodes.length;
final next = (index + 1) % nodes.length;
final hasPrevious = p.closed || index > 0;
final hasNext = p.closed || index < nodes.length - 1;
if (mode == DiagramPathHandleMode.corner) {
nodes[index] = node.copyWith(
mode: mode,
incoming: DiagramPoint.zero,
outgoing: DiagramPoint.zero,
);
} else {
final before = hasPrevious ? nodes[previous].position : node.position;
final after = hasNext ? nodes[next].position : node.position;
var tangent = after - before;
if (tangent.magnitude == 0) tangent = const DiagramPoint(1, 0);
final direction = tangent * (1 / tangent.magnitude);
var inLength = hasPrevious ? (node.position - before).magnitude / 3 : 0.0;
var outLength = hasNext ? (after - node.position).magnitude / 3 : 0.0;
if (mode == DiagramPathHandleMode.symmetric) {
inLength = outLength = math.max(inLength, outLength);
}
nodes[index] = node.copyWith(
mode: mode,
incoming: direction * -inLength,
outgoing: direction * outLength,
segment: hasNext ? DiagramPathSegmentKind.cubic : node.segment,
);
if (hasPrevious) {
nodes[previous] = nodes[previous].copyWith(
segment: DiagramPathSegmentKind.cubic,
);
}
}
return p.copyWith(nodes: nodes);
});