mirror of
https://gitee.com/ByteDance/flowgram.ai.git
synced 2025-07-07 17:43:29 +08:00
* feat(demo): create group tool * feat(demo): create group shortcut * refactor(core): split group service, controller, utils files * feat(history): free history add group operations * feat(demo): group node render * feat(demo): group node registry * refactor(stack): remove layer computing config * feat(stack): line stackIndex cannot be recalculated by default * feat(demo): group title & color palette acess form * feat(demo): ungroup button & shortcut * feat(demo): create group & ungroup operation register to free history service * refactor(group): group shortcuts move to group-plugin * refactor(group): group node render move to group-plugin * fix(group): undo/redo of create node or ungroup not work * perf(history): free history remove async operation * feat(group): trigger select box inside group * fix(group): container inside group * fix(group): auto layout should not be affected by group node * feat(container): support multi-layer nested containers * fix(group): group css variables overwrite each other * fix(container): node move in or out group shouldn't clear lines * feat(demo): node should follow mouse after move out container button clicked * feat(container): disable group move to non-group container node * fix(container): cross-level node moving causing coord offset * feat(demo): comment node support more button * fix(demo): comment in container fromJSON * feat(container): node into container show move out tips * feat(group): node into group show move out tips * feat(group): delete group when blocks is empty * refactor(group): createFreeGroupPlugin move to container-plugin * refactor(demo): replace disablePorts with defaultPorts * fix(demo): react warning * refactor(group): group plugin built-in GroupNodeRegistry * refactor(group): create free-group-plugin * fix(ci): lock & ts-check & test errors
48 lines
1.5 KiB
TypeScript
48 lines
1.5 KiB
TypeScript
import { WorkflowDocument } from '@flowgram.ai/free-layout-core';
|
|
import { PositionSchema, startTween, TransformData } from '@flowgram.ai/core';
|
|
|
|
import { LayoutNode } from './type';
|
|
import { LayoutStore } from './store';
|
|
|
|
export class LayoutPosition {
|
|
constructor(private readonly store: LayoutStore) {}
|
|
|
|
public async position(): Promise<void> {
|
|
return new Promise((resolve) => {
|
|
startTween({
|
|
from: { d: 0 },
|
|
to: { d: 100 },
|
|
duration: 300,
|
|
onUpdate: (v) => {
|
|
this.store.nodes.forEach((layoutNode) => {
|
|
this.updateNodePosition({ layoutNode, step: v.d });
|
|
});
|
|
},
|
|
onComplete: () => {
|
|
resolve();
|
|
},
|
|
});
|
|
});
|
|
}
|
|
|
|
private updateNodePosition(params: { layoutNode: LayoutNode; step: number }): void {
|
|
const { layoutNode, step } = params;
|
|
const transform = layoutNode.entity.getData(TransformData);
|
|
const position: PositionSchema = {
|
|
x: layoutNode.position.x + layoutNode.offset.x,
|
|
y: layoutNode.position.y + layoutNode.offset.y,
|
|
};
|
|
const deltaX = ((position.x - transform.position.x) * step) / 100;
|
|
const deltaY = ((position.y - transform.bounds.height / 2 - transform.position.y) * step) / 100;
|
|
|
|
transform.update({
|
|
position: {
|
|
x: transform.position.x + deltaX,
|
|
y: transform.position.y + deltaY,
|
|
},
|
|
});
|
|
const document = layoutNode.entity.document as WorkflowDocument;
|
|
document.layout.updateAffectedTransform(layoutNode.entity);
|
|
}
|
|
}
|