blob: d754970e638b6142758da83fd8e6bfdef63db911 [file] [log] [blame]
library graphlib.layout.charted.create_nodes;
import 'label/add_label.dart';
import 'util.dart' as util;
createNodes(selection, g, shapes) {
var simpleNodes = g.nodes().filter((v) { return !util.isSubgraph(g, v); });
var svgNodes = selection.selectAll("g.node")
.data(simpleNodes, (v) { return v; })
.classed("update", true);
svgNodes.selectAll("*").remove();
svgNodes.enter()
.append("g")
.attr("class", "node")
.style("opacity", 0);
svgNodes.each((v) {
var node = g.node(v),
thisGroup = d3.select(self),
labelGroup = thisGroup.append("g").attr("class", "label"),
labelDom = addLabel(labelGroup, node),
shape = shapes[node.shape],
bbox = _.pick(labelDom.node().getBBox(), "width", "height");
node.elem = self;
if (node.id) { thisGroup.attr("id", node.id); }
if (node.labelId) { labelGroup.attr("id", node.labelId); }
util.applyClass(thisGroup, node["class"], (thisGroup.classed("update") ? "update " : "") + "node");
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 shapeSvg = shape(d3.select(self), bbox, node);
util.applyStyle(shapeSvg, node.style);
var shapeBBox = shapeSvg.node().getBBox();
node.width = shapeBBox.width;
node.height = shapeBBox.height;
});
util.applyTransition(svgNodes.exit(), g)
.style("opacity", 0)
.remove();
return svgNodes;
}