36 lines
973 B
TypeScript
36 lines
973 B
TypeScript
import {
|
|
isFreshPlacementMetadata,
|
|
type PlanarCursorPlacementMode,
|
|
type PlanarPoint,
|
|
resolvePlanarCursorPosition,
|
|
} from '@pascal-app/editor'
|
|
|
|
type FloorplanCursorResolverOptions = {
|
|
snap?: (value: number) => number
|
|
}
|
|
|
|
export function createFloorplanCursorResolver(args: {
|
|
original: readonly [number, number]
|
|
metadata?: unknown
|
|
mode?: PlanarCursorPlacementMode
|
|
}) {
|
|
const original: PlanarPoint = [args.original[0], args.original[1]]
|
|
const mode = args.mode ?? (isFreshPlacementMetadata(args.metadata) ? 'absolute' : 'relative')
|
|
let anchor: PlanarPoint | null = null
|
|
|
|
return (
|
|
planPoint: readonly [number, number],
|
|
options: FloorplanCursorResolverOptions = {},
|
|
): PlanarPoint => {
|
|
const resolved = resolvePlanarCursorPosition({
|
|
cursor: [planPoint[0], planPoint[1]],
|
|
original,
|
|
anchor,
|
|
mode,
|
|
...(options.snap ? { snap: options.snap } : {}),
|
|
})
|
|
anchor = resolved.anchor
|
|
return resolved.point
|
|
}
|
|
}
|