{ "version": 3, "sources": ["../../../../../src/lib/shapes/line/toolStates/Pointing.ts"], "sourcesContent": ["import {\n\tMatrix2d,\n\tStateNode,\n\tTLEventHandlers,\n\tTLHandle,\n\tTLInterruptEvent,\n\tTLLineShape,\n\tTLShapeId,\n\tVec2d,\n\tcreateShapeId,\n\tgetIndexAbove,\n\tlast,\n\tsortByIndex,\n\tstructuredClone,\n} from '@tldraw/editor'\n\nconst MINIMUM_DISTANCE_BETWEEN_SHIFT_CLICKED_HANDLES = 2\n\nexport class Pointing extends StateNode {\n\tstatic override id = 'pointing'\n\n\tshape = {} as TLLineShape\n\n\tmarkId: string | undefined\n\n\toverride onEnter = (info: { shapeId?: TLShapeId }) => {\n\t\tconst { inputs } = this.editor\n\t\tconst { currentPagePoint } = inputs\n\n\t\tthis.markId = undefined\n\n\t\t// Previously created line shape that we might be extending\n\t\tconst shape = info.shapeId && this.editor.getShape(info.shapeId)\n\n\t\tif (shape && inputs.shiftKey) {\n\t\t\t// Extending a previous shape\n\t\t\tthis.markId = `creating:${shape.id}`\n\t\t\tthis.editor.mark(this.markId)\n\t\t\tthis.shape = shape\n\n\t\t\tconst handles = this.editor.getShapeHandles(this.shape)\n\t\t\tif (!handles) return\n\n\t\t\tconst vertexHandles = handles.filter((h) => h.type === 'vertex').sort(sortByIndex)\n\t\t\tconst endHandle = vertexHandles[vertexHandles.length - 1]\n\t\t\tconst prevEndHandle = vertexHandles[vertexHandles.length - 2]\n\n\t\t\tconst shapePagePoint = Matrix2d.applyToPoint(\n\t\t\t\tthis.editor.getShapeParentTransform(this.shape)!,\n\t\t\t\tnew Vec2d(this.shape.x, this.shape.y)\n\t\t\t)\n\n\t\t\tlet nextEndHandleIndex: string, nextEndHandleId: string, nextEndHandle: TLHandle\n\n\t\t\tconst nextPoint = Vec2d.Sub(currentPagePoint, shapePagePoint)\n\n\t\t\tif (\n\t\t\t\tVec2d.Dist(endHandle, prevEndHandle) < MINIMUM_DISTANCE_BETWEEN_SHIFT_CLICKED_HANDLES ||\n\t\t\t\tVec2d.Dist(nextPoint, endHandle) < MINIMUM_DISTANCE_BETWEEN_SHIFT_CLICKED_HANDLES\n\t\t\t) {\n\t\t\t\t// If the end handle is too close to the previous end handle, we'll just extend the previous end handle\n\t\t\t\tnextEndHandleIndex = endHandle.index\n\t\t\t\tnextEndHandleId = endHandle.id\n\t\t\t\tnextEndHandle = {\n\t\t\t\t\t...endHandle,\n\t\t\t\t\tx: nextPoint.x + 0.1,\n\t\t\t\t\ty: nextPoint.y + 0.1,\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\t// Otherwise, we'll create a new end handle\n\t\t\t\tnextEndHandleIndex = getIndexAbove(endHandle.index)\n\t\t\t\tnextEndHandleId = 'handle:' + nextEndHandleIndex\n\t\t\t\tnextEndHandle = {\n\t\t\t\t\tid: nextEndHandleId,\n\t\t\t\t\ttype: 'vertex',\n\t\t\t\t\tindex: nextEndHandleIndex,\n\t\t\t\t\tx: nextPoint.x + 0.1,\n\t\t\t\t\ty: nextPoint.y + 0.1,\n\t\t\t\t\tcanBind: false,\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tconst nextHandles = structuredClone(this.shape.props.handles)\n\n\t\t\tnextHandles[nextEndHandle.id] = nextEndHandle\n\n\t\t\tthis.editor.updateShapes([\n\t\t\t\t{\n\t\t\t\t\tid: this.shape.id,\n\t\t\t\t\ttype: this.shape.type,\n\t\t\t\t\tprops: {\n\t\t\t\t\t\thandles: nextHandles,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t])\n\t\t} else {\n\t\t\tconst id = createShapeId()\n\n\t\t\tthis.markId = `creating:${id}`\n\t\t\tthis.editor.mark(this.markId)\n\n\t\t\tthis.editor.createShapes([\n\t\t\t\t{\n\t\t\t\t\tid,\n\t\t\t\t\ttype: 'line',\n\t\t\t\t\tx: currentPagePoint.x,\n\t\t\t\t\ty: currentPagePoint.y,\n\t\t\t\t},\n\t\t\t])\n\n\t\t\tthis.editor.select(id)\n\t\t\tthis.shape = this.editor.getShape(id)!\n\t\t}\n\t}\n\n\toverride onPointerMove: TLEventHandlers['onPointerMove'] = () => {\n\t\tif (!this.shape) return\n\n\t\tif (this.editor.inputs.isDragging) {\n\t\t\tconst handles = this.editor.getShapeHandles(this.shape)\n\t\t\tconsole\n\t\t\tif (!handles) {\n\t\t\t\tif (this.markId) this.editor.bailToMark(this.markId)\n\t\t\t\tthrow Error('No handles found')\n\t\t\t}\n\t\t\tconst lastHandle = last(handles)!\n\t\t\tthis.editor.setCurrentTool('select.dragging_handle', {\n\t\t\t\tshape: this.shape,\n\t\t\t\tisCreating: true,\n\t\t\t\t// remove the offset that we added to the handle when we created it\n\t\t\t\thandle: { ...lastHandle, x: lastHandle.x - 0.1, y: lastHandle.y - 0.1 },\n\t\t\t\tonInteractionEnd: 'line',\n\t\t\t})\n\t\t}\n\t}\n\n\toverride onPointerUp: TLEventHandlers['onPointerUp'] = () => {\n\t\tthis.complete()\n\t}\n\n\toverride onCancel: TLEventHandlers['onCancel'] = () => {\n\t\tthis.cancel()\n\t}\n\n\toverride onComplete: TLEventHandlers['onComplete'] = () => {\n\t\tthis.complete()\n\t}\n\n\toverride onInterrupt: TLInterruptEvent = () => {\n\t\tthis.parent.transition('idle', {})\n\t\tif (this.markId) this.editor.bailToMark(this.markId)\n\t\tthis.editor.snaps.clear()\n\t}\n\n\tcomplete() {\n\t\tthis.parent.transition('idle', { shapeId: this.shape.id })\n\t\tthis.editor.snaps.clear()\n\t}\n\n\tcancel() {\n\t\tif (this.markId) this.editor.bailToMark(this.markId)\n\t\tthis.parent.transition('idle', { shapeId: this.shape.id })\n\t\tthis.editor.snaps.clear()\n\t}\n}\n"], "mappings": "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", "names": [] }