blob: d3db8bafc84316eb8fdd808771f1bcfe236d1364 [file] [log] [blame]
library graphlib.layout.charted.create_edge_paths;
import 'intersect/intersect.dart';
import 'util.dart' as util;
createEdgePaths(selection, g, arrows) {
var svgPaths = selection.selectAll("g.edgePath")
.data(g.edges(), (e) { return util.edgeToId(e); })
.classed("update", true);
enter(svgPaths, g);
exit(svgPaths, g);
util.applyTransition(svgPaths, g)
.style("opacity", 1);
svgPaths.selectAll("path.path")
.each((e) {
var edge = g.edge(e);
edge.arrowheadId = _.uniqueId("arrowhead");
var domEdge = d3.select(self)
.attr("marker-end", () {
return "url(#" + edge.arrowheadId + ")";
})
.style("fill", "none");
util.applyTransition(domEdge, g)
.attr("d", (e) { return calcPoints(g, e); });
if (edge.id) { domEdge.attr("id", edge.id); }
util.applyStyle(domEdge, edge.style);
});
svgPaths.selectAll("defs *").remove();
svgPaths.selectAll("defs")
.each((e) {
var edge = g.edge(e),
arrowhead = arrows[edge.arrowhead];
arrowhead(d3.select(self), edge.arrowheadId, edge, "arrowhead");
});
return svgPaths;
}
calcPoints(g, e) {
var edge = g.edge(e),
tail = g.node(e.v),
head = g.node(e.w),
points = edge.points.slice(1, edge.points.length - 1);
points.unshift(intersectNode(tail, points[0]));
points.push(intersectNode(head, points[points.length - 1]));
return createLine(edge, points);
}
createLine(edge, points) {
var line = d3.svg.line()
.x((d) { return d.x; })
.y((d) { return d.y; });
if (_.has(edge, "lineInterpolate")) {
line.interpolate(edge.lineInterpolate);
}
if (_.has(edge, "lineTension")) {
line.tension(Number(edge.lineTension));
}
return line(points);
}
getCoords(elem) {
var bbox = elem.getBBox(),
matrix = elem.getTransformToElement(elem.ownerSVGElement)
.translate(bbox.width / 2, bbox.height / 2);
return { "x": matrix.e, "y": matrix.f };
}
enter(svgPaths, g) {
var svgPathsEnter = svgPaths.enter()
.append("g")
.attr("class", "edgePath")
.style("opacity", 0);
svgPathsEnter.append("path")
.attr("class", "path")
.attr("d", (e) {
var edge = g.edge(e),
sourceElem = g.node(e.v).elem,
points = _.range(edge.points.length).map(() { return getCoords(sourceElem); });
return createLine(edge, points);
});
svgPathsEnter.append("defs");
}
exit(svgPaths, g) {
var svgPathExit = svgPaths.exit();
util.applyTransition(svgPathExit, g)
.style("opacity", 0)
.remove();
util.applyTransition(svgPathExit.select("path.path"), g)
.attr("d", (e) {
var source = g.node(e.v);
if (source) {
var points = _.range(self.pathSegList.length).map(() { return source; });
return createLine({}, points);
} else {
return d3.select(self).attr("d");
}
});
}