UNPKG

fabric

Version:

Object model for HTML5 canvas, and SVG-to-canvas parser. Backed by jsdom and node-canvas.

1 lines 28.7 kB
{"version":3,"file":"DraggableTextDelegate.mjs","sources":["../../../../src/shapes/IText/DraggableTextDelegate.ts"],"sourcesContent":["import type {\n DragEventData,\n DropEventData,\n TPointerEvent,\n} from '../../EventTypeDefs';\nimport { Point } from '../../Point';\nimport type { IText } from './IText';\nimport { setStyle } from '../../util/dom_style';\nimport { cloneStyles } from '../../util/internals/cloneStyles';\nimport type { TextStyleDeclaration } from '../Text/StyledText';\nimport { getDocumentFromElement } from '../../util/dom_misc';\nimport { CHANGED, NONE } from '../../constants';\n\n/**\n * #### Dragging IText/Textbox Lifecycle\n * - {@link start} is called from `mousedown` {@link IText#_mouseDownHandler} and determines if dragging should start by testing {@link isPointerOverSelection}\n * - if true `mousedown` {@link IText#_mouseDownHandler} is blocked to keep selection\n * - if the pointer moves, canvas fires numerous mousemove {@link Canvas#_onMouseMove} that we make sure **aren't** prevented ({@link IText#shouldStartDragging}) in order for the window to start a drag session\n * - once/if the session starts canvas calls {@link onDragStart} on the active object to determine if dragging should occur\n * - canvas fires relevant drag events that are handled by the handlers defined in this scope\n * - {@link end} is called from `mouseup` {@link IText#mouseUpHandler}, blocking IText default click behavior\n * - in case the drag session didn't occur, {@link end} handles a click, since logic to do so was blocked during `mousedown`\n */\nexport class DraggableTextDelegate {\n readonly target: IText;\n private __mouseDownInPlace = false;\n private __dragStartFired = false;\n private __isDraggingOver = false;\n private __dragStartSelection?: {\n selectionStart: number;\n selectionEnd: number;\n };\n private __dragImageDisposer?: VoidFunction;\n private _dispose?: () => void;\n\n constructor(target: IText) {\n this.target = target;\n const disposers = [\n this.target.on('dragenter', this.dragEnterHandler.bind(this)),\n this.target.on('dragover', this.dragOverHandler.bind(this)),\n this.target.on('dragleave', this.dragLeaveHandler.bind(this)),\n this.target.on('dragend', this.dragEndHandler.bind(this)),\n this.target.on('drop', this.dropHandler.bind(this)),\n ];\n this._dispose = () => {\n disposers.forEach((d) => d());\n this._dispose = undefined;\n };\n }\n\n isPointerOverSelection(e: TPointerEvent) {\n const target = this.target;\n const newSelection = target.getSelectionStartFromPointer(e);\n return (\n target.isEditing &&\n newSelection >= target.selectionStart &&\n newSelection <= target.selectionEnd &&\n target.selectionStart < target.selectionEnd\n );\n }\n\n /**\n * @public override this method to disable dragging and default to mousedown logic\n */\n start(e: TPointerEvent) {\n return (this.__mouseDownInPlace = this.isPointerOverSelection(e));\n }\n\n /**\n * @public override this method to disable dragging without discarding selection\n */\n isActive() {\n return this.__mouseDownInPlace;\n }\n\n /**\n * Ends interaction and sets cursor in case of a click\n * @returns true if was active\n */\n end(e: TPointerEvent) {\n const active = this.isActive();\n if (active && !this.__dragStartFired) {\n // mousedown has been blocked since `active` is true => cursor has not been set.\n // `__dragStartFired` is false => dragging didn't occur, pointer didn't move and is over selection.\n // meaning this is actually a click, `active` is a false positive.\n this.target.setCursorByClick(e);\n this.target.initDelayedCursor(true);\n }\n this.__mouseDownInPlace = false;\n this.__dragStartFired = false;\n this.__isDraggingOver = false;\n return active;\n }\n\n getDragStartSelection() {\n return this.__dragStartSelection;\n }\n\n /**\n * Override to customize the drag image\n * https://developer.mozilla.org/en-US/docs/Web/API/DataTransfer/setDragImage\n */\n setDragImage(\n e: DragEvent,\n {\n selectionStart,\n selectionEnd,\n }: {\n selectionStart: number;\n selectionEnd: number;\n },\n ) {\n const target = this.target;\n const canvas = target.canvas!;\n const flipFactor = new Point(target.flipX ? -1 : 1, target.flipY ? -1 : 1);\n const boundaries = target._getCursorBoundaries(selectionStart);\n const selectionPosition = new Point(\n boundaries.left + boundaries.leftOffset,\n boundaries.top + boundaries.topOffset,\n ).multiply(flipFactor);\n const pos = selectionPosition.transform(target.calcTransformMatrix());\n const pointer = canvas.getScenePoint(e);\n const diff = pointer.subtract(pos);\n const retinaScaling = target.getCanvasRetinaScaling();\n const bbox = target.getBoundingRect();\n const correction = pos.subtract(new Point(bbox.left, bbox.top));\n const vpt = canvas.viewportTransform;\n const offset = correction.add(diff).transform(vpt, true);\n // prepare instance for drag image snapshot by making all non selected text invisible\n const bgc = target.backgroundColor;\n const styles = cloneStyles(target.styles);\n target.backgroundColor = '';\n const styleOverride = {\n stroke: 'transparent',\n fill: 'transparent',\n textBackgroundColor: 'transparent',\n };\n target.setSelectionStyles(styleOverride, 0, selectionStart);\n target.setSelectionStyles(styleOverride, selectionEnd, target.text.length);\n target.dirty = true;\n const dragImage = target.toCanvasElement({\n enableRetinaScaling: canvas.enableRetinaScaling,\n viewportTransform: true,\n });\n // restore values\n target.backgroundColor = bgc;\n target.styles = styles;\n target.dirty = true;\n // position drag image offscreen\n setStyle(dragImage, {\n position: 'fixed',\n left: `${-dragImage.width}px`,\n border: NONE,\n width: `${dragImage.width / retinaScaling}px`,\n height: `${dragImage.height / retinaScaling}px`,\n });\n this.__dragImageDisposer && this.__dragImageDisposer();\n this.__dragImageDisposer = () => {\n dragImage.remove();\n };\n getDocumentFromElement(\n (e.target || this.target.hiddenTextarea)! as HTMLElement,\n ).body.appendChild(dragImage);\n e.dataTransfer?.setDragImage(dragImage, offset.x, offset.y);\n }\n\n /**\n * @returns {boolean} determines whether {@link target} should/shouldn't become a drag source\n */\n onDragStart(e: DragEvent): boolean {\n this.__dragStartFired = true;\n const target = this.target;\n const active = this.isActive();\n if (active && e.dataTransfer) {\n const selection = (this.__dragStartSelection = {\n selectionStart: target.selectionStart,\n selectionEnd: target.selectionEnd,\n });\n const value = target._text\n .slice(selection.selectionStart, selection.selectionEnd)\n .join('');\n const data = { text: target.text, value, ...selection };\n e.dataTransfer.setData('text/plain', value);\n e.dataTransfer.setData(\n 'application/fabric',\n JSON.stringify({\n value: value,\n styles: target.getSelectionStyles(\n selection.selectionStart,\n selection.selectionEnd,\n true,\n ),\n }),\n );\n e.dataTransfer.effectAllowed = 'copyMove';\n this.setDragImage(e, data);\n }\n target.abortCursorAnimation();\n return active;\n }\n\n /**\n * use {@link targetCanDrop} to respect overriding\n * @returns {boolean} determines whether {@link target} should/shouldn't become a drop target\n */\n canDrop(e: DragEvent): boolean {\n if (\n this.target.editable &&\n !this.target.getActiveControl() &&\n !e.defaultPrevented\n ) {\n if (this.isActive() && this.__dragStartSelection) {\n // drag source trying to drop over itself\n // allow dropping only outside of drag start selection\n const index = this.target.getSelectionStartFromPointer(e);\n const dragStartSelection = this.__dragStartSelection;\n return (\n index < dragStartSelection.selectionStart ||\n index > dragStartSelection.selectionEnd\n );\n }\n return true;\n }\n return false;\n }\n\n /**\n * in order to respect overriding {@link IText#canDrop} we call that instead of calling {@link canDrop} directly\n */\n protected targetCanDrop(e: DragEvent) {\n return this.target.canDrop(e);\n }\n\n dragEnterHandler({ e }: DragEventData) {\n const canDrop = this.targetCanDrop(e);\n if (!this.__isDraggingOver && canDrop) {\n this.__isDraggingOver = true;\n }\n }\n\n dragOverHandler(ev: DragEventData) {\n const { e } = ev;\n const canDrop = this.targetCanDrop(e);\n if (!this.__isDraggingOver && canDrop) {\n this.__isDraggingOver = true;\n } else if (this.__isDraggingOver && !canDrop) {\n // drop state has changed\n this.__isDraggingOver = false;\n }\n if (this.__isDraggingOver) {\n // can be dropped, inform browser\n e.preventDefault();\n // inform event subscribers\n ev.canDrop = true;\n ev.dropTarget = this.target;\n }\n }\n\n dragLeaveHandler() {\n if (this.__isDraggingOver || this.isActive()) {\n this.__isDraggingOver = false;\n }\n }\n\n /**\n * Override the `text/plain | application/fabric` types of {@link DragEvent#dataTransfer}\n * in order to change the drop value or to customize styling respectively, by listening to the `drop:before` event\n * https://developer.mozilla.org/en-US/docs/Web/API/HTML_Drag_and_Drop_API/Drag_operations#performing_a_drop\n */\n dropHandler(ev: DropEventData) {\n const { e } = ev;\n const didDrop = e.defaultPrevented;\n this.__isDraggingOver = false;\n // inform browser that the drop has been accepted\n e.preventDefault();\n let insert = e.dataTransfer?.getData('text/plain');\n if (insert && !didDrop) {\n const target = this.target;\n const canvas = target.canvas!;\n let insertAt = target.getSelectionStartFromPointer(e);\n const { styles } = (\n e.dataTransfer!.types.includes('application/fabric')\n ? JSON.parse(e.dataTransfer!.getData('application/fabric'))\n : {}\n ) as { styles: TextStyleDeclaration[] };\n const trailing = insert[Math.max(0, insert.length - 1)];\n const selectionStartOffset = 0;\n // drag and drop in same instance\n if (this.__dragStartSelection) {\n const selectionStart = this.__dragStartSelection.selectionStart;\n const selectionEnd = this.__dragStartSelection.selectionEnd;\n if (insertAt > selectionStart && insertAt <= selectionEnd) {\n insertAt = selectionStart;\n } else if (insertAt > selectionEnd) {\n insertAt -= selectionEnd - selectionStart;\n }\n target.removeChars(selectionStart, selectionEnd);\n // prevent `dragend` from handling event\n delete this.__dragStartSelection;\n }\n // remove redundant line break\n if (\n target._reNewline.test(trailing) &&\n (target._reNewline.test(target._text[insertAt]) ||\n insertAt === target._text.length)\n ) {\n insert = insert.trimEnd();\n }\n // inform subscribers\n ev.didDrop = true;\n ev.dropTarget = target;\n // finalize\n target.insertChars(insert, styles, insertAt);\n // can this part be moved in an outside event? andrea to check.\n canvas.setActiveObject(target);\n target.enterEditing(e);\n target.selectionStart = Math.min(\n insertAt + selectionStartOffset,\n target._text.length,\n );\n target.selectionEnd = Math.min(\n target.selectionStart + insert.length,\n target._text.length,\n );\n target.hiddenTextarea!.value = target.text;\n target._updateTextarea();\n target.hiddenTextarea!.focus();\n target.fire(CHANGED, {\n index: insertAt + selectionStartOffset,\n action: 'drop',\n });\n canvas.fire('text:changed', { target });\n canvas.contextTopDirty = true;\n canvas.requestRenderAll();\n }\n }\n\n /**\n * fired only on the drag source after drop (if occurred)\n * handle changes to the drag source in case of a drop on another object or a cancellation\n * https://developer.mozilla.org/en-US/docs/Web/API/HTML_Drag_and_Drop_API/Drag_operations#finishing_a_drag\n */\n dragEndHandler({ e }: DragEventData) {\n if (this.isActive() && this.__dragStartFired) {\n // once the drop event finishes we check if we need to change the drag source\n // if the drag source received the drop we bail out since the drop handler has already handled logic\n if (this.__dragStartSelection) {\n const target = this.target;\n const canvas = this.target.canvas!;\n const { selectionStart, selectionEnd } = this.__dragStartSelection;\n const dropEffect = e.dataTransfer?.dropEffect || NONE;\n if (dropEffect === NONE) {\n // pointer is back over selection\n target.selectionStart = selectionStart;\n target.selectionEnd = selectionEnd;\n target._updateTextarea();\n target.hiddenTextarea!.focus();\n } else {\n target.clearContextTop();\n if (dropEffect === 'move') {\n target.removeChars(selectionStart, selectionEnd);\n target.selectionStart = target.selectionEnd = selectionStart;\n target.hiddenTextarea &&\n (target.hiddenTextarea.value = target.text);\n target._updateTextarea();\n target.fire(CHANGED, {\n index: selectionStart,\n action: 'dragend',\n });\n canvas.fire('text:changed', { target });\n canvas.requestRenderAll();\n }\n target.exitEditing();\n }\n }\n }\n\n this.__dragImageDisposer && this.__dragImageDisposer();\n delete this.__dragImageDisposer;\n delete this.__dragStartSelection;\n this.__isDraggingOver = false;\n }\n\n dispose() {\n this._dispose && this._dispose();\n }\n}\n"],"names":["DraggableTextDelegate","constructor","target","_defineProperty","disposers","on","dragEnterHandler","bind","dragOverHandler","dragLeaveHandler","dragEndHandler","dropHandler","_dispose","forEach","d","undefined","isPointerOverSelection","e","newSelection","getSelectionStartFromPointer","isEditing","selectionStart","selectionEnd","start","__mouseDownInPlace","isActive","end","active","__dragStartFired","setCursorByClick","initDelayedCursor","__isDraggingOver","getDragStartSelection","__dragStartSelection","setDragImage","_ref","_e$dataTransfer","canvas","flipFactor","Point","flipX","flipY","boundaries","_getCursorBoundaries","selectionPosition","left","leftOffset","top","topOffset","multiply","pos","transform","calcTransformMatrix","pointer","getScenePoint","diff","subtract","retinaScaling","getCanvasRetinaScaling","bbox","getBoundingRect","correction","vpt","viewportTransform","offset","add","bgc","backgroundColor","styles","cloneStyles","styleOverride","stroke","fill","textBackgroundColor","setSelectionStyles","text","length","dirty","dragImage","toCanvasElement","enableRetinaScaling","setStyle","position","concat","width","border","NONE","height","__dragImageDisposer","remove","getDocumentFromElement","hiddenTextarea","body","appendChild","dataTransfer","x","y","onDragStart","selection","value","_text","slice","join","data","_objectSpread","setData","JSON","stringify","getSelectionStyles","effectAllowed","abortCursorAnimation","canDrop","editable","getActiveControl","defaultPrevented","index","dragStartSelection","targetCanDrop","_ref2","ev","preventDefault","dropTarget","_e$dataTransfer2","didDrop","insert","getData","insertAt","types","includes","parse","trailing","Math","max","selectionStartOffset","removeChars","_reNewline","test","trimEnd","insertChars","setActiveObject","enterEditing","min","_updateTextarea","focus","fire","CHANGED","action","contextTopDirty","requestRenderAll","_ref3","_e$dataTransfer3","dropEffect","clearContextTop","exitEditing","dispose"],"mappings":"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"}