UNPKG

tldraw

Version:

A tiny little drawing editor.

152 lines (151 loc) 5.54 kB
"use strict"; var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __hasOwnProp = Object.prototype.hasOwnProperty; var __export = (target, all) => { for (var name in all) __defProp(target, name, { get: all[name], enumerable: true }); }; var __copyProps = (to, from, except, desc) => { if (from && typeof from === "object" || typeof from === "function") { for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); } return to; }; var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); var PointingArrowLabel_exports = {}; __export(PointingArrowLabel_exports, { PointingArrowLabel: () => PointingArrowLabel }); module.exports = __toCommonJS(PointingArrowLabel_exports); var import_editor = require("@tldraw/editor"); var import_arrowLabel = require("../../../shapes/arrow/arrowLabel"); var import_selectHelpers = require("../selectHelpers"); class PointingArrowLabel extends import_editor.StateNode { static id = "pointing_arrow_label"; shapeId = ""; markId = ""; wasAlreadySelected = false; didDrag = false; didCtrlOnEnter = false; info = {}; updateCursor() { this.editor.setCursor({ type: "grabbing", rotation: 0 }); } onEnter(info) { const { shape } = info; if (typeof info.onInteractionEnd === "string") { this.parent.setCurrentToolIdMask(info.onInteractionEnd); } this.info = info; this.shapeId = shape.id; this.didDrag = false; this.didCtrlOnEnter = info.accelKey; this.wasAlreadySelected = this.editor.getOnlySelectedShapeId() === shape.id; this.updateCursor(); const geometry = this.editor.getShapeGeometry(shape); const labelGeometry = geometry.children[1]; if (!labelGeometry) { throw Error(`Expected to find an arrow label geometry for shape: ${shape.id}`); } const currentPagePoint = this.editor.inputs.getCurrentPagePoint(); const pointInShapeSpace = this.editor.getPointInShapeSpace(shape, currentPagePoint); this._labelDragOffset = import_editor.Vec.Sub(labelGeometry.center, pointInShapeSpace); this.markId = this.editor.markHistoryStoppingPoint("label-drag start"); const additiveSelectionKey = info.shiftKey || info.accelKey; if (additiveSelectionKey) { const selectedShapeIds = this.editor.getSelectedShapeIds(); this.editor.setSelectedShapes([...selectedShapeIds, this.shapeId]); return; } this.editor.setSelectedShapes([this.shapeId]); } onExit() { this.parent.setCurrentToolIdMask(void 0); this.editor.setCursor({ type: "default", rotation: 0 }); } _labelDragOffset = new import_editor.Vec(0, 0); onPointerMove() { const isDragging = this.editor.inputs.getIsDragging(); if (!isDragging) return; if (this.didCtrlOnEnter) { this.parent.transition("brushing", this.info); return; } const shape = this.editor.getShape(this.shapeId); if (!shape) return; const options = this.editor.getShapeUtil("arrow").options; const geometry = (0, import_arrowLabel.getArrowBodyGeometry)(this.editor, shape); const transform = this.editor.getShapePageTransform(shape.id); const pointInShapeSpace = this.editor.getPointInShapeSpace(shape, this.editor.inputs.getCurrentPagePoint()).add(this._labelDragOffset); const defaultLabelPosition = (0, import_arrowLabel.getArrowLabelDefaultPosition)(this.editor, shape); let nextLabelPosition = geometry.uninterpolateAlongEdge(pointInShapeSpace); if (isNaN(nextLabelPosition)) { nextLabelPosition = defaultLabelPosition; } const nextLabelPoint = transform.applyToPoint(geometry.interpolateAlongEdge(nextLabelPosition)); const labelDefaultPoint = transform.applyToPoint( geometry.interpolateAlongEdge(defaultLabelPosition) ); if (import_editor.Vec.DistMin( nextLabelPoint, labelDefaultPoint, options.labelCenterSnapDistance / this.editor.getZoomLevel() )) { nextLabelPosition = defaultLabelPosition; } this.didDrag = true; this.editor.updateShape({ id: shape.id, type: shape.type, props: { labelPosition: nextLabelPosition } }); } onPointerUp() { const shape = this.editor.getShape(this.shapeId); if (!shape) return; if (this.didDrag || !this.wasAlreadySelected) { this.complete(); } else if (this.editor.canEditShape(shape)) { (0, import_selectHelpers.startEditingShapeWithRichText)(this.editor, shape.id); } } onCancel() { this.cancel(); } onComplete() { this.cancel(); } onInterrupt() { this.cancel(); } complete() { const { onInteractionEnd } = this.info; if (onInteractionEnd) { if (typeof onInteractionEnd === "string") { this.editor.setCurrentTool(onInteractionEnd, {}); } else { onInteractionEnd(); } return; } this.parent.transition("idle"); } cancel() { this.editor.bailToMark(this.markId); const { onInteractionEnd } = this.info; if (onInteractionEnd) { if (typeof onInteractionEnd === "string") { this.editor.setCurrentTool(onInteractionEnd, {}); } else { onInteractionEnd(); } return; } this.parent.transition("idle"); } } //# sourceMappingURL=PointingArrowLabel.js.map