{"version":3,"sources":["https://lively-kernel.org/lively4/BP2019RH-stable/src/internal/individuals-as-points/map/zoomer.js"],"names":["d3","Zoomer","constructor","masterCanvas","slaveCanvases","freeHandDrawer","canvasWindow","maximumScale","originalCanvasWidth","originalCanvasHeight","zoom","scaleExtent","extent","translateExtent","lastZoomEvent","currentZoomLevel","transform","k","x","y","addZoomToMaster","select","canvas","call","on","_onZoom","removeZoomFromMaster","newZoomEvent","Date","now","event","updateTransform","updateScale","draw","forEach","applyTransform","updateZoom","worldExtent","lively","getExtent","width","height","zoomRatio","minimumScale","newZoomLevel","scaleTo"],"mappings":"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","file":"zoomer.js","sourcesContent":["import d3 from \"src/external/d3.v5.js\"\n\nexport class Zoomer {\n  \n  constructor(masterCanvas, slaveCanvases, freeHandDrawer, canvasWindow) {\n    this.masterCanvas = masterCanvas\n    this.slaveCanvases = slaveCanvases\n    this.freeHandDrawer = freeHandDrawer\n    this.maximumScale = 300\n    this.originalCanvasWidth = 500\n    this.originalCanvasHeight = 500\n    this.zoom = d3.zoom()\n      .scaleExtent([1, this.maximumScale])\n      .extent([[0,0], [100, 100]])\n      .translateExtent([[0, 0], [500, 500]])\n    this.lastZoomEvent = 0\n    this.canvasWindow = canvasWindow\n    this.currentZoomLevel = this.zoom.scaleExtent()[0]\n    this.transform = {k:1, x:0, y:0}\n  }\n  \n  addZoomToMaster() {\n    d3.select(this.masterCanvas.canvas)\n      .call(this.zoom\n            .on(\"zoom\", () => {this._onZoom()}))\n    d3.select(this.masterCanvas.canvas).on(\"dblclick.zoom\", null)\n  }\n  \n  removeZoomFromMaster() {\n    d3.select(this.masterCanvas.canvas).on(\"mousedown.zoom\", null)\n    d3.select(this.masterCanvas.canvas).on(\"mousemove.zoom\", null)\n    d3.select(this.masterCanvas.canvas).on(\"wheel.zoom\", null)\n  }\n  \n  _onZoom() {\n    let newZoomEvent = Date.now()\n    this.currentZoomLevel = d3.event.transform.k\n    if (newZoomEvent - this.lastZoomEvent < 100) {\n      return\n    } else {\n      this.lastZoomEvent = newZoomEvent\n      this.transform = d3.event.transform\n      this.masterCanvas.updateTransform(this.transform)\n      this.masterCanvas.updateScale(this.transform.k)\n      this.masterCanvas.draw()\n      this.slaveCanvases.forEach(canvas => {\n        canvas.updateTransform(this.transform)\n        canvas.updateScale(this.transform.k)\n        canvas.draw()\n      })\n      this.freeHandDrawer.applyTransform(this.transform)\n    }\n  }\n  \n  \n  \n  updateZoom() {\n    let worldExtent = lively.getExtent(this.canvasWindow)\n    let width = worldExtent.x\n    let height = worldExtent.y\n    this.zoom.extent([[0,0], [width, height]])\n    let zoomRatio = this.currentZoomLevel / this.zoom.scaleExtent()[0]\n    let minimumScale\n    if (width < height) {\n      minimumScale = width / this.originalCanvasWidth\n    } else {\n      minimumScale = height / this.originalCanvasHeight\n    }\n    if (minimumScale === 0) {\n      // just a failsafe, because scaling to scale 0 breaks the d3.event.transform to {0, NaN, NaN}\n      return\n    }\n    this.zoom.scaleExtent([minimumScale , this.maximumScale])\n    \n    let newZoomLevel = zoomRatio * minimumScale\n    \n    d3.select(this.masterCanvas.canvas).call(this.zoom.scaleTo, newZoomLevel)\n  }\n}"]}