{"version":3,"sources":["https://lively-kernel.org/lively4/BP2019RH1/src/internal/individuals-as-points/venn/interaction-manager.js"],"names":["d3","InteractionManager","constructor","canvas","vennDiagram","transform","zoomIdentity","radius","draggableSubjects","clickSubjects","altClickSubjects","registerDragging","subjects","select","call","drag","subject","_dragSubject","on","_dragged","_dragended","registerClick","_clickSubject","registerDoubleClick","doubleClickSubjects","_doubleClickSubject","setDraggingSubjects","setToggleSubjects","toggleSubjects","setInspectSubjects","inspectSubjects","setDoubleClickSubjects","doubleClickSubject","_getSubjectUnderMouse","toggleDoubleClick","clickSubject","inspect","position","mouse","x","y","i","length","node","dx","dy","event","fx","invertX","fy","invertY","updatePosition","updateDistribution"],"mappings":";;;;;;AAAOA,Q;;;;;;;;;;;;;;;;;;AAEQ,YAAMC,kBAAN,CAAyB;AACtCC,oBAAYC,MAAZ,EAAoBC,WAApB,EAAiC;AAC/B,eAAKD,MAAL,GAAcA,MAAd;AACA,eAAKC,WAAL,GAAmBA,WAAnB;AACA,eAAKC,SAAL,GAAiBL,GAAGM,YAApB;AACA,eAAKC,MAAL,GAAc,EAAd;AACA,eAAKC,iBAAL,GAAyB,EAAzB;AACA,eAAKC,aAAL,GAAqB,EAArB;AACA,eAAKC,gBAAL,GAAwB,EAAxB;AACD;;AAED;AACA;AACA;;AAEAC,yBAAiBC,QAAjB,EAA2B;AACzB,eAAKJ,iBAAL,GAAyBI,QAAzB;;AAEAZ,aAAGa,MAAH,CAAU,KAAKV,MAAf,EACGW,IADH,CACQd,GAAGe,IAAH,GACCC,OADD,CACS,MAAM,KAAKC,YAAL,EADf,EAECC,EAFD,CAEI,MAFJ,EAEY,MAAM,KAAKC,QAAL,EAFlB,EAGCD,EAHD,CAGI,KAHJ,EAGW,MAAM,KAAKE,UAAL,EAHjB,CADR;AAKD;;AAEDC,sBAAcT,QAAd,EAAwB;AACtB,eAAKH,aAAL,GAAqBG,QAArB;AACAZ,aAAGa,MAAH,CAAU,KAAKV,MAAf,EACGe,EADH,CACM,OADN,EACe,MAAM,KAAKI,aAAL,EADrB;AAED;;AAEDC,4BAAoBX,QAApB,EAA8B;AAC5B,eAAKY,mBAAL,GAA2BZ,QAA3B;AACAZ,aAAGa,MAAH,CAAU,KAAKV,MAAf,EACGe,EADH,CACM,UADN,EACkB,MAAM,KAAKO,mBAAL,EADxB;AAED;;AAEDC,4BAAoBd,QAApB,EAA8B;AAC5B,eAAKJ,iBAAL,GAAyBI,QAAzB;AACD;;AAEDe,0BAAkBf,QAAlB,EAA4B;AAC1B,eAAKgB,cAAL,GAAsBhB,QAAtB;AACD;;AAEDiB,2BAAmBjB,QAAnB,EAA6B;AAC3B,eAAKkB,eAAL,GAAuBlB,QAAvB;AACD;;AAEDmB,+BAAuBnB,QAAvB,EAAiC;AAC/B,eAAKY,mBAAL,GAA2BZ,QAA3B;AACD;;AAED;AACA;AACA;;AAEAa,8BAAsB;AACpB,cAAIO,qBAAqB,KAAKC,qBAAL,CAA2B,KAAKT,mBAAhC,CAAzB;AACA,cAAGQ,kBAAH,EAAuBA,mBAAmBE,iBAAnB;AACxB;;AAEDZ,wBAAgB;AACd,cAAIa,eAAe,KAAKF,qBAAL,CAA2B,KAAKxB,aAAhC,CAAnB;AACA,cAAG0B,YAAH,EAAiB,KAAK/B,WAAL,CAAiBgC,OAAjB,CAAyBD,YAAzB;AAClB;;AAEDF,8BAAsBrB,QAAtB,EAAgC;AAC9B,cAAIyB,WAAWrC,GAAGsC,KAAH,CAAS,KAAKnC,MAAd,CAAf;AACA,cAAIoC,IAAIF,SAAS,CAAT,CAAR;AACA,cAAIG,IAAIH,SAAS,CAAT,CAAR;AACA,eAAK,IAAII,IAAI7B,SAAS8B,MAAT,GAAkB,CAA/B,EAAkCD,KAAK,CAAvC,EAA0C,EAAEA,CAA5C,EAA+C;AAC7C,gBAAIE,OAAO/B,SAAS6B,CAAT,CAAX;AACA,gBAAIG,KAAKL,IAAII,KAAKJ,CAAlB;AACA,gBAAIM,KAAKL,IAAIG,KAAKH,CAAlB;;AAEA;AACA;AACA,gBAAII,KAAKA,EAAL,GAAUC,KAAKA,EAAf,GAAoB,KAAKtC,MAAL,GAAc,KAAKA,MAA3C,EAAmD;AACjD,qBAAOoC,IAAP;AACD;AACF;AACF;;AAED1B,uBAAe;AACb,iBAAO,KAAKgB,qBAAL,CAA2B,KAAKzB,iBAAhC,CAAP;AACD;;AAEDW,mBAAW;AACT,cAAIwB,OAAO3C,GAAG8C,KAAH,CAAS9B,OAApB;AACA2B,eAAKI,EAAL,GAAU,KAAK1C,SAAL,CAAe2C,OAAf,CAAuBhD,GAAG8C,KAAH,CAASP,CAAhC,CAAV;AACAI,eAAKM,EAAL,GAAU,KAAK5C,SAAL,CAAe6C,OAAf,CAAuBlD,GAAG8C,KAAH,CAASN,CAAhC,CAAV;AACAG,eAAKQ,cAAL,CAAoBnD,GAAG8C,KAAH,CAASP,CAA7B,EAAgCvC,GAAG8C,KAAH,CAASN,CAAzC;AACA,eAAKpC,WAAL,CAAiBgD,kBAAjB;AACD;;AAEDhC,qBAAa;AACX,cAAIuB,OAAO3C,GAAG8C,KAAH,CAAS9B,OAApB;AACA2B,eAAKI,EAAL,GAAU,IAAV;AACAJ,eAAKM,EAAL,GAAU,IAAV;AACA,cAAIV,IAAI,KAAKlC,SAAL,CAAe2C,OAAf,CAAuBhD,GAAG8C,KAAH,CAASP,CAAhC,CAAR;AACA,cAAIC,IAAI,KAAKnC,SAAL,CAAe6C,OAAf,CAAuBlD,GAAG8C,KAAH,CAASN;AACxC;AACA;AAFQ,WAAR;AAGD;;AAxGqC;;yBAAnBvC,kB","file":"interaction-manager.js","sourcesContent":["import d3 from \"src/external/d3.v5.js\";\n\nexport default class InteractionManager {\n  constructor(canvas, vennDiagram) {\n    this.canvas = canvas\n    this.vennDiagram = vennDiagram\n    this.transform = d3.zoomIdentity;\n    this.radius = 35\n    this.draggableSubjects = []\n    this.clickSubjects = []\n    this.altClickSubjects = []\n  }\n  \n  // ------------------------------------------\n  // Public Methods\n  // ------------------------------------------\n  \n  registerDragging(subjects) {\n    this.draggableSubjects = subjects\n    \n    d3.select(this.canvas)\n      .call(d3.drag()\n            .subject(() => this._dragSubject())\n            .on(\"drag\", () => this._dragged())\n            .on(\"end\", () => this._dragended()))\n  }\n  \n  registerClick(subjects) {\n    this.clickSubjects = subjects\n    d3.select(this.canvas)\n      .on(\"click\", () => this._clickSubject())\n  }\n  \n  registerDoubleClick(subjects) {\n    this.doubleClickSubjects = subjects\n    d3.select(this.canvas)\n      .on(\"dblclick\", () => this._doubleClickSubject())\n  }\n    \n  setDraggingSubjects(subjects) {\n    this.draggableSubjects = subjects\n  }\n  \n  setToggleSubjects(subjects) {\n    this.toggleSubjects = subjects\n  }\n  \n  setInspectSubjects(subjects) {\n    this.inspectSubjects = subjects\n  }\n  \n  setDoubleClickSubjects(subjects) {\n    this.doubleClickSubjects = subjects\n  }\n  \n  // ------------------------------------------\n  // Private Methods\n  // ------------------------------------------\n  \n  _doubleClickSubject() {\n    let doubleClickSubject = this._getSubjectUnderMouse(this.doubleClickSubjects)    \n    if(doubleClickSubject) doubleClickSubject.toggleDoubleClick()\n  }\n  \n  _clickSubject() {\n    let clickSubject = this._getSubjectUnderMouse(this.clickSubjects)\n    if(clickSubject) this.vennDiagram.inspect(clickSubject)\n  }\n  \n  _getSubjectUnderMouse(subjects) {\n    let position = d3.mouse(this.canvas)\n    let x = position[0]\n    let y = position[1]\n    for (let i = subjects.length - 1; i >= 0; --i) {\n      let node = subjects[i];\n      let dx = x - node.x;\n      let dy = y - node.y;\n      \n      //check if euclidian distance is bigger than radius\n      // or in this case, if squared euclidean distance is bigger that squared radius, to avoid sqrt\n      if (dx * dx + dy * dy < this.radius * this.radius) { \n        return node;\n      }\n    }\n  }\n  \n  _dragSubject() {\n    return this._getSubjectUnderMouse(this.draggableSubjects)\n  }\n  \n  _dragged() {\n    let node = d3.event.subject;\n    node.fx = this.transform.invertX(d3.event.x)\n    node.fy = this.transform.invertY(d3.event.y)\n    node.updatePosition(d3.event.x, d3.event.y)\n    this.vennDiagram.updateDistribution()\n  }\n\n  _dragended() {\n    let node = d3.event.subject;\n    node.fx = null;\n    node.fy = null;\n    let x = this.transform.invertX(d3.event.x)\n    let y = this.transform.invertY(d3.event.y)\n    //node.updatePosition(x, y)\n    //this.vennDiagram.updateDistribution()\n  }\n  \n}"]}