kopia lustrzana https://github.com/Tldraw/Tldraw
139 wiersze
3.0 KiB
TypeScript
139 wiersze
3.0 KiB
TypeScript
import { createShapeId } from '@tldraw/tlschema'
|
|
import { Vec } from '../../../../primitives/Vec'
|
|
import { alertMaxShapes } from '../../../Editor'
|
|
import { TLBaseBoxShape } from '../../../shapes/BaseBoxShapeUtil'
|
|
import { TLEventHandlers } from '../../../types/event-types'
|
|
import { StateNode } from '../../StateNode'
|
|
import { BaseBoxShapeTool } from '../BaseBoxShapeTool'
|
|
|
|
export class Pointing extends StateNode {
|
|
static override id = 'pointing'
|
|
|
|
markId = ''
|
|
|
|
wasFocusedOnEnter = false
|
|
|
|
override onEnter = () => {
|
|
this.wasFocusedOnEnter = !this.editor.getIsMenuOpen()
|
|
}
|
|
|
|
override onPointerMove: TLEventHandlers['onPointerMove'] = (info) => {
|
|
if (this.editor.inputs.isDragging) {
|
|
if (this.editor.maxShapesReached()) {
|
|
alertMaxShapes(this.editor)
|
|
this.cancel()
|
|
return
|
|
}
|
|
const { originPagePoint } = this.editor.inputs
|
|
|
|
const shapeType = (this.parent as BaseBoxShapeTool)!.shapeType
|
|
|
|
const id = createShapeId()
|
|
|
|
this.markId = `creating:${id}`
|
|
|
|
this.editor.mark(this.markId)
|
|
|
|
this.editor
|
|
.createShapes<TLBaseBoxShape>([
|
|
{
|
|
id,
|
|
type: shapeType,
|
|
x: originPagePoint.x,
|
|
y: originPagePoint.y,
|
|
props: {
|
|
w: 1,
|
|
h: 1,
|
|
},
|
|
},
|
|
])
|
|
.select(id)
|
|
|
|
this.editor.setCurrentTool('select.resizing', {
|
|
...info,
|
|
target: 'selection',
|
|
handle: 'bottom_right',
|
|
isCreating: true,
|
|
creationCursorOffset: { x: 1, y: 1 },
|
|
onInteractionEnd: this.parent.id,
|
|
onCreate: (this.parent as BaseBoxShapeTool).onCreate,
|
|
})
|
|
}
|
|
}
|
|
|
|
override onPointerUp: TLEventHandlers['onPointerUp'] = () => {
|
|
this.complete()
|
|
}
|
|
|
|
override onCancel: TLEventHandlers['onCancel'] = () => {
|
|
this.cancel()
|
|
}
|
|
|
|
override onComplete: TLEventHandlers['onComplete'] = () => {
|
|
this.complete()
|
|
}
|
|
|
|
override onInterrupt: TLEventHandlers['onInterrupt'] = () => {
|
|
this.cancel()
|
|
}
|
|
|
|
complete() {
|
|
const { originPagePoint } = this.editor.inputs
|
|
|
|
if (!this.wasFocusedOnEnter) {
|
|
return
|
|
}
|
|
|
|
if (this.editor.maxShapesReached()) {
|
|
alertMaxShapes(this.editor)
|
|
this.cancel()
|
|
return
|
|
}
|
|
|
|
this.editor.mark(this.markId)
|
|
|
|
const shapeType = (this.parent as BaseBoxShapeTool)!.shapeType as TLBaseBoxShape['type']
|
|
|
|
const id = createShapeId()
|
|
|
|
this.editor.mark(this.markId)
|
|
|
|
this.editor.createShapes<TLBaseBoxShape>([
|
|
{
|
|
id,
|
|
type: shapeType,
|
|
x: originPagePoint.x,
|
|
y: originPagePoint.y,
|
|
},
|
|
])
|
|
|
|
const shape = this.editor.getShape<TLBaseBoxShape>(id)!
|
|
const { w, h } = this.editor.getShapeUtil(shape).getDefaultProps() as TLBaseBoxShape['props']
|
|
const delta = new Vec(w / 2, h / 2)
|
|
|
|
const parentTransform = this.editor.getShapeParentTransform(shape)
|
|
if (parentTransform) delta.rot(-parentTransform.rotation())
|
|
|
|
this.editor.updateShapes<TLBaseBoxShape>([
|
|
{
|
|
id,
|
|
type: shapeType,
|
|
x: shape.x - delta.x,
|
|
y: shape.y - delta.y,
|
|
},
|
|
])
|
|
|
|
this.editor.setSelectedShapes([id])
|
|
|
|
if (this.editor.getInstanceState().isToolLocked) {
|
|
this.parent.transition('idle')
|
|
} else {
|
|
this.editor.setCurrentTool('select.idle')
|
|
}
|
|
}
|
|
|
|
cancel() {
|
|
this.parent.transition('idle')
|
|
}
|
|
}
|