UNPKG

fabric

Version:

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

1 lines 31.6 kB
{"version":3,"file":"Group.min.mjs","sources":["../../../src/shapes/Group.ts"],"sourcesContent":["import type { CollectionEvents, ObjectEvents } from '../EventTypeDefs';\nimport { createCollectionMixin } from '../Collection';\nimport type {\n TClassProperties,\n TSVGReviver,\n TOptions,\n Abortable,\n} from '../typedefs';\nimport {\n invertTransform,\n multiplyTransformMatrices,\n} from '../util/misc/matrix';\nimport {\n enlivenObjectEnlivables,\n enlivenObjects,\n} from '../util/misc/objectEnlive';\nimport { applyTransformToObject } from '../util/misc/objectTransforms';\nimport { FabricObject } from './Object/FabricObject';\nimport { Rect } from './Rect';\nimport { classRegistry } from '../ClassRegistry';\nimport type { FabricObjectProps, SerializedObjectProps } from './Object/types';\nimport { log } from '../util/internals/console';\nimport type {\n ImperativeLayoutOptions,\n LayoutBeforeEvent,\n LayoutAfterEvent,\n} from '../LayoutManager/types';\nimport { LayoutManager } from '../LayoutManager/LayoutManager';\nimport {\n LAYOUT_TYPE_ADDED,\n LAYOUT_TYPE_IMPERATIVE,\n LAYOUT_TYPE_INITIALIZATION,\n LAYOUT_TYPE_REMOVED,\n} from '../LayoutManager/constants';\nimport type { SerializedLayoutManager } from '../LayoutManager/LayoutManager';\nimport type { FitContentLayout } from '../LayoutManager';\nimport type { DrawContext } from './Object/Object';\n\n/**\n * This class handles the specific case of creating a group using {@link Group#fromObject} and is not meant to be used in any other case.\n * We could have used a boolean in the constructor, as we did previously, but we think the boolean\n * would stay in the group's constructor interface and create confusion, therefore it was removed.\n * This layout manager doesn't do anything and therefore keeps the exact layout the group had when {@link Group#toObject} was called.\n */\nclass NoopLayoutManager extends LayoutManager {\n performLayout() {}\n}\n\nexport interface GroupEvents extends ObjectEvents, CollectionEvents {\n 'layout:before': LayoutBeforeEvent;\n 'layout:after': LayoutAfterEvent;\n}\n\nexport interface GroupOwnProps {\n subTargetCheck: boolean;\n interactive: boolean;\n}\n\nexport interface SerializedGroupProps\n extends SerializedObjectProps,\n GroupOwnProps {\n objects: SerializedObjectProps[];\n layoutManager: SerializedLayoutManager;\n}\n\nexport interface GroupProps extends FabricObjectProps, GroupOwnProps {\n layoutManager: LayoutManager;\n}\n\nexport const groupDefaultValues: Partial<TClassProperties<Group>> = {\n strokeWidth: 0,\n subTargetCheck: false,\n interactive: false,\n};\n\n/**\n * @fires object:added\n * @fires object:removed\n * @fires layout:before\n * @fires layout:after\n */\nexport class Group\n extends createCollectionMixin(\n FabricObject<GroupProps, SerializedGroupProps, GroupEvents>,\n )\n implements GroupProps\n{\n /**\n * Used to optimize performance\n * set to `false` if you don't need contained objects to be targets of events\n * @default\n * @type boolean\n */\n declare subTargetCheck: boolean;\n\n /**\n * Used to allow targeting of object inside groups.\n * set to true if you want to select an object inside a group.\\\n * **REQUIRES** `subTargetCheck` set to true\n * This will be not removed but slowly replaced with a method setInteractive\n * that will take care of enabling subTargetCheck and necessary object events.\n * There is too much attached to group interactivity to just be evaluated by a\n * boolean in the code\n * @default\n * @deprecated\n * @type boolean\n */\n declare interactive: boolean;\n\n declare layoutManager: LayoutManager;\n\n /**\n * Used internally to optimize performance\n * Once an object is selected, instance is rendered without the selected object.\n * This way instance is cached only once for the entire interaction with the selected object.\n * @private\n */\n protected _activeObjects: FabricObject[] = [];\n\n static type = 'Group';\n\n static ownDefaults: Record<string, any> = groupDefaultValues;\n private __objectSelectionTracker: (ev: ObjectEvents['selected']) => void;\n private __objectSelectionDisposer: (ev: ObjectEvents['deselected']) => void;\n\n static getDefaults(): Record<string, any> {\n return {\n ...super.getDefaults(),\n ...Group.ownDefaults,\n };\n }\n\n /**\n * Constructor\n *\n * @param {FabricObject[]} [objects] instance objects\n * @param {Object} [options] Options object\n */\n constructor(objects: FabricObject[] = [], options: Partial<GroupProps> = {}) {\n super();\n Object.assign(this, Group.ownDefaults);\n this.setOptions(options);\n this.groupInit(objects, options);\n }\n\n /**\n * Shared code between group and active selection\n * Meant to be used by the constructor.\n */\n protected groupInit(\n objects: FabricObject[],\n options: {\n layoutManager?: LayoutManager;\n top?: number;\n left?: number;\n },\n ) {\n this._objects = [...objects]; // Avoid unwanted mutations of Collection to affect the caller\n\n this.__objectSelectionTracker = this.__objectSelectionMonitor.bind(\n this,\n true,\n );\n this.__objectSelectionDisposer = this.__objectSelectionMonitor.bind(\n this,\n false,\n );\n\n this.forEachObject((object) => {\n this.enterGroup(object, false);\n });\n\n // perform initial layout\n this.layoutManager = options.layoutManager ?? new LayoutManager();\n this.layoutManager.performLayout({\n type: LAYOUT_TYPE_INITIALIZATION,\n target: this,\n targets: [...objects],\n // @TODO remove this concept from the layout manager.\n // Layout manager will calculate the correct position,\n // group options can override it later.\n x: options.left,\n y: options.top,\n });\n }\n\n /**\n * Checks if object can enter group and logs relevant warnings\n * @private\n * @param {FabricObject} object\n * @returns\n */\n canEnterGroup(object: FabricObject) {\n if (object === this || this.isDescendantOf(object)) {\n // prevent circular object tree\n log(\n 'error',\n 'Group: circular object trees are not supported, this call has no effect',\n );\n return false;\n } else if (this._objects.indexOf(object) !== -1) {\n // is already in the objects array\n log(\n 'error',\n 'Group: duplicate objects are not supported inside group, this call has no effect',\n );\n return false;\n }\n return true;\n }\n\n /**\n * Override this method to enhance performance (for groups with a lot of objects).\n * If Overriding, be sure not pass illegal objects to group - it will break your app.\n * @private\n */\n protected _filterObjectsBeforeEnteringGroup(objects: FabricObject[]) {\n return objects.filter((object, index, array) => {\n // can enter AND is the first occurrence of the object in the passed args (to prevent adding duplicates)\n return this.canEnterGroup(object) && array.indexOf(object) === index;\n });\n }\n\n /**\n * Add objects\n * @param {...FabricObject[]} objects\n */\n add(...objects: FabricObject[]) {\n const allowedObjects = this._filterObjectsBeforeEnteringGroup(objects);\n const size = super.add(...allowedObjects);\n this._onAfterObjectsChange(LAYOUT_TYPE_ADDED, allowedObjects);\n return size;\n }\n\n /**\n * Inserts an object into collection at specified index\n * @param {FabricObject[]} objects Object to insert\n * @param {Number} index Index to insert object at\n */\n insertAt(index: number, ...objects: FabricObject[]) {\n const allowedObjects = this._filterObjectsBeforeEnteringGroup(objects);\n const size = super.insertAt(index, ...allowedObjects);\n this._onAfterObjectsChange(LAYOUT_TYPE_ADDED, allowedObjects);\n return size;\n }\n\n /**\n * Remove objects\n * @param {...FabricObject[]} objects\n * @returns {FabricObject[]} removed objects\n */\n remove(...objects: FabricObject[]) {\n const removed = super.remove(...objects);\n this._onAfterObjectsChange(LAYOUT_TYPE_REMOVED, removed);\n return removed;\n }\n\n _onObjectAdded(object: FabricObject) {\n this.enterGroup(object, true);\n this.fire('object:added', { target: object });\n object.fire('added', { target: this });\n }\n\n /**\n * @private\n * @param {FabricObject} object\n * @param {boolean} [removeParentTransform] true if object should exit group without applying group's transform to it\n */\n _onObjectRemoved(object: FabricObject, removeParentTransform?: boolean) {\n this.exitGroup(object, removeParentTransform);\n this.fire('object:removed', { target: object });\n object.fire('removed', { target: this });\n }\n\n /**\n * @private\n * @param {'added'|'removed'} type\n * @param {FabricObject[]} targets\n */\n _onAfterObjectsChange(type: 'added' | 'removed', targets: FabricObject[]) {\n this.layoutManager.performLayout({\n type,\n targets,\n target: this,\n });\n }\n\n _onStackOrderChanged() {\n this._set('dirty', true);\n }\n\n /**\n * @private\n * @param {string} key\n * @param {*} value\n */\n _set(key: string, value: any) {\n const prev = this[key as keyof this];\n super._set(key, value);\n if (key === 'canvas' && prev !== value) {\n (this._objects || []).forEach((object) => {\n object._set(key, value);\n });\n }\n return this;\n }\n\n /**\n * @private\n */\n _shouldSetNestedCoords() {\n return this.subTargetCheck;\n }\n\n /**\n * Remove all objects\n * @returns {FabricObject[]} removed objects\n */\n removeAll() {\n this._activeObjects = [];\n return this.remove(...this._objects);\n }\n\n /**\n * keeps track of the selected objects\n * @private\n */\n __objectSelectionMonitor<T extends boolean>(\n selected: T,\n {\n target: object,\n }: ObjectEvents[T extends true ? 'selected' : 'deselected'],\n ) {\n const activeObjects = this._activeObjects;\n if (selected) {\n activeObjects.push(object);\n this._set('dirty', true);\n } else if (activeObjects.length > 0) {\n const index = activeObjects.indexOf(object);\n if (index > -1) {\n activeObjects.splice(index, 1);\n this._set('dirty', true);\n }\n }\n }\n\n /**\n * @private\n * @param {boolean} watch\n * @param {FabricObject} object\n */\n _watchObject(watch: boolean, object: FabricObject) {\n // make sure we listen only once\n watch && this._watchObject(false, object);\n if (watch) {\n object.on('selected', this.__objectSelectionTracker);\n object.on('deselected', this.__objectSelectionDisposer);\n } else {\n object.off('selected', this.__objectSelectionTracker);\n object.off('deselected', this.__objectSelectionDisposer);\n }\n }\n\n /**\n * @private\n * @param {FabricObject} object\n * @param {boolean} [removeParentTransform] true if object is in canvas coordinate plane\n */\n enterGroup(object: FabricObject, removeParentTransform?: boolean) {\n object.group && object.group.remove(object);\n object._set('parent', this);\n this._enterGroup(object, removeParentTransform);\n }\n\n /**\n * @private\n * @param {FabricObject} object\n * @param {boolean} [removeParentTransform] true if object is in canvas coordinate plane\n */\n _enterGroup(object: FabricObject, removeParentTransform?: boolean) {\n if (removeParentTransform) {\n // can this be converted to utils (sendObjectToPlane)?\n applyTransformToObject(\n object,\n multiplyTransformMatrices(\n invertTransform(this.calcTransformMatrix()),\n object.calcTransformMatrix(),\n ),\n );\n }\n this._shouldSetNestedCoords() && object.setCoords();\n object._set('group', this);\n object._set('canvas', this.canvas);\n this._watchObject(true, object);\n const activeObject =\n this.canvas &&\n this.canvas.getActiveObject &&\n this.canvas.getActiveObject();\n // if we are adding the activeObject in a group\n if (\n activeObject &&\n (activeObject === object || object.isDescendantOf(activeObject))\n ) {\n this._activeObjects.push(object);\n }\n }\n\n /**\n * @private\n * @param {FabricObject} object\n * @param {boolean} [removeParentTransform] true if object should exit group without applying group's transform to it\n */\n exitGroup(object: FabricObject, removeParentTransform?: boolean) {\n this._exitGroup(object, removeParentTransform);\n object._set('parent', undefined);\n object._set('canvas', undefined);\n }\n\n /**\n * Executes the inner fabric logic of exiting a group.\n * - Stop watching the object\n * - Remove the object from the optimization map this._activeObjects\n * - unset the group property of the object\n * @protected\n * @param {FabricObject} object\n * @param {boolean} [removeParentTransform] true if object should exit group without applying group's transform to it\n */\n _exitGroup(object: FabricObject, removeParentTransform?: boolean) {\n object._set('group', undefined);\n if (!removeParentTransform) {\n applyTransformToObject(\n object,\n multiplyTransformMatrices(\n this.calcTransformMatrix(),\n object.calcTransformMatrix(),\n ),\n );\n object.setCoords();\n }\n this._watchObject(false, object);\n const index =\n this._activeObjects.length > 0 ? this._activeObjects.indexOf(object) : -1;\n if (index > -1) {\n this._activeObjects.splice(index, 1);\n }\n }\n\n /**\n * Decide if the group should cache or not. Create its own cache level\n * needsItsOwnCache should be used when the object drawing method requires\n * a cache step.\n * Generally you do not cache objects in groups because the group is already cached.\n * @return {Boolean}\n */\n shouldCache() {\n const ownCache = FabricObject.prototype.shouldCache.call(this);\n if (ownCache) {\n for (let i = 0; i < this._objects.length; i++) {\n if (this._objects[i].willDrawShadow()) {\n this.ownCaching = false;\n return false;\n }\n }\n }\n return ownCache;\n }\n\n /**\n * Check if this object or a child object will cast a shadow\n * @return {Boolean}\n */\n willDrawShadow() {\n if (super.willDrawShadow()) {\n return true;\n }\n for (let i = 0; i < this._objects.length; i++) {\n if (this._objects[i].willDrawShadow()) {\n return true;\n }\n }\n return false;\n }\n\n /**\n * Check if instance or its group are caching, recursively up\n * @return {Boolean}\n */\n isOnACache(): boolean {\n return this.ownCaching || (!!this.parent && this.parent.isOnACache());\n }\n\n /**\n * Execute the drawing operation for an object on a specified context\n * @param {CanvasRenderingContext2D} ctx Context to render on\n */\n drawObject(\n ctx: CanvasRenderingContext2D,\n forClipping: boolean | undefined,\n context: DrawContext,\n ) {\n this._renderBackground(ctx);\n for (let i = 0; i < this._objects.length; i++) {\n const obj = this._objects[i];\n // TODO: handle rendering edge case somehow\n if (this.canvas?.preserveObjectStacking && obj.group !== this) {\n ctx.save();\n ctx.transform(...invertTransform(this.calcTransformMatrix()));\n obj.render(ctx);\n ctx.restore();\n } else if (obj.group === this) {\n obj.render(ctx);\n }\n }\n this._drawClipPath(ctx, this.clipPath, context);\n }\n\n /**\n * @override\n * @return {Boolean}\n */\n setCoords() {\n super.setCoords();\n this._shouldSetNestedCoords() &&\n this.forEachObject((object) => object.setCoords());\n }\n\n triggerLayout(options: ImperativeLayoutOptions = {}) {\n this.layoutManager.performLayout({\n target: this,\n type: LAYOUT_TYPE_IMPERATIVE,\n ...options,\n });\n }\n\n /**\n * Renders instance on a given context\n * @param {CanvasRenderingContext2D} ctx context to render instance on\n */\n render(ctx: CanvasRenderingContext2D) {\n this._transformDone = true;\n super.render(ctx);\n this._transformDone = false;\n }\n\n /**\n *\n * @private\n * @param {'toObject'|'toDatalessObject'} [method]\n * @param {string[]} [propertiesToInclude] Any properties that you might want to additionally include in the output\n * @returns {FabricObject[]} serialized objects\n */\n __serializeObjects(\n method: 'toObject' | 'toDatalessObject',\n propertiesToInclude?: string[],\n ) {\n const _includeDefaultValues = this.includeDefaultValues;\n return this._objects\n .filter(function (obj) {\n return !obj.excludeFromExport;\n })\n .map(function (obj) {\n const originalDefaults = obj.includeDefaultValues;\n obj.includeDefaultValues = _includeDefaultValues;\n const data = obj[method || 'toObject'](propertiesToInclude);\n obj.includeDefaultValues = originalDefaults;\n // delete data.version;\n return data;\n });\n }\n\n /**\n * Returns object representation of an instance\n * @param {string[]} [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<\n GroupProps & TClassProperties<this>,\n keyof SerializedGroupProps\n >,\n K extends keyof T = never,\n >(propertiesToInclude: K[] = []): Pick<T, K> & SerializedGroupProps {\n const layoutManager = this.layoutManager.toObject();\n\n return {\n ...super.toObject([\n 'subTargetCheck',\n 'interactive',\n ...propertiesToInclude,\n ]),\n ...(layoutManager.strategy !== 'fit-content' || this.includeDefaultValues\n ? { layoutManager }\n : {}),\n objects: this.__serializeObjects(\n 'toObject',\n propertiesToInclude as string[],\n ),\n };\n }\n\n toString() {\n return `#<Group: (${this.complexity()})>`;\n }\n\n dispose() {\n this.layoutManager.unsubscribeTargets({\n targets: this.getObjects(),\n target: this,\n });\n this._activeObjects = [];\n this.forEachObject((object) => {\n this._watchObject(false, object);\n object.dispose();\n });\n super.dispose();\n }\n\n /**\n * @private\n */\n _createSVGBgRect(reviver?: TSVGReviver) {\n if (!this.backgroundColor) {\n return '';\n }\n const fillStroke = Rect.prototype._toSVG.call(this);\n const commons = fillStroke.indexOf('COMMON_PARTS');\n fillStroke[commons] = 'for=\"group\" ';\n const markup = fillStroke.join('');\n return reviver ? reviver(markup) : markup;\n }\n\n /**\n * Returns svg representation of an instance\n * @param {TSVGReviver} [reviver] Method for further parsing of svg representation.\n * @return {String} svg representation of an instance\n */\n _toSVG(reviver?: TSVGReviver) {\n const svgString = ['<g ', 'COMMON_PARTS', ' >\\n'];\n const bg = this._createSVGBgRect(reviver);\n bg && svgString.push('\\t\\t', bg);\n for (let i = 0; i < this._objects.length; i++) {\n svgString.push('\\t\\t', this._objects[i].toSVG(reviver));\n }\n svgString.push('</g>\\n');\n return svgString;\n }\n\n /**\n * Returns styles-string for svg-export, specific version for group\n * @return {String}\n */\n getSvgStyles(): string {\n const opacity =\n typeof this.opacity !== 'undefined' && this.opacity !== 1\n ? `opacity: ${this.opacity};`\n : '',\n visibility = this.visible ? '' : ' visibility: hidden;';\n return [opacity, this.getSvgFilter(), visibility].join('');\n }\n\n /**\n * Returns svg clipPath representation of an instance\n * @param {Function} [reviver] Method for further parsing of svg representation.\n * @return {String} svg representation of an instance\n */\n toClipPathSVG(reviver?: TSVGReviver): string {\n const svgString = [];\n const bg = this._createSVGBgRect(reviver);\n bg && svgString.push('\\t', bg);\n for (let i = 0; i < this._objects.length; i++) {\n svgString.push('\\t', this._objects[i].toClipPathSVG(reviver));\n }\n return this._createBaseClipPathSVGMarkup(svgString, {\n reviver,\n });\n }\n\n /**\n * @todo support loading from svg\n * @private\n * @static\n * @memberOf Group\n * @param {Object} object Object to create a group from\n * @returns {Promise<Group>}\n */\n static fromObject<T extends TOptions<SerializedGroupProps>>(\n { type, objects = [], layoutManager, ...options }: T,\n abortable?: Abortable,\n ) {\n return Promise.all([\n enlivenObjects<FabricObject>(objects, abortable),\n enlivenObjectEnlivables(options, abortable),\n ]).then(([objects, hydratedOptions]) => {\n const group = new this(objects, {\n ...options,\n ...hydratedOptions,\n layoutManager: new NoopLayoutManager(),\n });\n if (layoutManager) {\n const layoutClass = classRegistry.getClass<typeof LayoutManager>(\n layoutManager.type,\n );\n const strategyClass = classRegistry.getClass<typeof FitContentLayout>(\n layoutManager.strategy,\n );\n group.layoutManager = new layoutClass(new strategyClass());\n } else {\n group.layoutManager = new LayoutManager();\n }\n group.layoutManager.subscribeTargets({\n type: LAYOUT_TYPE_INITIALIZATION,\n target: group,\n targets: group.getObjects(),\n });\n group.setCoords();\n return group;\n });\n }\n}\n\nclassRegistry.setClass(Group);\n"],"names":["NoopLayoutManager","LayoutManager","performLayout","groupDefaultValues","strokeWidth","subTargetCheck","interactive","Group","createCollectionMixin","FabricObject","getDefaults","_objectSpread","super","ownDefaults","constructor","objects","arguments","length","undefined","options","_defineProperty","this","Object","assign","setOptions","groupInit","_options$layoutManage","_objects","__objectSelectionTracker","__objectSelectionMonitor","bind","__objectSelectionDisposer","forEachObject","object","enterGroup","layoutManager","type","LAYOUT_TYPE_INITIALIZATION","target","targets","x","left","y","top","canEnterGroup","isDescendantOf","log","indexOf","_filterObjectsBeforeEnteringGroup","filter","index","array","add","_len","Array","_key","allowedObjects","size","_onAfterObjectsChange","LAYOUT_TYPE_ADDED","insertAt","_len2","_key2","remove","removed","LAYOUT_TYPE_REMOVED","_onObjectAdded","fire","_onObjectRemoved","removeParentTransform","exitGroup","_onStackOrderChanged","_set","key","value","prev","forEach","_shouldSetNestedCoords","removeAll","_activeObjects","selected","_ref","activeObjects","push","splice","_watchObject","watch","on","off","group","_enterGroup","applyTransformToObject","multiplyTransformMatrices","invertTransform","calcTransformMatrix","setCoords","canvas","activeObject","getActiveObject","_exitGroup","shouldCache","ownCache","prototype","call","i","willDrawShadow","ownCaching","isOnACache","parent","drawObject","ctx","forClipping","context","_renderBackground","_this$canvas","obj","preserveObjectStacking","save","transform","render","restore","_drawClipPath","clipPath","triggerLayout","LAYOUT_TYPE_IMPERATIVE","_transformDone","__serializeObjects","method","propertiesToInclude","_includeDefaultValues","includeDefaultValues","excludeFromExport","map","originalDefaults","data","toObject","strategy","toString","concat","complexity","dispose","unsubscribeTargets","getObjects","_createSVGBgRect","reviver","backgroundColor","fillStroke","Rect","_toSVG","commons","markup","join","svgString","bg","toSVG","getSvgStyles","opacity","visibility","visible","getSvgFilter","toClipPathSVG","_createBaseClipPathSVGMarkup","fromObject","_ref2","abortable","_objectWithoutProperties","_excluded","Promise","all","enlivenObjects","enlivenObjectEnlivables","then","_ref3","hydratedOptions","layoutClass","classRegistry","getClass","strategyClass","subscribeTargets","setClass"],"mappings":"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"}