previewMove method
void
previewMove(
- DiagramPoint world, {
- required DiagramPoint snapPoint(),
- bool shouldReparent = false,
- DiagramMoveAdjuster? adjuster,
- required double zoom,
- 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));
}