{"version":3,"sources":["https://lively-kernel.org/lively4/lively4-augment/src/components/halo/lively-halo-control-point-item.js"],"names":["HaloItem","nodes","events","pt","Grid","Strings","SVG","_","HaloControlPointItem","isMetaNode","initialize","lively","addEventListener","e","onMouseDown","setup","halo","path","index","setPosition","offset","getGlobalPosition","subPt","updatePosition","isConnector","get","classList","add","curveIndex","getCurvePoint","cp","undefined","setCurvePoint","pos","x","y","v","getPathVertices","cpPos","addPt","evt","preventDefault","start","document","documentElement","move","onPointerUp","removeEventListener","stop","target","window","that","shiftKey","ctrlKey","addCurvePoint","addControlPoint","removeControlPoint","vertices","original","eventOffset","globalPosition","shadowRoot","querySelectorAll","forEach","ea","style","visibility","pointerEvents","targetPointerEvents","findTargetAt","curvePoint","Object","assign","c","x2","x1","splice","setPathVertices","cp2","y2","x3","remove","showHighlight","element","highlight","showElement","innerHTML","id","moveBy","border","setExtent","getExtent","hideHighlight","world","body","p","clientX","clientY","tagName","getGlobalBounds","containsPoint","targetElement","findControlPoints","controlPoints","eaPath","parentElement","push","y1","snapRange","findWorldContext","setGlobalPosition","hand","delta","newPos","snapPt","setVerticePosition","connectMethod","points","myPos","pointsDist","map","point","dist","nearPoints","sortBy","filter","disconnectMethod","resetBounds","HaloService","showHalos","stopPropagation","svg","getPosition"],"mappings":"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","file":"lively-halo-control-point-item.js","sourcesContent":["import HaloItem from 'src/components/halo/lively-halo-item.js';\nimport * as nodes from 'src/client/morphic/node-helpers.js'\nimport * as events from 'src/client/morphic/event-helpers.js'\nimport {pt} from 'src/client/graphics.js';\nimport {Grid} from 'src/client/morphic/snapping.js';\nimport Strings from 'src/client/strings.js';\nimport SVG from \"src/client/svg.js\"\nimport _ from 'src/external/lodash/lodash.js'\n\nexport default class HaloControlPointItem extends HaloItem {\n  \n  get isMetaNode() {\n    return true\n  }\n  \n  initialize() {\n    lively.addEventListener(\"Morphic\", this, 'pointerdown',  e => this.onMouseDown(e));\n  }\n  \n  setup(halo, path, index) {\n    this.halo = halo\n    this.path = path\n    this.index = index\n    lively.setPosition(this, pt(0,0))\n//    this.offset = lively.getGlobalPosition(this.path.parentElement).subPt(lively.getGlobalPosition(this))\n    this.offset = lively.getGlobalPosition(this.path)\n      .subPt(lively.getGlobalPosition(this))\n    this.updatePosition()\n    if (this.isConnector) {\n      this.get(\"#shape\").classList.add(\"connector\")\n    } \n    if (this.curveIndex > 1) {\n      this.get(\"#shape\").classList.add(\"curve\")\n    }\n\n  }\n  \n  getCurvePoint(cp, curveIndex) {\n    if (curveIndex === undefined) curveIndex = 1;\n    return pt(cp[\"x\" + curveIndex],cp[\"y\" + curveIndex])\n  }\n  \n \n  setCurvePoint(cp, curveIndex, pos) {\n    if (curveIndex === undefined) curveIndex = 1;\n    cp[\"x\" + curveIndex] = pos.x \n    cp[\"y\" + curveIndex] = pos.y  \n  }\n  \n  updatePosition() {\n    var v = SVG.getPathVertices(this.path)\n    var cp = v[this.index]\n    let cpPos = this.getCurvePoint(cp, this.curveIndex)\n    lively.setPosition(this, this.offset.addPt(cpPos))\n    // lively.showPoint(lively.getGlobalPosition(this))\n  }\n\n  onMouseDown(evt) {\n    evt.preventDefault();\n    this.start(evt);\n\n    // attach mousemove handler to body only after mousedown occured\n    lively.addEventListener(\"HaloControlPoint\", document.documentElement, 'pointermove', (evt) => {\n      evt.preventDefault();\n      this.move(evt);\n    });\n    // and capture the following mouse up anywere \n    lively.addEventListener(\"HaloControlPoint\", document.documentElement, 'pointerup',  e => this.onPointerUp(e));\n  }\n\n  onPointerUp(evt) {\n    lively.removeEventListener(\"HaloControlPoint\", document.documentElement);\n    this.stop(evt);\n  }\n\n  start(evt, target) {    \n    this.target = target || window.that\n    // lively.notify(\"svg start \" + lively.getPosition(this.target))\n\n    // this.snapping = new Snapping(this.target) \n    if (evt.shiftKey && evt.ctrlKey) {\n      this.addCurvePoint(evt)\n    } else if (evt.shiftKey) {\n      this.addControlPoint(evt)\n    } else if (evt.ctrlKey) {\n      this.removeControlPoint(evt)     \n    }\n    \n    this.vertices = SVG.getPathVertices(this.path)\n    var cp = this.vertices[this.index]\n    if (!cp) return\n    \n    this.original = this.getCurvePoint(cp, this.curveIndex)\n    // lively.notify(\"original \" + this.original)\n    \n    this.eventOffset = events.globalPosition(evt)\n    // lively.notify(\"eventOffset \" + this.eventOffset)\n\n    this.halo.shadowRoot.querySelectorAll(\".halo\").forEach(ea => {\n      ea.style.visibility = \"hidden\"\n      // if (ea !== this) ea.style.visibility = \"hidden\"\n    })\n    \n    // this.halo.shadowRoot.querySelectorAll(\"lively-halo-control-point-item\").forEach(ea => {\n    //  ea.style.visibility = \"hidden\"\n    //   // if (ea !== this) ea.style.visibility = \"hidden\"\n    // })\n\n    this.style.pointerEvents = \"none\"\n\n    this.targetPointerEvents = this.target.style.pointerEvents\n    this.target.style.pointerEvents = \"none\"; // disable mouse events while dragging...\n    \n    if (this.isConnector) {\n      // lively.notify(\"find target\")\n      this.findTargetAt(evt)\n    }\n  }\n  \n  addCurvePoint() {\n    this.vertices = SVG.getPathVertices(this.path)\n    var cp = this.vertices[this.index]\n    var curvePoint = Object.assign({}, cp)\n    curvePoint.c = \"Q\"\n    curvePoint.x2 = cp.x1\n    curvePoint.x2 = cp.x2\n    this.curveIndex = 2\n    this.vertices.splice(this.index, 0, curvePoint) \n    SVG.setPathVertices(this.path, this.vertices)\n  }\n  \n  \n  addControlPoint() {\n    this.vertices = SVG.getPathVertices(this.path)\n    var cp = this.vertices[this.index]\n    var cp2 = Object.assign({}, cp)\n    cp2.c = \"L\"\n    this.vertices.splice(this.index + 1, 0, cp2) \n    SVG.setPathVertices(this.path, this.vertices)\n    this.index++\n  }\n\n  removeControlPoint() {\n    this.vertices = SVG.getPathVertices(this.path)\n    if (this.index == 0) {\n      this.vertices[1].c = \"M\" // the first one has to be M\n    }\n    \n    if (this.curveIndex > 1) {\n      var cp = this.vertices[this.index]\n      cp.c = \"L\"\n      delete cp.x2\n      delete cp.y2\n      delete cp.x3\n      delete cp.y2\n    } else {\n      this.vertices.splice(this.index, 1)     \n    }\n    SVG.setPathVertices(this.path, this.vertices)\n    this.remove()\n  }\n\n  \n  showHighlight(element) {\n    this.highlight = lively.showElement(element,100000)\n    this.highlight.innerHTML = \"\" + element.id\n    lively.moveBy(this.highlight, pt(-2,-2))\n    this.highlight.style.border = \"1px dashed rgba(0,0,100,0.5)\"\n    lively.setExtent(this.highlight, lively.getExtent(this.highlight).addPt(pt(2,2)))\n    return this.highlight\n  }\n\n  hideHighlight() {\n    if (this.highlight) this.highlight.remove();\n  }\n\n  findTargetAt(evt, world=document.body) {\n    this.hideHighlight()\n    \n    // does only work with \"mousemove\" but not with \"pointermove\"\n    // var element = evt.composedPath().find(ea => {\n    //   lively.showElement(ea)\n    //   return ea.classList && ea.classList.contains(\"lively-content\") && ea !== this \n    // }) \n    var p = pt(evt.clientX, evt.clientY)\n    var element\n    world.querySelectorAll(\".lively-content, lively-table\").forEach(ea => {\n      if (ea.tagName !== \"LIVELY-CONNECTOR\" && \n          lively.getGlobalBounds(ea).containsPoint(p)) element = ea;\n    })\n    \n    if (element) {\n      this.showHighlight(element)\n      this.targetElement = element\n    } else {\n      if (this.targetElement) this.targetElement = null\n    }\n    return element\n  }\n\n  findControlPoints(evt, world=document.body) {\n    var controlPoints = []\n    \n    world.querySelectorAll(\":not(marker) > path\").forEach(eaPath => {\n      var offset = lively.getGlobalPosition(eaPath.parentElement)\n      SVG.getPathVertices(eaPath).forEach((ea, index) => {\n        if (this.path == eaPath && index == this.index) {\n           // ignore me\n        } else {\n          controlPoints.push(offset.addPt(pt(ea.x1, ea.y1)))\n        }\n        \n      })\n    })\n    return controlPoints\n  }\n\n  move(evt) {\n    // lively.notify(\"svg \" + lively.getPosition(this.target))\n\n    const snapRange = 20; // #TODO make preference\n    \n    var world = lively.findWorldContext(this.target)\n    if (!this.original) return\n    \n    lively.setGlobalPosition(lively.hand, pt(evt.clientX, evt.clientY))\n    \n    // non-connector path\n    var delta = events.globalPosition(evt).subPt(this.eventOffset)\n\n    var newPos = pt(this.original.x + delta.x, this.original.y + delta.y)\n    if (!evt.ctrlKey) { // #TODO alt does not work with pointer events\n      newPos = Grid.snapPt(newPos, 10, 5) \n    }\n    \n   //  lively.notify(\"newPos \" + newPos)\n    this.setVerticePosition(newPos)\n    \n    if (this.isConnector) {\n      this.findTargetAt(evt, world)\n      // lively.showPoint(pt(evt.clientX, evt.clientY))\n\n      var connectMethod = this.index == 0 ? \"connectFrom\" : \"connectTo\";\n      if (this.targetElement) {\n        this.target[connectMethod](this.targetElement); \n        this.style.visibility = \"hidden\"\n      } else {\n        this.style.visibility = \"visible\"\n        this.target[connectMethod](lively.hand); \n      } \n    } else {\n      var points = this.findControlPoints(world)\n      var myPos = lively.getGlobalPosition(this)\n      var pointsDist = points.map(ea => {return {point: ea, dist: ea.dist(myPos)}})\n      \n      \n      if (!evt.ctrlKey) {\n        var nearPoints = _.sortBy(pointsDist.filter(ea => ea.dist < snapRange), ea => ea.dist).map(ea => ea.point)\n\n        // nearPoints.forEach(ea => lively.showPoint(ea))\n        if (nearPoints[0]) {\n          // lively.showPoint(nearPoints[0])\n          var p = nearPoints[0].subPt(lively.getGlobalPosition(this.path.parentElement))\n          this.setVerticePosition(p)\n\n        }        \n      }\n      \n    }\n  }\n\n  setVerticePosition(pos) {\n    if (!this.vertices)\n      this.vertices = SVG.getPathVertices(this.path);\n    var cp = this.vertices[this.index]\n    if (!cp) return;\n    this.setCurvePoint(cp, this.curveIndex, pos)\n    SVG.setPathVertices(this.path, this.vertices)\n    this.updatePosition()\n  }\n\n  stop(evt) {\n    this.hideHighlight()\n    this.style.pointerEvents = null\n    this.target.style.pointerEvents = this.targetPointerEvents; // receive mouse events again\n    \n    if (this.targetElement) {\n        var connectMethod = this.index == 0 ? \"connectFrom\" : \"connectTo\";\n        if (this.target[connectMethod]) {\n          this.target[connectMethod](this.targetElement) \n        }\n    } else {\n        var disconnectMethod = this.index == 0 ? \n            \"disconnectFromElement\" : \"disconnectToElement\";\n        if (this.target[disconnectMethod]) {\n          this.target[disconnectMethod](this.targetElement) \n        }\n    }\n    if (this.isConnector) {\n      this.target.resetBounds()\n    } else {\n      this.resetBounds(this.path)\n    }\n    this.halo.shadowRoot.querySelectorAll(\".halo\").forEach(ea => {\n      if (ea !== this) ea.style.visibility = null\n    })\n\n    HaloService.showHalos(window.that);\n\n    // this.halo.info.stop()\n    evt.preventDefault();\n    evt.stopPropagation()\n  }\n\n  resetBounds(path) {\n    // assuming `svg.style.overflow == \"visible\"` during move\n    var svg = path.parentElement\n    // lively.showElement(svg)\n\n    SVG.resetBounds(svg, path)\n    lively.setExtent(this, lively.getExtent(svg))\n    var pos = lively.getPosition(svg)\n    lively.moveBy(this, pos)\n    // lively.setPosition(svg, pt(0,0))\n  }\n  \n    \n}"]}