feat: improve grouping perf in edgeless (#14442)
fix #14433 #### PR Dependency Tree * **PR #14442** 👈 This tree was auto-generated by [Charcoal](https://github.com/danerwilliams/charcoal) <!-- This is an auto-generated comment: release notes by coderabbit.ai --> ## Summary by CodeRabbit * **New Features** * Level-of-detail thumbnails for large images. * Adaptive pacing for snapping, distribution and other alignment work. * RAF coalescer utility to batch high-frequency updates. * Operation timing utility to measure synchronous work. * **Improvements** * Batch group/ungroup reparenting that preserves element order and selection. * Coalesced panning and drag updates to reduce jitter. * Connector/group indexing for more reliable updates, deletions and sync. * Throttled viewport refresh behavior. * **Documentation** * Docs added for RAF coalescer and measureOperation. <!-- end of auto-generated comment: release notes by coderabbit.ai -->
This commit is contained in:
@@ -155,9 +155,22 @@ export class FrameBlockModel
|
||||
}
|
||||
|
||||
removeChild(element: GfxModel): void {
|
||||
this.removeChildren([element]);
|
||||
}
|
||||
|
||||
removeChildren(elements: GfxModel[]): void {
|
||||
const childIds = [...new Set(elements.map(element => element.id))];
|
||||
if (!this.props.childElementIds || childIds.length === 0) {
|
||||
return;
|
||||
}
|
||||
|
||||
this.store.transact(() => {
|
||||
this.props.childElementIds &&
|
||||
delete this.props.childElementIds[element.id];
|
||||
const childElementIds = this.props.childElementIds;
|
||||
if (!childElementIds) return;
|
||||
|
||||
childIds.forEach(childId => {
|
||||
delete childElementIds[childId];
|
||||
});
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
@@ -54,12 +54,21 @@ export class GroupElementModel extends GfxGroupLikeElementModel<GroupElementProp
|
||||
}
|
||||
|
||||
override addChild(element: GfxModel) {
|
||||
if (!canSafeAddToContainer(this, element)) {
|
||||
this.addChildren([element]);
|
||||
}
|
||||
|
||||
addChildren(elements: GfxModel[]) {
|
||||
elements = [...new Set(elements)].filter(element =>
|
||||
canSafeAddToContainer(this, element)
|
||||
);
|
||||
if (elements.length === 0) {
|
||||
return;
|
||||
}
|
||||
|
||||
this.surface.store.transact(() => {
|
||||
this.children.set(element.id, true);
|
||||
elements.forEach(element => {
|
||||
this.children.set(element.id, true);
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
@@ -76,11 +85,22 @@ export class GroupElementModel extends GfxGroupLikeElementModel<GroupElementProp
|
||||
}
|
||||
|
||||
removeChild(element: GfxModel) {
|
||||
this.removeChildren([element]);
|
||||
}
|
||||
|
||||
removeChildren(elements: GfxModel[]) {
|
||||
if (!this.children) {
|
||||
return;
|
||||
}
|
||||
const childIds = [...new Set(elements.map(element => element.id))];
|
||||
if (childIds.length === 0) {
|
||||
return;
|
||||
}
|
||||
|
||||
this.surface.store.transact(() => {
|
||||
this.children.delete(element.id);
|
||||
childIds.forEach(childId => {
|
||||
this.children.delete(childId);
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user