{"version":3,"sources":["https://lively-kernel.org/lively4/BP2019RH1/src/internal/individuals-as-points/map/zoomer.js"],"names":["d3","Zoomer","constructor","masterCanvas","slaveCanvases","freeHandDrawer","canvasWindow","maximumScale","originalCanvasWidth","canvas","width","originalCanvasHeight","height","zoom","scaleExtent","extent","translateExtent","lastZoomEvent","currentZoomLevel","transform","k","x","y","updateZoom","canvasExtent","lively","getExtent","zoomRatio","minimumScale","newZoomLevel","select","call","scaleTo","addZoomToMaster","on","shiftKeyPressed","_onZoom","removeZoomFromMaster","newZoomEvent","Date","now","event","updateTransform","updateScale","draw","forEach","applyTransform","updateStyle","lineWidth"],"mappings":";;;;;;AAAOA,Q;;;;;;;;;;;;;;;;;;AAEA,YAAMC,MAAN,CAAa;;AAElBC,oBAAYC,YAAZ,EAA0BC,aAA1B,EAAyCC,cAAzC,EAAyDC,YAAzD,EAAuE;AACrE,eAAKH,YAAL,GAAoBA,YAApB;AACA,eAAKC,aAAL,GAAqBA,aAArB;AACA,eAAKC,cAAL,GAAsBA,cAAtB;AACA,eAAKE,YAAL,GAAoB,GAApB;AACA,eAAKC,mBAAL,GAA2BL,aAAaM,MAAb,CAAoBC,KAA/C;AACA,eAAKC,oBAAL,GAA4BR,aAAaM,MAAb,CAAoBG,MAAhD;AACA,eAAKC,IAAL,GAAYb,GAAGa,IAAH,GACTC,WADS,CACG,CAAC,CAAD,EAAI,KAAKP,YAAT,CADH,EAETQ,MAFS,CAEF,CAAC,CAAC,CAAD,EAAG,CAAH,CAAD,EAAQ,CAAC,GAAD,EAAM,GAAN,CAAR,CAFE,EAGTC,eAHS,CAGO,CAAC,CAAC,CAAD,EAAI,CAAJ,CAAD,EAAS,CAAC,KAAKR,mBAAN,EAA2B,KAAKG,oBAAhC,CAAT,CAHP,CAAZ;AAIA,eAAKM,aAAL,GAAqB,CAArB;AACA,eAAKX,YAAL,GAAoBA,YAApB;AACA,eAAKY,gBAAL,GAAwB,KAAKL,IAAL,CAAUC,WAAV,GAAwB,CAAxB,CAAxB;AACA,eAAKK,SAAL,GAAiB,EAACC,GAAE,CAAH,EAAMC,GAAE,CAAR,EAAWC,GAAE,CAAb,EAAjB;AACD;;AAEDC,qBAAa;AACX,cAAIC,eAAeC,OAAOC,SAAP,CAAiB,KAAKvB,YAAL,CAAkBM;AACtD;AADmB,WAAnB,CAEA,IAAIC,QAAQc,aAAaH,CAAzB;AACA,cAAIT,SAASY,aAAaF,CAA1B;AACA,eAAKT,IAAL,CAAUE,MAAV,CAAiB,CAAC,CAAC,CAAD,EAAG,CAAH,CAAD,EAAQ,CAACL,KAAD,EAAQE,MAAR,CAAR,CAAjB;AACA,cAAIe,YAAY,KAAKT,gBAAL,GAAwB,KAAKL,IAAL,CAAUC,WAAV,GAAwB,CAAxB,CAAxC;AACA,cAAIc,YAAJ;AACA,cAAIlB,QAAQE,MAAZ,EAAoB;AAClBgB,2BAAelB,QAAQ,KAAKF,mBAA5B;AACD,WAFD,MAEO;AACLoB,2BAAehB,SAAS,KAAKD,oBAA7B;AACD;AACD,cAAIiB,iBAAiB,CAArB,EAAwB;AACtB;AACA;AACD;AACD,eAAKf,IAAL,CAAUC,WAAV,CAAsB,CAACc,YAAD,EAAgB,KAAKrB,YAArB,CAAtB;;AAEA,cAAIsB,eAAeF,YAAYC,YAA/B;;AAEA5B,aAAG8B,MAAH,CAAU,KAAK3B,YAAL,CAAkBM,MAA5B,EAAoCsB,IAApC,CAAyC,KAAKlB,IAAL,CAAUmB,OAAnD,EAA4DH,YAA5D;AACD;;AAEDI,0BAAkB;AAChBjC,aAAG8B,MAAH,CAAU,KAAK3B,YAAL,CAAkBM,MAA5B,EACGsB,IADH,CACQ,KAAKlB,IAAL,CACCqB,EADD,CACI,MADJ,EACY,MAAM;AAAC,gBAAI,CAAC,KAAKC,eAAV,EAA2B,KAAKC,OAAL;AAAe,WAD7D,CADR;AAGApC,aAAG8B,MAAH,CAAU,KAAK3B,YAAL,CAAkBM,MAA5B,EAAoCyB,EAApC,CAAuC,eAAvC,EAAwD,IAAxD;AACD;;AAEDG,+BAAuB;AACrBrC,aAAG8B,MAAH,CAAU,KAAK3B,YAAL,CAAkBM,MAA5B,EAAoCyB,EAApC,CAAuC,gBAAvC,EAAyD,IAAzD;AACAlC,aAAG8B,MAAH,CAAU,KAAK3B,YAAL,CAAkBM,MAA5B,EAAoCyB,EAApC,CAAuC,gBAAvC,EAAyD,IAAzD;AACAlC,aAAG8B,MAAH,CAAU,KAAK3B,YAAL,CAAkBM,MAA5B,EAAoCyB,EAApC,CAAuC,YAAvC,EAAqD,IAArD;AACD;;AAEDE,kBAAU;AACR,cAAIE,eAAeC,KAAKC,GAAL,EAAnB;AACA,eAAKtB,gBAAL,GAAwBlB,GAAGyC,KAAH,CAAStB,SAAT,CAAmBC,CAA3C;AACA,cAAIkB,eAAe,KAAKrB,aAApB,GAAoC,GAAxC,EAA6C;AAC3C;AACD,WAFD,MAEO;AACL,iBAAKA,aAAL,GAAqBqB,YAArB;AACA,iBAAKnB,SAAL,GAAiBnB,GAAGyC,KAAH,CAAStB,SAA1B;AACA,iBAAKhB,YAAL,CAAkBuC,eAAlB,CAAkC,KAAKvB,SAAvC;AACA,iBAAKhB,YAAL,CAAkBwC,WAAlB,CAA8B,KAAKxB,SAAL,CAAeC,CAA7C;AACA,iBAAKjB,YAAL,CAAkByC,IAAlB;AACA,iBAAKxC,aAAL,CAAmByC,OAAnB,CAA2BpC,UAAU;AACnCA,qBAAOiC,eAAP,CAAuB,KAAKvB,SAA5B;AACAV,qBAAOkC,WAAP,CAAmB,KAAKxB,SAAL,CAAeC,CAAlC;AACAX,qBAAOmC,IAAP;AACD,aAJD;AAKA,iBAAKvC,cAAL,CAAoByC,cAApB,CAAmC,KAAK3B,SAAxC;AACA,iBAAKd,cAAL,CAAoB0C,WAApB,CAAgC,EAACC,WAAW,IAAE,KAAK7B,SAAL,CAAeC,CAA7B,EAAhC;AACD;AACF;AA3EiB","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 = masterCanvas.canvas.width\n    this.originalCanvasHeight = masterCanvas.canvas.height\n    this.zoom = d3.zoom()\n      .scaleExtent([1, this.maximumScale])\n      .extent([[0,0], [100, 100]])\n      .translateExtent([[0, 0], [this.originalCanvasWidth, this.originalCanvasHeight]])\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  updateZoom() {\n    let canvasExtent = lively.getExtent(this.masterCanvas.canvas)\n    // let worldExtent = lively.getExtent(this.canvasWindow)\n    let width = canvasExtent.x\n    let height = canvasExtent.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  \n  addZoomToMaster() {\n    d3.select(this.masterCanvas.canvas)\n      .call(this.zoom\n            .on(\"zoom\", () => {if (!this.shiftKeyPressed) 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      this.freeHandDrawer.updateStyle({lineWidth: 1/this.transform.k})\n    }\n  }\n}"]}