previewMove method

void previewMove(
  1. DiagramPoint world, {
  2. required DiagramPoint snapPoint(
    1. DiagramPoint
    ),
  3. bool shouldReparent = false,
  4. DiagramMoveAdjuster? adjuster,
  5. required double zoom,
  6. required DiagramRect viewportBounds,
})

Implementation

void previewMove(
  DiagramPoint world, {
  required DiagramPoint Function(DiagramPoint) snapPoint,
  bool shouldReparent = false,
  DiagramMoveAdjuster? adjuster,
  required double zoom,
  required DiagramRect viewportBounds,
}) {
  final baseline = transformBaseline;
  final handle = dragHandle;
  if (baseline == null ||
      handle is! DiagramMoveHandle ||
      !baseline.plan.allowed) {
    return;
  }
  final origin = baseline.origin;
  var delta = world - origin;
  final anchor = _moveSnapAnchor(baseline);
  if (anchor != null) {
    delta = snapPoint(anchor + delta) - anchor;
  }
  moveGuides = const [];
  if (adjuster != null &&
      baseline.selectionBounds != null &&
      baseline.selectedIds.every(
        (id) => baseline.elements[id] is FramedElement,
      )) {
    final excluded = baseline.elements.keys.toSet();
    for (final id in baseline.selectedIds) {
      var parent = store.scene.framedElementById(id)?.source.parentId;
      while (parent != null && excluded.add(parent)) {
        parent = store.scene.framedElementById(parent)?.source.parentId;
      }
    }
    final adjustment = adjuster.adjust(
      DiagramMoveRequest(
        scene: store.scene,
        bounds: DiagramRect.union([
          for (final id in baseline.selectedIds)
            if (store.scene.framedElementById(id) case final current?)
              if (baseline.elements[id] case final FramedElement original)
                current.bounds.translate(
                  DiagramPoint(
                    original.frame.left - current.source.frame.left,
                    original.frame.top - current.source.frame.top,
                  ),
                ),
        ]),
        pointerDelta: world - origin,
        delta: delta,
        excludedIds: excluded,
        zoom: zoom,
        viewportBounds: viewportBounds,
      ),
    );
    delta = adjustment.delta;
    moveGuides = List.unmodifiable(adjustment.guides);
  }
  reparentTargetId = null;
  if (handle.usesTranslationPreview && !shouldReparent) {
    movePreview = DiagramMovePreview(
      elementIds: baseline.elements.keys,
      delta: delta,
    );
    return;
  }
  if (handle.usesTranslationPreview) {
    replaceGestureHandle(const DiagramDragHandle.move());
    movePreview = null;
  }
  final nextShapeParents = <String, String?>{};
  for (final element in baseline.elements.values) {
    switch (element) {
      case FramedElement():
        final resolved = store.scene.framedElementById(element.id);
        if (resolved != null && !resolved.behavior.movable) {
          continue;
        }
        final nextFrame = element.frame.translate(delta);
        final nextParentId =
            shouldReparent && baseline.selectedIds.contains(element.id)
            ? store.internals.grouping
                  .reparentTarget(
                    nextFrame,
                    excluding: baseline.elements.keys.toSet(),
                  )
                  ?.id
            : element.parentId;
        nextShapeParents[element.id] = nextParentId;
        if (shouldReparent && nextParentId != null) {
          reparentTargetId = nextParentId;
        }
      case ConnectorElement():
        break;
    }
  }
  _preview(baseline.plan.translate(delta, parents: nextShapeParents));
}