fabric
Version:
Object model for HTML5 canvas, and SVG-to-canvas parser. Backed by jsdom and node-canvas.
1 lines • 19.5 kB
Source Map (JSON)
{"version":3,"file":"LayoutManager.mjs","sources":["../../../src/LayoutManager/LayoutManager.ts"],"sourcesContent":["import { Point } from '../Point';\nimport {\n CENTER,\n CHANGED,\n MODIFIED,\n MODIFY_PATH,\n MODIFY_POLY,\n MOVING,\n RESIZING,\n ROTATING,\n SCALING,\n SKEWING,\n iMatrix,\n} from '../constants';\nimport type { Group } from '../shapes/Group';\nimport type { FabricObject } from '../shapes/Object/FabricObject';\nimport { invertTransform } from '../util/misc/matrix';\nimport { resolveOrigin } from '../util/misc/resolveOrigin';\nimport { FitContentLayout } from './LayoutStrategies/FitContentLayout';\nimport type { LayoutStrategy } from './LayoutStrategies/LayoutStrategy';\nimport {\n LAYOUT_TYPE_INITIALIZATION,\n LAYOUT_TYPE_ADDED,\n LAYOUT_TYPE_REMOVED,\n LAYOUT_TYPE_IMPERATIVE,\n LAYOUT_TYPE_OBJECT_MODIFIED,\n LAYOUT_TYPE_OBJECT_MODIFYING,\n} from './constants';\nimport type {\n LayoutContext,\n LayoutResult,\n RegistrationContext,\n StrictLayoutContext,\n} from './types';\nimport { classRegistry } from '../ClassRegistry';\nimport type { TModificationEvents } from '../EventTypeDefs';\n\nconst LAYOUT_MANAGER = 'layoutManager';\n\nexport type SerializedLayoutManager = {\n type: string;\n strategy: string;\n};\n\nexport class LayoutManager {\n private declare _prevLayoutStrategy?: LayoutStrategy;\n protected declare _subscriptions: Map<FabricObject, VoidFunction[]>;\n\n strategy: LayoutStrategy;\n\n constructor(strategy: LayoutStrategy = new FitContentLayout()) {\n this.strategy = strategy;\n this._subscriptions = new Map();\n }\n\n public performLayout(context: LayoutContext) {\n const strictContext: StrictLayoutContext = {\n bubbles: true,\n strategy: this.strategy,\n ...context,\n prevStrategy: this._prevLayoutStrategy,\n stopPropagation() {\n this.bubbles = false;\n },\n };\n\n this.onBeforeLayout(strictContext);\n\n const layoutResult = this.getLayoutResult(strictContext);\n if (layoutResult) {\n this.commitLayout(strictContext, layoutResult);\n }\n\n this.onAfterLayout(strictContext, layoutResult);\n this._prevLayoutStrategy = strictContext.strategy;\n }\n\n /**\n * Attach handlers for events that we know will invalidate the layout when\n * performed on child objects ( general transforms ).\n * Returns the disposers for later unsubscribing and cleanup\n * @param {FabricObject} object\n * @param {RegistrationContext & Partial<StrictLayoutContext>} context\n * @returns {VoidFunction[]} disposers remove the handlers\n */\n protected attachHandlers(\n object: FabricObject,\n context: RegistrationContext & Partial<StrictLayoutContext>,\n ): VoidFunction[] {\n const { target } = context;\n return (\n [\n MODIFIED,\n MOVING,\n RESIZING,\n ROTATING,\n SCALING,\n SKEWING,\n CHANGED,\n MODIFY_POLY,\n MODIFY_PATH,\n ] as (TModificationEvents & 'modified')[]\n ).map((key) =>\n object.on(key, (e) =>\n this.performLayout(\n key === MODIFIED\n ? {\n type: LAYOUT_TYPE_OBJECT_MODIFIED,\n trigger: key,\n e,\n target,\n }\n : {\n type: LAYOUT_TYPE_OBJECT_MODIFYING,\n trigger: key,\n e,\n target,\n },\n ),\n ),\n );\n }\n\n /**\n * Subscribe an object to transform events that will trigger a layout change on the parent\n * This is important only for interactive groups.\n * @param object\n * @param context\n */\n protected subscribe(\n object: FabricObject,\n context: RegistrationContext & Partial<StrictLayoutContext>,\n ) {\n this.unsubscribe(object, context);\n const disposers = this.attachHandlers(object, context);\n this._subscriptions.set(object, disposers);\n }\n\n /**\n * unsubscribe object layout triggers\n */\n protected unsubscribe(\n object: FabricObject,\n _context?: RegistrationContext & Partial<StrictLayoutContext>,\n ) {\n (this._subscriptions.get(object) || []).forEach((d) => d());\n this._subscriptions.delete(object);\n }\n\n unsubscribeTargets(\n context: RegistrationContext & Partial<StrictLayoutContext>,\n ) {\n context.targets.forEach((object) => this.unsubscribe(object, context));\n }\n\n subscribeTargets(\n context: RegistrationContext & Partial<StrictLayoutContext>,\n ) {\n context.targets.forEach((object) => this.subscribe(object, context));\n }\n\n protected onBeforeLayout(context: StrictLayoutContext) {\n const { target, type } = context;\n const { canvas } = target;\n // handle layout triggers subscription\n // @TODO: gate the registration when the group is interactive\n if (type === LAYOUT_TYPE_INITIALIZATION || type === LAYOUT_TYPE_ADDED) {\n this.subscribeTargets(context);\n } else if (type === LAYOUT_TYPE_REMOVED) {\n this.unsubscribeTargets(context);\n }\n // fire layout event (event will fire only for layouts after initialization layout)\n target.fire('layout:before', {\n context,\n });\n canvas &&\n canvas.fire('object:layout:before', {\n target,\n context,\n });\n\n if (type === LAYOUT_TYPE_IMPERATIVE && context.deep) {\n const { strategy: _, ...tricklingContext } = context;\n // traverse the tree\n target.forEachObject(\n (object) =>\n (object as Group).layoutManager &&\n (object as Group).layoutManager.performLayout({\n ...tricklingContext,\n bubbles: false,\n target: object as Group,\n }),\n );\n }\n }\n\n protected getLayoutResult(\n context: StrictLayoutContext,\n ): Required<LayoutResult> | undefined {\n const { target, strategy, type } = context;\n\n const result = strategy.calcLayoutResult(context, target.getObjects());\n\n if (!result) {\n return;\n }\n\n const prevCenter =\n type === LAYOUT_TYPE_INITIALIZATION\n ? new Point()\n : target.getRelativeCenterPoint();\n\n const {\n center: nextCenter,\n correction = new Point(),\n relativeCorrection = new Point(),\n } = result;\n const offset = prevCenter\n .subtract(nextCenter)\n .add(correction)\n .transform(\n // in `initialization` we do not account for target's transformation matrix\n type === LAYOUT_TYPE_INITIALIZATION\n ? iMatrix\n : invertTransform(target.calcOwnMatrix()),\n true,\n )\n .add(relativeCorrection);\n\n return {\n result,\n prevCenter,\n nextCenter,\n offset,\n };\n }\n\n protected commitLayout(\n context: StrictLayoutContext,\n layoutResult: Required<LayoutResult>,\n ) {\n const { target } = context;\n const {\n result: { size },\n nextCenter,\n } = layoutResult;\n // set dimensions\n target.set({ width: size.x, height: size.y });\n // layout descendants\n this.layoutObjects(context, layoutResult);\n // set position\n // in `initialization` we do not account for target's transformation matrix\n if (context.type === LAYOUT_TYPE_INITIALIZATION) {\n // TODO: what about strokeWidth?\n target.set({\n left:\n context.x ?? nextCenter.x + size.x * resolveOrigin(target.originX),\n top: context.y ?? nextCenter.y + size.y * resolveOrigin(target.originY),\n });\n } else {\n target.setPositionByOrigin(nextCenter, CENTER, CENTER);\n // invalidate\n target.setCoords();\n target.set('dirty', true);\n }\n }\n\n protected layoutObjects(\n context: StrictLayoutContext,\n layoutResult: Required<LayoutResult>,\n ) {\n const { target } = context;\n // adjust objects to account for new center\n target.forEachObject((object) => {\n object.group === target &&\n this.layoutObject(context, layoutResult, object);\n });\n // adjust clip path to account for new center\n context.strategy.shouldLayoutClipPath(context) &&\n this.layoutObject(context, layoutResult, target.clipPath as FabricObject);\n }\n\n /**\n * @param {FabricObject} object\n * @param {Point} offset\n */\n protected layoutObject(\n context: StrictLayoutContext,\n { offset }: Required<LayoutResult>,\n object: FabricObject,\n ) {\n // TODO: this is here for cache invalidation.\n // verify if this is necessary since we have explicit\n // cache invalidation at the end of commitLayout\n object.set({\n left: object.left + offset.x,\n top: object.top + offset.y,\n });\n }\n\n protected onAfterLayout(\n context: StrictLayoutContext,\n layoutResult?: LayoutResult,\n ) {\n const {\n target,\n strategy,\n bubbles,\n prevStrategy: _,\n ...bubblingContext\n } = context;\n const { canvas } = target;\n\n // fire layout event (event will fire only for layouts after initialization layout)\n target.fire('layout:after', {\n context,\n result: layoutResult,\n });\n canvas &&\n canvas.fire('object:layout:after', {\n context,\n result: layoutResult,\n target,\n });\n\n // bubble\n const parent = target.parent;\n if (bubbles && parent?.layoutManager) {\n // add target to context#path\n (bubblingContext.path || (bubblingContext.path = [])).push(target);\n // all parents should invalidate their layout\n parent.layoutManager.performLayout({\n ...bubblingContext,\n target: parent,\n });\n }\n target.set('dirty', true);\n }\n\n dispose() {\n const { _subscriptions } = this;\n _subscriptions.forEach((disposers) => disposers.forEach((d) => d()));\n _subscriptions.clear();\n }\n\n toObject() {\n return {\n type: LAYOUT_MANAGER,\n strategy: (this.strategy.constructor as typeof LayoutStrategy).type,\n };\n }\n\n toJSON() {\n return this.toObject();\n }\n}\n\nclassRegistry.setClass(LayoutManager, LAYOUT_MANAGER);\n"],"names":["LAYOUT_MANAGER","LayoutManager","constructor","strategy","arguments","length","undefined","FitContentLayout","_defineProperty","_subscriptions","Map","performLayout","context","strictContext","_objectSpread","bubbles","prevStrategy","_prevLayoutStrategy","stopPropagation","onBeforeLayout","layoutResult","getLayoutResult","commitLayout","onAfterLayout","attachHandlers","object","target","MODIFIED","MOVING","RESIZING","ROTATING","SCALING","SKEWING","CHANGED","MODIFY_POLY","MODIFY_PATH","map","key","on","e","type","LAYOUT_TYPE_OBJECT_MODIFIED","trigger","LAYOUT_TYPE_OBJECT_MODIFYING","subscribe","unsubscribe","disposers","set","_context","get","forEach","d","delete","unsubscribeTargets","targets","subscribeTargets","canvas","LAYOUT_TYPE_INITIALIZATION","LAYOUT_TYPE_ADDED","LAYOUT_TYPE_REMOVED","fire","LAYOUT_TYPE_IMPERATIVE","deep","tricklingContext","_objectWithoutProperties","_excluded","forEachObject","layoutManager","result","calcLayoutResult","getObjects","prevCenter","Point","getRelativeCenterPoint","center","nextCenter","correction","relativeCorrection","offset","subtract","add","transform","iMatrix","invertTransform","calcOwnMatrix","size","width","x","height","y","layoutObjects","_context$x","_context$y","left","resolveOrigin","originX","top","originY","setPositionByOrigin","CENTER","setCoords","group","layoutObject","shouldLayoutClipPath","clipPath","_ref","_","bubblingContext","_excluded2","parent","path","push","dispose","clear","toObject","toJSON","classRegistry","setClass"],"mappings":"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"}