{"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  declare private _prevLayoutStrategy?: LayoutStrategy;\n  declare protected _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","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","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","parent","path","push","dispose","clear","toObject","toJSON","classRegistry","setClass"],"mappings":"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"}