setHandleMode method

EditResult setHandleMode(
  1. String id,
  2. String nodeId,
  3. DiagramPathHandleMode mode
)

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