| 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; |
| } |