{"version":3,"sources":["https://lively-kernel.org/lively4/BP2019RH-stable/src/internal/individuals-as-points/common/drawFreehand.js"],"names":["d3","ContextMenu","inside","FreehandSelection","ColorStore","deepCopy","boundDraw","boundSetPosition","boundOnDrawStop","FreehandDrawer","constructor","parentElement","canvas","svg","style","pos","x","y","transform","k","colorstore","_initialiseContext","lastLinePoints","selections","listeners","_registerEventListeners","_draw","bind","_setPosition","_onDrawStop","start","addEventListener","stop","removeEventListener","addListener","listener","push","drawSelections","leftPadding","paddingLeft","parseInt","topPadding","paddingTop","select","selectAll","data","attr","d","linePoints","map","join","enter","append","color","exit","remove","applyScaling","factor","forEach","selection","point","applyTransform","console","log","newFreehandSelection","generateRandomHexColor","freehandSelectionCreated","e","position","_calculateRelativePosition","rect","target","getBoundingClientRect","clientX","left","clientY","top","lively","pt","buttons","ctx","save","translate","scale","beginPath","moveTo","lineTo","stroke","restore","_clear","clearRect","width","height","getContext","lineWidth","lineCap","strokeStyle","_deleteSelection","includes","splice","indexOf","freehandSelectionDeleted","evt","currentSelection","_findSelectionFromPosition","stopPropagation","preventDefault","selectionSVG","_getSVGElementFromSelection","_openSelectionMenu","result","linePointsArray","d3Selection","filter","_groups","length","menuItems","freehandSelectionOnContextMenu","menu","openIn","document","body"],"mappings":"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","file":"drawFreehand.js","sourcesContent":["// needed to be able to call functions called with event listener with the context of FreehandDrawer and not the context of the element to which the event listener is bound\nvar boundDraw;\nvar boundSetPosition;\nvar boundOnDrawStop;\n\nimport d3 from 'src/external/d3.v5.js'\nimport ContextMenu from 'src/client/contextmenu.js'\n\n\nimport inside from \"https://lively-kernel.org/lively4/BP2019RH1/src/internal/individuals-as-points/common/npm-point-in-polygon.js\" //absolute path needed, don't ask why\n\nimport FreehandSelection from './freehandSelection.js'\nimport ColorStore from './color-store.js'\nimport { deepCopy } from './utils.js'\n\nexport default class FreehandDrawer {\n  constructor(parentElement, canvas, svg, style = {}) {\n    // parentElement should be a div containing the canvas (on some level)\n    // canvas should lay on top of svg, canvas and svg should always have same extent\n    this.parentElement = parentElement\n    this.canvas = canvas\n    this.svg = svg\n    \n    this.pos = { x: 0, y: 0 }\n    this.transform = {x: 0 , y: 0, k: 1}\n    this.colorstore = new ColorStore()\n    \n    this._initialiseContext(canvas, style)\n  \n    this.lastLinePoints = []\n    this.selections = []\n\n    this.listeners = []\n\n    this._registerEventListeners()\n    boundDraw = this._draw.bind(this)\n    boundSetPosition = this._setPosition.bind(this)\n    boundOnDrawStop = this._onDrawStop.bind(this)\n  }\n\n  start() {\n    debugger\n    this.canvas.addEventListener('mousemove', boundDraw)\n    this.canvas.addEventListener('mousedown', boundSetPosition)\n    this.canvas.addEventListener('mouseup', boundOnDrawStop)\n  }\n\n  stop() {\n    debugger\n    this.canvas.removeEventListener('mousemove', boundDraw)\n    this.canvas.removeEventListener('mousedown', boundSetPosition)\n    this.canvas.removeEventListener('mouseup', boundOnDrawStop)\n  }\n\n  addListener(listener) {\n    debugger\n    this.listeners.push(listener)\n  }\n  \n  drawSelections() {\n    debugger\n    let leftPadding = this.canvas.style.paddingLeft ? parseInt(this.canvas.style.paddingLeft) : 0\n    let topPadding = this.canvas.style.paddingTop ? parseInt(this.canvas.style.paddingTop) : 0\n    \n    //d3.select(this.svg).selectAll(\"polygon\").remove()\n    \n    d3.select(this.svg).selectAll(\"polygon\")\n      .data(this.selections)\n        .attr(\"points\",function(d) { \n          return d.linePoints.map(function(d) {\n              return [d.x + leftPadding, d.y + topPadding].join(\",\");\n          }).join(\" \");\n        })\n      .enter().append(\"polygon\")\n        .attr(\"points\",function(d) { \n          return d.linePoints.map(function(d) {\n              return [d.x + leftPadding, d.y + topPadding].join(\",\");\n          }).join(\" \");\n        })\n        .style(\"fill\", function(d) {return d.color})\n        .style(\"fill-opacity\", \"0.3\")\n        .style(\"stroke\", \"black\")\n        .style(\"stroke-dasharray\", \"5,5\")\n        \n    d3.select(this.svg).selectAll(\"polygon\")\n      .data(this.selections)\n      .exit()\n        .remove()\n  }\n  \n  applyScaling(factor) {\n    this.selections.forEach(selection => {\n      selection.linePoints = selection.linePoints.map(point => {\n        return {\"x\": point.x * factor.x, \"y\": point.y * factor.y}\n      })  \n    })\n    this.drawSelections()\n  }\n  \n  applyTransform(transform) {\n    this.transform = transform\n    d3.select(this.svg).selectAll(\"polygon\")\n      .attr(\"transform\", transform)\n  }\n\n  _onDrawStop() {\n    this.lastLinePoints.push({ \"x\": this.pos.x, \"y\": this.pos.y })\n    console.log(this.lastLinePoints)\n    \n    let newFreehandSelection = new FreehandSelection(this.colorstore.generateRandomHexColor(), deepCopy(this.lastLinePoints))\n    this.selections.push(newFreehandSelection)\n\n    this.listeners.forEach(listener => {\n      listener.freehandSelectionCreated()\n    })\n    \n    this.lastLinePoints = []\n  }\n\n  _setPosition(e) {\n    let position = this._calculateRelativePosition(e) \n        \n    this.pos.x = position.x;\n    this.pos.y = position.y;\n  }\n  \n  _calculateRelativePosition(e) {\n    var rect = e.target.getBoundingClientRect()\n    let paddingLeft = this.canvas.style.paddingLeft ? parseInt(this.canvas.style.paddingLeft) : 0\n    let paddingTop = this.canvas.style.paddingTop ? parseInt(this.canvas.style.paddingTop) : 0\n    var x = e.clientX - rect.left - paddingLeft\n    var y = e.clientY - rect.top - paddingTop\n    \n    // apply tranformation\n    x = (x - this.transform.x) / this.transform.k\n    y = (y - this.transform.y) / this.transform.k\n    \n    return lively.pt(x,y)\n  }\n  \n\n  _draw(e) {\n    // mouse left button must be pressed\n    if (e.buttons !== 1) return;\n    \n    this.ctx.save()\n    this.ctx.translate(this.transform.x, this.transform.y)\n    this.ctx.scale(this.transform.k, this.transform.k)\n    \n    this.ctx.beginPath() // begin\n\n    this.ctx.moveTo(this.pos.x, this.pos.y) // from\n\n    this.lastLinePoints.push({ \"x\": this.pos.x, \"y\": this.pos.y })\n\n    this._setPosition(e)\n    this.ctx.lineTo(this.pos.x, this.pos.y) // to\n\n    this.ctx.stroke() // draw it!\n    this.ctx.restore()\n  }\n\n  _clear() {\n    this.ctx.clearRect(0, 0, this.canvas.width, this.canvas.height)\n  }\n  \n  _initialiseContext(canvas, style) {\n    this.ctx = canvas.getContext('2d')\n    this.ctx.lineWidth = style.lineWidth ? style.lineWidth : 1\n    this.ctx.lineCap = style.lineCap ? style.lineCap : 'round'\n    this.ctx.strokeStyle = style.strokeStyle ? style.strokeStyle : \"#000000\"\n  }\n  \n  _deleteSelection(selection) {\n    if (this.selections.includes(selection) ) {\n      this.selections.splice(this.selections.indexOf(selection), 1)\n      }\n    this.listeners.forEach(listener => listener.freehandSelectionDeleted(selection))\n  }\n  \n  _registerEventListeners() {\n    this.canvas.addEventListener(\"contextmenu\", (evt) => {\n      let currentSelection = this._findSelectionFromPosition(evt)\n      if (currentSelection) {\n        evt.stopPropagation()\n        evt.preventDefault()\n        let selectionSVG = this._getSVGElementFromSelection(currentSelection)\n        this._openSelectionMenu(evt, currentSelection, selectionSVG)\n      }\n    })\n  }\n  \n  _findSelectionFromPosition(evt) {\n    let result = false\n    let position = this._calculateRelativePosition(evt)\n    this.selections.forEach(selection => {\n      let linePointsArray = selection.linePoints.map(point => [point.x, point.y])\n      if (inside([position.x, position.y], linePointsArray)) {\n        result = selection\n      } \n    })\n    return result\n  }\n  \n  _getSVGElementFromSelection(selection) {\n    var d3Selection = d3.select(this.svg).selectAll(\"polygon\").filter(function(svg) {\n      return svg.color === selection.color;\n    })\n    if (d3Selection._groups.length >= 1) return d3Selection._groups[0][0] // happily assuming that we always have just one corresponding selectionElement (which given the usage of color as a kinda identifier should be fine)\n  }\n  \n  async _openSelectionMenu(evt, selection, selectionSVG) {\n    const menuItems = [\n    ['Create new visualization from selection', () => {\n      this.listeners.forEach(listener => listener.freehandSelectionOnContextMenu(evt, selection, selectionSVG))}],\n    ['Delete selection', () => this._deleteSelection(selection)]\n  ]\n    const menu = await ContextMenu.openIn(document.body, evt, this.canvas, document.body,  menuItems)\n  }\n  \n\n\n}"]}