{"version":3,"sources":["https://lively-kernel.org/lively4/swd21-particles/src/client/morphic/snapping.js"],"names":["pt","Strings","Grid","snapAllTopLevelContent","gridSize","lively","preferences","get","Array","from","document","body","querySelectorAll","filter","ea","classList","contains","isWindow","forEach","pos","getPosition","setPosition","snap","x","y","value","snapSize","undefined","rest","Math","abs","snapPt","p","optSnapPosition","evt","altKey","Snapping","snapTo","target","snapping","constructor","helpers","snapDistance","padding","clearHelpers","snapBounds","corner","match","snapToExtent","all","_all","parentElement","showHelpers","snapped","isHorizontal","Object","keys","concat","map","eaElement","line","offset","getGlobalPosition","subPt","globalY","Number","minLeft","min","getGlobalBounds","left","maxRight","max","right","globalX","minTop","top","maxBottom","bottom","showPath","remove","cornerOrSide","leftRightTopOrBottom","otherLeftRightTopOrBottom","_","groupBy","round","getBounds","oldBounds","old","sortBy","delta","deltaPt","newPos","addPt","rounded","newBounds","prefixSelector","setBounds","moveBy"],"mappings":"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","file":"snapping.js","sourcesContent":["import {pt} from \"src/client/graphics.js\"\nimport Strings from 'src/client/strings.js';\n\nexport class Grid {\n  static snapAllTopLevelContent() {\n    var  gridSize = lively.preferences.get(\"GridSize\") || 100;\n    Array.from(document.body.querySelectorAll(\":scope > *\"))\n      .filter(ea => ea.classList.contains(\"lively-content\") || ea.isWindow)\n      .forEach( ea => {\n        var pos = lively.getPosition(ea)\n        lively.setPosition(ea, \n          pt(Grid.snap(pos.x, gridSize, gridSize / 2), Grid.snap(pos.y,  gridSize, gridSize / 2)))\n      })\n  }\n  \n  static snap(value, gridSize, snapSize) {\n    if (gridSize === undefined)\n      gridSize = lively.preferences.get(\"GridSize\")\n    if (snapSize === undefined)\n      snapSize = lively.preferences.get(\"SnapSize\")\n  \n  \n    // #TODO make treatment of negative numbers easier while keping the [tests](test/graphics-test.js) green\n    var rest = Math.abs(value % gridSize)\n    if (value >  0 ) {\n      if (Math.abs(gridSize - Math.abs(rest)) < snapSize) \n         return value - rest + gridSize\n      if (rest < snapSize) \n        return value - rest;\n    } else {\n      if (Math.abs(gridSize - Math.abs(rest)) < snapSize) \n         return value + rest - gridSize\n      if (rest < snapSize) \n        return value + rest;\n    }\n    return value\n  }\n\n  static snapPt(p, gridSize, snapSize) {\n    return pt(this.snap(p.x, gridSize, snapSize), this.snap(p.y, gridSize, snapSize))\n  }\n\n  static optSnapPosition(pos, evt) {\n    // snap if preference is \"on\" and 'alt' take the opposite\n    if ((lively.preferences.get(\"SnapWindowsInGrid\") && !evt.altKey) ||\n        (!lively.preferences.get(\"SnapWindowsInGrid\") && evt.altKey)) {\n      return this.snapPt(pos)\n    } else {\n      return pos\n    }\n  }\n} \n\nexport default class Snapping {\n\n  static snapTo(target) {\n    var snapping = new Snapping(target)\n    snapping.snap()\n  }\n  \n  constructor(target) {\n    this.target = target\n    this.helpers = []\n    this.snapDistance = 5\n  }\n\n  snap() {\n    var padding = lively.preferences.get(\"SnapPaddingSize\")\n    this.clearHelpers()\n    \n    this.snapTo(\"left\", \"left\")\n    this.snapTo(\"left\", \"right\")\n    this.snapTo(\"left\", \"right\", padding)\n    this.snapTo(\"left\", \"centerX\")\n    \n    this.snapTo(\"top\", \"top\")\n    this.snapTo(\"top\", \"bottom\")\n    this.snapTo(\"top\", \"bottom\", padding)\n    this.snapTo(\"top\", \"centerY\")\n    \n    this.snapTo(\"right\", \"right\")\n    this.snapTo(\"right\", \"left\")\n    this.snapTo(\"right\", \"left\", -padding)\n    this.snapTo(\"right\", \"centerX\")\n\n    this.snapTo(\"bottom\", \"bottom\")\n    this.snapTo(\"bottom\", \"top\")\n    this.snapTo(\"bottom\", \"top\", -padding)\n    this.snapTo(\"bottom\", \"centerY\")\n\n  }\n\n  snapBounds(corner) {\n    // #TODO for find an alorithm that computes all the existing paddings in the world and use them here, so that it works like in PowerPoint and others\n    var padding = lively.preferences.get(\"SnapPaddingSize\")\n    this.clearHelpers()\n\n    if (corner.match(\"Left\")) {\n      this.snapToExtent(corner, \"left\", \"left\")\n      this.snapToExtent(corner, \"left\", \"right\")\n      this.snapToExtent(corner, \"left\", \"right\", padding)\n      this.snapToExtent(corner, \"left\", \"centerX\")\n    }\n\n    if (corner.match(\"Right\")) {\n      this.snapToExtent(corner, \"right\", \"right\")\n      this.snapToExtent(corner, \"right\", \"left\")\n      this.snapToExtent(corner, \"right\", \"left\", -padding)\n      this.snapToExtent(corner, \"right\", \"centerX\")\n    }\n\n    if (corner.match(\"top\")) {\n      this.snapToExtent(corner, \"top\", \"top\")\n      this.snapToExtent(corner, \"top\", \"bottom\")\n      this.snapToExtent(corner, \"top\", \"bottom\", padding)\n      this.snapToExtent(corner, \"top\", \"centerY\")\n    }\n    \n    if (corner.match(\"bottom\")) {\n      this.snapToExtent(corner, \"bottom\", \"bottom\")\n      this.snapToExtent(corner, \"bottom\", \"top\")\n      this.snapToExtent(corner, \"bottom\", \"top\", -padding)\n      this.snapToExtent(corner, \"bottom\", \"centerY\")\n    }\n\n  }\n\n  get all() {\n    if (!this._all) {\n      this._all = Array.from(this.target.parentElement.querySelectorAll(\":scope > *\"))\n        .filter(ea => (ea !== this.target) && ea.classList.contains(\"lively-content\"));\n    }\n    return this._all\n  }\n\n  showHelpers(snap, snapped, isHorizontal) {\n    Object.keys(snap)\n      .filter(ea => ea  == snapped)\n      .forEach( ea => {\n        this.helpers = this.helpers.concat(\n          snap[ea].map(eaElement => {\n            let line = undefined,\n              offset = lively.getGlobalPosition(this.target).subPt(lively.getPosition(this.target))\n            if (isHorizontal) {\n              let globalY = Number(ea) + offset.y \n              let minLeft = Math.min(\n                  lively.getGlobalBounds(eaElement).left(),\n                  lively.getGlobalBounds(this.target).left())\n              let maxRight = Math.max(\n                  lively.getGlobalBounds(eaElement).right(),\n                  lively.getGlobalBounds(this.target).right()) \n              line = [pt(minLeft, globalY), pt(maxRight, globalY)]\n            } else {\n              let globalX = Number(ea) + offset.x \n              let minTop = Math.min(\n                  lively.getGlobalBounds(eaElement).top(),\n                  lively.getGlobalBounds(this.target).top())\n              let maxBottom = Math.max(\n                  lively.getGlobalBounds(eaElement).bottom(),\n                  lively.getGlobalBounds(this.target).bottom());\n              line = [pt(globalX, minTop), pt(globalX, maxBottom)]\n            }\n            return lively.showPath(line, \"rgba(80,180,80,0.8)\", false)\n          }));\n          \n        // this.helpers = this.helpers.concat(\n        //   snap[ea].map(eaElement => {\n        //     return lively.showElement(eaElement) }))\n      })\n  }\n\n  clearHelpers() {\n    if (this.helpers) {\n      this.helpers.forEach(ea => ea && ea.remove())\n    }\n    this.helpers = []\n  }\n\n  /*\n   * Snap the extent (for resizing) of target to sides of other objects\n   */\n  snapToExtent(cornerOrSide, leftRightTopOrBottom, otherLeftRightTopOrBottom, padding) {\n    if (padding === undefined) padding = 0;\n    var isHorizontal = leftRightTopOrBottom == \"top\" || leftRightTopOrBottom == \"bottom\" \n    \n    if (!otherLeftRightTopOrBottom) otherLeftRightTopOrBottom = leftRightTopOrBottom\n    var target = this.target\n    var snap  =_.groupBy(this.all, ea => \n      Math.round(lively.getBounds(ea)[otherLeftRightTopOrBottom]() + padding));\n    \n    var oldBounds = lively.getBounds(target)\n    var old = oldBounds[leftRightTopOrBottom]();\n   \n    var snapped = _.sortBy(\n      Object.keys(snap).filter(ea => Math.abs(ea - old) < this.snapDistance),\n      ea => Math.abs(ea - old))[0];\n      \n    if (snapped !== undefined) {\n      // show snapped with a helper\n      this.showHelpers(snap, snapped, isHorizontal)\n      var delta = snapped - old; \n      var deltaPt = isHorizontal ? pt(0, delta) : pt(delta, 0);\n      \n      var newPos = oldBounds[cornerOrSide]().addPt(deltaPt).rounded()\n      var newBounds = oldBounds[Strings.prefixSelector(\"with\", cornerOrSide)](newPos)\n      lively.setBounds(target, newBounds)\n    }\n  }\n\n  /*\n   * Snap the position of target to sides of other objects\n   */\n  snapTo(leftRightTopOrBottom, otherLeftRightTopOrBottom, padding) {\n    if (padding === undefined) padding = 0;\n    var isHorizontal = leftRightTopOrBottom == \"top\" || leftRightTopOrBottom == \"bottom\" \n    \n    if (!otherLeftRightTopOrBottom) otherLeftRightTopOrBottom = leftRightTopOrBottom\n    var target = this.target\n    var snap  =_.groupBy(this.all, ea => \n          Math.round(lively.getBounds(ea)[otherLeftRightTopOrBottom]() + padding));\n    var oldBounds = lively.getBounds(target);\n    var old = oldBounds[leftRightTopOrBottom]();\n    \n    var snapped = _.sortBy(\n        Object.keys(snap).filter(ea => Math.abs(ea - old) < this.snapDistance),\n        ea => Math.abs(ea - old))[0];\n      \n    if (snapped !== undefined) {\n      this.showHelpers(snap, snapped, isHorizontal)\n      var pos = lively.getPosition(target)\n      if (isHorizontal)\n        lively.moveBy(target, pt(0, snapped - old))\n      else\n        lively.moveBy(target, pt(snapped - old, 0))\n    }\n  }\n}\n"]}