in packages/ketcher-core/src/application/editor/actions/fragment.ts [42:151]
export function fromMultipleMove(
restruct,
lists,
d: Vec2,
shouldPerform = true,
) {
d = new Vec2(d);
const action = new Action();
const struct = restruct.molecule;
const loops = new Pile();
const atomsToInvalidate = new Pile();
if (lists.atoms) {
const atomSet = new Pile(lists.atoms);
const bondlist: Array<number> = [];
restruct.bonds.forEach((bond, bid) => {
if (atomSet.has(bond.b.begin) && atomSet.has(bond.b.end)) {
bondlist.push(bid);
// add all adjacent loops
// those that are not completely inside the structure will get redrawn anyway
['hb1', 'hb2'].forEach((hb) => {
const loop = struct.halfBonds.get(bond.b[hb]).loop;
if (loop >= 0) loops.add(loop);
});
return;
}
if (atomSet.has(bond.b.begin)) {
atomsToInvalidate.add(bond.b.begin);
return;
}
if (atomSet.has(bond.b.end)) atomsToInvalidate.add(bond.b.end);
});
bondlist.forEach((bond) => {
action.addOp(new BondMove(bond, d));
});
loops.forEach((loopId) => {
if (restruct.reloops.get(loopId) && restruct.reloops.get(loopId).visel) {
// hack
action.addOp(new LoopMove(loopId, d));
}
});
lists.atoms.forEach((aid) => {
action.addOp(new AtomMove(aid, d, !atomsToInvalidate.has(aid)));
});
if (lists.sgroupData && lists.sgroupData.length === 0) {
const sgroups = getRelSGroupsBySelection(struct, lists.atoms);
sgroups.forEach((sg) => {
action.addOp(new SGroupDataMove(sg.id, d));
});
}
}
if (lists.rxnArrows) {
lists.rxnArrows.forEach((rxnArrow) => {
action.addOp(new RxnArrowMove(rxnArrow, d, true));
});
}
if (lists.rxnPluses) {
lists.rxnPluses.forEach((rxnPulse) => {
action.addOp(new RxnPlusMove(rxnPulse, d, true));
});
}
if (lists.simpleObjects) {
lists.simpleObjects.forEach((simpleObject) => {
action.addOp(new SimpleObjectMove(simpleObject, d, true));
});
}
if (lists.sgroupData) {
lists.sgroupData.forEach((sgData) => {
action.addOp(new SGroupDataMove(sgData, d));
});
}
if (lists.enhancedFlags) {
lists.enhancedFlags.forEach((fid) => {
action.addOp(new EnhancedFlagMove(fid, d));
});
}
if (lists.texts) {
lists.texts.forEach((text) => {
action.addOp(new TextMove(text, d, true));
});
}
if (lists[IMAGE_KEY]) {
lists[IMAGE_KEY].forEach((image) => {
action.addOp(new ImageMove(image, d));
});
}
if (lists[MULTITAIL_ARROW_KEY]) {
lists[MULTITAIL_ARROW_KEY].forEach((multitailArrow) => {
action.addOp(new MultitailArrowMove(multitailArrow, d));
});
}
return shouldPerform ? action.perform(restruct) : action;
}