fabric 6.0.0 → 6.0.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +12 -0
- package/README.md +8 -18
- package/dist/fabric.d.ts +4 -0
- package/dist/fabric.d.ts.map +1 -1
- package/dist/fabric.min.mjs +1 -1
- package/dist/fabric.mjs +1 -0
- package/dist/fabric.mjs.map +1 -1
- package/dist/index.js +146 -107
- package/dist/index.js.map +1 -1
- package/dist/index.min.js +1 -1
- package/dist/index.min.js.map +1 -1
- package/dist/index.min.mjs +1 -1
- package/dist/index.min.mjs.map +1 -1
- package/dist/index.mjs +146 -108
- package/dist/index.mjs.map +1 -1
- package/dist/index.node.cjs +146 -107
- package/dist/index.node.cjs.map +1 -1
- package/dist/index.node.mjs +146 -108
- package/dist/index.node.mjs.map +1 -1
- package/dist/package.json.min.mjs +1 -1
- package/dist/package.json.mjs +1 -1
- package/dist/src/EventTypeDefs.d.ts +2 -1
- package/dist/src/EventTypeDefs.d.ts.map +1 -1
- package/dist/src/LayoutManager/LayoutManager.d.ts.map +1 -1
- package/dist/src/LayoutManager/LayoutManager.min.mjs +1 -1
- package/dist/src/LayoutManager/LayoutManager.min.mjs.map +1 -1
- package/dist/src/LayoutManager/LayoutManager.mjs +13 -8
- package/dist/src/LayoutManager/LayoutManager.mjs.map +1 -1
- package/dist/src/LayoutManager/LayoutStrategies/ClipPathLayout.min.mjs +1 -1
- package/dist/src/LayoutManager/LayoutStrategies/ClipPathLayout.min.mjs.map +1 -1
- package/dist/src/LayoutManager/LayoutStrategies/ClipPathLayout.mjs +3 -3
- package/dist/src/LayoutManager/LayoutStrategies/ClipPathLayout.mjs.map +1 -1
- package/dist/src/LayoutManager/LayoutStrategies/LayoutStrategy.d.ts +1 -1
- package/dist/src/LayoutManager/LayoutStrategies/LayoutStrategy.d.ts.map +1 -1
- package/dist/src/LayoutManager/LayoutStrategies/LayoutStrategy.min.mjs +1 -1
- package/dist/src/LayoutManager/LayoutStrategies/LayoutStrategy.min.mjs.map +1 -1
- package/dist/src/LayoutManager/LayoutStrategies/LayoutStrategy.mjs +15 -9
- package/dist/src/LayoutManager/LayoutStrategies/LayoutStrategy.mjs.map +1 -1
- package/dist/src/Observable.d.ts +8 -0
- package/dist/src/Observable.d.ts.map +1 -1
- package/dist/src/Observable.min.mjs.map +1 -1
- package/dist/src/Observable.mjs +8 -0
- package/dist/src/Observable.mjs.map +1 -1
- package/dist/src/canvas/SelectableCanvas.d.ts.map +1 -1
- package/dist/src/canvas/SelectableCanvas.min.mjs +1 -1
- package/dist/src/canvas/SelectableCanvas.min.mjs.map +1 -1
- package/dist/src/canvas/SelectableCanvas.mjs +5 -5
- package/dist/src/canvas/SelectableCanvas.mjs.map +1 -1
- package/dist/src/canvas/StaticCanvas.d.ts +1 -1
- package/dist/src/constants.d.ts +16 -0
- package/dist/src/constants.d.ts.map +1 -1
- package/dist/src/constants.min.mjs +1 -1
- package/dist/src/constants.min.mjs.map +1 -1
- package/dist/src/constants.mjs +17 -1
- package/dist/src/constants.mjs.map +1 -1
- package/dist/src/controls/Control.d.ts.map +1 -1
- package/dist/src/controls/Control.min.mjs +1 -1
- package/dist/src/controls/Control.min.mjs.map +1 -1
- package/dist/src/controls/Control.mjs +2 -1
- package/dist/src/controls/Control.mjs.map +1 -1
- package/dist/src/controls/changeWidth.min.mjs +1 -1
- package/dist/src/controls/changeWidth.min.mjs.map +1 -1
- package/dist/src/controls/changeWidth.mjs +2 -2
- package/dist/src/controls/changeWidth.mjs.map +1 -1
- package/dist/src/controls/commonControls.d.ts.map +1 -1
- package/dist/src/controls/commonControls.min.mjs +1 -1
- package/dist/src/controls/commonControls.min.mjs.map +1 -1
- package/dist/src/controls/commonControls.mjs +4 -3
- package/dist/src/controls/commonControls.mjs.map +1 -1
- package/dist/src/controls/controlRendering.min.mjs +1 -1
- package/dist/src/controls/controlRendering.min.mjs.map +1 -1
- package/dist/src/controls/controlRendering.mjs +3 -3
- package/dist/src/controls/controlRendering.mjs.map +1 -1
- package/dist/src/controls/drag.min.mjs +1 -1
- package/dist/src/controls/drag.min.mjs.map +1 -1
- package/dist/src/controls/drag.mjs +2 -2
- package/dist/src/controls/drag.mjs.map +1 -1
- package/dist/src/controls/polyControl.d.ts.map +1 -1
- package/dist/src/controls/polyControl.min.mjs +1 -1
- package/dist/src/controls/polyControl.min.mjs.map +1 -1
- package/dist/src/controls/polyControl.mjs +2 -1
- package/dist/src/controls/polyControl.mjs.map +1 -1
- package/dist/src/controls/rotate.d.ts.map +1 -1
- package/dist/src/controls/rotate.min.mjs +1 -1
- package/dist/src/controls/rotate.min.mjs.map +1 -1
- package/dist/src/controls/rotate.mjs +2 -1
- package/dist/src/controls/rotate.mjs.map +1 -1
- package/dist/src/controls/scale.d.ts.map +1 -1
- package/dist/src/controls/scale.min.mjs +1 -1
- package/dist/src/controls/scale.min.mjs.map +1 -1
- package/dist/src/controls/scale.mjs +8 -7
- package/dist/src/controls/scale.mjs.map +1 -1
- package/dist/src/controls/scaleSkew.d.ts.map +1 -1
- package/dist/src/controls/scaleSkew.min.mjs +1 -1
- package/dist/src/controls/scaleSkew.min.mjs.map +1 -1
- package/dist/src/controls/scaleSkew.mjs +3 -2
- package/dist/src/controls/scaleSkew.mjs.map +1 -1
- package/dist/src/controls/skew.d.ts.map +1 -1
- package/dist/src/controls/skew.min.mjs +1 -1
- package/dist/src/controls/skew.min.mjs.map +1 -1
- package/dist/src/controls/skew.mjs +7 -7
- package/dist/src/controls/skew.mjs.map +1 -1
- package/dist/src/filters/Blur.min.mjs +1 -1
- package/dist/src/filters/Blur.min.mjs.map +1 -1
- package/dist/src/filters/Blur.mjs +1 -1
- package/dist/src/filters/Blur.mjs.map +1 -1
- package/dist/src/filters/Pixelate.min.mjs +1 -1
- package/dist/src/filters/Pixelate.min.mjs.map +1 -1
- package/dist/src/filters/Pixelate.mjs +1 -1
- package/dist/src/filters/Pixelate.mjs.map +1 -1
- package/dist/src/parser/attributes.d.ts.map +1 -1
- package/dist/src/parser/attributes.min.mjs +1 -1
- package/dist/src/parser/attributes.min.mjs.map +1 -1
- package/dist/src/parser/attributes.mjs +3 -1
- package/dist/src/parser/attributes.mjs.map +1 -1
- package/dist/src/parser/elements_parser.min.mjs +1 -1
- package/dist/src/parser/elements_parser.min.mjs.map +1 -1
- package/dist/src/parser/elements_parser.mjs +3 -3
- package/dist/src/parser/elements_parser.mjs.map +1 -1
- package/dist/src/parser/normalizeValue.min.mjs +1 -1
- package/dist/src/parser/normalizeValue.min.mjs.map +1 -1
- package/dist/src/parser/normalizeValue.mjs +7 -7
- package/dist/src/parser/normalizeValue.mjs.map +1 -1
- package/dist/src/parser/parseTransformAttribute.min.mjs +1 -1
- package/dist/src/parser/parseTransformAttribute.min.mjs.map +1 -1
- package/dist/src/parser/parseTransformAttribute.mjs +5 -5
- package/dist/src/parser/parseTransformAttribute.mjs.map +1 -1
- package/dist/src/shapes/Circle.d.ts.map +1 -1
- package/dist/src/shapes/Circle.min.mjs +1 -1
- package/dist/src/shapes/Circle.min.mjs.map +1 -1
- package/dist/src/shapes/Circle.mjs +3 -2
- package/dist/src/shapes/Circle.mjs.map +1 -1
- package/dist/src/shapes/Ellipse.min.mjs +1 -1
- package/dist/src/shapes/Ellipse.min.mjs.map +1 -1
- package/dist/src/shapes/Ellipse.mjs +3 -3
- package/dist/src/shapes/Ellipse.mjs.map +1 -1
- package/dist/src/shapes/IText/DraggableTextDelegate.min.mjs +1 -1
- package/dist/src/shapes/IText/DraggableTextDelegate.min.mjs.map +1 -1
- package/dist/src/shapes/IText/DraggableTextDelegate.mjs +3 -3
- package/dist/src/shapes/IText/DraggableTextDelegate.mjs.map +1 -1
- package/dist/src/shapes/IText/IText.min.mjs +1 -1
- package/dist/src/shapes/IText/IText.min.mjs.map +1 -1
- package/dist/src/shapes/IText/IText.mjs +3 -3
- package/dist/src/shapes/IText/IText.mjs.map +1 -1
- package/dist/src/shapes/IText/ITextBehavior.min.mjs +1 -1
- package/dist/src/shapes/IText/ITextBehavior.min.mjs.map +1 -1
- package/dist/src/shapes/IText/ITextBehavior.mjs +2 -2
- package/dist/src/shapes/IText/ITextBehavior.mjs.map +1 -1
- package/dist/src/shapes/IText/ITextKeyBehavior.min.mjs +1 -1
- package/dist/src/shapes/IText/ITextKeyBehavior.min.mjs.map +1 -1
- package/dist/src/shapes/IText/ITextKeyBehavior.mjs +2 -2
- package/dist/src/shapes/IText/ITextKeyBehavior.mjs.map +1 -1
- package/dist/src/shapes/Image.min.mjs +1 -1
- package/dist/src/shapes/Image.min.mjs.map +1 -1
- package/dist/src/shapes/Image.mjs +2 -2
- package/dist/src/shapes/Image.mjs.map +1 -1
- package/dist/src/shapes/Object/AnimatableObject.d.ts.map +1 -1
- package/dist/src/shapes/Object/AnimatableObject.min.mjs +1 -1
- package/dist/src/shapes/Object/AnimatableObject.min.mjs.map +1 -1
- package/dist/src/shapes/Object/AnimatableObject.mjs +2 -1
- package/dist/src/shapes/Object/AnimatableObject.mjs.map +1 -1
- package/dist/src/shapes/Object/FabricObjectSVGExportMixin.d.ts.map +1 -1
- package/dist/src/shapes/Object/FabricObjectSVGExportMixin.min.mjs +1 -1
- package/dist/src/shapes/Object/FabricObjectSVGExportMixin.min.mjs.map +1 -1
- package/dist/src/shapes/Object/FabricObjectSVGExportMixin.mjs +4 -4
- package/dist/src/shapes/Object/FabricObjectSVGExportMixin.mjs.map +1 -1
- package/dist/src/shapes/Object/InteractiveObject.d.ts.map +1 -1
- package/dist/src/shapes/Object/InteractiveObject.min.mjs +1 -1
- package/dist/src/shapes/Object/InteractiveObject.min.mjs.map +1 -1
- package/dist/src/shapes/Object/InteractiveObject.mjs +2 -1
- package/dist/src/shapes/Object/InteractiveObject.mjs.map +1 -1
- package/dist/src/shapes/Object/Object.d.ts +9 -7
- package/dist/src/shapes/Object/Object.d.ts.map +1 -1
- package/dist/src/shapes/Object/Object.min.mjs +1 -1
- package/dist/src/shapes/Object/Object.min.mjs.map +1 -1
- package/dist/src/shapes/Object/Object.mjs +14 -12
- package/dist/src/shapes/Object/Object.mjs.map +1 -1
- package/dist/src/shapes/Object/ObjectGeometry.min.mjs +1 -1
- package/dist/src/shapes/Object/ObjectGeometry.min.mjs.map +1 -1
- package/dist/src/shapes/Object/ObjectGeometry.mjs +3 -3
- package/dist/src/shapes/Object/ObjectGeometry.mjs.map +1 -1
- package/dist/src/shapes/Object/defaultValues.d.ts.map +1 -1
- package/dist/src/shapes/Object/defaultValues.min.mjs +1 -1
- package/dist/src/shapes/Object/defaultValues.min.mjs.map +1 -1
- package/dist/src/shapes/Object/defaultValues.mjs +4 -4
- package/dist/src/shapes/Object/defaultValues.mjs.map +1 -1
- package/dist/src/shapes/Object/types/ControlProps.d.ts +4 -3
- package/dist/src/shapes/Object/types/ControlProps.d.ts.map +1 -1
- package/dist/src/shapes/Polyline.d.ts.map +1 -1
- package/dist/src/shapes/Polyline.min.mjs +1 -1
- package/dist/src/shapes/Polyline.min.mjs.map +1 -1
- package/dist/src/shapes/Polyline.mjs +3 -3
- package/dist/src/shapes/Polyline.mjs.map +1 -1
- package/dist/src/shapes/Text/Text.d.ts +2 -2
- package/dist/src/shapes/Text/Text.d.ts.map +1 -1
- package/dist/src/shapes/Text/Text.min.mjs +1 -1
- package/dist/src/shapes/Text/Text.min.mjs.map +1 -1
- package/dist/src/shapes/Text/Text.mjs +5 -5
- package/dist/src/shapes/Text/Text.mjs.map +1 -1
- package/dist/src/shapes/Text/TextSVGExportMixin.d.ts.map +1 -1
- package/dist/src/shapes/Text/TextSVGExportMixin.min.mjs +1 -1
- package/dist/src/shapes/Text/TextSVGExportMixin.min.mjs.map +1 -1
- package/dist/src/shapes/Text/TextSVGExportMixin.mjs +2 -1
- package/dist/src/shapes/Text/TextSVGExportMixin.mjs.map +1 -1
- package/dist/src/shapes/Text/constants.min.mjs +1 -1
- package/dist/src/shapes/Text/constants.min.mjs.map +1 -1
- package/dist/src/shapes/Text/constants.mjs +2 -2
- package/dist/src/shapes/Text/constants.mjs.map +1 -1
- package/dist/src/util/misc/objectEnlive.d.ts +1 -0
- package/dist/src/util/misc/objectEnlive.d.ts.map +1 -1
- package/dist/src/util/misc/objectEnlive.min.mjs.map +1 -1
- package/dist/src/util/misc/objectEnlive.mjs +1 -0
- package/dist/src/util/misc/objectEnlive.mjs.map +1 -1
- package/dist/src/util/misc/svgParsing.min.mjs +1 -1
- package/dist/src/util/misc/svgParsing.min.mjs.map +1 -1
- package/dist/src/util/misc/svgParsing.mjs +2 -2
- package/dist/src/util/misc/svgParsing.mjs.map +1 -1
- package/dist/src/util/transform_matrix_removal.min.mjs +1 -1
- package/dist/src/util/transform_matrix_removal.min.mjs.map +1 -1
- package/dist/src/util/transform_matrix_removal.mjs +3 -3
- package/dist/src/util/transform_matrix_removal.mjs.map +1 -1
- package/fabric.ts +4 -0
- package/package.json +1 -1
- package/src/EventTypeDefs.ts +14 -6
- package/src/LayoutManager/LayoutManager.ts +28 -19
- package/src/LayoutManager/LayoutStrategies/ClipPathLayout.ts +2 -2
- package/src/LayoutManager/LayoutStrategies/LayoutStrategy.ts +7 -7
- package/src/Observable.ts +8 -0
- package/src/canvas/SelectableCanvas.ts +25 -11
- package/src/canvas/canvas_gestures.mixin.ts +6 -5
- package/src/constants.ts +17 -0
- package/src/controls/Control.ts +2 -1
- package/src/controls/changeWidth.ts +2 -2
- package/src/controls/commonControls.ts +4 -3
- package/src/controls/controlRendering.ts +3 -3
- package/src/controls/drag.ts +2 -2
- package/src/controls/polyControl.ts +2 -1
- package/src/controls/rotate.ts +2 -1
- package/src/controls/scale.ts +8 -7
- package/src/controls/scaleSkew.ts +3 -2
- package/src/controls/skew.ts +14 -7
- package/src/filters/Blur.ts +1 -1
- package/src/filters/Pixelate.ts +1 -1
- package/src/parser/attributes.ts +4 -2
- package/src/parser/elements_parser.ts +3 -3
- package/src/parser/normalizeValue.ts +7 -7
- package/src/parser/parseTransformAttribute.ts +5 -5
- package/src/shapes/Circle.ts +3 -2
- package/src/shapes/Ellipse.ts +3 -3
- package/src/shapes/IText/DraggableTextDelegate.ts +3 -3
- package/src/shapes/IText/IText.ts +3 -3
- package/src/shapes/IText/ITextBehavior.ts +2 -2
- package/src/shapes/IText/ITextKeyBehavior.ts +2 -2
- package/src/shapes/Image.ts +2 -2
- package/src/shapes/Object/AnimatableObject.ts +2 -1
- package/src/shapes/Object/FabricObjectSVGExportMixin.ts +4 -6
- package/src/shapes/Object/InteractiveObject.ts +2 -1
- package/src/shapes/Object/Object.ts +16 -11
- package/src/shapes/Object/ObjectGeometry.ts +3 -3
- package/src/shapes/Object/defaultValues.ts +17 -8
- package/src/shapes/Object/types/ControlProps.ts +4 -3
- package/src/shapes/Polyline.spec.ts +0 -1
- package/src/shapes/Polyline.ts +12 -4
- package/src/shapes/Text/Text.ts +7 -7
- package/src/shapes/Text/TextSVGExportMixin.ts +3 -2
- package/src/shapes/Text/constants.ts +3 -3
- package/src/util/misc/objectEnlive.ts +1 -0
- package/src/util/misc/svgParsing.ts +2 -2
- package/src/util/transform_matrix_removal.ts +3 -3
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Ellipse.mjs","sources":["../../../src/shapes/Ellipse.ts"],"sourcesContent":["import { twoMathPi } from '../constants';\nimport { SHARED_ATTRIBUTES } from '../parser/attributes';\nimport { parseAttributes } from '../parser/parseAttributes';\nimport type { Abortable, TClassProperties, TOptions } from '../typedefs';\nimport { classRegistry } from '../ClassRegistry';\nimport { FabricObject, cacheProperties } from './Object/FabricObject';\nimport type { FabricObjectProps, SerializedObjectProps } from './Object/types';\nimport type { ObjectEvents } from '../EventTypeDefs';\nimport type { CSSRules } from '../parser/typedefs';\n\nexport const ellipseDefaultValues: Partial<TClassProperties<Ellipse>> = {\n rx: 0,\n ry: 0,\n};\n\ninterface UniqueEllipseProps {\n rx: number;\n ry: number;\n}\n\nexport interface SerializedEllipseProps\n extends SerializedObjectProps,\n UniqueEllipseProps {}\n\nexport interface EllipseProps extends FabricObjectProps, UniqueEllipseProps {}\n\nconst ELLIPSE_PROPS = ['rx', 'ry'] as const;\n\nexport class Ellipse<\n Props extends TOptions<EllipseProps> = Partial<EllipseProps>,\n SProps extends SerializedEllipseProps = SerializedEllipseProps,\n EventSpec extends ObjectEvents = ObjectEvents\n >\n extends FabricObject<Props, SProps, EventSpec>\n implements EllipseProps\n{\n /**\n * Horizontal radius\n * @type Number\n * @default\n */\n declare rx: number;\n\n /**\n * Vertical radius\n * @type Number\n * @default\n */\n declare ry: number;\n\n static type = 'Ellipse';\n\n static cacheProperties = [...cacheProperties, ...ELLIPSE_PROPS];\n\n static ownDefaults = ellipseDefaultValues;\n\n static getDefaults(): Record<string, any> {\n return {\n ...super.getDefaults(),\n ...Ellipse.ownDefaults,\n };\n }\n\n /**\n * Constructor\n * @param {Object} [options] Options object\n */\n constructor(options?: Props) {\n super();\n Object.assign(this, Ellipse.ownDefaults);\n this.setOptions(options);\n }\n\n /**\n * @private\n * @param {String} key\n * @param {*} value\n * @return {Ellipse} thisArg\n */\n _set(key: string, value: any) {\n super._set(key, value);\n switch (key) {\n case 'rx':\n this.rx = value;\n this.set('width', value * 2);\n break;\n\n case 'ry':\n this.ry = value;\n this.set('height', value * 2);\n break;\n }\n return this;\n }\n\n /**\n * Returns horizontal radius of an object (according to how an object is scaled)\n * @return {Number}\n */\n getRx() {\n return this.get('rx') * this.get(
|
|
1
|
+
{"version":3,"file":"Ellipse.mjs","sources":["../../../src/shapes/Ellipse.ts"],"sourcesContent":["import { SCALE_X, SCALE_Y, twoMathPi } from '../constants';\nimport { SHARED_ATTRIBUTES } from '../parser/attributes';\nimport { parseAttributes } from '../parser/parseAttributes';\nimport type { Abortable, TClassProperties, TOptions } from '../typedefs';\nimport { classRegistry } from '../ClassRegistry';\nimport { FabricObject, cacheProperties } from './Object/FabricObject';\nimport type { FabricObjectProps, SerializedObjectProps } from './Object/types';\nimport type { ObjectEvents } from '../EventTypeDefs';\nimport type { CSSRules } from '../parser/typedefs';\n\nexport const ellipseDefaultValues: Partial<TClassProperties<Ellipse>> = {\n rx: 0,\n ry: 0,\n};\n\ninterface UniqueEllipseProps {\n rx: number;\n ry: number;\n}\n\nexport interface SerializedEllipseProps\n extends SerializedObjectProps,\n UniqueEllipseProps {}\n\nexport interface EllipseProps extends FabricObjectProps, UniqueEllipseProps {}\n\nconst ELLIPSE_PROPS = ['rx', 'ry'] as const;\n\nexport class Ellipse<\n Props extends TOptions<EllipseProps> = Partial<EllipseProps>,\n SProps extends SerializedEllipseProps = SerializedEllipseProps,\n EventSpec extends ObjectEvents = ObjectEvents\n >\n extends FabricObject<Props, SProps, EventSpec>\n implements EllipseProps\n{\n /**\n * Horizontal radius\n * @type Number\n * @default\n */\n declare rx: number;\n\n /**\n * Vertical radius\n * @type Number\n * @default\n */\n declare ry: number;\n\n static type = 'Ellipse';\n\n static cacheProperties = [...cacheProperties, ...ELLIPSE_PROPS];\n\n static ownDefaults = ellipseDefaultValues;\n\n static getDefaults(): Record<string, any> {\n return {\n ...super.getDefaults(),\n ...Ellipse.ownDefaults,\n };\n }\n\n /**\n * Constructor\n * @param {Object} [options] Options object\n */\n constructor(options?: Props) {\n super();\n Object.assign(this, Ellipse.ownDefaults);\n this.setOptions(options);\n }\n\n /**\n * @private\n * @param {String} key\n * @param {*} value\n * @return {Ellipse} thisArg\n */\n _set(key: string, value: any) {\n super._set(key, value);\n switch (key) {\n case 'rx':\n this.rx = value;\n this.set('width', value * 2);\n break;\n\n case 'ry':\n this.ry = value;\n this.set('height', value * 2);\n break;\n }\n return this;\n }\n\n /**\n * Returns horizontal radius of an object (according to how an object is scaled)\n * @return {Number}\n */\n getRx() {\n return this.get('rx') * this.get(SCALE_X);\n }\n\n /**\n * Returns Vertical radius of an object (according to how an object is scaled)\n * @return {Number}\n */\n getRy() {\n return this.get('ry') * this.get(SCALE_Y);\n }\n\n /**\n * Returns object representation of an instance\n * @param {Array} [propertiesToInclude] Any properties that you might want to additionally include in the output\n * @return {Object} object representation of an instance\n */\n toObject<\n T extends Omit<Props & TClassProperties<this>, keyof SProps>,\n K extends keyof T = never\n >(propertiesToInclude: K[] = []): Pick<T, K> & SProps {\n return super.toObject([...ELLIPSE_PROPS, ...propertiesToInclude]);\n }\n\n /**\n * Returns svg representation of an instance\n * @return {Array} an array of strings with the specific svg representation\n * of the instance\n */\n _toSVG(): string[] {\n return [\n '<ellipse ',\n 'COMMON_PARTS',\n `cx=\"0\" cy=\"0\" rx=\"${this.rx}\" ry=\"${this.ry}\" />\\n`,\n ];\n }\n\n /**\n * @private\n * @param {CanvasRenderingContext2D} ctx context to render on\n */\n _render(ctx: CanvasRenderingContext2D) {\n ctx.beginPath();\n ctx.save();\n ctx.transform(1, 0, 0, this.ry / this.rx, 0, 0);\n ctx.arc(0, 0, this.rx, 0, twoMathPi, false);\n ctx.restore();\n this._renderPaintInOrder(ctx);\n }\n\n /* _FROM_SVG_START_ */\n\n /**\n * List of attribute names to account for when parsing SVG element (used by {@link Ellipse.fromElement})\n * @static\n * @memberOf Ellipse\n * @see http://www.w3.org/TR/SVG/shapes.html#EllipseElement\n */\n static ATTRIBUTE_NAMES = [...SHARED_ATTRIBUTES, 'cx', 'cy', 'rx', 'ry'];\n\n /**\n * Returns {@link Ellipse} instance from an SVG element\n * @static\n * @memberOf Ellipse\n * @param {HTMLElement} element Element to parse\n * @return {Ellipse}\n */\n static async fromElement(\n element: HTMLElement,\n options: Abortable,\n cssRules?: CSSRules\n ) {\n const parsedAttributes = parseAttributes(\n element,\n this.ATTRIBUTE_NAMES,\n cssRules\n );\n\n parsedAttributes.left = (parsedAttributes.left || 0) - parsedAttributes.rx;\n parsedAttributes.top = (parsedAttributes.top || 0) - parsedAttributes.ry;\n return new this(parsedAttributes);\n }\n\n /* _FROM_SVG_END_ */\n}\n\nclassRegistry.setClass(Ellipse);\nclassRegistry.setSVGClass(Ellipse);\n"],"names":["ellipseDefaultValues","rx","ry","ELLIPSE_PROPS","Ellipse","FabricObject","getDefaults","_objectSpread","ownDefaults","constructor","options","Object","assign","setOptions","_set","key","value","set","getRx","get","SCALE_X","getRy","SCALE_Y","toObject","propertiesToInclude","arguments","length","undefined","_toSVG","concat","_render","ctx","beginPath","save","transform","arc","twoMathPi","restore","_renderPaintInOrder","fromElement","element","cssRules","parsedAttributes","parseAttributes","ATTRIBUTE_NAMES","left","top","_defineProperty","cacheProperties","SHARED_ATTRIBUTES","classRegistry","setClass","setSVGClass"],"mappings":";;;;;;;;AAUO,MAAMA,oBAAwD,GAAG;AACtEC,EAAAA,EAAE,EAAE,CAAC;AACLC,EAAAA,EAAE,EAAE,CAAA;AACN,EAAC;AAaD,MAAMC,aAAa,GAAG,CAAC,IAAI,EAAE,IAAI,CAAU,CAAA;AAEpC,MAAMC,OAAO,SAKVC,YAAY,CAEtB;EAqBE,OAAOC,WAAWA,GAAwB;AACxC,IAAA,OAAAC,cAAA,CAAAA,cAAA,CAAA,EAAA,EACK,KAAK,CAACD,WAAW,EAAE,CAAA,EACnBF,OAAO,CAACI,WAAW,CAAA,CAAA;AAE1B,GAAA;;AAEA;AACF;AACA;AACA;EACEC,WAAWA,CAACC,OAAe,EAAE;AAC3B,IAAA,KAAK,EAAE,CAAA;IACPC,MAAM,CAACC,MAAM,CAAC,IAAI,EAAER,OAAO,CAACI,WAAW,CAAC,CAAA;AACxC,IAAA,IAAI,CAACK,UAAU,CAACH,OAAO,CAAC,CAAA;AAC1B,GAAA;;AAEA;AACF;AACA;AACA;AACA;AACA;AACEI,EAAAA,IAAIA,CAACC,GAAW,EAAEC,KAAU,EAAE;AAC5B,IAAA,KAAK,CAACF,IAAI,CAACC,GAAG,EAAEC,KAAK,CAAC,CAAA;AACtB,IAAA,QAAQD,GAAG;AACT,MAAA,KAAK,IAAI;QACP,IAAI,CAACd,EAAE,GAAGe,KAAK,CAAA;QACf,IAAI,CAACC,GAAG,CAAC,OAAO,EAAED,KAAK,GAAG,CAAC,CAAC,CAAA;AAC5B,QAAA,MAAA;AAEF,MAAA,KAAK,IAAI;QACP,IAAI,CAACd,EAAE,GAAGc,KAAK,CAAA;QACf,IAAI,CAACC,GAAG,CAAC,QAAQ,EAAED,KAAK,GAAG,CAAC,CAAC,CAAA;AAC7B,QAAA,MAAA;AACJ,KAAA;AACA,IAAA,OAAO,IAAI,CAAA;AACb,GAAA;;AAEA;AACF;AACA;AACA;AACEE,EAAAA,KAAKA,GAAG;AACN,IAAA,OAAO,IAAI,CAACC,GAAG,CAAC,IAAI,CAAC,GAAG,IAAI,CAACA,GAAG,CAACC,OAAO,CAAC,CAAA;AAC3C,GAAA;;AAEA;AACF;AACA;AACA;AACEC,EAAAA,KAAKA,GAAG;AACN,IAAA,OAAO,IAAI,CAACF,GAAG,CAAC,IAAI,CAAC,GAAG,IAAI,CAACA,GAAG,CAACG,OAAO,CAAC,CAAA;AAC3C,GAAA;;AAEA;AACF;AACA;AACA;AACA;AACEC,EAAAA,QAAQA,GAG8C;AAAA,IAAA,IAApDC,mBAAwB,GAAAC,SAAA,CAAAC,MAAA,GAAA,CAAA,IAAAD,SAAA,CAAA,CAAA,CAAA,KAAAE,SAAA,GAAAF,SAAA,CAAA,CAAA,CAAA,GAAG,EAAE,CAAA;IAC7B,OAAO,KAAK,CAACF,QAAQ,CAAC,CAAC,GAAGpB,aAAa,EAAE,GAAGqB,mBAAmB,CAAC,CAAC,CAAA;AACnE,GAAA;;AAEA;AACF;AACA;AACA;AACA;AACEI,EAAAA,MAAMA,GAAa;AACjB,IAAA,OAAO,CACL,WAAW,EACX,cAAc,EAAA,yBAAA,CAAAC,MAAA,CACO,IAAI,CAAC5B,EAAE,cAAA4B,MAAA,CAAS,IAAI,CAAC3B,EAAE,EAC7C,SAAA,CAAA,CAAA,CAAA;AACH,GAAA;;AAEA;AACF;AACA;AACA;EACE4B,OAAOA,CAACC,GAA6B,EAAE;IACrCA,GAAG,CAACC,SAAS,EAAE,CAAA;IACfD,GAAG,CAACE,IAAI,EAAE,CAAA;IACVF,GAAG,CAACG,SAAS,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,IAAI,CAAChC,EAAE,GAAG,IAAI,CAACD,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC,CAAA;AAC/C8B,IAAAA,GAAG,CAACI,GAAG,CAAC,CAAC,EAAE,CAAC,EAAE,IAAI,CAAClC,EAAE,EAAE,CAAC,EAAEmC,SAAS,EAAE,KAAK,CAAC,CAAA;IAC3CL,GAAG,CAACM,OAAO,EAAE,CAAA;AACb,IAAA,IAAI,CAACC,mBAAmB,CAACP,GAAG,CAAC,CAAA;AAC/B,GAAA;;AAEA;;AAEA;AACF;AACA;AACA;AACA;AACA;;AAGE;AACF;AACA;AACA;AACA;AACA;AACA;AACE,EAAA,aAAaQ,WAAWA,CACtBC,OAAoB,EACpB9B,OAAkB,EAClB+B,QAAmB,EACnB;IACA,MAAMC,gBAAgB,GAAGC,eAAe,CACtCH,OAAO,EACP,IAAI,CAACI,eAAe,EACpBH,QACF,CAAC,CAAA;AAEDC,IAAAA,gBAAgB,CAACG,IAAI,GAAG,CAACH,gBAAgB,CAACG,IAAI,IAAI,CAAC,IAAIH,gBAAgB,CAACzC,EAAE,CAAA;AAC1EyC,IAAAA,gBAAgB,CAACI,GAAG,GAAG,CAACJ,gBAAgB,CAACI,GAAG,IAAI,CAAC,IAAIJ,gBAAgB,CAACxC,EAAE,CAAA;AACxE,IAAA,OAAO,IAAI,IAAI,CAACwC,gBAAgB,CAAC,CAAA;AACnC,GAAA;;AAEA;AACF,CAAA;AAnJE;AACF;AACA;AACA;AACA;AAGE;AACF;AACA;AACA;AACA;AAJEK,eAAA,CAfW3C,OAAO,EAAA,MAAA,EAsBJ,SAAS,CAAA,CAAA;AAAA2C,eAAA,CAtBZ3C,OAAO,EAwBO,iBAAA,EAAA,CAAC,GAAG4C,eAAe,EAAE,GAAG7C,aAAa,CAAC,CAAA,CAAA;AAAA4C,eAAA,CAxBpD3C,OAAO,EAAA,aAAA,EA0BGJ,oBAAoB,CAAA,CAAA;AAAA+C,eAAA,CA1B9B3C,OAAO,EAiIO,iBAAA,EAAA,CAAC,GAAG6C,iBAAiB,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,CAAA,CAAA;AA4BzEC,aAAa,CAACC,QAAQ,CAAC/C,OAAO,CAAC,CAAA;AAC/B8C,aAAa,CAACE,WAAW,CAAChD,OAAO,CAAC;;;;"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{defineProperty as t,objectSpread2 as e}from"../../../_virtual/_rollupPluginBabelHelpers.min.mjs";import{Point as r}from"../../Point.min.mjs";import{setStyle as i}from"../../util/dom_style.min.mjs";import{cloneDeep as a}from"../../util/internals/cloneDeep.min.mjs";import{getDocumentFromElement as
|
|
1
|
+
import{defineProperty as t,objectSpread2 as e}from"../../../_virtual/_rollupPluginBabelHelpers.min.mjs";import{Point as r}from"../../Point.min.mjs";import{setStyle as i}from"../../util/dom_style.min.mjs";import{cloneDeep as a}from"../../util/internals/cloneDeep.min.mjs";import{getDocumentFromElement as s}from"../../util/dom_misc.min.mjs";import{NONE as n,CHANGED as o}from"../../constants.min.mjs";class d{constructor(e){t(this,"target",void 0),t(this,"__mouseDownInPlace",!1),t(this,"__dragStartFired",!1),t(this,"__isDraggingOver",!1),t(this,"__dragStartSelection",void 0),t(this,"__dragImageDisposer",void 0),t(this,"_dispose",void 0),this.target=e;const r=[this.target.on("dragenter",this.dragEnterHandler.bind(this)),this.target.on("dragover",this.dragOverHandler.bind(this)),this.target.on("dragleave",this.dragLeaveHandler.bind(this)),this.target.on("dragend",this.dragEndHandler.bind(this)),this.target.on("drop",this.dropHandler.bind(this))];this._dispose=()=>{r.forEach((t=>t())),this._dispose=void 0}}isPointerOverSelection(t){const e=this.target,r=e.getSelectionStartFromPointer(t);return e.isEditing&&r>=e.selectionStart&&r<=e.selectionEnd&&e.selectionStart<e.selectionEnd}start(t){return this.__mouseDownInPlace=this.isPointerOverSelection(t)}isActive(){return this.__mouseDownInPlace}end(t){const e=this.isActive();return e&&!this.__dragStartFired&&(this.target.setCursorByClick(t),this.target.initDelayedCursor(!0)),this.__mouseDownInPlace=!1,this.__dragStartFired=!1,this.__isDraggingOver=!1,e}getDragStartSelection(){return this.__dragStartSelection}setDragImage(t,e){var o;let{selectionStart:d,selectionEnd:g}=e;const l=this.target,c=l.canvas,h=new r(l.flipX?-1:1,l.flipY?-1:1),_=l._getCursorBoundaries(d),p=new r(_.left+_.leftOffset,_.top+_.topOffset).multiply(h).transform(l.calcTransformMatrix()),S=c.getScenePoint(t).subtract(p),v=l.getCanvasRetinaScaling(),m=l.getBoundingRect(),f=p.subtract(new r(m.left,m.top)),u=c.viewportTransform,D=f.add(S).transform(u,!0),x=l.backgroundColor,T=a(l.styles);l.backgroundColor="";const E={stroke:"transparent",fill:"transparent",textBackgroundColor:"transparent"};l.setSelectionStyles(E,0,d),l.setSelectionStyles(E,g,l.text.length),l.dirty=!0;const b=l.toCanvasElement({enableRetinaScaling:c.enableRetinaScaling,viewportTransform:!0});l.backgroundColor=x,l.styles=T,l.dirty=!0,i(b,{position:"fixed",left:"".concat(-b.width,"px"),border:n,width:"".concat(b.width/v,"px"),height:"".concat(b.height/v,"px")}),this.__dragImageDisposer&&this.__dragImageDisposer(),this.__dragImageDisposer=()=>{b.remove()},s(t.target||this.target.hiddenTextarea).body.appendChild(b),null===(o=t.dataTransfer)||void 0===o||o.setDragImage(b,D.x,D.y)}onDragStart(t){this.__dragStartFired=!0;const r=this.target,i=this.isActive();if(i&&t.dataTransfer){const i=this.__dragStartSelection={selectionStart:r.selectionStart,selectionEnd:r.selectionEnd},a=r._text.slice(i.selectionStart,i.selectionEnd).join(""),s=e({text:r.text,value:a},i);t.dataTransfer.setData("text/plain",a),t.dataTransfer.setData("application/fabric",JSON.stringify({value:a,styles:r.getSelectionStyles(i.selectionStart,i.selectionEnd,!0)})),t.dataTransfer.effectAllowed="copyMove",this.setDragImage(t,s)}return r.abortCursorAnimation(),i}canDrop(t){if(this.target.editable&&!this.target.getActiveControl()&&!t.defaultPrevented){if(this.isActive()&&this.__dragStartSelection){const e=this.target.getSelectionStartFromPointer(t),r=this.__dragStartSelection;return e<r.selectionStart||e>r.selectionEnd}return!0}return!1}targetCanDrop(t){return this.target.canDrop(t)}dragEnterHandler(t){let{e:e}=t;const r=this.targetCanDrop(e);!this.__isDraggingOver&&r&&(this.__isDraggingOver=!0)}dragOverHandler(t){const{e:e}=t,r=this.targetCanDrop(e);!this.__isDraggingOver&&r?this.__isDraggingOver=!0:this.__isDraggingOver&&!r&&(this.__isDraggingOver=!1),this.__isDraggingOver&&(e.preventDefault(),t.canDrop=!0,t.dropTarget=this.target)}dragLeaveHandler(){(this.__isDraggingOver||this.isActive())&&(this.__isDraggingOver=!1)}dropHandler(t){var e;const{e:r}=t,i=r.defaultPrevented;this.__isDraggingOver=!1,r.preventDefault();let a=null===(e=r.dataTransfer)||void 0===e?void 0:e.getData("text/plain");if(a&&!i){const e=this.target,i=e.canvas;let s=e.getSelectionStartFromPointer(r);const{styles:n}=r.dataTransfer.types.includes("application/fabric")?JSON.parse(r.dataTransfer.getData("application/fabric")):{},d=a[Math.max(0,a.length-1)],g=0;if(this.__dragStartSelection){const t=this.__dragStartSelection.selectionStart,r=this.__dragStartSelection.selectionEnd;s>t&&s<=r?s=t:s>r&&(s-=r-t),e.removeChars(t,r),delete this.__dragStartSelection}e._reNewline.test(d)&&(e._reNewline.test(e._text[s])||s===e._text.length)&&(a=a.trimEnd()),t.didDrop=!0,t.dropTarget=e,e.insertChars(a,n,s),i.setActiveObject(e),e.enterEditing(r),e.selectionStart=Math.min(s+g,e._text.length),e.selectionEnd=Math.min(e.selectionStart+a.length,e._text.length),e.hiddenTextarea.value=e.text,e._updateTextarea(),e.hiddenTextarea.focus(),e.fire(o,{index:s+g,action:"drop"}),i.fire("text:changed",{target:e}),i.contextTopDirty=!0,i.requestRenderAll()}}dragEndHandler(t){let{e:e}=t;if(this.isActive()&&this.__dragStartFired&&this.__dragStartSelection){var r;const t=this.target,i=this.target.canvas,{selectionStart:a,selectionEnd:s}=this.__dragStartSelection,d=(null===(r=e.dataTransfer)||void 0===r?void 0:r.dropEffect)||n;d===n?(t.selectionStart=a,t.selectionEnd=s,t._updateTextarea(),t.hiddenTextarea.focus()):(t.clearContextTop(),"move"===d&&(t.removeChars(a,s),t.selectionStart=t.selectionEnd=a,t.hiddenTextarea&&(t.hiddenTextarea.value=t.text),t._updateTextarea(),t.fire(o,{index:a,action:"dragend"}),i.fire("text:changed",{target:t}),i.requestRenderAll()),t.exitEditing())}this.__dragImageDisposer&&this.__dragImageDisposer(),delete this.__dragImageDisposer,delete this.__dragStartSelection,this.__isDraggingOver=!1}dispose(){this._dispose&&this._dispose()}}export{d as DraggableTextDelegate};
|
|
2
2
|
//# sourceMappingURL=DraggableTextDelegate.min.mjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"DraggableTextDelegate.min.mjs","sources":["../../../../src/shapes/IText/DraggableTextDelegate.ts"],"sourcesContent":["import type { Canvas } from '../../canvas/Canvas';\nimport 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 { cloneDeep } from '../../util/internals/cloneDeep';\nimport type { TextStyleDeclaration } from '../Text/StyledText';\nimport { getDocumentFromElement } from '../../util/dom_misc';\nimport { 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 = cloneDeep(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","this","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","pos","left","leftOffset","top","topOffset","multiply","transform","calcTransformMatrix","diff","getScenePoint","subtract","retinaScaling","getCanvasRetinaScaling","bbox","getBoundingRect","correction","vpt","viewportTransform","offset","add","bgc","backgroundColor","styles","cloneDeep","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","action","contextTopDirty","requestRenderAll","_ref3","_e$dataTransfer3","dropEffect","clearContextTop","exitEditing","dispose"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"DraggableTextDelegate.min.mjs","sources":["../../../../src/shapes/IText/DraggableTextDelegate.ts"],"sourcesContent":["import type { Canvas } from '../../canvas/Canvas';\nimport 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 { cloneDeep } from '../../util/internals/cloneDeep';\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 = cloneDeep(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","this","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","pos","left","leftOffset","top","topOffset","multiply","transform","calcTransformMatrix","diff","getScenePoint","subtract","retinaScaling","getCanvasRetinaScaling","bbox","getBoundingRect","correction","vpt","viewportTransform","offset","add","bgc","backgroundColor","styles","cloneDeep","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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"}
|
|
@@ -3,7 +3,7 @@ import { Point } from '../../Point.mjs';
|
|
|
3
3
|
import { setStyle } from '../../util/dom_style.mjs';
|
|
4
4
|
import { cloneDeep } from '../../util/internals/cloneDeep.mjs';
|
|
5
5
|
import { getDocumentFromElement } from '../../util/dom_misc.mjs';
|
|
6
|
-
import { NONE } from '../../constants.mjs';
|
|
6
|
+
import { NONE, CHANGED } from '../../constants.mjs';
|
|
7
7
|
|
|
8
8
|
/**
|
|
9
9
|
* #### Dragging IText/Textbox Lifecycle
|
|
@@ -273,7 +273,7 @@ class DraggableTextDelegate {
|
|
|
273
273
|
target.hiddenTextarea.value = target.text;
|
|
274
274
|
target._updateTextarea();
|
|
275
275
|
target.hiddenTextarea.focus();
|
|
276
|
-
target.fire(
|
|
276
|
+
target.fire(CHANGED, {
|
|
277
277
|
index: insertAt + selectionStartOffset,
|
|
278
278
|
action: 'drop'
|
|
279
279
|
});
|
|
@@ -319,7 +319,7 @@ class DraggableTextDelegate {
|
|
|
319
319
|
target.selectionStart = target.selectionEnd = selectionStart;
|
|
320
320
|
target.hiddenTextarea && (target.hiddenTextarea.value = target.text);
|
|
321
321
|
target._updateTextarea();
|
|
322
|
-
target.fire(
|
|
322
|
+
target.fire(CHANGED, {
|
|
323
323
|
index: selectionStart,
|
|
324
324
|
action: 'dragend'
|
|
325
325
|
});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"DraggableTextDelegate.mjs","sources":["../../../../src/shapes/IText/DraggableTextDelegate.ts"],"sourcesContent":["import type { Canvas } from '../../canvas/Canvas';\nimport 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 { cloneDeep } from '../../util/internals/cloneDeep';\nimport type { TextStyleDeclaration } from '../Text/StyledText';\nimport { getDocumentFromElement } from '../../util/dom_misc';\nimport { 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 = cloneDeep(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","cloneDeep","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","action","contextTopDirty","requestRenderAll","_ref3","_e$dataTransfer3","dropEffect","clearContextTop","exitEditing","dispose"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"DraggableTextDelegate.mjs","sources":["../../../../src/shapes/IText/DraggableTextDelegate.ts"],"sourcesContent":["import type { Canvas } from '../../canvas/Canvas';\nimport 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 { cloneDeep } from '../../util/internals/cloneDeep';\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 = cloneDeep(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","cloneDeep","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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"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{objectSpread2 as t,defineProperty as e}from"../../../_virtual/_rollupPluginBabelHelpers.min.mjs";import{Canvas as i}from"../../canvas/Canvas.min.mjs";import{ITextClickBehavior as s}from"./ITextClickBehavior.min.mjs";import{keysMap as n,keysMapRtl as r,ctrlKeysMapDown as o,ctrlKeysMapUp as h}from"./constants.min.mjs";import{classRegistry as l}from"../../ClassRegistry.min.mjs";import{JUSTIFY as a,JUSTIFY_RIGHT as c,JUSTIFY_LEFT as d,JUSTIFY_CENTER as g}from"../Text/constants.min.mjs";import{RIGHT as f,LEFT as u,CENTER as p}from"../../constants.min.mjs";const
|
|
1
|
+
import{objectSpread2 as t,defineProperty as e}from"../../../_virtual/_rollupPluginBabelHelpers.min.mjs";import{Canvas as i}from"../../canvas/Canvas.min.mjs";import{ITextClickBehavior as s}from"./ITextClickBehavior.min.mjs";import{keysMap as n,keysMapRtl as r,ctrlKeysMapDown as o,ctrlKeysMapUp as h}from"./constants.min.mjs";import{classRegistry as l}from"../../ClassRegistry.min.mjs";import{JUSTIFY as a,JUSTIFY_RIGHT as c,JUSTIFY_LEFT as d,JUSTIFY_CENTER as g}from"../Text/constants.min.mjs";import{RIGHT as f,LEFT as u,CENTER as p,FILL as C}from"../../constants.min.mjs";const x=t({selectionStart:0,selectionEnd:0,selectionColor:"rgba(17,119,255,0.3)",isEditing:!1,editable:!0,editingBorderColor:"rgba(102,153,255,0.25)",cursorWidth:2,cursorColor:"",cursorDelay:1e3,cursorDuration:600,caching:!0,hiddenTextareaContainer:null,keysMap:n,keysMapRtl:r,ctrlKeysMapDown:o,ctrlKeysMapUp:h},{_selectionDirection:null,_reSpace:/\s|\r?\n/,inCompositionMode:!1});class _ extends s{static getDefaults(){return t(t({},super.getDefaults()),_.ownDefaults)}get type(){const t=super.type;return"itext"===t?"i-text":t}constructor(e,i){super(e,t(t({},_.ownDefaults),i)),this.initBehavior()}_set(t,e){return this.isEditing&&this._savedProps&&t in this._savedProps?(this._savedProps[t]=e,this):("canvas"===t&&(this.canvas instanceof i&&this.canvas.textEditingManager.remove(this),e instanceof i&&e.textEditingManager.add(this)),super._set(t,e))}setSelectionStart(t){t=Math.max(t,0),this._updateAndFire("selectionStart",t)}setSelectionEnd(t){t=Math.min(t,this.text.length),this._updateAndFire("selectionEnd",t)}_updateAndFire(t,e){this[t]!==e&&(this._fireSelectionChanged(),this[t]=e),this._updateTextarea()}_fireSelectionChanged(){this.fire("selection:changed"),this.canvas&&this.canvas.fire("text:selection:changed",{target:this})}initDimensions(){this.isEditing&&this.initDelayedCursor(),super.initDimensions()}getSelectionStyles(){let t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:this.selectionStart||0,e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:this.selectionEnd,i=arguments.length>2?arguments[2]:void 0;return super.getSelectionStyles(t,e,i)}setSelectionStyles(t){let e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:this.selectionStart||0,i=arguments.length>2&&void 0!==arguments[2]?arguments[2]:this.selectionEnd;return super.setSelectionStyles(t,e,i)}get2DCursorLocation(){let t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:this.selectionStart,e=arguments.length>1?arguments[1]:void 0;return super.get2DCursorLocation(t,e)}render(t){super.render(t),this.cursorOffsetCache={},this.renderCursorOrSelection()}toCanvasElement(t){const e=this.isEditing;this.isEditing=!1;const i=super.toCanvasElement(t);return this.isEditing=e,i}renderCursorOrSelection(){if(!this.isEditing)return;const t=this.clearContextTop(!0);if(!t)return;const e=this._getCursorBoundaries();this.selectionStart===this.selectionEnd?this.renderCursor(t,e):this.renderSelection(t,e),this.canvas.contextTopDirty=!0,t.restore()}_getCursorBoundaries(){let t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:this.selectionStart,e=arguments.length>1?arguments[1]:void 0;const i=this._getLeftOffset(),s=this._getTopOffset(),n=this._getCursorBoundariesOffsets(t,e);return{left:i,top:s,leftOffset:n.left,topOffset:n.top}}_getCursorBoundariesOffsets(t,e){return e?this.__getCursorBoundariesOffsets(t):this.cursorOffsetCache&&"top"in this.cursorOffsetCache?this.cursorOffsetCache:this.cursorOffsetCache=this.__getCursorBoundariesOffsets(t)}__getCursorBoundariesOffsets(t){let e=0,i=0;const{charIndex:s,lineIndex:n}=this.get2DCursorLocation(t);for(let t=0;t<n;t++)e+=this.getHeightOfLine(t);const r=this._getLineLeftOffset(n),o=this.__charBounds[n][s];o&&(i=o.left),0!==this.charSpacing&&s===this._textLines[n].length&&(i-=this._getWidthOfCharSpacing());const h={top:e,left:r+(i>0?i:0)};return"rtl"===this.direction&&(this.textAlign===f||this.textAlign===a||this.textAlign===c?h.left*=-1:this.textAlign===u||this.textAlign===d?h.left=r-(i>0?i:0):this.textAlign!==p&&this.textAlign!==g||(h.left=r-(i>0?i:0))),h}renderCursorAt(t){const e=this._getCursorBoundaries(t,!0);this._renderCursor(this.canvas.contextTop,e,t)}renderCursor(t,e){this._renderCursor(t,e,this.selectionStart)}_renderCursor(t,e,i){const s=this.get2DCursorLocation(i),n=s.lineIndex,r=s.charIndex>0?s.charIndex-1:0,o=this.getValueOfPropertyAt(n,r,"fontSize"),h=this.getObjectScaling().x*this.canvas.getZoom(),l=this.cursorWidth/h,a=this.getValueOfPropertyAt(n,r,"deltaY"),c=e.topOffset+(1-this._fontSizeFraction)*this.getHeightOfLine(n)/this.lineHeight-o*(1-this._fontSizeFraction);this.inCompositionMode&&this.renderSelection(t,e),t.fillStyle=this.cursorColor||this.getValueOfPropertyAt(n,r,C),t.globalAlpha=this._currentCursorOpacity,t.fillRect(e.left+e.leftOffset-l/2,c+e.top+a,l,o)}renderSelection(t,e){const i={selectionStart:this.inCompositionMode?this.hiddenTextarea.selectionStart:this.selectionStart,selectionEnd:this.inCompositionMode?this.hiddenTextarea.selectionEnd:this.selectionEnd};this._renderSelection(t,i,e)}renderDragSourceEffect(){const t=this.draggableTextDelegate.getDragStartSelection();this._renderSelection(this.canvas.contextTop,t,this._getCursorBoundaries(t.selectionStart,!0))}renderDropTargetEffect(t){const e=this.getSelectionStartFromPointer(t);this.renderCursorAt(e)}_renderSelection(t,e,i){const s=e.selectionStart,n=e.selectionEnd,r=this.textAlign.includes(a),o=this.get2DCursorLocation(s),h=this.get2DCursorLocation(n),l=o.lineIndex,C=h.lineIndex,x=o.charIndex<0?0:o.charIndex,_=h.charIndex<0?0:h.charIndex;for(let e=l;e<=C;e++){const s=this._getLineLeftOffset(e)||0;let n=this.getHeightOfLine(e),o=0,h=0,S=0;if(e===l&&(h=this.__charBounds[l][x].left),e>=l&&e<C)S=r&&!this.isEndOfWrapping(e)?this.width:this.getLineWidth(e)||5;else if(e===C)if(0===_)S=this.__charBounds[C][_].left;else{const t=this._getWidthOfCharSpacing();S=this.__charBounds[C][_-1].left+this.__charBounds[C][_-1].width-t}o=n,(this.lineHeight<1||e===C&&this.lineHeight>1)&&(n/=this.lineHeight);let m=i.left+s+h,O=n,v=0;const A=S-h;this.inCompositionMode?(t.fillStyle=this.compositionColor||"black",O=1,v=n):t.fillStyle=this.selectionColor,"rtl"===this.direction&&(this.textAlign===f||this.textAlign===a||this.textAlign===c?m=this.width-m-A:this.textAlign===u||this.textAlign===d?m=i.left+s-S:this.textAlign!==p&&this.textAlign!==g||(m=i.left+s-S)),t.fillRect(m,i.top+i.topOffset+v,A,O),i.topOffset+=o}}getCurrentCharFontSize(){const t=this._getCurrentCharIndex();return this.getValueOfPropertyAt(t.l,t.c,"fontSize")}getCurrentCharColor(){const t=this._getCurrentCharIndex();return this.getValueOfPropertyAt(t.l,t.c,C)}_getCurrentCharIndex(){const t=this.get2DCursorLocation(this.selectionStart,!0),e=t.charIndex>0?t.charIndex-1:0;return{l:t.lineIndex,c:e}}dispose(){this._exitEditing(),this.draggableTextDelegate.dispose(),super.dispose()}}e(_,"ownDefaults",x),e(_,"type","IText"),l.setClass(_),l.setClass(_,"i-text");export{_ as IText,x as iTextDefaultValues};
|
|
2
2
|
//# sourceMappingURL=IText.min.mjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"IText.min.mjs","sources":["../../../../src/shapes/IText/IText.ts"],"sourcesContent":["import { Canvas } from '../../canvas/Canvas';\nimport type { ITextEvents } from './ITextBehavior';\nimport { ITextClickBehavior } from './ITextClickBehavior';\nimport {\n ctrlKeysMapDown,\n ctrlKeysMapUp,\n keysMap,\n keysMapRtl,\n} from './constants';\nimport type { TClassProperties, TFiller, TOptions } from '../../typedefs';\nimport { classRegistry } from '../../ClassRegistry';\nimport type { SerializedTextProps, TextProps } from '../Text/Text';\nimport {\n JUSTIFY,\n JUSTIFY_CENTER,\n JUSTIFY_LEFT,\n JUSTIFY_RIGHT,\n} from '../Text/constants';\nimport { CENTER, LEFT, RIGHT } from '../../constants';\nimport type { ObjectToCanvasElementOptions } from '../Object/Object';\n\ntype CursorBoundaries = {\n left: number;\n top: number;\n leftOffset: number;\n topOffset: number;\n};\n\n// Declare IText protected properties to workaround TS\nconst protectedDefaultValues = {\n _selectionDirection: null,\n _reSpace: /\\s|\\r?\\n/,\n inCompositionMode: false,\n};\n\nexport const iTextDefaultValues: Partial<TClassProperties<IText>> = {\n selectionStart: 0,\n selectionEnd: 0,\n selectionColor: 'rgba(17,119,255,0.3)',\n isEditing: false,\n editable: true,\n editingBorderColor: 'rgba(102,153,255,0.25)',\n cursorWidth: 2,\n cursorColor: '',\n cursorDelay: 1000,\n cursorDuration: 600,\n caching: true,\n hiddenTextareaContainer: null,\n keysMap,\n keysMapRtl,\n ctrlKeysMapDown,\n ctrlKeysMapUp,\n ...protectedDefaultValues,\n};\n\n// @TODO this is not complete\ninterface UniqueITextProps {\n selectionStart: number;\n selectionEnd: number;\n}\n\nexport interface SerializedITextProps\n extends SerializedTextProps,\n UniqueITextProps {}\n\nexport interface ITextProps extends TextProps, UniqueITextProps {}\n\n/**\n * @fires changed\n * @fires selection:changed\n * @fires editing:entered\n * @fires editing:exited\n * @fires dragstart\n * @fires drag drag event firing on the drag source\n * @fires dragend\n * @fires copy\n * @fires cut\n * @fires paste\n *\n * #### Supported key combinations\n * ```\n * Move cursor: left, right, up, down\n * Select character: shift + left, shift + right\n * Select text vertically: shift + up, shift + down\n * Move cursor by word: alt + left, alt + right\n * Select words: shift + alt + left, shift + alt + right\n * Move cursor to line start/end: cmd + left, cmd + right or home, end\n * Select till start/end of line: cmd + shift + left, cmd + shift + right or shift + home, shift + end\n * Jump to start/end of text: cmd + up, cmd + down\n * Select till start/end of text: cmd + shift + up, cmd + shift + down or shift + pgUp, shift + pgDown\n * Delete character: backspace\n * Delete word: alt + backspace\n * Delete line: cmd + backspace\n * Forward delete: delete\n * Copy text: ctrl/cmd + c\n * Paste text: ctrl/cmd + v\n * Cut text: ctrl/cmd + x\n * Select entire text: ctrl/cmd + a\n * Quit editing tab or esc\n * ```\n *\n * #### Supported mouse/touch combination\n * ```\n * Position cursor: click/touch\n * Create selection: click/touch & drag\n * Create selection: click & shift + click\n * Select word: double click\n * Select line: triple click\n * ```\n */\nexport class IText<\n Props extends TOptions<ITextProps> = Partial<ITextProps>,\n SProps extends SerializedITextProps = SerializedITextProps,\n EventSpec extends ITextEvents = ITextEvents\n >\n extends ITextClickBehavior<Props, SProps, EventSpec>\n implements UniqueITextProps\n{\n /**\n * Index where text selection starts (or where cursor is when there is no selection)\n * @type Number\n * @default\n */\n declare selectionStart: number;\n\n /**\n * Index where text selection ends\n * @type Number\n * @default\n */\n declare selectionEnd: number;\n\n declare compositionStart: number;\n\n declare compositionEnd: number;\n\n /**\n * Color of text selection\n * @type String\n * @default\n */\n declare selectionColor: string;\n\n /**\n * Indicates whether text is in editing mode\n * @type Boolean\n * @default\n */\n declare isEditing: boolean;\n\n /**\n * Indicates whether a text can be edited\n * @type Boolean\n * @default\n */\n declare editable: boolean;\n\n /**\n * Border color of text object while it's in editing mode\n * @type String\n * @default\n */\n declare editingBorderColor: string;\n\n /**\n * Width of cursor (in px)\n * @type Number\n * @default\n */\n declare cursorWidth: number;\n\n /**\n * Color of text cursor color in editing mode.\n * if not set (default) will take color from the text.\n * if set to a color value that fabric can understand, it will\n * be used instead of the color of the text at the current position.\n * @type String\n * @default\n */\n declare cursorColor: string;\n\n /**\n * Delay between cursor blink (in ms)\n * @type Number\n * @default\n */\n declare cursorDelay: number;\n\n /**\n * Duration of cursor fade in (in ms)\n * @type Number\n * @default\n */\n declare cursorDuration: number;\n\n declare compositionColor: string;\n\n /**\n * Indicates whether internal text char widths can be cached\n * @type Boolean\n * @default\n */\n declare caching: boolean;\n\n static ownDefaults = iTextDefaultValues;\n\n static getDefaults(): Record<string, any> {\n return { ...super.getDefaults(), ...IText.ownDefaults };\n }\n\n static type = 'IText';\n\n get type() {\n const type = super.type;\n // backward compatibility\n return type === 'itext' ? 'i-text' : type;\n }\n\n /**\n * Constructor\n * @param {String} text Text string\n * @param {Object} [options] Options object\n */\n constructor(text: string, options?: Props) {\n super(text, { ...IText.ownDefaults, ...options } as Props);\n this.initBehavior();\n }\n\n /**\n * While editing handle differently\n * @private\n * @param {string} key\n * @param {*} value\n */\n _set(key: string, value: any) {\n if (this.isEditing && this._savedProps && key in this._savedProps) {\n // @ts-expect-error irritating TS\n this._savedProps[key] = value;\n return this;\n }\n if (key === 'canvas') {\n this.canvas instanceof Canvas &&\n this.canvas.textEditingManager.remove(this);\n value instanceof Canvas && value.textEditingManager.add(this);\n }\n return super._set(key, value);\n }\n\n /**\n * Sets selection start (left boundary of a selection)\n * @param {Number} index Index to set selection start to\n */\n setSelectionStart(index: number) {\n index = Math.max(index, 0);\n this._updateAndFire('selectionStart', index);\n }\n\n /**\n * Sets selection end (right boundary of a selection)\n * @param {Number} index Index to set selection end to\n */\n setSelectionEnd(index: number) {\n index = Math.min(index, this.text.length);\n this._updateAndFire('selectionEnd', index);\n }\n\n /**\n * @private\n * @param {String} property 'selectionStart' or 'selectionEnd'\n * @param {Number} index new position of property\n */\n protected _updateAndFire(\n property: 'selectionStart' | 'selectionEnd',\n index: number\n ) {\n if (this[property] !== index) {\n this._fireSelectionChanged();\n this[property] = index;\n }\n this._updateTextarea();\n }\n\n /**\n * Fires the even of selection changed\n * @private\n */\n _fireSelectionChanged() {\n this.fire('selection:changed');\n this.canvas && this.canvas.fire('text:selection:changed', { target: this });\n }\n\n /**\n * Initialize text dimensions. Render all text on given context\n * or on a offscreen canvas to get the text width with measureText.\n * Updates this.width and this.height with the proper values.\n * Does not return dimensions.\n * @private\n */\n initDimensions() {\n this.isEditing && this.initDelayedCursor();\n super.initDimensions();\n }\n\n /**\n * Gets style of a current selection/cursor (at the start position)\n * if startIndex or endIndex are not provided, selectionStart or selectionEnd will be used.\n * @param {Number} startIndex Start index to get styles at\n * @param {Number} endIndex End index to get styles at, if not specified selectionEnd or startIndex + 1\n * @param {Boolean} [complete] get full style or not\n * @return {Array} styles an array with one, zero or more Style objects\n */\n getSelectionStyles(\n startIndex: number = this.selectionStart || 0,\n endIndex: number = this.selectionEnd,\n complete?: boolean\n ) {\n return super.getSelectionStyles(startIndex, endIndex, complete);\n }\n\n /**\n * Sets style of a current selection, if no selection exist, do not set anything.\n * @param {Object} [styles] Styles object\n * @param {Number} [startIndex] Start index to get styles at\n * @param {Number} [endIndex] End index to get styles at, if not specified selectionEnd or startIndex + 1\n */\n setSelectionStyles(\n styles: object,\n startIndex: number = this.selectionStart || 0,\n endIndex: number = this.selectionEnd\n ) {\n return super.setSelectionStyles(styles, startIndex, endIndex);\n }\n\n /**\n * Returns 2d representation (lineIndex and charIndex) of cursor (or selection start)\n * @param {Number} [selectionStart] Optional index. When not given, current selectionStart is used.\n * @param {Boolean} [skipWrapping] consider the location for unwrapped lines. useful to manage styles.\n */\n get2DCursorLocation(\n selectionStart = this.selectionStart,\n skipWrapping?: boolean\n ) {\n return super.get2DCursorLocation(selectionStart, skipWrapping);\n }\n\n /**\n * @private\n * @param {CanvasRenderingContext2D} ctx Context to render on\n */\n render(ctx: CanvasRenderingContext2D) {\n super.render(ctx);\n // clear the cursorOffsetCache, so we ensure to calculate once per renderCursor\n // the correct position but not at every cursor animation.\n this.cursorOffsetCache = {};\n this.renderCursorOrSelection();\n }\n\n /**\n * @override block cursor/selection logic while rendering the exported canvas\n * @todo this workaround should be replaced with a more robust solution\n */\n toCanvasElement(options?: ObjectToCanvasElementOptions): HTMLCanvasElement {\n const isEditing = this.isEditing;\n this.isEditing = false;\n const canvas = super.toCanvasElement(options);\n this.isEditing = isEditing;\n return canvas;\n }\n\n /**\n * Renders cursor or selection (depending on what exists)\n * it does on the contextTop. If contextTop is not available, do nothing.\n */\n renderCursorOrSelection() {\n if (!this.isEditing) {\n return;\n }\n const ctx = this.clearContextTop(true);\n if (!ctx) {\n return;\n }\n const boundaries = this._getCursorBoundaries();\n if (this.selectionStart === this.selectionEnd) {\n this.renderCursor(ctx, boundaries);\n } else {\n this.renderSelection(ctx, boundaries);\n }\n this.canvas!.contextTopDirty = true;\n ctx.restore();\n }\n\n /**\n * Returns cursor boundaries (left, top, leftOffset, topOffset)\n * left/top are left/top of entire text box\n * leftOffset/topOffset are offset from that left/top point of a text box\n * @private\n * @param {number} [index] index from start\n * @param {boolean} [skipCaching]\n */\n _getCursorBoundaries(\n index: number = this.selectionStart,\n skipCaching?: boolean\n ): CursorBoundaries {\n const left = this._getLeftOffset(),\n top = this._getTopOffset(),\n offsets = this._getCursorBoundariesOffsets(index, skipCaching);\n return {\n left: left,\n top: top,\n leftOffset: offsets.left,\n topOffset: offsets.top,\n };\n }\n\n /**\n * Caches and returns cursor left/top offset relative to instance's center point\n * @private\n * @param {number} index index from start\n * @param {boolean} [skipCaching]\n */\n _getCursorBoundariesOffsets(\n index: number,\n skipCaching?: boolean\n ): { left: number; top: number } {\n if (skipCaching) {\n return this.__getCursorBoundariesOffsets(index);\n }\n if (this.cursorOffsetCache && 'top' in this.cursorOffsetCache) {\n return this.cursorOffsetCache as { left: number; top: number };\n }\n return (this.cursorOffsetCache = this.__getCursorBoundariesOffsets(index));\n }\n\n /**\n * Calculates cursor left/top offset relative to instance's center point\n * @private\n * @param {number} index index from start\n */\n __getCursorBoundariesOffsets(index: number) {\n let topOffset = 0,\n leftOffset = 0;\n const { charIndex, lineIndex } = this.get2DCursorLocation(index);\n\n for (let i = 0; i < lineIndex; i++) {\n topOffset += this.getHeightOfLine(i);\n }\n const lineLeftOffset = this._getLineLeftOffset(lineIndex);\n const bound = this.__charBounds[lineIndex][charIndex];\n bound && (leftOffset = bound.left);\n if (\n this.charSpacing !== 0 &&\n charIndex === this._textLines[lineIndex].length\n ) {\n leftOffset -= this._getWidthOfCharSpacing();\n }\n const boundaries = {\n top: topOffset,\n left: lineLeftOffset + (leftOffset > 0 ? leftOffset : 0),\n };\n if (this.direction === 'rtl') {\n if (\n this.textAlign === RIGHT ||\n this.textAlign === JUSTIFY ||\n this.textAlign === JUSTIFY_RIGHT\n ) {\n boundaries.left *= -1;\n } else if (this.textAlign === LEFT || this.textAlign === JUSTIFY_LEFT) {\n boundaries.left = lineLeftOffset - (leftOffset > 0 ? leftOffset : 0);\n } else if (\n this.textAlign === CENTER ||\n this.textAlign === JUSTIFY_CENTER\n ) {\n boundaries.left = lineLeftOffset - (leftOffset > 0 ? leftOffset : 0);\n }\n }\n return boundaries;\n }\n\n /**\n * Renders cursor on context Top, outside the animation cycle, on request\n * Used for the drag/drop effect.\n * If contextTop is not available, do nothing.\n */\n renderCursorAt(selectionStart: number) {\n const boundaries = this._getCursorBoundaries(selectionStart, true);\n this._renderCursor(this.canvas!.contextTop, boundaries, selectionStart);\n }\n\n /**\n * Renders cursor\n * @param {Object} boundaries\n * @param {CanvasRenderingContext2D} ctx transformed context to draw on\n */\n renderCursor(ctx: CanvasRenderingContext2D, boundaries: CursorBoundaries) {\n this._renderCursor(ctx, boundaries, this.selectionStart);\n }\n\n _renderCursor(\n ctx: CanvasRenderingContext2D,\n boundaries: CursorBoundaries,\n selectionStart: number\n ) {\n const cursorLocation = this.get2DCursorLocation(selectionStart),\n lineIndex = cursorLocation.lineIndex,\n charIndex =\n cursorLocation.charIndex > 0 ? cursorLocation.charIndex - 1 : 0,\n charHeight = this.getValueOfPropertyAt(lineIndex, charIndex, 'fontSize'),\n multiplier = this.getObjectScaling().x * this.canvas!.getZoom(),\n cursorWidth = this.cursorWidth / multiplier,\n dy = this.getValueOfPropertyAt(lineIndex, charIndex, 'deltaY'),\n topOffset =\n boundaries.topOffset +\n ((1 - this._fontSizeFraction) * this.getHeightOfLine(lineIndex)) /\n this.lineHeight -\n charHeight * (1 - this._fontSizeFraction);\n\n if (this.inCompositionMode) {\n // TODO: investigate why there isn't a return inside the if,\n // and why can't happen at the top of the function\n this.renderSelection(ctx, boundaries);\n }\n ctx.fillStyle =\n this.cursorColor ||\n (this.getValueOfPropertyAt(lineIndex, charIndex, 'fill') as string);\n ctx.globalAlpha = this._currentCursorOpacity;\n ctx.fillRect(\n boundaries.left + boundaries.leftOffset - cursorWidth / 2,\n topOffset + boundaries.top + dy,\n cursorWidth,\n charHeight\n );\n }\n\n /**\n * Renders text selection\n * @param {Object} boundaries Object with left/top/leftOffset/topOffset\n * @param {CanvasRenderingContext2D} ctx transformed context to draw on\n */\n renderSelection(ctx: CanvasRenderingContext2D, boundaries: CursorBoundaries) {\n const selection = {\n selectionStart: this.inCompositionMode\n ? this.hiddenTextarea!.selectionStart\n : this.selectionStart,\n selectionEnd: this.inCompositionMode\n ? this.hiddenTextarea!.selectionEnd\n : this.selectionEnd,\n };\n this._renderSelection(ctx, selection, boundaries);\n }\n\n /**\n * Renders drag start text selection\n */\n renderDragSourceEffect() {\n const dragStartSelection =\n this.draggableTextDelegate.getDragStartSelection()!;\n this._renderSelection(\n this.canvas!.contextTop,\n dragStartSelection,\n this._getCursorBoundaries(dragStartSelection.selectionStart, true)\n );\n }\n\n renderDropTargetEffect(e: DragEvent) {\n const dragSelection = this.getSelectionStartFromPointer(e);\n this.renderCursorAt(dragSelection);\n }\n\n /**\n * Renders text selection\n * @private\n * @param {{ selectionStart: number, selectionEnd: number }} selection\n * @param {Object} boundaries Object with left/top/leftOffset/topOffset\n * @param {CanvasRenderingContext2D} ctx transformed context to draw on\n */\n _renderSelection(\n ctx: CanvasRenderingContext2D,\n selection: { selectionStart: number; selectionEnd: number },\n boundaries: CursorBoundaries\n ) {\n const selectionStart = selection.selectionStart,\n selectionEnd = selection.selectionEnd,\n isJustify = this.textAlign.includes(JUSTIFY),\n start = this.get2DCursorLocation(selectionStart),\n end = this.get2DCursorLocation(selectionEnd),\n startLine = start.lineIndex,\n endLine = end.lineIndex,\n startChar = start.charIndex < 0 ? 0 : start.charIndex,\n endChar = end.charIndex < 0 ? 0 : end.charIndex;\n\n for (let i = startLine; i <= endLine; i++) {\n const lineOffset = this._getLineLeftOffset(i) || 0;\n let lineHeight = this.getHeightOfLine(i),\n realLineHeight = 0,\n boxStart = 0,\n boxEnd = 0;\n\n if (i === startLine) {\n boxStart = this.__charBounds[startLine][startChar].left;\n }\n if (i >= startLine && i < endLine) {\n boxEnd =\n isJustify && !this.isEndOfWrapping(i)\n ? this.width\n : this.getLineWidth(i) || 5; // WTF is this 5?\n } else if (i === endLine) {\n if (endChar === 0) {\n boxEnd = this.__charBounds[endLine][endChar].left;\n } else {\n const charSpacing = this._getWidthOfCharSpacing();\n boxEnd =\n this.__charBounds[endLine][endChar - 1].left +\n this.__charBounds[endLine][endChar - 1].width -\n charSpacing;\n }\n }\n realLineHeight = lineHeight;\n if (this.lineHeight < 1 || (i === endLine && this.lineHeight > 1)) {\n lineHeight /= this.lineHeight;\n }\n let drawStart = boundaries.left + lineOffset + boxStart,\n drawHeight = lineHeight,\n extraTop = 0;\n const drawWidth = boxEnd - boxStart;\n if (this.inCompositionMode) {\n ctx.fillStyle = this.compositionColor || 'black';\n drawHeight = 1;\n extraTop = lineHeight;\n } else {\n ctx.fillStyle = this.selectionColor;\n }\n if (this.direction === 'rtl') {\n if (\n this.textAlign === RIGHT ||\n this.textAlign === JUSTIFY ||\n this.textAlign === JUSTIFY_RIGHT\n ) {\n drawStart = this.width - drawStart - drawWidth;\n } else if (this.textAlign === LEFT || this.textAlign === JUSTIFY_LEFT) {\n drawStart = boundaries.left + lineOffset - boxEnd;\n } else if (\n this.textAlign === CENTER ||\n this.textAlign === JUSTIFY_CENTER\n ) {\n drawStart = boundaries.left + lineOffset - boxEnd;\n }\n }\n ctx.fillRect(\n drawStart,\n boundaries.top + boundaries.topOffset + extraTop,\n drawWidth,\n drawHeight\n );\n boundaries.topOffset += realLineHeight;\n }\n }\n\n /**\n * High level function to know the height of the cursor.\n * the currentChar is the one that precedes the cursor\n * Returns fontSize of char at the current cursor\n * Unused from the library, is for the end user\n * @return {Number} Character font size\n */\n getCurrentCharFontSize(): number {\n const cp = this._getCurrentCharIndex();\n return this.getValueOfPropertyAt(cp.l, cp.c, 'fontSize');\n }\n\n /**\n * High level function to know the color of the cursor.\n * the currentChar is the one that precedes the cursor\n * Returns color (fill) of char at the current cursor\n * if the text object has a pattern or gradient for filler, it will return that.\n * Unused by the library, is for the end user\n * @return {String | TFiller} Character color (fill)\n */\n getCurrentCharColor(): string | TFiller | null {\n const cp = this._getCurrentCharIndex();\n return this.getValueOfPropertyAt(cp.l, cp.c, 'fill');\n }\n\n /**\n * Returns the cursor position for the getCurrent.. functions\n * @private\n */\n _getCurrentCharIndex() {\n const cursorPosition = this.get2DCursorLocation(this.selectionStart, true),\n charIndex =\n cursorPosition.charIndex > 0 ? cursorPosition.charIndex - 1 : 0;\n return { l: cursorPosition.lineIndex, c: charIndex };\n }\n\n dispose() {\n this._exitEditing();\n this.draggableTextDelegate.dispose();\n super.dispose();\n }\n}\n\nclassRegistry.setClass(IText);\n// legacy\nclassRegistry.setClass(IText, 'i-text');\n"],"names":["iTextDefaultValues","_objectSpread","selectionStart","selectionEnd","selectionColor","isEditing","editable","editingBorderColor","cursorWidth","cursorColor","cursorDelay","cursorDuration","caching","hiddenTextareaContainer","keysMap","keysMapRtl","ctrlKeysMapDown","ctrlKeysMapUp","_selectionDirection","_reSpace","inCompositionMode","IText","ITextClickBehavior","getDefaults","super","ownDefaults","type","constructor","text","options","this","initBehavior","_set","key","value","_savedProps","canvas","Canvas","textEditingManager","remove","add","setSelectionStart","index","Math","max","_updateAndFire","setSelectionEnd","min","length","property","_fireSelectionChanged","_updateTextarea","fire","target","initDimensions","initDelayedCursor","getSelectionStyles","startIndex","arguments","undefined","endIndex","complete","setSelectionStyles","styles","get2DCursorLocation","skipWrapping","render","ctx","cursorOffsetCache","renderCursorOrSelection","toCanvasElement","clearContextTop","boundaries","_getCursorBoundaries","renderCursor","renderSelection","contextTopDirty","restore","skipCaching","left","_getLeftOffset","top","_getTopOffset","offsets","_getCursorBoundariesOffsets","leftOffset","topOffset","__getCursorBoundariesOffsets","charIndex","lineIndex","i","getHeightOfLine","lineLeftOffset","_getLineLeftOffset","bound","__charBounds","charSpacing","_textLines","_getWidthOfCharSpacing","direction","textAlign","RIGHT","JUSTIFY","JUSTIFY_RIGHT","LEFT","JUSTIFY_LEFT","CENTER","JUSTIFY_CENTER","renderCursorAt","_renderCursor","contextTop","cursorLocation","charHeight","getValueOfPropertyAt","multiplier","getObjectScaling","x","getZoom","dy","_fontSizeFraction","lineHeight","fillStyle","globalAlpha","_currentCursorOpacity","fillRect","selection","hiddenTextarea","_renderSelection","renderDragSourceEffect","dragStartSelection","draggableTextDelegate","getDragStartSelection","renderDropTargetEffect","e","dragSelection","getSelectionStartFromPointer","isJustify","includes","start","end","startLine","endLine","startChar","endChar","lineOffset","realLineHeight","boxStart","boxEnd","isEndOfWrapping","width","getLineWidth","drawStart","drawHeight","extraTop","drawWidth","compositionColor","getCurrentCharFontSize","cp","_getCurrentCharIndex","l","c","getCurrentCharColor","cursorPosition","dispose","_exitEditing","_defineProperty","classRegistry","setClass"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"IText.min.mjs","sources":["../../../../src/shapes/IText/IText.ts"],"sourcesContent":["import { Canvas } from '../../canvas/Canvas';\nimport type { ITextEvents } from './ITextBehavior';\nimport { ITextClickBehavior } from './ITextClickBehavior';\nimport {\n ctrlKeysMapDown,\n ctrlKeysMapUp,\n keysMap,\n keysMapRtl,\n} from './constants';\nimport type { TClassProperties, TFiller, TOptions } from '../../typedefs';\nimport { classRegistry } from '../../ClassRegistry';\nimport type { SerializedTextProps, TextProps } from '../Text/Text';\nimport {\n JUSTIFY,\n JUSTIFY_CENTER,\n JUSTIFY_LEFT,\n JUSTIFY_RIGHT,\n} from '../Text/constants';\nimport { CENTER, FILL, LEFT, RIGHT } from '../../constants';\nimport type { ObjectToCanvasElementOptions } from '../Object/Object';\n\ntype CursorBoundaries = {\n left: number;\n top: number;\n leftOffset: number;\n topOffset: number;\n};\n\n// Declare IText protected properties to workaround TS\nconst protectedDefaultValues = {\n _selectionDirection: null,\n _reSpace: /\\s|\\r?\\n/,\n inCompositionMode: false,\n};\n\nexport const iTextDefaultValues: Partial<TClassProperties<IText>> = {\n selectionStart: 0,\n selectionEnd: 0,\n selectionColor: 'rgba(17,119,255,0.3)',\n isEditing: false,\n editable: true,\n editingBorderColor: 'rgba(102,153,255,0.25)',\n cursorWidth: 2,\n cursorColor: '',\n cursorDelay: 1000,\n cursorDuration: 600,\n caching: true,\n hiddenTextareaContainer: null,\n keysMap,\n keysMapRtl,\n ctrlKeysMapDown,\n ctrlKeysMapUp,\n ...protectedDefaultValues,\n};\n\n// @TODO this is not complete\ninterface UniqueITextProps {\n selectionStart: number;\n selectionEnd: number;\n}\n\nexport interface SerializedITextProps\n extends SerializedTextProps,\n UniqueITextProps {}\n\nexport interface ITextProps extends TextProps, UniqueITextProps {}\n\n/**\n * @fires changed\n * @fires selection:changed\n * @fires editing:entered\n * @fires editing:exited\n * @fires dragstart\n * @fires drag drag event firing on the drag source\n * @fires dragend\n * @fires copy\n * @fires cut\n * @fires paste\n *\n * #### Supported key combinations\n * ```\n * Move cursor: left, right, up, down\n * Select character: shift + left, shift + right\n * Select text vertically: shift + up, shift + down\n * Move cursor by word: alt + left, alt + right\n * Select words: shift + alt + left, shift + alt + right\n * Move cursor to line start/end: cmd + left, cmd + right or home, end\n * Select till start/end of line: cmd + shift + left, cmd + shift + right or shift + home, shift + end\n * Jump to start/end of text: cmd + up, cmd + down\n * Select till start/end of text: cmd + shift + up, cmd + shift + down or shift + pgUp, shift + pgDown\n * Delete character: backspace\n * Delete word: alt + backspace\n * Delete line: cmd + backspace\n * Forward delete: delete\n * Copy text: ctrl/cmd + c\n * Paste text: ctrl/cmd + v\n * Cut text: ctrl/cmd + x\n * Select entire text: ctrl/cmd + a\n * Quit editing tab or esc\n * ```\n *\n * #### Supported mouse/touch combination\n * ```\n * Position cursor: click/touch\n * Create selection: click/touch & drag\n * Create selection: click & shift + click\n * Select word: double click\n * Select line: triple click\n * ```\n */\nexport class IText<\n Props extends TOptions<ITextProps> = Partial<ITextProps>,\n SProps extends SerializedITextProps = SerializedITextProps,\n EventSpec extends ITextEvents = ITextEvents\n >\n extends ITextClickBehavior<Props, SProps, EventSpec>\n implements UniqueITextProps\n{\n /**\n * Index where text selection starts (or where cursor is when there is no selection)\n * @type Number\n * @default\n */\n declare selectionStart: number;\n\n /**\n * Index where text selection ends\n * @type Number\n * @default\n */\n declare selectionEnd: number;\n\n declare compositionStart: number;\n\n declare compositionEnd: number;\n\n /**\n * Color of text selection\n * @type String\n * @default\n */\n declare selectionColor: string;\n\n /**\n * Indicates whether text is in editing mode\n * @type Boolean\n * @default\n */\n declare isEditing: boolean;\n\n /**\n * Indicates whether a text can be edited\n * @type Boolean\n * @default\n */\n declare editable: boolean;\n\n /**\n * Border color of text object while it's in editing mode\n * @type String\n * @default\n */\n declare editingBorderColor: string;\n\n /**\n * Width of cursor (in px)\n * @type Number\n * @default\n */\n declare cursorWidth: number;\n\n /**\n * Color of text cursor color in editing mode.\n * if not set (default) will take color from the text.\n * if set to a color value that fabric can understand, it will\n * be used instead of the color of the text at the current position.\n * @type String\n * @default\n */\n declare cursorColor: string;\n\n /**\n * Delay between cursor blink (in ms)\n * @type Number\n * @default\n */\n declare cursorDelay: number;\n\n /**\n * Duration of cursor fade in (in ms)\n * @type Number\n * @default\n */\n declare cursorDuration: number;\n\n declare compositionColor: string;\n\n /**\n * Indicates whether internal text char widths can be cached\n * @type Boolean\n * @default\n */\n declare caching: boolean;\n\n static ownDefaults = iTextDefaultValues;\n\n static getDefaults(): Record<string, any> {\n return { ...super.getDefaults(), ...IText.ownDefaults };\n }\n\n static type = 'IText';\n\n get type() {\n const type = super.type;\n // backward compatibility\n return type === 'itext' ? 'i-text' : type;\n }\n\n /**\n * Constructor\n * @param {String} text Text string\n * @param {Object} [options] Options object\n */\n constructor(text: string, options?: Props) {\n super(text, { ...IText.ownDefaults, ...options } as Props);\n this.initBehavior();\n }\n\n /**\n * While editing handle differently\n * @private\n * @param {string} key\n * @param {*} value\n */\n _set(key: string, value: any) {\n if (this.isEditing && this._savedProps && key in this._savedProps) {\n // @ts-expect-error irritating TS\n this._savedProps[key] = value;\n return this;\n }\n if (key === 'canvas') {\n this.canvas instanceof Canvas &&\n this.canvas.textEditingManager.remove(this);\n value instanceof Canvas && value.textEditingManager.add(this);\n }\n return super._set(key, value);\n }\n\n /**\n * Sets selection start (left boundary of a selection)\n * @param {Number} index Index to set selection start to\n */\n setSelectionStart(index: number) {\n index = Math.max(index, 0);\n this._updateAndFire('selectionStart', index);\n }\n\n /**\n * Sets selection end (right boundary of a selection)\n * @param {Number} index Index to set selection end to\n */\n setSelectionEnd(index: number) {\n index = Math.min(index, this.text.length);\n this._updateAndFire('selectionEnd', index);\n }\n\n /**\n * @private\n * @param {String} property 'selectionStart' or 'selectionEnd'\n * @param {Number} index new position of property\n */\n protected _updateAndFire(\n property: 'selectionStart' | 'selectionEnd',\n index: number\n ) {\n if (this[property] !== index) {\n this._fireSelectionChanged();\n this[property] = index;\n }\n this._updateTextarea();\n }\n\n /**\n * Fires the even of selection changed\n * @private\n */\n _fireSelectionChanged() {\n this.fire('selection:changed');\n this.canvas && this.canvas.fire('text:selection:changed', { target: this });\n }\n\n /**\n * Initialize text dimensions. Render all text on given context\n * or on a offscreen canvas to get the text width with measureText.\n * Updates this.width and this.height with the proper values.\n * Does not return dimensions.\n * @private\n */\n initDimensions() {\n this.isEditing && this.initDelayedCursor();\n super.initDimensions();\n }\n\n /**\n * Gets style of a current selection/cursor (at the start position)\n * if startIndex or endIndex are not provided, selectionStart or selectionEnd will be used.\n * @param {Number} startIndex Start index to get styles at\n * @param {Number} endIndex End index to get styles at, if not specified selectionEnd or startIndex + 1\n * @param {Boolean} [complete] get full style or not\n * @return {Array} styles an array with one, zero or more Style objects\n */\n getSelectionStyles(\n startIndex: number = this.selectionStart || 0,\n endIndex: number = this.selectionEnd,\n complete?: boolean\n ) {\n return super.getSelectionStyles(startIndex, endIndex, complete);\n }\n\n /**\n * Sets style of a current selection, if no selection exist, do not set anything.\n * @param {Object} [styles] Styles object\n * @param {Number} [startIndex] Start index to get styles at\n * @param {Number} [endIndex] End index to get styles at, if not specified selectionEnd or startIndex + 1\n */\n setSelectionStyles(\n styles: object,\n startIndex: number = this.selectionStart || 0,\n endIndex: number = this.selectionEnd\n ) {\n return super.setSelectionStyles(styles, startIndex, endIndex);\n }\n\n /**\n * Returns 2d representation (lineIndex and charIndex) of cursor (or selection start)\n * @param {Number} [selectionStart] Optional index. When not given, current selectionStart is used.\n * @param {Boolean} [skipWrapping] consider the location for unwrapped lines. useful to manage styles.\n */\n get2DCursorLocation(\n selectionStart = this.selectionStart,\n skipWrapping?: boolean\n ) {\n return super.get2DCursorLocation(selectionStart, skipWrapping);\n }\n\n /**\n * @private\n * @param {CanvasRenderingContext2D} ctx Context to render on\n */\n render(ctx: CanvasRenderingContext2D) {\n super.render(ctx);\n // clear the cursorOffsetCache, so we ensure to calculate once per renderCursor\n // the correct position but not at every cursor animation.\n this.cursorOffsetCache = {};\n this.renderCursorOrSelection();\n }\n\n /**\n * @override block cursor/selection logic while rendering the exported canvas\n * @todo this workaround should be replaced with a more robust solution\n */\n toCanvasElement(options?: ObjectToCanvasElementOptions): HTMLCanvasElement {\n const isEditing = this.isEditing;\n this.isEditing = false;\n const canvas = super.toCanvasElement(options);\n this.isEditing = isEditing;\n return canvas;\n }\n\n /**\n * Renders cursor or selection (depending on what exists)\n * it does on the contextTop. If contextTop is not available, do nothing.\n */\n renderCursorOrSelection() {\n if (!this.isEditing) {\n return;\n }\n const ctx = this.clearContextTop(true);\n if (!ctx) {\n return;\n }\n const boundaries = this._getCursorBoundaries();\n if (this.selectionStart === this.selectionEnd) {\n this.renderCursor(ctx, boundaries);\n } else {\n this.renderSelection(ctx, boundaries);\n }\n this.canvas!.contextTopDirty = true;\n ctx.restore();\n }\n\n /**\n * Returns cursor boundaries (left, top, leftOffset, topOffset)\n * left/top are left/top of entire text box\n * leftOffset/topOffset are offset from that left/top point of a text box\n * @private\n * @param {number} [index] index from start\n * @param {boolean} [skipCaching]\n */\n _getCursorBoundaries(\n index: number = this.selectionStart,\n skipCaching?: boolean\n ): CursorBoundaries {\n const left = this._getLeftOffset(),\n top = this._getTopOffset(),\n offsets = this._getCursorBoundariesOffsets(index, skipCaching);\n return {\n left: left,\n top: top,\n leftOffset: offsets.left,\n topOffset: offsets.top,\n };\n }\n\n /**\n * Caches and returns cursor left/top offset relative to instance's center point\n * @private\n * @param {number} index index from start\n * @param {boolean} [skipCaching]\n */\n _getCursorBoundariesOffsets(\n index: number,\n skipCaching?: boolean\n ): { left: number; top: number } {\n if (skipCaching) {\n return this.__getCursorBoundariesOffsets(index);\n }\n if (this.cursorOffsetCache && 'top' in this.cursorOffsetCache) {\n return this.cursorOffsetCache as { left: number; top: number };\n }\n return (this.cursorOffsetCache = this.__getCursorBoundariesOffsets(index));\n }\n\n /**\n * Calculates cursor left/top offset relative to instance's center point\n * @private\n * @param {number} index index from start\n */\n __getCursorBoundariesOffsets(index: number) {\n let topOffset = 0,\n leftOffset = 0;\n const { charIndex, lineIndex } = this.get2DCursorLocation(index);\n\n for (let i = 0; i < lineIndex; i++) {\n topOffset += this.getHeightOfLine(i);\n }\n const lineLeftOffset = this._getLineLeftOffset(lineIndex);\n const bound = this.__charBounds[lineIndex][charIndex];\n bound && (leftOffset = bound.left);\n if (\n this.charSpacing !== 0 &&\n charIndex === this._textLines[lineIndex].length\n ) {\n leftOffset -= this._getWidthOfCharSpacing();\n }\n const boundaries = {\n top: topOffset,\n left: lineLeftOffset + (leftOffset > 0 ? leftOffset : 0),\n };\n if (this.direction === 'rtl') {\n if (\n this.textAlign === RIGHT ||\n this.textAlign === JUSTIFY ||\n this.textAlign === JUSTIFY_RIGHT\n ) {\n boundaries.left *= -1;\n } else if (this.textAlign === LEFT || this.textAlign === JUSTIFY_LEFT) {\n boundaries.left = lineLeftOffset - (leftOffset > 0 ? leftOffset : 0);\n } else if (\n this.textAlign === CENTER ||\n this.textAlign === JUSTIFY_CENTER\n ) {\n boundaries.left = lineLeftOffset - (leftOffset > 0 ? leftOffset : 0);\n }\n }\n return boundaries;\n }\n\n /**\n * Renders cursor on context Top, outside the animation cycle, on request\n * Used for the drag/drop effect.\n * If contextTop is not available, do nothing.\n */\n renderCursorAt(selectionStart: number) {\n const boundaries = this._getCursorBoundaries(selectionStart, true);\n this._renderCursor(this.canvas!.contextTop, boundaries, selectionStart);\n }\n\n /**\n * Renders cursor\n * @param {Object} boundaries\n * @param {CanvasRenderingContext2D} ctx transformed context to draw on\n */\n renderCursor(ctx: CanvasRenderingContext2D, boundaries: CursorBoundaries) {\n this._renderCursor(ctx, boundaries, this.selectionStart);\n }\n\n _renderCursor(\n ctx: CanvasRenderingContext2D,\n boundaries: CursorBoundaries,\n selectionStart: number\n ) {\n const cursorLocation = this.get2DCursorLocation(selectionStart),\n lineIndex = cursorLocation.lineIndex,\n charIndex =\n cursorLocation.charIndex > 0 ? cursorLocation.charIndex - 1 : 0,\n charHeight = this.getValueOfPropertyAt(lineIndex, charIndex, 'fontSize'),\n multiplier = this.getObjectScaling().x * this.canvas!.getZoom(),\n cursorWidth = this.cursorWidth / multiplier,\n dy = this.getValueOfPropertyAt(lineIndex, charIndex, 'deltaY'),\n topOffset =\n boundaries.topOffset +\n ((1 - this._fontSizeFraction) * this.getHeightOfLine(lineIndex)) /\n this.lineHeight -\n charHeight * (1 - this._fontSizeFraction);\n\n if (this.inCompositionMode) {\n // TODO: investigate why there isn't a return inside the if,\n // and why can't happen at the top of the function\n this.renderSelection(ctx, boundaries);\n }\n ctx.fillStyle =\n this.cursorColor ||\n (this.getValueOfPropertyAt(lineIndex, charIndex, FILL) as string);\n ctx.globalAlpha = this._currentCursorOpacity;\n ctx.fillRect(\n boundaries.left + boundaries.leftOffset - cursorWidth / 2,\n topOffset + boundaries.top + dy,\n cursorWidth,\n charHeight\n );\n }\n\n /**\n * Renders text selection\n * @param {Object} boundaries Object with left/top/leftOffset/topOffset\n * @param {CanvasRenderingContext2D} ctx transformed context to draw on\n */\n renderSelection(ctx: CanvasRenderingContext2D, boundaries: CursorBoundaries) {\n const selection = {\n selectionStart: this.inCompositionMode\n ? this.hiddenTextarea!.selectionStart\n : this.selectionStart,\n selectionEnd: this.inCompositionMode\n ? this.hiddenTextarea!.selectionEnd\n : this.selectionEnd,\n };\n this._renderSelection(ctx, selection, boundaries);\n }\n\n /**\n * Renders drag start text selection\n */\n renderDragSourceEffect() {\n const dragStartSelection =\n this.draggableTextDelegate.getDragStartSelection()!;\n this._renderSelection(\n this.canvas!.contextTop,\n dragStartSelection,\n this._getCursorBoundaries(dragStartSelection.selectionStart, true)\n );\n }\n\n renderDropTargetEffect(e: DragEvent) {\n const dragSelection = this.getSelectionStartFromPointer(e);\n this.renderCursorAt(dragSelection);\n }\n\n /**\n * Renders text selection\n * @private\n * @param {{ selectionStart: number, selectionEnd: number }} selection\n * @param {Object} boundaries Object with left/top/leftOffset/topOffset\n * @param {CanvasRenderingContext2D} ctx transformed context to draw on\n */\n _renderSelection(\n ctx: CanvasRenderingContext2D,\n selection: { selectionStart: number; selectionEnd: number },\n boundaries: CursorBoundaries\n ) {\n const selectionStart = selection.selectionStart,\n selectionEnd = selection.selectionEnd,\n isJustify = this.textAlign.includes(JUSTIFY),\n start = this.get2DCursorLocation(selectionStart),\n end = this.get2DCursorLocation(selectionEnd),\n startLine = start.lineIndex,\n endLine = end.lineIndex,\n startChar = start.charIndex < 0 ? 0 : start.charIndex,\n endChar = end.charIndex < 0 ? 0 : end.charIndex;\n\n for (let i = startLine; i <= endLine; i++) {\n const lineOffset = this._getLineLeftOffset(i) || 0;\n let lineHeight = this.getHeightOfLine(i),\n realLineHeight = 0,\n boxStart = 0,\n boxEnd = 0;\n\n if (i === startLine) {\n boxStart = this.__charBounds[startLine][startChar].left;\n }\n if (i >= startLine && i < endLine) {\n boxEnd =\n isJustify && !this.isEndOfWrapping(i)\n ? this.width\n : this.getLineWidth(i) || 5; // WTF is this 5?\n } else if (i === endLine) {\n if (endChar === 0) {\n boxEnd = this.__charBounds[endLine][endChar].left;\n } else {\n const charSpacing = this._getWidthOfCharSpacing();\n boxEnd =\n this.__charBounds[endLine][endChar - 1].left +\n this.__charBounds[endLine][endChar - 1].width -\n charSpacing;\n }\n }\n realLineHeight = lineHeight;\n if (this.lineHeight < 1 || (i === endLine && this.lineHeight > 1)) {\n lineHeight /= this.lineHeight;\n }\n let drawStart = boundaries.left + lineOffset + boxStart,\n drawHeight = lineHeight,\n extraTop = 0;\n const drawWidth = boxEnd - boxStart;\n if (this.inCompositionMode) {\n ctx.fillStyle = this.compositionColor || 'black';\n drawHeight = 1;\n extraTop = lineHeight;\n } else {\n ctx.fillStyle = this.selectionColor;\n }\n if (this.direction === 'rtl') {\n if (\n this.textAlign === RIGHT ||\n this.textAlign === JUSTIFY ||\n this.textAlign === JUSTIFY_RIGHT\n ) {\n drawStart = this.width - drawStart - drawWidth;\n } else if (this.textAlign === LEFT || this.textAlign === JUSTIFY_LEFT) {\n drawStart = boundaries.left + lineOffset - boxEnd;\n } else if (\n this.textAlign === CENTER ||\n this.textAlign === JUSTIFY_CENTER\n ) {\n drawStart = boundaries.left + lineOffset - boxEnd;\n }\n }\n ctx.fillRect(\n drawStart,\n boundaries.top + boundaries.topOffset + extraTop,\n drawWidth,\n drawHeight\n );\n boundaries.topOffset += realLineHeight;\n }\n }\n\n /**\n * High level function to know the height of the cursor.\n * the currentChar is the one that precedes the cursor\n * Returns fontSize of char at the current cursor\n * Unused from the library, is for the end user\n * @return {Number} Character font size\n */\n getCurrentCharFontSize(): number {\n const cp = this._getCurrentCharIndex();\n return this.getValueOfPropertyAt(cp.l, cp.c, 'fontSize');\n }\n\n /**\n * High level function to know the color of the cursor.\n * the currentChar is the one that precedes the cursor\n * Returns color (fill) of char at the current cursor\n * if the text object has a pattern or gradient for filler, it will return that.\n * Unused by the library, is for the end user\n * @return {String | TFiller} Character color (fill)\n */\n getCurrentCharColor(): string | TFiller | null {\n const cp = this._getCurrentCharIndex();\n return this.getValueOfPropertyAt(cp.l, cp.c, FILL);\n }\n\n /**\n * Returns the cursor position for the getCurrent.. functions\n * @private\n */\n _getCurrentCharIndex() {\n const cursorPosition = this.get2DCursorLocation(this.selectionStart, true),\n charIndex =\n cursorPosition.charIndex > 0 ? cursorPosition.charIndex - 1 : 0;\n return { l: cursorPosition.lineIndex, c: charIndex };\n }\n\n dispose() {\n this._exitEditing();\n this.draggableTextDelegate.dispose();\n super.dispose();\n }\n}\n\nclassRegistry.setClass(IText);\n// legacy\nclassRegistry.setClass(IText, 'i-text');\n"],"names":["iTextDefaultValues","_objectSpread","selectionStart","selectionEnd","selectionColor","isEditing","editable","editingBorderColor","cursorWidth","cursorColor","cursorDelay","cursorDuration","caching","hiddenTextareaContainer","keysMap","keysMapRtl","ctrlKeysMapDown","ctrlKeysMapUp","_selectionDirection","_reSpace","inCompositionMode","IText","ITextClickBehavior","getDefaults","super","ownDefaults","type","constructor","text","options","this","initBehavior","_set","key","value","_savedProps","canvas","Canvas","textEditingManager","remove","add","setSelectionStart","index","Math","max","_updateAndFire","setSelectionEnd","min","length","property","_fireSelectionChanged","_updateTextarea","fire","target","initDimensions","initDelayedCursor","getSelectionStyles","startIndex","arguments","undefined","endIndex","complete","setSelectionStyles","styles","get2DCursorLocation","skipWrapping","render","ctx","cursorOffsetCache","renderCursorOrSelection","toCanvasElement","clearContextTop","boundaries","_getCursorBoundaries","renderCursor","renderSelection","contextTopDirty","restore","skipCaching","left","_getLeftOffset","top","_getTopOffset","offsets","_getCursorBoundariesOffsets","leftOffset","topOffset","__getCursorBoundariesOffsets","charIndex","lineIndex","i","getHeightOfLine","lineLeftOffset","_getLineLeftOffset","bound","__charBounds","charSpacing","_textLines","_getWidthOfCharSpacing","direction","textAlign","RIGHT","JUSTIFY","JUSTIFY_RIGHT","LEFT","JUSTIFY_LEFT","CENTER","JUSTIFY_CENTER","renderCursorAt","_renderCursor","contextTop","cursorLocation","charHeight","getValueOfPropertyAt","multiplier","getObjectScaling","x","getZoom","dy","_fontSizeFraction","lineHeight","fillStyle","FILL","globalAlpha","_currentCursorOpacity","fillRect","selection","hiddenTextarea","_renderSelection","renderDragSourceEffect","dragStartSelection","draggableTextDelegate","getDragStartSelection","renderDropTargetEffect","e","dragSelection","getSelectionStartFromPointer","isJustify","includes","start","end","startLine","endLine","startChar","endChar","lineOffset","realLineHeight","boxStart","boxEnd","isEndOfWrapping","width","getLineWidth","drawStart","drawHeight","extraTop","drawWidth","compositionColor","getCurrentCharFontSize","cp","_getCurrentCharIndex","l","c","getCurrentCharColor","cursorPosition","dispose","_exitEditing","_defineProperty","classRegistry","setClass"],"mappings":"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"}
|