dagre-d3
Version:
A D3-based renderer for Dagre
74 lines (55 loc) • 2.19 kB
JavaScript
var _ = require("./lodash");
var addLabel = require("./label/add-label");
var util = require("./util");
var d3 = require("./d3");
module.exports = createNodes;
function createNodes(selection, g, shapes) {
var simpleNodes = g.nodes().filter(function(v) { return !util.isSubgraph(g, v); });
var svgNodes = selection.selectAll("g.node")
.data(simpleNodes, function(v) { return v; })
.classed("update", true);
svgNodes.exit().remove();
svgNodes.enter().append("g")
.attr("class", "node")
.style("opacity", 0);
svgNodes = selection.selectAll("g.node");
svgNodes.each(function(v) {
var node = g.node(v);
var thisGroup = d3.select(this);
util.applyClass(thisGroup, node["class"],
(thisGroup.classed("update") ? "update " : "") + "node");
thisGroup.select("g.label").remove();
var labelGroup = thisGroup.append("g").attr("class", "label");
var labelDom = addLabel(labelGroup, node);
var shape = shapes[node.shape];
var bbox = _.pick(labelDom.node().getBBox(), "width", "height");
node.elem = this;
if (node.id) { thisGroup.attr("id", node.id); }
if (node.labelId) { labelGroup.attr("id", node.labelId); }
if (_.has(node, "width")) { bbox.width = node.width; }
if (_.has(node, "height")) { bbox.height = node.height; }
bbox.width += node.paddingLeft + node.paddingRight;
bbox.height += node.paddingTop + node.paddingBottom;
labelGroup.attr("transform", "translate(" +
((node.paddingLeft - node.paddingRight) / 2) + "," +
((node.paddingTop - node.paddingBottom) / 2) + ")");
var root = d3.select(this);
root.select(".label-container").remove();
var shapeSvg = shape(root, bbox, node).classed("label-container", true);
util.applyStyle(shapeSvg, node.style);
var shapeBBox = shapeSvg.node().getBBox();
node.width = shapeBBox.width;
node.height = shapeBBox.height;
});
var exitSelection;
if (svgNodes.exit) {
exitSelection = svgNodes.exit();
} else {
exitSelection = svgNodes.selectAll(null); // empty selection
}
util.applyTransition(exitSelection, g)
.style("opacity", 0)
.remove();
return svgNodes;
}
;