UNPKG

fabric

Version:

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

1 lines 15 kB
{"version":3,"file":"ITextClickBehavior.mjs","sources":["../../../../src/shapes/IText/ITextClickBehavior.ts"],"sourcesContent":["import type {\n ObjectPointerEvents,\n TPointerEvent,\n TPointerEventInfo,\n} from '../../EventTypeDefs';\nimport { Point } from '../../Point';\nimport { invertTransform } from '../../util/misc/matrix';\nimport { DraggableTextDelegate } from './DraggableTextDelegate';\nimport type { ITextEvents } from './ITextBehavior';\nimport { ITextKeyBehavior } from './ITextKeyBehavior';\nimport type { TOptions } from '../../typedefs';\nimport type { TextProps, SerializedTextProps } from '../Text/Text';\nimport type { IText } from './IText';\n/**\n * `LEFT_CLICK === 0`\n */\nconst notALeftClick = (e: Event) => !!(e as MouseEvent).button;\n\nexport abstract class ITextClickBehavior<\n Props extends TOptions<TextProps> = Partial<TextProps>,\n SProps extends SerializedTextProps = SerializedTextProps,\n EventSpec extends ITextEvents = ITextEvents,\n> extends ITextKeyBehavior<Props, SProps, EventSpec> {\n protected draggableTextDelegate: DraggableTextDelegate;\n\n initBehavior() {\n // Initializes event handlers related to cursor or selection\n this.on('mousedown', this._mouseDownHandler);\n this.on('mouseup', this.mouseUpHandler);\n this.on('mousedblclick', this.doubleClickHandler);\n this.on('mousetripleclick', this.tripleClickHandler);\n\n this.draggableTextDelegate = new DraggableTextDelegate(\n this as unknown as IText,\n );\n\n super.initBehavior();\n }\n\n /**\n * If this method returns true a mouse move operation over a text selection\n * will not prevent the native mouse event allowing the browser to start a drag operation.\n * shouldStartDragging can be read 'do not prevent default for mouse move event'\n * To prevent drag and drop between objects both shouldStartDragging and onDragStart should return false\n * @returns\n */\n shouldStartDragging() {\n return this.draggableTextDelegate.isActive();\n }\n\n /**\n * @public override this method to control whether instance should/shouldn't become a drag source,\n * @see also {@link DraggableTextDelegate#isActive}\n * To prevent drag and drop between objects both shouldStartDragging and onDragStart should return false\n * @returns {boolean} should handle event\n */\n onDragStart(e: DragEvent) {\n return this.draggableTextDelegate.onDragStart(e);\n }\n\n /**\n * @public override this method to control whether instance should/shouldn't become a drop target\n */\n canDrop(e: DragEvent) {\n return this.draggableTextDelegate.canDrop(e);\n }\n\n /**\n * Default handler for double click, select a word\n */\n doubleClickHandler(options: TPointerEventInfo) {\n if (!this.isEditing) {\n return;\n }\n this.selectWord(this.getSelectionStartFromPointer(options.e));\n this.renderCursorOrSelection();\n }\n\n /**\n * Default handler for triple click, select a line\n */\n tripleClickHandler(options: TPointerEventInfo) {\n if (!this.isEditing) {\n return;\n }\n this.selectLine(this.getSelectionStartFromPointer(options.e));\n this.renderCursorOrSelection();\n }\n\n /**\n * Default event handler for the basic functionalities needed on _mouseDown\n * can be overridden to do something different.\n * Scope of this implementation is: find the click position, set selectionStart\n * find selectionEnd, initialize the drawing of either cursor or selection area\n * initializing a mousedDown on a text area will cancel fabricjs knowledge of\n * current compositionMode. It will be set to false.\n */\n _mouseDownHandler({ e, alreadySelected }: ObjectPointerEvents['mousedown']) {\n if (\n !this.canvas ||\n !this.editable ||\n notALeftClick(e) ||\n this.getActiveControl()\n ) {\n return;\n }\n\n if (this.draggableTextDelegate.start(e)) {\n return;\n }\n\n this.canvas.textEditingManager.register(this);\n\n if (alreadySelected) {\n this.inCompositionMode = false;\n this.setCursorByClick(e);\n }\n\n if (this.isEditing) {\n this.__selectionStartOnMouseDown = this.selectionStart;\n if (this.selectionStart === this.selectionEnd) {\n this.abortCursorAnimation();\n }\n this.renderCursorOrSelection();\n }\n this.selected ||= alreadySelected || this.isEditing;\n }\n\n /**\n * standard handler for mouse up, overridable\n * @private\n */\n mouseUpHandler({ e, transform }: ObjectPointerEvents['mouseup']) {\n const didDrag = this.draggableTextDelegate.end(e);\n\n if (this.canvas) {\n this.canvas.textEditingManager.unregister(this);\n\n const activeObject = this.canvas._activeObject;\n if (activeObject && activeObject !== this) {\n // avoid running this logic when there is an active object\n // this because is possible with shift click and fast clicks,\n // to rapidly deselect and reselect this object and trigger an enterEdit\n return;\n }\n }\n\n if (\n !this.editable ||\n (this.group && !this.group.interactive) ||\n (transform && transform.actionPerformed) ||\n notALeftClick(e) ||\n didDrag\n ) {\n return;\n }\n\n if (this.selected && !this.getActiveControl()) {\n this.enterEditing(e);\n if (this.selectionStart === this.selectionEnd) {\n this.initDelayedCursor(true);\n } else {\n this.renderCursorOrSelection();\n }\n }\n }\n\n /**\n * Changes cursor location in a text depending on passed pointer (x/y) object\n * @param {TPointerEvent} e Event object\n */\n setCursorByClick(e: TPointerEvent) {\n const newSelection = this.getSelectionStartFromPointer(e),\n start = this.selectionStart,\n end = this.selectionEnd;\n if (e.shiftKey) {\n this.setSelectionStartEndWithShift(start, end, newSelection);\n } else {\n this.selectionStart = newSelection;\n this.selectionEnd = newSelection;\n }\n if (this.isEditing) {\n this._fireSelectionChanged();\n this._updateTextarea();\n }\n }\n\n /**\n * Returns index of a character corresponding to where an object was clicked\n * @param {TPointerEvent} e Event object\n * @return {Number} Index of a character\n */\n getSelectionStartFromPointer(e: TPointerEvent): number {\n const mouseOffset = this.canvas!.getScenePoint(e)\n .transform(invertTransform(this.calcTransformMatrix()))\n .add(new Point(-this._getLeftOffset(), -this._getTopOffset()));\n let height = 0,\n charIndex = 0,\n lineIndex = 0;\n\n for (let i = 0; i < this._textLines.length; i++) {\n if (height <= mouseOffset.y) {\n height += this.getHeightOfLine(i);\n lineIndex = i;\n if (i > 0) {\n charIndex +=\n this._textLines[i - 1].length + this.missingNewlineOffset(i - 1);\n }\n } else {\n break;\n }\n }\n const lineLeftOffset = Math.abs(this._getLineLeftOffset(lineIndex));\n let width = lineLeftOffset;\n const charLength = this._textLines[lineIndex].length;\n const chars = this.__charBounds[lineIndex];\n for (let j = 0; j < charLength; j++) {\n // i removed something about flipX here, check.\n const charWidth = chars[j].kernedWidth;\n const widthAfter = width + charWidth;\n if (mouseOffset.x <= widthAfter) {\n // if the pointer is closer to the end of the char we increment charIndex\n // in order to position the cursor after the char\n if (\n Math.abs(mouseOffset.x - widthAfter) <=\n Math.abs(mouseOffset.x - width)\n ) {\n charIndex++;\n }\n break;\n }\n width = widthAfter;\n charIndex++;\n }\n\n return Math.min(\n // if object is horizontally flipped, mirror cursor location from the end\n this.flipX ? charLength - charIndex : charIndex,\n this._text.length,\n );\n }\n}\n"],"names":["notALeftClick","e","button","ITextClickBehavior","ITextKeyBehavior","constructor","arguments","_defineProperty","initBehavior","on","_mouseDownHandler","mouseUpHandler","doubleClickHandler","tripleClickHandler","draggableTextDelegate","DraggableTextDelegate","shouldStartDragging","isActive","onDragStart","canDrop","options","isEditing","selectWord","getSelectionStartFromPointer","renderCursorOrSelection","selectLine","_ref","alreadySelected","canvas","editable","getActiveControl","start","textEditingManager","register","inCompositionMode","setCursorByClick","__selectionStartOnMouseDown","selectionStart","selectionEnd","abortCursorAnimation","selected","_ref2","transform","didDrag","end","unregister","activeObject","_activeObject","group","interactive","actionPerformed","enterEditing","initDelayedCursor","newSelection","shiftKey","setSelectionStartEndWithShift","_fireSelectionChanged","_updateTextarea","mouseOffset","getScenePoint","invertTransform","calcTransformMatrix","add","Point","_getLeftOffset","_getTopOffset","height","charIndex","lineIndex","i","_textLines","length","y","getHeightOfLine","missingNewlineOffset","lineLeftOffset","Math","abs","_getLineLeftOffset","width","charLength","chars","__charBounds","j","charWidth","kernedWidth","widthAfter","x","min","flipX","_text"],"mappings":"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"}