feat(input): support artboard selection
This commit is contained in:
35
input/selection.ts
Normal file
35
input/selection.ts
Normal file
@@ -0,0 +1,35 @@
|
||||
import { commandIds } from "@commands/ids";
|
||||
import type { Dispatch } from "@commands/dispatcher";
|
||||
import type { ImageDocument } from "@core/document";
|
||||
import type { ViewportState } from "@editor/state";
|
||||
import type { PointerInputEvent } from "./pointer";
|
||||
|
||||
export function handleArtboardSelection(options: {
|
||||
event: PointerInputEvent;
|
||||
document: ImageDocument;
|
||||
viewport: ViewportState;
|
||||
dispatch: Dispatch;
|
||||
}): boolean {
|
||||
if (options.event.pointerType !== "mouse" || (options.event.buttons & 1) !== 1) return false;
|
||||
|
||||
const point = viewportPointToDocumentPoint(options.event.position, options.viewport);
|
||||
const artboard = [...options.document.artboards].reverse().find((candidate) => {
|
||||
const bounds = candidate.bounds;
|
||||
return point.x >= bounds.x && point.x <= bounds.x + bounds.w && point.y >= bounds.y && point.y <= bounds.y + bounds.h;
|
||||
});
|
||||
|
||||
if (!artboard) {
|
||||
options.dispatch(commandIds.selectionClear, undefined);
|
||||
return true;
|
||||
}
|
||||
|
||||
options.dispatch(commandIds.selectionSet, { artboardId: artboard.id, layerIds: [] });
|
||||
return true;
|
||||
}
|
||||
|
||||
function viewportPointToDocumentPoint(point: PointerInputEvent["position"], viewport: ViewportState) {
|
||||
return {
|
||||
x: viewport.center.x + (point.x - viewport.size.w / 2) / viewport.zoom,
|
||||
y: viewport.center.y + (point.y - viewport.size.h / 2) / viewport.zoom,
|
||||
};
|
||||
}
|
||||
Reference in New Issue
Block a user