{"version":3,"sources":["https://lively-kernel.org/lively4/swd21-event-sourcing/src/client/layout.js"],"names":["pt","rect","Windows","Intersection","rects","intersections","i","length","j","intersection","width","height","push","windows","bounds","Map","forEach","ea","set","lively","getGlobalBounds","get","a","b","withWindows","obj","objBounds","element","Layout","getCenter","nodes","reduce","sum","addPt","getGlobalPosition","scaleBy","expandUntilNoIntersectionsToBottomLeft","maxiterations","undefined","y","moveBy","x","allWindows","expandUntilNoIntersectionsExplosion","all","count","elementA","elementB","isNonEmpty","left","xdir","top","ydir","oldExpandUntilNoIntersectionsExplosion","center","showPoint","dista","dist","distb","direction","subPt","normalized","delta","showPath","makeLocalSpace","objCenter","getGlobalCenter","other","otherCenter","randomizeContentPosition","node","extent","getExtent","childNodes","setPosition","Math","random"],"mappings":"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","file":"layout.js","sourcesContent":["\n/* Little Window Layout Helper */\n\nimport {pt, rect} from \"src/client/graphics.js\"\nimport Windows from \"src/components/widgets/lively-window.js\"\n\nexport class Intersection {\n  \n  static rects(rects) {\n    var intersections = []\n    for(var i=0; i < rects.length; i++) {\n      for(var j=i; j < rects.length; j++) {\n        if (i !== j) {\n          var intersection = rects[i].intersection(rects[j])\n          if (intersection && intersection.width > 0 && intersection.height > 0)\n            intersections.push(intersection)\n        }\n      }  \n    }\n    return intersections\n  }\n  \n  static windows(windows) {\n    \n    var bounds = new Map()\n    windows.forEach( ea => bounds.set(ea, lively.getGlobalBounds(ea)))\n    var intersections = []\n    for(var i=0; i < windows.length; i++) {\n      for(var j=i; j < windows.length; j++) {\n        if (i !== j) {\n          \n          var intersection = bounds.get(windows[i]).intersection(bounds.get(windows[j]))\n          if (intersection && intersection.width > 0 && intersection.height > 0)\n            intersections.push({intersection: intersection, a:windows[i], b: windows[i] })\n        }\n      }  \n    }\n    return intersections\n  }\n\n  static withWindows(obj, windows) {\n    var intersections = []\n    var objBounds = lively.getGlobalBounds(obj)\n    for(var i=0; i < windows.length; i++) {\n      if (windows[i] !== obj) {\n        var intersection = lively.getGlobalBounds(windows[i]).intersection(objBounds)\n        if (intersection && intersection.width > 0 && intersection.height > 0)\n          intersections.push({intersection: intersection, element: windows[i], })\n      }\n    }\n    return intersections\n  }\n  \n  \n}\n\n\nexport default class Layout {\n  \n  static getCenter(nodes) {\n    return nodes.reduce((sum, ea) => sum.addPt(lively.getGlobalPosition(ea)), pt(0,0)).scaleBy(1/nodes.length)\n  }\n  \n  static expandUntilNoIntersectionsToBottomLeft(windows, maxiterations) {\n    if (maxiterations === undefined) maxiterations = 100;\n    var i=0\n    do {\n      i++\n      var intersections = Intersection.windows(windows)\n      intersections.forEach(ea => {\n        var obj\n        if (ea.intersection.width > ea.intersection.height) {\n          if (lively.getGlobalPosition(ea.a).y > lively.getGlobalPosition(ea.b).y)\n            obj = ea.a\n          else\n            obj = ea.b\n          lively.moveBy(obj, pt(0, ea.intersection.height + 10))\n        } else {\n          if (lively.getGlobalPosition(ea.a).x > lively.getGlobalPosition(ea.b).x)\n            obj = ea.a\n          else\n            obj = ea.b\n          lively.moveBy(obj, pt(ea.intersection.width + 10, 0))\n        }\n      })\n    } while(intersections.length > 0 && i < maxiterations)\n  }\n  \n  \n  static expandUntilNoIntersectionsToBottomLeft(windows, maxiterations) {\n    windows = windows || Windows.allWindows()\n\n    if (maxiterations === undefined) maxiterations = 100;\n    var i=0\n    do {\n      i++\n      var intersections = Intersection.windows(windows)\n      intersections.forEach(ea => {\n        var obj\n        if (ea.intersection.width > ea.intersection.height) {\n          if (lively.getGlobalPosition(ea.a).y > lively.getGlobalPosition(ea.b).y)\n            obj = ea.a\n          else\n            obj = ea.b\n          lively.moveBy(obj, pt(0, ea.intersection.height + 10))\n        } else {\n          if (lively.getGlobalPosition(ea.a).x > lively.getGlobalPosition(ea.b).x)\n            obj = ea.a\n          else\n            obj = ea.b\n          lively.moveBy(obj, pt(ea.intersection.width + 10, 0))\n        }\n      })\n    } while(intersections.length > 0 && i < maxiterations)\n  }\n  \n    static expandUntilNoIntersectionsExplosion(windows, maxiterations) {  \n      var all = windows || Windows.allWindows()\n\n      var count = 30\n      while(count > 0 /* or error is small enough */ ) {\n        count--\n        for(var elementA of all) {\n          for(var elementB of all) {\n\n            var a = lively.getGlobalBounds(elementA)\n            var b = lively.getGlobalBounds(elementB)\n\n\n            var intersection = a.intersection(b) \n\n\n            if (intersection.isNonEmpty()) {\n\n              // lively.showRect(intersection)\n\n              if (a.left() < intersection.left()) {\n                var xdir = -1\n              } else {\n                xdir = 1\n              }\n\n              if (a.top() < intersection.top()) {\n                var ydir = -1\n              } else {\n                ydir = 1\n              }\n\n              lively.moveBy(elementA, lively.pt(xdir *  0.1 * intersection.width, ydir *  0.1 * intersection.width))\n              lively.moveBy(elementB, lively.pt(-xdir *  0.1 * intersection.width, -ydir *  0.1 * intersection.width))\n\n            }\n          }\n        }        \n    }\n  }\n  \n  // this implementation moves the windows to far....\n  static oldExpandUntilNoIntersectionsExplosion(windows, maxiterations) {\n    windows = windows || Windows.allWindows()\n    if (maxiterations === undefined) maxiterations = 200;\n    var center = this.getCenter(windows)\n    lively.showPoint(center)\n    var i=0\n    do {\n      i++\n      var intersections = Intersection.windows(windows)\n      intersections.forEach(ea => {\n        var dista = center.dist(ea.a)\n        var distb = center.dist(ea.b)\n        var obj = dista > distb ? ea.a : ea.b; \n        var direction = lively.getGlobalPosition(obj).subPt(center).normalized()\n        var delta = direction.scaleBy(50) // #TODO I am to dumb to calculate the real length and keep the direction... so just go for it\n        lively.showPath([lively.getGlobalPosition(obj), lively.getGlobalPosition(obj).addPt(delta)])\n        lively.moveBy(obj, delta)\n      })\n    } while(intersections.length > 0 && i < maxiterations)\n  }\n  \n  /*\n   * Move overlapping windows away until it does not touch any more\n   */\n  static makeLocalSpace(obj) {\n    var intersections = Intersection.withWindows(obj, Windows.allWindows())\n    var objCenter =   lively.getGlobalCenter(obj)\n    var objBounds = lively.getGlobalBounds(obj)\n    intersections.forEach(ea => {\n      var other = ea.element\n      var intersection\n      while (\n        (intersection = lively.getGlobalBounds(other).intersection(objBounds)) &&\n        intersection.width > 0 && intersection.height > 0) {\n        var otherCenter = lively.getGlobalCenter(other);\n        var delta = otherCenter.subPt(objCenter).normalized().scaleBy(10)\n        lively.moveBy(other, delta)\n        lively.showPath([otherCenter, otherCenter.addPt(delta)])\n      } \n    })\n  }\n\n  \n  // just for development and testing\n  static randomizeContentPosition(node) {\n    var extent = lively.getExtent(node)\n    node.childNodes.forEach(ea => lively.setPosition(ea, pt(Math.random()* extent.y, Math.random() * extent.x)))\n  }\n  \n}\n\n\n// // Live Feedback\n// if (that) {\n//   Layout.randomizeContentPosition(that)\n//   setTimeout(() => {\n//     Layout.expandUntilNoIntersectionsToBottomLeft(Array.from(that.childNodes))\n//   }, 500)\n// }\n\n"]}