{"version":3,"sources":["https://lively-kernel.org/lively4/BP2019RH1/src/internal/individuals-as-points/group-chaining/selection-with-zoom.js"],"names":["inside","mp2","mb2","vec3","INDIVIDUAL_COLOR_SELECTED","INDIVIDUAL_COLOR","INDIVIDUAL_TYPE","SelectAction","Selector","constructor","interactiveCanvas","applyGlobal","selectedNodes","selectedNodesPreviousColor","mousePressed","canvas","mousePosition","_registerClickedDownHandler","that","on","left","clickedNodesIndices","_calculateNodeIndicesUnderMousePointer","nodeUnderMouse","_getSelectedNode","_handleNodeSelection","node","_selectOrDeselectNode","applyAction","data","_nodeAlreadySelected","_deselectNode","_selectNode","drawing","tcolor","transform","scale","nodes","forEach","index","polygonForNode","_getPolygonForZoomedNode","push","drawingInformation","_getZoomedDrawingInformation","polygon","_getPolygoneForNode","x","size","y","clickedPointsIndices","selectedNode","nodeType","canvasWidth","_getCanvasWidth","canvasHeight","_getCanvasHeight","normalizedPosition","_calculateNormalizedCords","tx","ty","normalizedPositionWithAppliedTransform","_applyTransformOnNormalizedPosition","denormalizedPositionWithAppliedTransform","_calculateDenormalizedCords","zoomedDrawingInformation","tsize","oldPositionNormalized","fromValues","zoomedOldPositionNormalized","create","transformMat3","width","height","xNorm","yNorm"],"mappings":"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","file":"selection-with-zoom.js","sourcesContent":["import inside from \"https://lively-kernel.org/lively4/BP2019RH1/scratch/individualsAsPoints/regl/npm-modules/npm-point-in-polygon.js\";\nimport mp2 from \"https://lively-kernel.org/lively4/BP2019RH1/scratch/individualsAsPoints/regl/npm-modules/npm-mouse-position.js\";\nimport mb2 from \"https://lively-kernel.org/lively4/BP2019RH1/scratch/individualsAsPoints/regl/npm-modules/npm-mouse-pressed.js\"; \nimport { vec3 } from \"https://cdnjs.cloudflare.com/ajax/libs/gl-matrix/2.8.1/gl-matrix.js\";\nimport { INDIVIDUAL_COLOR_SELECTED, INDIVIDUAL_COLOR, INDIVIDUAL_TYPE } from \"./groupingTryOut.js\" \nimport SelectAction from '../common/actions.js'\n\n\nexport class Selector {\n  constructor(interactiveCanvas) {\n    this.applyGlobal = true;\n    this.interactiveCanvas = interactiveCanvas;\n    \n    this.selectedNodes = {};\n    this.selectedNodesPreviousColor = {};\n\n    this.mousePressed = mb2(this.interactiveCanvas.canvas);\n    this.mousePosition = mp2(this.interactiveCanvas.canvas);\n    \n    this._registerClickedDownHandler(this);\n  }\n\n  // ------------------------------------------\n  // Public Methods\n  // ------------------------------------------\n  \n\n  // ------------------------------------------\n  // Private Methods\n  // ------------------------------------------\n\n  _registerClickedDownHandler(that) {\n    that.mousePressed.on('down', function() {\n      if (that.mousePressed.left) {\n        let clickedNodesIndices = that._calculateNodeIndicesUnderMousePointer();\n        let nodeUnderMouse = that._getSelectedNode(clickedNodesIndices);\n        that._handleNodeSelection(nodeUnderMouse);\n      }   \n    })\n  }\n\n  _handleNodeSelection(node) {\n    if(node){\n      this._selectOrDeselectNode(node);\n      this.interactiveCanvas.applyAction(new SelectAction(node.data, this.applyGlobal));\n    }\n  }\n  \n  _selectOrDeselectNode(node) {\n    if(this._nodeAlreadySelected(node)) {\n      this._deselectNode(node)\n    } else {\n      this._selectNode(node);\n    }\n  }\n\n  _nodeAlreadySelected(node) {\n    return node.drawing[\"selected\"];\n  }\n\n  _deselectNode(node) {\n    node.drawing[\"selected\"] = false;\n    node.drawing.tcolor = INDIVIDUAL_COLOR;\n  }\n\n  _selectNode(node) {\n    node.drawing[\"selected\"] = true;\n    node.drawing.tcolor = INDIVIDUAL_COLOR_SELECTED;\n  }\n\n   _calculateNodeIndicesUnderMousePointer() {\n     let transform = this.interactiveCanvas.transform\n     let scale = this.interactiveCanvas.scale\n               \n     let clickedNodesIndices = [];\n     this.interactiveCanvas.nodes.forEach((node, index) => {\n       let polygonForNode = this._getPolygonForZoomedNode(node, transform, scale);\n       if (inside(this.mousePosition, polygonForNode)) {\n         clickedNodesIndices.push(index)\n       }\n     })\n     return clickedNodesIndices;\n  }\n\n  _getPolygonForZoomedNode(node, transform, scale) {\n    let drawingInformation = this._getZoomedDrawingInformation(node.drawing, transform, scale);\n    let polygon = this._getPolygoneForNode(drawingInformation);\n    return polygon;\n  }\n  \n  _getPolygoneForNode(drawingInformation) {\n    return [\n      [drawingInformation.x - drawingInformation.size/2, drawingInformation.y - drawingInformation.size/2],\n      [drawingInformation.x + drawingInformation.size/2, drawingInformation.y - drawingInformation.size/2],\n      [drawingInformation.x + drawingInformation.size/2, drawingInformation.y + drawingInformation.size/2],\n      [drawingInformation.x - drawingInformation.size/2, drawingInformation.y + drawingInformation.size/2]\n    ]\n  }\n\n  _getSelectedNode(clickedPointsIndices){\n    let selectedNode;\n    clickedPointsIndices.forEach( (index) => {\n      if (this.interactiveCanvas.nodes[index].data.nodeType == INDIVIDUAL_TYPE) {\n        selectedNode = this.interactiveCanvas.nodes[index];  \n      }\n    })\n    return selectedNode;\n  }\n  \n  _getZoomedDrawingInformation(drawingInformation, transform, scale){\n    let canvasWidth = this._getCanvasWidth();\n    let canvasHeight = this._getCanvasHeight();\n\n    let normalizedPosition = this._calculateNormalizedCords(drawingInformation.tx, drawingInformation.ty, canvasWidth, canvasHeight);\n    let normalizedPositionWithAppliedTransform = this._applyTransformOnNormalizedPosition(normalizedPosition, transform);\n    let denormalizedPositionWithAppliedTransform = this._calculateDenormalizedCords(normalizedPositionWithAppliedTransform[0], normalizedPositionWithAppliedTransform[1], canvasWidth, canvasHeight);\n    \n    let zoomedDrawingInformation = {};\n    zoomedDrawingInformation[\"size\"] = scale * drawingInformation.tsize;\n    zoomedDrawingInformation[\"x\"] = denormalizedPositionWithAppliedTransform.x;\n    zoomedDrawingInformation[\"y\"] = denormalizedPositionWithAppliedTransform.y;\n    \n    return zoomedDrawingInformation;\n  }\n\n  _applyTransformOnNormalizedPosition(normalizedPosition, transform) {\n    let oldPositionNormalized = vec3.fromValues(normalizedPosition.x, normalizedPosition.y, 1);\n    let zoomedOldPositionNormalized = vec3.create();\n    vec3.transformMat3(zoomedOldPositionNormalized, oldPositionNormalized, transform);\n    return zoomedOldPositionNormalized;\n  }\n\n  _getCanvasWidth() {\n    return this.interactiveCanvas.canvas.width;\n  }\n\n  _getCanvasHeight() {\n    return this.interactiveCanvas.canvas.height;\n  }\n  \n  _calculateNormalizedCords(x, y, width, height){\n    let xNorm = 2.0 * ((x / width) - 0.5);\n    let yNorm = -1.0 * (2.0 * ((y / height) - 0.5));\n    \n    return {x: xNorm, y: yNorm}\n  }  \n  \n  _calculateDenormalizedCords(xNorm, yNorm, width, height){\n    let x = ((xNorm / 2.0) + 0.5) * width;\n    let y = (-0.5 * yNorm + 0.5) * height;\n\n    \n    return {x: x, y: y};\n  }\n\n}"]}