{"version":3,"sources":["https://lively-kernel.org/lively4/BP2019RH1/scratch/individualsAsPoints/regl/groupchaining/node-modules/interactive-canvas.js"],"names":["Zoomer","Selector","IndividualsGrouper","d3","InteractiveCanvas","constructor","world","canvas","regl","inspector","rawIndividuals","transform","scale","nodes","individualsGrouper","individuals","menu","start","getGroupingStructure","drawNodes","updateNodes","groupingKey","updateMenu","uniqueValuesForKey","Set","map","item","generateGroupingLegend","updateScale","updateTransform","drawZoomedPoints","points","inspectNode","node","inspect","registerZoom","zoomer","registerSelection","selector","registerGrouping","groupingLayouter","menuContainer","keys","animateNodes","duration","ease","easeCubic","timer","elapsed","t","Math","min","animateZoomedPoints","tick","stop"],"mappings":";;;;;;AAASA,Y,aAAAA,M;;AACAC,c,wBAAAA,Q;;AACAC,wB,yBAAAA,kB;;AACFC,Q;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAGA,YAAMC,iBAAN,CAAwB;;AAE7BC,oBAAYC,KAAZ,EAAmBC,MAAnB,EAA2BC,IAA3B,EAAiCC,SAAjC,EAA4CC,cAA5C,EAA4D;AAC1D,eAAKH,MAAL,GAAcA,MAAd;AACA,eAAKC,IAAL,GAAYA,IAAZ;AACA,eAAKG,SAAL,GAAiB,IAAjB;AACA,eAAKC,KAAL,GAAa,CAAb;AACA,eAAKC,KAAL,GAAa,IAAb;AACA,eAAKJ,SAAL,GAAiBA,SAAjB;AACA,eAAKK,kBAAL,GAA0B,IAA1B;AACA,eAAKC,WAAL,GAAmBL,cAAnB;AACA,eAAKM,IAAL,GAAY,IAAZ;AACA,eAAKV,KAAL,GAAaA,KAAb;AACD;;AAEDW,gBAAQ;AACN,eAAKJ,KAAL,GAAa,KAAKC,kBAAL,CAAwBI,oBAAxB,EAAb;AACA,eAAKC,SAAL;AACD;;AAEDC,oBAAYP,KAAZ,EAAmBQ,WAAnB,EAA+B;AAC7B,eAAKR,KAAL,GAAaA,KAAb;AACD;;AAEDS,mBAAWD,WAAX,EAAwB;AACtB,cAAIE,qBAAqB,CAAC,GAAG,IAAIC,GAAJ,CAAQ,KAAKd,cAAL,CAAoBe,GAApB,CAAwBC,QAAQA,KAAK,KAAKL,WAAV,CAAhC,CAAR,CAAJ,CAAzB;AACA,eAAKL,IAAL,CAAUW,sBAAV,CAAiCN,WAAjC,EAA8CE,kBAA9C;AACD;;AAEDK,oBAAYhB,KAAZ,EAAkB;AAChB,eAAKA,KAAL,GAAaA,KAAb;AACD;;AAEDiB,wBAAgBlB,SAAhB,EAA0B;AACxB,eAAKA,SAAL,GAAiBA,SAAjB;AACD;;AAEDQ,oBAAW;AACT,eAAKX,IAAL,CAAUsB,gBAAV,CACE;AACEC,oBAAQ,KAAKlB,KADf;AAEEF,uBAAW,KAAKA,SAFlB;AAGEC,mBAAO,KAAKA;AAHd,WADF;AAMD;;AAEDoB,oBAAYC,IAAZ,EAAiB;AACf,eAAKxB,SAAL,CAAeyB,OAAf,CAAuBD,IAAvB;AACD;;AAEDE,uBAAe;AACb,eAAKC,MAAL,GAAc,IAAIpC,MAAJ,CAAW,IAAX,CAAd;AACD;;AAEDqC,4BAAmB;AACjB,eAAKC,QAAL,GAAgB,IAAIrC,QAAJ,CAAa,IAAb,CAAhB;AACD;;AAEDsC,yBAAiBC,gBAAjB,EAAmCC,aAAnC,EAAkDC,IAAlD,EAAwD;AACtD,eAAK5B,kBAAL,GAA0B,IAAIZ,kBAAJ,CAAuB,IAAvB,EAA6B,KAAKa,WAAlC,EAA+CyB,gBAA/C,EAAiEC,aAAjE,EAAgF,KAAKnC,KAArF,EAA4FoC,IAA5F,CAA1B;AACD;;AAEDC,uBAAe;;AAEb,gBAAMC,WAAW,IAAjB;AACA,gBAAMC,OAAO1C,GAAG2C,SAAhB;AACA,cAAIC,QAAQ5C,GAAG4C,KAAH,CAAUC,OAAD,IAAa;AAC9B,kBAAMC,IAAIC,KAAKC,GAAL,CAAS,CAAT,EAAYN,KAAKG,UAAUJ,QAAf,CAAZ,CAAV;AACA,iBAAKpC,IAAL,CAAU4C,mBAAV,CAA8B;AAC5BrB,sBAAQ,KAAKlB,KADe;AAE5BF,yBAAW,KAAKA,SAFY;AAG5BC,qBAAO,KAAKA,KAHgB;AAI5ByC,oBAAMJ;AAJsB,aAA9B;;AAOA,gBAAIA,MAAM,CAAV,EAAa;AACXF,oBAAMO,IAAN;AACD;AACF,WAZS,CAAZ;AAaD;;AA/E4B","file":"interactive-canvas.js","sourcesContent":["import { Zoomer } from \"./zoomer.js\";\nimport { Selector } from \"./selection-with-zoom.js\";\nimport { IndividualsGrouper } from \"./individuals-grouper.js\";\nimport d3 from \"src/external/d3.v5.js\";\n\n\nexport class InteractiveCanvas {\n  \n  constructor(world, canvas, regl, inspector, rawIndividuals) {\n    this.canvas = canvas;\n    this.regl = regl;\n    this.transform = null;\n    this.scale = 1;\n    this.nodes = null;\n    this.inspector = inspector;\n    this.individualsGrouper = null;\n    this.individuals = rawIndividuals;\n    this.menu = null;\n    this.world = world;\n  }\n  \n  start() {\n    this.nodes = this.individualsGrouper.getGroupingStructure();\n    this.drawNodes();\n  }\n  \n  updateNodes(nodes, groupingKey){\n    this.nodes = nodes;\n  } \n  \n  updateMenu(groupingKey) {\n    let uniqueValuesForKey = [...new Set(this.rawIndividuals.map(item => item[this.groupingKey]))]\n    this.menu.generateGroupingLegend(groupingKey, uniqueValuesForKey);\n  }\n  \n  updateScale(scale){\n    this.scale = scale;\n  }\n  \n  updateTransform(transform){\n    this.transform = transform;\n  }\n  \n  drawNodes(){\n    this.regl.drawZoomedPoints(\n      {\n        points: this.nodes,\n        transform: this.transform,\n        scale: this.scale\n      });\n  }\n  \n  inspectNode(node){\n    this.inspector.inspect(node);\n  }\n  \n  registerZoom() {\n    this.zoomer = new Zoomer(this);\n  }\n  \n  registerSelection(){\n    this.selector = new Selector(this);\n  };\n  \n  registerGrouping(groupingLayouter, menuContainer, keys) {\n    this.individualsGrouper = new IndividualsGrouper(this, this.individuals, groupingLayouter, menuContainer, this.world, keys);\n  }\n\n  animateNodes() {\n\n    const duration = 2000;\n    const ease = d3.easeCubic;\n    let timer = d3.timer((elapsed) => {\n        const t = Math.min(1, ease(elapsed / duration))\n        this.regl.animateZoomedPoints({\n          points: this.nodes,\n          transform: this.transform,\n          scale: this.scale,\n          tick: t,\n        })\n\n        if (t === 1) {\n          timer.stop()\n        }\n      })\n  }\n  \n}\n\n"]}