Deterministic layout
This commit is contained in:
parent
e2b2a4fc55
commit
02d9f423b7
|
@ -15,6 +15,8 @@ const {
|
||||||
|
|
||||||
const math = require('mathjs');
|
const math = require('mathjs');
|
||||||
|
|
||||||
|
const { size } = require('../../constants/view');
|
||||||
|
|
||||||
class GraphView extends GraphViewBase {
|
class GraphView extends GraphViewBase {
|
||||||
constructor(props) {
|
constructor(props) {
|
||||||
if (!props.layoutEngine) {
|
if (!props.layoutEngine) {
|
||||||
|
@ -151,8 +153,6 @@ GraphView.defaultProps = merge(GraphViewBase.defaultProps, {
|
||||||
layoutEngineType: null,
|
layoutEngineType: null,
|
||||||
});
|
});
|
||||||
|
|
||||||
const size = 120;
|
|
||||||
|
|
||||||
class Node extends NodeBase {
|
class Node extends NodeBase {
|
||||||
constructor(props) {
|
constructor(props) {
|
||||||
super(props);
|
super(props);
|
||||||
|
|
|
@ -31,6 +31,8 @@ const {
|
||||||
PA_VOLUME_NORM,
|
PA_VOLUME_NORM,
|
||||||
} = require('../../constants/pulse');
|
} = require('../../constants/pulse');
|
||||||
|
|
||||||
|
const { size } = require('../../constants/view');
|
||||||
|
|
||||||
const VolumeSlider = require('../../components/volume-slider');
|
const VolumeSlider = require('../../components/volume-slider');
|
||||||
|
|
||||||
const {
|
const {
|
||||||
|
@ -106,7 +108,6 @@ const graphConfig = {
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
|
|
||||||
const size = 120;
|
|
||||||
const s2 = size / 2;
|
const s2 = size / 2;
|
||||||
|
|
||||||
const Sink = () => r.path({
|
const Sink = () => r.path({
|
||||||
|
|
|
@ -1,5 +1,17 @@
|
||||||
|
|
||||||
const size = 200;
|
const { size } = require('../../constants/view');
|
||||||
|
|
||||||
|
const margin = size / 10;
|
||||||
|
const step = size + (2 * margin);
|
||||||
|
|
||||||
|
function nodesIntersect(a, b) {
|
||||||
|
if (a.x === undefined || a.y === undefined || b.x === undefined || b.y === undefined) {
|
||||||
|
return undefined;
|
||||||
|
}
|
||||||
|
|
||||||
|
return (((a.x - size - margin) < b.x) && (b.x < (a.x + size + margin))) &&
|
||||||
|
(((a.y - size - margin) < b.y) && (b.y < (a.y + size + margin)));
|
||||||
|
}
|
||||||
|
|
||||||
module.exports = class LayoutEngine {
|
module.exports = class LayoutEngine {
|
||||||
constructor(graphViewProps) {
|
constructor(graphViewProps) {
|
||||||
|
@ -10,21 +22,39 @@ module.exports = class LayoutEngine {
|
||||||
return node;
|
return node;
|
||||||
}
|
}
|
||||||
|
|
||||||
adjustNodes(nodes, nodesMap) {
|
adjustNodes(nodes) {
|
||||||
nodes.forEach(node => {
|
nodes.forEach(node => {
|
||||||
|
if (node.type === 'satellite') {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
if (node.x !== undefined) {
|
if (node.x !== undefined) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (node.type === 'source') {
|
if (node.type === 'source') {
|
||||||
node.x = 0 * size;
|
node.x = 0 * step;
|
||||||
} else if (node.type === 'sink') {
|
} else if (node.type === 'sink') {
|
||||||
node.x = 10 * size;
|
node.x = 8 * step;
|
||||||
} else {
|
} else {
|
||||||
node.x = (2 * size) + (Math.round(6 * Math.random()) * size);
|
node.x = (2 * step) + ((node.index % 5) * step);
|
||||||
}
|
}
|
||||||
|
|
||||||
node.y = Math.random() * 1200;
|
node.y = 0;
|
||||||
|
|
||||||
|
for (const otherNode of nodes) {
|
||||||
|
if (otherNode.type === 'satellite') {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (otherNode === node) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (nodesIntersect(node, otherNode)) {
|
||||||
|
node.y += size + margin;
|
||||||
|
}
|
||||||
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
return nodes;
|
return nodes;
|
||||||
|
|
4
constants/view.js
Normal file
4
constants/view.js
Normal file
|
@ -0,0 +1,4 @@
|
||||||
|
|
||||||
|
const size = 120;
|
||||||
|
|
||||||
|
module.exports = { size };
|
Loading…
Reference in New Issue
Block a user