sigma
Version:
A JavaScript library aimed at visualizing graphs of thousands of nodes and edges.
69 lines (68 loc) • 2.25 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
function drawEdgeLabel(context, edgeData, sourceData, targetData, settings) {
var size = settings.edgeLabelSize, font = settings.edgeLabelFont, weight = settings.edgeLabelWeight, color = settings.edgeLabelColor.attribute
? edgeData[settings.edgeLabelColor.attribute] || settings.edgeLabelColor.color || "#000"
: settings.edgeLabelColor.color;
var label = edgeData.label;
if (!label)
return;
context.fillStyle = color;
context.font = "".concat(weight, " ").concat(size, "px ").concat(font);
// Computing positions without considering nodes sizes:
var sSize = sourceData.size;
var tSize = targetData.size;
var sx = sourceData.x;
var sy = sourceData.y;
var tx = targetData.x;
var ty = targetData.y;
var cx = (sx + tx) / 2;
var cy = (sy + ty) / 2;
var dx = tx - sx;
var dy = ty - sy;
var d = Math.sqrt(dx * dx + dy * dy);
if (d < sSize + tSize)
return;
// Adding nodes sizes:
sx += (dx * sSize) / d;
sy += (dy * sSize) / d;
tx -= (dx * tSize) / d;
ty -= (dy * tSize) / d;
cx = (sx + tx) / 2;
cy = (sy + ty) / 2;
dx = tx - sx;
dy = ty - sy;
d = Math.sqrt(dx * dx + dy * dy);
// Handling ellipsis
var textLength = context.measureText(label).width;
if (textLength > d) {
var ellipsis = "…";
label = label + ellipsis;
textLength = context.measureText(label).width;
while (textLength > d && label.length > 1) {
label = label.slice(0, -2) + ellipsis;
textLength = context.measureText(label).width;
}
if (label.length < 4)
return;
}
var angle;
if (dx > 0) {
if (dy > 0)
angle = Math.acos(dx / d);
else
angle = Math.asin(dy / d);
}
else {
if (dy > 0)
angle = Math.acos(dx / d) + Math.PI;
else
angle = Math.asin(dx / d) + Math.PI / 2;
}
context.save();
context.translate(cx, cy);
context.rotate(angle);
context.fillText(label, -textLength / 2, edgeData.size / 2 + size);
context.restore();
}
exports.default = drawEdgeLabel;