2021-05-15 15:20:21 +00:00
|
|
|
import { Data, LineShape, RayShape } from "types"
|
|
|
|
import * as vec from "utils/vec"
|
|
|
|
import BaseSession from "./base-session"
|
|
|
|
import commands from "state/commands"
|
|
|
|
import { current } from "immer"
|
2021-05-22 15:45:24 +00:00
|
|
|
import { getPage } from "utils/utils"
|
2021-05-15 15:20:21 +00:00
|
|
|
|
|
|
|
export default class DirectionSession extends BaseSession {
|
|
|
|
delta = [0, 0]
|
|
|
|
origin: number[]
|
|
|
|
snapshot: DirectionSnapshot
|
|
|
|
|
|
|
|
constructor(data: Data, point: number[]) {
|
|
|
|
super(data)
|
|
|
|
this.origin = point
|
|
|
|
this.snapshot = getDirectionSnapshot(data)
|
|
|
|
}
|
|
|
|
|
|
|
|
update(data: Data, point: number[]) {
|
2021-05-22 15:45:24 +00:00
|
|
|
const { shapes } = this.snapshot
|
|
|
|
|
|
|
|
const page = getPage(data)
|
2021-05-15 15:20:21 +00:00
|
|
|
|
|
|
|
for (let { id } of shapes) {
|
2021-05-22 15:45:24 +00:00
|
|
|
const shape = page.shapes[id] as RayShape | LineShape
|
2021-05-15 15:20:21 +00:00
|
|
|
|
|
|
|
shape.direction = vec.uni(vec.vec(shape.point, point))
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
cancel(data: Data) {
|
2021-05-22 15:45:24 +00:00
|
|
|
const page = getPage(data, this.snapshot.currentPageId)
|
2021-05-15 15:20:21 +00:00
|
|
|
|
|
|
|
for (let { id, direction } of this.snapshot.shapes) {
|
2021-05-22 15:45:24 +00:00
|
|
|
const shape = page.shapes[id] as RayShape | LineShape
|
2021-05-15 15:20:21 +00:00
|
|
|
shape.direction = direction
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
complete(data: Data) {
|
2021-05-17 21:27:18 +00:00
|
|
|
commands.direct(data, this.snapshot, getDirectionSnapshot(data))
|
2021-05-15 15:20:21 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
export function getDirectionSnapshot(data: Data) {
|
2021-05-22 15:45:24 +00:00
|
|
|
const { shapes } = getPage(current(data))
|
2021-05-15 15:20:21 +00:00
|
|
|
|
|
|
|
let snapshapes: { id: string; direction: number[] }[] = []
|
|
|
|
|
|
|
|
data.selectedIds.forEach((id) => {
|
|
|
|
const shape = shapes[id]
|
|
|
|
if ("direction" in shape) {
|
|
|
|
snapshapes.push({ id: shape.id, direction: shape.direction })
|
|
|
|
}
|
|
|
|
})
|
|
|
|
|
|
|
|
return {
|
2021-05-22 15:45:24 +00:00
|
|
|
currentPageId: data.currentPageId,
|
2021-05-15 15:20:21 +00:00
|
|
|
shapes: snapshapes,
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
export type DirectionSnapshot = ReturnType<typeof getDirectionSnapshot>
|