Fix spawn floorplan move handle

This commit is contained in:
Aymeric Rabot
2026-06-10 14:11:50 -04:00
parent 3a1ba56246
commit 5fd9be05df
4 changed files with 48 additions and 0 deletions
@@ -0,0 +1,39 @@
import {
type AnyNodeId,
type FloorplanMoveTarget,
type FloorplanMoveTargetSession,
type SpawnNode,
snapScalar,
useScene,
} from '@pascal-app/core'
import { getSegmentGridStep } from '@pascal-app/editor'
export const spawnFloorplanMoveTarget: FloorplanMoveTarget<SpawnNode> = ({ node }) => {
const spawnId = node.id as AnyNodeId
const startY = node.position[1]
const originalPosition: [number, number, number] = [...node.position]
let lastPosition: [number, number, number] | null = null
const session: FloorplanMoveTargetSession = {
affectedIds: [spawnId],
apply({ planPoint, modifiers }) {
const step = getSegmentGridStep()
const snap = (value: number) => (modifiers.shiftKey ? value : snapScalar(value, step))
const next: [number, number, number] = [snap(planPoint[0]), startY, snap(planPoint[1])]
if (lastPosition && lastPosition[0] === next[0] && lastPosition[2] === next[2]) return
lastPosition = next
useScene.getState().updateNodes([{ id: spawnId, data: { position: next } }])
},
canCommit() {
if (!lastPosition) return false
return lastPosition[0] !== originalPosition[0] || lastPosition[2] !== originalPosition[2]
},
commit() {
if (!lastPosition) return
useScene.getState().updateNodes([{ id: spawnId, data: { position: lastPosition } }])
},
}
return session
}