{"version":3,"file":"X_Connector.min.mjs","sources":["../../../../src/shapes/canvasx/X_Connector.ts"],"sourcesContent":["import { Path } from '../Path';\nimport { Control } from '../../controls/Control';\nimport { invertTransform, multiplyTransformMatrices } from '../../util';\nimport { Point, XY } from '../../Point';\nimport { TMat2D } from '../../typedefs';\nimport { InteractiveFabricObject } from '../Object/InteractiveObject';\nimport { createObjectDefaultControls } from '../../controls/commonControls';\nimport { FabricObject } from '../Object/Object';\nimport { Transform } from '../../EventTypeDefs';\n\nconst getPath = (\n  fromPoint: XY,\n  toPoint: XY,\n  control1: XY,\n  control2: XY,\n  offset: XY,\n  style: any,\n  isMoving = false\n) => {\n  let path: string = '';\n  if (!isMoving) {\n    offset = { x: -1, y: -1 };\n  }\n\n  path = `M ${fromPoint.x + offset.x} ${fromPoint.y + offset.y} C ${\n    control1.x + offset.x\n  }, ${control1.y + offset.y}, ${control2.x + offset.x} ${\n    control2.y + offset.y\n  }, ${toPoint.x + offset.x} ${toPoint.y + offset.y}`;\n\n  return path;\n};\n\nclass X_Connector extends Path {\n  fromPoint: XY;\n  toPoint: XY;\n  control1: XY;\n  control2: XY;\n  offset: XY;\n  style: any;\n  prevLeft: number;\n  prevTop: number;\n  preCenter: Point;\n  preTransform: TMat2D | null;\n  fromObjectId: string;\n  toObjectId: string;\n\n  constructor(\n    fromPoint: XY,\n    toPoint: XY,\n    control1: XY,\n    control2: XY,\n    style: any = {},\n    options = {}\n  ) {\n    const path = getPath(\n      fromPoint,\n      toPoint,\n      control1,\n      control2,\n      { x: 0, y: 0 },\n      style\n    );\n    super(path, options);\n    this.initialize();\n    this.type = 'X_Connector';\n    this.objectCaching = false;\n\n    const localFromPoint = TransformPointFromCanvasToObject(\n      this,\n      new Point(fromPoint)\n    );\n    const localToPoint = TransformPointFromCanvasToObject(\n      this,\n      new Point(toPoint)\n    );\n    const localControl1 = TransformPointFromCanvasToObject(\n      this,\n      new Point(control1)\n    );\n    const localControl2 = TransformPointFromCanvasToObject(\n      this,\n      new Point(control2)\n    );\n    // if (!this.canvas) return;\n    // let from = new Point(fromPoint).transform(this.canvas!.viewportTransform);\n    // let to = new Point(toPoint).transform(this.canvas!.viewportTransform);\n    // let control11 = new Point(control1).transform(\n    //   this.canvas!.viewportTransform\n    // );\n    // let control21 = new Point(control2).transform(\n    //   this.canvas!.viewportTransform\n    // );\n\n    this.set({\n      fromPoint: localFromPoint,\n      toPoint: localToPoint,\n      control1: localControl1,\n      control2: localControl2,\n      style,\n    });\n\n    this.controls = {\n      ...createObjectDefaultControls,\n      start: new Control({\n        x: 0,\n        y: 0,\n        offsetX: localFromPoint.x,\n        offsetY: localFromPoint.y,\n        mouseDownHandler: this._mouseDownControl.bind(this),\n        mouseUpHandler: this._mouseUpControl.bind(this),\n        positionHandler: this._positionControl.bind(this),\n        actionHandler: this.dragActionHandler.bind(this, 'start'),\n        cursorStyle: 'crosshair',\n        render: this._renderControl.bind(this, 'start'),\n      }),\n      end: new Control({\n        x: 0,\n        y: 0,\n        offsetX: localToPoint.x,\n        offsetY: localToPoint.y,\n        mouseDownHandler: this._mouseDownControl.bind(this),\n        mouseUpHandler: this._mouseUpControl.bind(this),\n        positionHandler: this._positionControl.bind(this),\n        actionHandler: this.dragActionHandler.bind(this, 'end'),\n        cursorStyle: 'crosshair',\n        render: this._renderControl.bind(this, 'end'),\n      }),\n      control1: new Control({\n        x: 0,\n        y: 0,\n        offsetX: localControl1.x,\n        offsetY: localControl1.y,\n        mouseDownHandler: this._mouseDownControl.bind(this),\n        mouseUpHandler: this._mouseUpControl.bind(this),\n        positionHandler: this._positionControl.bind(this),\n        actionHandler: this.dragActionHandler.bind(this, 'control1'),\n        cursorStyle: 'crosshair',\n        render: this._renderControl.bind(this, 'control1'),\n      }),\n      control2: new Control({\n        x: 0,\n        y: 0,\n        offsetX: localControl2.x,\n        offsetY: localControl2.y,\n        mouseDownHandler: this._mouseDownControl.bind(this),\n        mouseUpHandler: this._mouseUpControl.bind(this),\n        positionHandler: this._positionControl.bind(this),\n        actionHandler: this.dragActionHandler.bind(this, 'control2'),\n        cursorStyle: 'crosshair',\n        render: this._renderControl.bind(this, 'control2'),\n      }),\n    };\n  }\n\n  initialize() {\n    // this.setDimensions();\n\n    const { left, top, width, height, pathOffset } = this._calcDimensions();\n    console.log(' path initialize ', left, top, width, height, pathOffset);\n    this.set({\n      left,\n      top,\n      width,\n      height,\n      pathOffset,\n    });\n    this.canvas?.renderAll();\n  }\n\n  update({ fromPoint, toPoint, control1, control2, style }: any) {\n    let localFromPoint, localToPoint, localControl1, localControl2;\n\n    let newFrom, newTo, newControl1, newControl2;\n\n    this.prevLeft = this.left;\n    this.prevTop = this.top;\n    this.preCenter = this.getCenterPoint();\n    this.preTransform = this.calcTransformMatrix();\n\n    if (fromPoint) {\n      newFrom = fromPoint;\n      localFromPoint = TransformPointFromCanvasToObject(\n        this,\n        new Point(fromPoint)\n      );\n    } else {\n      localFromPoint = this.fromPoint;\n      newFrom = TransformPointFromObjectToCanvas(\n        this,\n        new Point(this.fromPoint)\n      );\n    }\n\n    if (toPoint) {\n      newTo = toPoint;\n      localToPoint = TransformPointFromCanvasToObject(this, new Point(toPoint));\n      //   this.toPoint = localToPoint;\n    } else {\n      localToPoint = this.toPoint;\n      newTo = TransformPointFromObjectToCanvas(this, new Point(this.toPoint));\n    }\n    if (control1) {\n      newControl1 = control1;\n      localControl1 = TransformPointFromCanvasToObject(\n        this,\n        new Point(control1)\n      );\n    } else {\n      localControl1 = this.control1;\n      newControl1 = TransformPointFromObjectToCanvas(\n        this,\n        new Point(this.control1)\n      );\n    }\n\n    if (control2) {\n      newControl2 = control2;\n      localControl2 = TransformPointFromCanvasToObject(\n        this,\n        new Point(control2)\n      );\n    } else {\n      localControl2 = this.control2;\n      newControl2 = TransformPointFromObjectToCanvas(\n        this,\n        new Point(this.control2)\n      );\n    }\n    if (style) {\n      this.style = style;\n    }\n\n    Object.assign(this, {\n      fromPoint: newFrom,\n      toPoint: newTo,\n      control1: newControl1,\n      control2: newControl2,\n      style,\n    });\n    console.log(\n      'update path fromPoint',\n      newFrom,\n      'toPoint',\n      newTo,\n      'control1',\n      newControl1,\n      'control2',\n      newControl2,\n      'style',\n      style\n    );\n    this.updatePath(false);\n    // const path = getPath(\n    //   newFrom,\n    //   newTo,\n    //   newControl1,\n    //   newControl2,\n    //   { x: 0, y: 0 },\n    //   style,\n    //   false\n    // );\n    // this.path = new Path(path).path;\n    // console.log('path', JSON.stringify(this.path));\n\n    this.set({\n      fromPoint: localFromPoint,\n      toPoint: localToPoint,\n      control1: localControl1,\n      control2: localControl2,\n      style,\n    });\n    // this.initialize();\n    // this.updateControlOffsets(new Point(0, 0));\n\n    this.updatePath(false);\n    this.setBoundingBox(false);\n    this.setCoords();\n    const offset = {\n      x: this.getCenterPoint().x - this.preCenter.x,\n      y: this.getCenterPoint().y - this.preCenter.y,\n    };\n    // loop all the controls and update the offset\n    this.updateControlOffsets(new Point(offset));\n    this.prevLeft = 0;\n    this.prevTop = 0;\n    this.preCenter = new Point(0, 0);\n    this.preTransform = null;\n\n    // this.setBoundingBox(false);\n    // const path = getPath(\n    //   fromPoint\n    //     ? fromPoint\n    //     : TransformPointFromObjectToCanvas(this, new Point(this.fromPoint)),\n    //   toPoint\n    //     ? toPoint\n    //     : TransformPointFromObjectToCanvas(this, new Point(this.toPoint)),\n    //   control1\n    //     ? control1\n    //     : TransformPointFromObjectToCanvas(this, new Point(this.control1)),\n    //   control2\n    //     ? control2\n    //     : TransformPointFromObjectToCanvas(this, new Point(this.control2)),\n    //   { x: 0, y: 0 },\n    //   style\n    // );\n    // console.log('path', path);\n    // this.set({ path });\n\n    // this.initialize();\n    this.canvas?.renderAll();\n  }\n\n  _mouseDownControl(\n    eventData: any,\n    transform: Transform,\n    x: number,\n    y: number\n  ) {\n    this.prevLeft = transform.target.left;\n    this.prevTop = transform.target.top;\n    this.preCenter = transform.target.getCenterPoint();\n    this.preTransform = transform.target.calcTransformMatrix();\n  }\n\n  _mouseUpControl(eventData: any, transform: Transform, x: number, y: number) {\n    this.updatePath(false);\n    this.setBoundingBox(false);\n    transform.target.setCoords();\n    const offset = {\n      x: transform.target.getCenterPoint().x - this.preCenter.x,\n      y: transform.target.getCenterPoint().y - this.preCenter.y,\n    };\n    // loop all the controls and update the offset\n    this.updateControlOffsets(new Point(offset));\n    this.prevLeft = 0;\n    this.prevTop = 0;\n    this.preCenter = new Point(0, 0);\n    this.preTransform = null;\n  }\n\n  _positionControl(\n    dim: Point,\n    finalMatrix: TMat2D,\n    fabricObject: InteractiveFabricObject,\n    currentControl: Control\n  ) {\n    const point = {\n      x: currentControl.offsetX,\n      y: currentControl.offsetY,\n    };\n    //@ts-ignore\n    const result = fabricObject.transformPointToViewport(point);\n\n    return result;\n  }\n\n  //responding to control movement\n  //control is the control being moved\n  //eventData is the mouse event\n  dragActionHandler(\n    controlType: string,\n    eventData: any,\n    transform: Transform,\n    x: number,\n    y: number\n  ) {\n    const target = transform.target;\n    // const relevantPoint = getLocalPoint(transform, 'center', 'top', x, y);\n    //@ts-ignore\n    const relevantPoint = target.transformPointFromCanvas(new Point(x, y));\n    console.log('dragActionHandler', controlType, x, y, relevantPoint);\n    // relevantPoint.x = relevantPoint.x ;\n    // relevantPoint.y = relevantPoint.y ;\n\n    switch (controlType) {\n      case 'start':\n        target.set({ fromPoint: relevantPoint });\n        target.controls['start'].offsetX = relevantPoint.x;\n        target.controls['start'].offsetY = relevantPoint.y;\n        break;\n      case 'end':\n        target.set({ toPoint: relevantPoint });\n        target.controls['end'].offsetX = relevantPoint.x;\n        target.controls['end'].offsetY = relevantPoint.y;\n\n        break;\n      case 'control1':\n        target.set({ control1: relevantPoint });\n        target.controls['control1'].offsetX = relevantPoint.x;\n        target.controls['control1'].offsetY = relevantPoint.y;\n\n        break;\n      case 'control2':\n        target.set({ control2: relevantPoint });\n        target.controls['control2'].offsetX = relevantPoint.x;\n        target.controls['control2'].offsetY = relevantPoint.y;\n\n        break;\n    }\n\n    const isMoving = true;\n    this.updatePath(isMoving);\n\n    target.dirty = true;\n    target.canvas?.requestRenderAll();\n\n    return true;\n  }\n\n  private updateControlOffsets(offset: Point = new Point(0, 0)) {\n    const target = this;\n    const offsetX = offset.x;\n    const offsetY = offset.y;\n\n    target.controls['start'].offsetX = target.fromPoint.x - offsetX;\n    target.controls['start'].offsetY = target.fromPoint.y - offsetY;\n\n    target.fromPoint.x -= offsetX;\n    target.fromPoint.y -= offsetY;\n\n    target.controls['end'].offsetX = target.toPoint.x - offsetX;\n    target.controls['end'].offsetY = target.toPoint.y - offsetY;\n    target.toPoint.x -= offsetX;\n    target.toPoint.y -= offsetY;\n\n    target.controls['control1'].offsetX = target.control1.x - offsetX;\n    target.controls['control1'].offsetY = target.control1.y - offsetY;\n    target.control1.x -= offsetX;\n    target.control1.y -= offsetY;\n\n    target.controls['control2'].offsetX = target.control2.x - offsetX;\n    target.controls['control2'].offsetY = target.control2.y - offsetY;\n    target.control2.x -= offsetX;\n    target.control2.y -= offsetY;\n  }\n\n  _renderControl(\n    controlType: string,\n    ctx: any,\n    left: number,\n    top: number,\n    styleOverride: any,\n    fabricObject: FabricObject\n  ) {\n    let color = 'white';\n    if (controlType === 'control1' || controlType === 'control2') {\n      color = 'blue';\n    }\n\n    const drawDottedLine = (targetControl: string) => {\n      const point = TransformPointFromObjectToCanvas2(\n        fabricObject,\n        new Point({\n          x: this.controls[targetControl].offsetX,\n          y: this.controls[targetControl].offsetY,\n        })\n      );\n\n      ctx.save();\n      ctx.strokeStyle = 'gray';\n      ctx.setLineDash([5, 5]); // Set the line dash pattern\n      ctx.beginPath();\n      ctx.moveTo(left, top);\n      ctx.lineTo(point.x, point.y);\n      ctx.closePath();\n      ctx.stroke();\n      ctx.restore();\n    };\n\n    if (controlType === 'control1') {\n      drawDottedLine('start');\n    }\n\n    if (controlType === 'control2') {\n      drawDottedLine('end');\n    }\n\n    ctx.save();\n    ctx.fillStyle = color;\n    ctx.strokeStyle = 'gray';\n    ctx.beginPath();\n    ctx.arc(left, top, 5, 0, Math.PI * 2, false);\n    ctx.closePath();\n    ctx.fill();\n    ctx.stroke();\n    ctx.restore();\n  }\n\n  updatePath(isMoving = true) {\n    const path = getPath(\n      this.fromPoint,\n      this.toPoint,\n      this.control1,\n      this.control2,\n      this.pathOffset,\n      this.style,\n      isMoving\n    );\n\n    console.log('updatePath', JSON.stringify(path));\n\n    this.path = new Path(path).path;\n    this.dirty = true;\n  }\n  setBoundingBox(adjustPosition?: boolean) {\n    const preMatrix = this.calcTransformMatrix();\n    const { left, top, width, height, pathOffset } = this._calcDimensions();\n\n    //the new left/top after transformation\n    const newLeftTop = new Point(left, top).transform(preMatrix);\n\n    this.set({\n      left: newLeftTop.x,\n      top: newLeftTop.y,\n      width,\n      height,\n      pathOffset,\n    });\n  }\n}\n\nexport { X_Connector };\n\n// todo: why TransformPointFromObjectToCanvas and TransformPointFromObjectToCanvas2 is different? why it works for one doesn't work for another?\nexport const TransformPointFromObjectToCanvas = (\n  object: FabricObject,\n  point: Point\n) => {\n  const mObject = object.calcOwnMatrix();\n  // const mCanvas = object.getViewportTransform();\n  // const matrix = multiplyTransformMatrices(mCanvas, mObject);\n  const transformedPoint = point.transform(mObject); // transformPoint(point, matrix);\n  return transformedPoint;\n};\n\nexport const TransformPointFromCanvasToObject = (\n  object: FabricObject,\n  point: Point\n) => {\n  const mObject = object.calcOwnMatrix();\n  // const mCanvas = object.canvas!.viewportTransform;\n  // const matrix = multiplyTransformMatrices(mCanvas, mObject);\n  const invertedMatrix = invertTransform(mObject);\n  const transformedPoint = point.transform(invertedMatrix);\n  return transformedPoint;\n};\n\nexport const TransformPointFromObjectToCanvas2 = (\n  object: FabricObject,\n  point: Point\n) => {\n  const mObject = object.calcTransformMatrix();\n  const mCanvas = object.canvas!.viewportTransform;\n  const matrix = multiplyTransformMatrices(mCanvas, mObject);\n  const transformedPoint = point.transform(matrix); // transformPoint(point, matrix);\n  return transformedPoint;\n};\n"],"names":["getPath","fromPoint","toPoint","control1","control2","offset","style","path","arguments","length","undefined","x","y","concat","X_Connector","Path","constructor","options","super","_defineProperty","this","initialize","type","objectCaching","localFromPoint","TransformPointFromCanvasToObject","Point","localToPoint","localControl1","localControl2","set","controls","_objectSpread","createObjectDefaultControls","start","Control","offsetX","offsetY","mouseDownHandler","_mouseDownControl","bind","mouseUpHandler","_mouseUpControl","positionHandler","_positionControl","actionHandler","dragActionHandler","cursorStyle","render","_renderControl","end","_this$canvas","left","top","width","height","pathOffset","_calcDimensions","console","log","canvas","renderAll","update","_ref","_this$canvas2","newFrom","newTo","newControl1","newControl2","prevLeft","prevTop","preCenter","getCenterPoint","preTransform","calcTransformMatrix","TransformPointFromObjectToCanvas","Object","assign","updatePath","setBoundingBox","setCoords","updateControlOffsets","eventData","transform","target","dim","finalMatrix","fabricObject","currentControl","point","transformPointToViewport","controlType","_target$canvas","relevantPoint","transformPointFromCanvas","dirty","requestRenderAll","ctx","styleOverride","color","drawDottedLine","targetControl","TransformPointFromObjectToCanvas2","save","strokeStyle","setLineDash","beginPath","moveTo","lineTo","closePath","stroke","restore","fillStyle","arc","Math","PI","fill","isMoving","JSON","stringify","adjustPosition","preMatrix","newLeftTop","object","mObject","calcOwnMatrix","invertedMatrix","invertTransform","mCanvas","viewportTransform","matrix","multiplyTransformMatrices"],"mappings":"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"}