moveSubtree static method
CanvasSceneDocument
moveSubtree(
- CanvasSceneDocument doc,
- NodeId id, {
- NodeId? newParentId,
- 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);
}