diff --git a/dist/vis.js b/dist/vis.js index bcdf1732..1cbcc27a 100644 --- a/dist/vis.js +++ b/dist/vis.js @@ -40430,11 +40430,10 @@ return /******/ (function(modules) { // webpackBootstrap this._placeNodesByHierarchy(distribution); // condense the whitespace. - console.time("bla"); this._condenseHierarchy(distribution); - console.timeEnd("bla"); + // shift to center so gravity does not have to do much - //this._shiftToCenter(); + this._shiftToCenter(); } } } @@ -40447,6 +40446,8 @@ return /******/ (function(modules) { // webpackBootstrap value: function _condenseHierarchy(distribution) { var _this2 = this; + // first we have some methods to help shifting trees around. + // the main method to shift the trees var shiftTrees = function shiftTrees() { var treeSizes = getTreeSizes(); for (var i = 0; i < treeSizes.length - 1; i++) { @@ -40457,6 +40458,7 @@ return /******/ (function(modules) { // webpackBootstrap } }; + // shift a single tree by an offset var shiftTree = function shiftTree(index, offset) { for (var nodeId in _this2.hierarchicalTrees) { if (_this2.hierarchicalTrees.hasOwnProperty(nodeId)) { @@ -40467,6 +40469,7 @@ return /******/ (function(modules) { // webpackBootstrap } }; + // get the width of a tree var getTreeSize = function getTreeSize(index) { var min = 1e9; var max = -1e9; @@ -40482,6 +40485,7 @@ return /******/ (function(modules) { // webpackBootstrap return [min, max]; }; + // get the width of all trees var getTreeSizes = function getTreeSizes() { var treeWidths = []; for (var i = 0; i < _this2.treeIndex; i++) { @@ -40490,23 +40494,7 @@ return /******/ (function(modules) { // webpackBootstrap return treeWidths; }; - var nodeInBranch = function nodeInBranch(source, target) { - if (source.id == target.id) { - return true; - } - var match = false; - if (_this2.hierarchicalParents[source.id]) { - var children = _this2.hierarchicalParents[source.id].children; - if (children.length > 0) { - for (var i = 0; i < children.length; i++) { - match = nodeInBranch(_this2.body.nodes[children[i]], target); - if (match == true) return match; - } - } - } - return match; - }; - + // get a map of all nodes in this branch var getBranchNodes = function getBranchNodes(source, map) { map[source.id] = true; if (_this2.hierarchicalParents[source.id]) { @@ -40519,6 +40507,8 @@ return /******/ (function(modules) { // webpackBootstrap } }; + // get a min max width as well as the maximum movement space it has on either sides + // we use min max terminology because width and height can interchange depending on the direction of the layout var getBranchBoundary = function getBranchBoundary(branchMap) { var maxLevel = arguments.length <= 1 || arguments[1] === undefined ? 1e9 : arguments[1]; @@ -40533,6 +40523,7 @@ return /******/ (function(modules) { // webpackBootstrap var index = _this2.distributionIndex[node.id]; var position = _this2._getPositionForHierarchy(_this2.body.nodes[node.id]); + // if this is the node at the side, there is no previous node if (index != 0) { var prevNode = _this2.distributionOrdering[level][index - 1]; if (branchMap[prevNode.id] === undefined) { @@ -40541,6 +40532,7 @@ return /******/ (function(modules) { // webpackBootstrap } } + // if this is the node at the end there is no next node if (index != _this2.distributionOrdering[level].length - 1) { var nextNode = _this2.distributionOrdering[level][index + 1]; if (branchMap[nextNode.id] === undefined) { @@ -40549,6 +40541,7 @@ return /******/ (function(modules) { // webpackBootstrap } } + // the width is only relevant for the levels two nodes have in common. This is why we filter on this. if (level <= maxLevel) { min = Math.min(position, min); max = Math.max(position, max); @@ -40556,9 +40549,13 @@ return /******/ (function(modules) { // webpackBootstrap } } + // if there was no next node, the max space is infinite (1e9 ~ close enough) + maxSpace = maxSpace < 0 ? 1e9 : maxSpace; + return [min, max, minSpace, maxSpace]; }; + // get the maximum level of a branch. var getMaxLevel = function getMaxLevel(nodeId) { var level = _this2.hierarchicalLevels[nodeId]; if (_this2.hierarchicalParents[nodeId]) { @@ -40572,12 +40569,14 @@ return /******/ (function(modules) { // webpackBootstrap return level; }; + // check what the maximum level is these nodes have in common. var getCollisionLevel = function getCollisionLevel(node1, node2) { var maxLevel1 = getMaxLevel(node1.id); var maxLevel2 = getMaxLevel(node2.id); return Math.min(maxLevel1, maxLevel2); }; + // check if two nodes have the same parent(s) var hasSameParent = function hasSameParent(node1, node2) { var parents1 = _this2.hierarchicalChildren[node1.id]; var parents2 = _this2.hierarchicalChildren[node2.id]; @@ -40596,6 +40595,7 @@ return /******/ (function(modules) { // webpackBootstrap return false; }; + // condense elements. These can be nodes or branches depending on the callback. var shiftElementsCloser = function shiftElementsCloser(callback, levels, centerParents) { for (var i = 0; i < levels.length; i++) { var level = levels[i]; @@ -40612,8 +40612,11 @@ return /******/ (function(modules) { // webpackBootstrap } }; + // Global var in this scope to define when the movement has stopped. var stillShifting = false; - var blockShiftCallback = function blockShiftCallback(node1, node2) { + + // callback for shifting branches + var branchShiftCallback = function branchShiftCallback(node1, node2) { var centerParent = arguments.length <= 2 || arguments[2] === undefined ? false : arguments[2]; //window.CALLBACKS.push(() => { @@ -40669,6 +40672,7 @@ return /******/ (function(modules) { // webpackBootstrap //this.body.emitter.emit("_redraw");}) }; + // callback for shifting individual nodes var unitShiftCallback = function unitShiftCallback(node1, node2, centerParent) { var pos1 = _this2._getPositionForHierarchy(node1); var pos2 = _this2._getPositionForHierarchy(node2); @@ -40688,71 +40692,66 @@ return /******/ (function(modules) { // webpackBootstrap } }; + // method to shift all nodes closer together iteratively var shiftUnitsCloser = function shiftUnitsCloser(iterations) { var levels = Object.keys(_this2.distributionOrdering); for (var i = 0; i < iterations; i++) { stillShifting = false; shiftElementsCloser(unitShiftCallback, levels, false); if (stillShifting !== true) { - console.log("FINISHED shiftUnitsCloser IN " + i); + //console.log("FINISHED shiftUnitsCloser IN " + i); break; } } - console.log("FINISHED shiftUnitsCloser IN " + iterations); + //console.log("FINISHED shiftUnitsCloser IN " + iterations); }; + // method to remove whitespace between branches. Because we do bottom up, we can center the parents. var shiftBranchesCloserBottomUp = function shiftBranchesCloserBottomUp(iterations) { var levels = Object.keys(_this2.distributionOrdering); levels = levels.reverse(); for (var i = 0; i < iterations; i++) { stillShifting = false; - shiftElementsCloser(blockShiftCallback, levels, true); + shiftElementsCloser(branchShiftCallback, levels, true); if (stillShifting !== true) { - console.log("FINISHED shiftBranchesCloserBottomUp IN " + i); - break; - } - } - }; - - var shiftBranchesCloserTopDown = function shiftBranchesCloserTopDown(iterations) { - var levels = Object.keys(_this2.distributionOrdering); - for (var i = 0; i < iterations; i++) { - stillShifting = false; - shiftElementsCloser(blockShiftCallback, levels, true); - if (stillShifting !== true) { - console.log("FINISHED shiftBranchesCloserBottomUp IN " + i); + //console.log("FINISHED shiftBranchesCloserBottomUp IN " + i); break; } } }; + // center all parents var centerAllParents = function centerAllParents() { for (var node in _this2.body.nodes) { _this2._centerParent(_this2.body.nodes[node]); } }; + // the actual work is done here. shiftBranchesCloserBottomUp(5); centerAllParents(); shiftUnitsCloser(2); - //centerAllParents(); shiftTrees(); } + + /** + * We use this method to center a parent node and check if it does not cross other nodes when it does. + * @param node + * @private + */ }, { key: '_centerParent', value: function _centerParent(node) { - //console.log("CENTERING DADDY:", node.id) if (this.hierarchicalChildren[node.id]) { var parents = this.hierarchicalChildren[node.id].parents; - //console.log(parents) for (var i = 0; i < parents.length; i++) { var parentId = parents[i]; var parentNode = this.body.nodes[parentId]; if (this.hierarchicalParents[parentId]) { + // get the range of the children var minPos = 1e9; var maxPos = -1e9; var children = this.hierarchicalParents[parentId].children; - //console.log(children) if (children.length > 0) { for (var _i2 = 0; _i2 < children.length; _i2++) { var childNode = this.body.nodes[children[_i2]]; @@ -40781,8 +40780,6 @@ return /******/ (function(modules) { // webpackBootstrap var newPosition = 0.5 * (minPos + maxPos); if (newPosition < position + maxSpace && newPosition > position - minSpace) { this._setPositionForHierarchy(parentNode, newPosition, undefined, true); - } else { - //console.log("CANNOT CENTER:", parentId, minSpace, maxSpace, newPosition); } } }