mirror of
https://github.com/excalidraw/excalidraw.git
synced 2025-05-03 10:00:07 -04:00
lasso tests
This commit is contained in:
parent
5d8fd603bb
commit
99c573e88e
4 changed files with 1870 additions and 56 deletions
|
@ -52,15 +52,27 @@ export class LassoTrail extends AnimatedTrail {
|
||||||
this.intersectedElements.clear();
|
this.intersectedElements.clear();
|
||||||
this.enclosedElements.clear();
|
this.enclosedElements.clear();
|
||||||
|
|
||||||
|
try {
|
||||||
this.worker = new Worker(new URL("./worker.ts", import.meta.url), {
|
this.worker = new Worker(new URL("./worker.ts", import.meta.url), {
|
||||||
type: "module",
|
type: "module",
|
||||||
});
|
});
|
||||||
|
|
||||||
this.worker.onmessage = (event: MessageEvent<LassoWorkerOutput>) => {
|
this.worker.onmessage = (event: MessageEvent<LassoWorkerOutput>) => {
|
||||||
const { selectedElementIds } = event.data;
|
const { selectedElementIds } = event.data;
|
||||||
|
this.selectElementsFromIds(selectedElementIds);
|
||||||
|
};
|
||||||
|
|
||||||
|
this.worker.onerror = (error) => {
|
||||||
|
console.error("Worker error:", error);
|
||||||
|
};
|
||||||
|
} catch (error) {
|
||||||
|
console.error("Failed to start worker", error);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
selectElementsFromIds = (ids: string[]) => {
|
||||||
this.app.setState((prevState) => {
|
this.app.setState((prevState) => {
|
||||||
const nextSelectedElementIds = selectedElementIds.reduce((acc, id) => {
|
const nextSelectedElementIds = ids.reduce((acc, id) => {
|
||||||
acc[id] = true;
|
acc[id] = true;
|
||||||
return acc;
|
return acc;
|
||||||
}, {} as Record<ExcalidrawElement["id"], true>);
|
}, {} as Record<ExcalidrawElement["id"], true>);
|
||||||
|
@ -89,9 +101,7 @@ export class LassoTrail extends AnimatedTrail {
|
||||||
);
|
);
|
||||||
|
|
||||||
const selectedIds = [...Object.keys(nextSelection.selectedElementIds)];
|
const selectedIds = [...Object.keys(nextSelection.selectedElementIds)];
|
||||||
const selectedGroupIds = [
|
const selectedGroupIds = [...Object.keys(nextSelection.selectedGroupIds)];
|
||||||
...Object.keys(nextSelection.selectedGroupIds),
|
|
||||||
];
|
|
||||||
|
|
||||||
return {
|
return {
|
||||||
selectedElementIds: nextSelection.selectedElementIds,
|
selectedElementIds: nextSelection.selectedElementIds,
|
||||||
|
@ -110,11 +120,6 @@ export class LassoTrail extends AnimatedTrail {
|
||||||
});
|
});
|
||||||
};
|
};
|
||||||
|
|
||||||
this.worker.onerror = (error) => {
|
|
||||||
console.error("Worker error:", error);
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
||||||
addPointToPath = (x: number, y: number) => {
|
addPointToPath = (x: number, y: number) => {
|
||||||
super.addPointToPath(x, y);
|
super.addPointToPath(x, y);
|
||||||
|
|
||||||
|
|
1806
packages/excalidraw/lasso/lasso.test.tsx
Normal file
1806
packages/excalidraw/lasso/lasso.test.tsx
Normal file
File diff suppressed because it is too large
Load diff
|
@ -9,7 +9,7 @@ export type LassoWorkerInput = {
|
||||||
elementsSegments: ElementsSegmentsMap;
|
elementsSegments: ElementsSegmentsMap;
|
||||||
intersectedElements: Set<ExcalidrawElement["id"]>;
|
intersectedElements: Set<ExcalidrawElement["id"]>;
|
||||||
enclosedElements: Set<ExcalidrawElement["id"]>;
|
enclosedElements: Set<ExcalidrawElement["id"]>;
|
||||||
simplifyDistance: number;
|
simplifyDistance?: number;
|
||||||
};
|
};
|
||||||
|
|
||||||
export type LassoWorkerOutput = {
|
export type LassoWorkerOutput = {
|
||||||
|
|
|
@ -86,7 +86,10 @@ export const updateSelection = (input: LassoWorkerInput): LassoWorkerOutput => {
|
||||||
simplifyDistance,
|
simplifyDistance,
|
||||||
} = input;
|
} = input;
|
||||||
// simplify the path to reduce the number of points
|
// simplify the path to reduce the number of points
|
||||||
const path = simplify(lassoPath, simplifyDistance) as GlobalPoint[];
|
let path: GlobalPoint[] = lassoPath;
|
||||||
|
if (simplifyDistance) {
|
||||||
|
path = simplify(lassoPath, simplifyDistance) as GlobalPoint[];
|
||||||
|
}
|
||||||
// close the path to form a polygon for enclosure check
|
// close the path to form a polygon for enclosure check
|
||||||
const closedPath = polygonFromPoints(path);
|
const closedPath = polygonFromPoints(path);
|
||||||
// as the path might not enclose a shape anymore, clear before checking
|
// as the path might not enclose a shape anymore, clear before checking
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue