moveSubtree static method

CanvasSceneDocument moveSubtree(
  1. CanvasSceneDocument doc,
  2. NodeId id, {
  3. NodeId? newParentId,
  4. int? toIndex,
})

Implementation

static CanvasSceneDocument moveSubtree(
  CanvasSceneDocument doc,
  NodeId id, {
  NodeId? newParentId,
  int? toIndex,
}) {
  final node = findById(doc, id);
  if (node == null) return doc;

  // Prevent cycles and invalid parents.
  if (newParentId != null) {
    if (newParentId == id) return doc;

    final np = findById(doc, newParentId);
    if (np == null || !np.isGroup) return doc;

    if (_containsId(node, newParentId)) return doc;
  }

  final pr = findParentOf(doc, id);
  if (pr == null) return doc;

  final oldParentId = pr.parent?.id;
  final sameParent = oldParentId == newParentId;

  if (sameParent) {
    final siblings = (pr.parent == null)
        ? [...doc.children]
        : [...pr.parent!.childrenOrEmpty];

    final moving = siblings.removeAt(pr.index);
    final i = _clampInsertIndex(toIndex ?? siblings.length, siblings.length);
    siblings.insert(i, moving);

    return _replaceChildren(doc, pr.parent, siblings);
  }

  final d1 = _removeAtParentRef(doc, pr);
  return addNode(d1, node, parentId: newParentId, index: toIndex);
}