;(function(undefined) {
|
|
'use strict';
|
|
|
|
if (typeof sigma === 'undefined')
|
|
throw 'sigma is not declared';
|
|
|
|
// Initialize packages:
|
|
sigma.utils.pkg('sigma.canvas.hovers');
|
|
|
|
/**
|
|
* This hover renderer will basically display the label with a background.
|
|
*
|
|
* @param {object} node The node object.
|
|
* @param {CanvasRenderingContext2D} context The canvas context.
|
|
* @param {configurable} settings The settings function.
|
|
*/
|
|
sigma.canvas.hovers.def = function(node, context, settings) {
|
|
var x,
|
|
y,
|
|
w,
|
|
h,
|
|
e,
|
|
fontStyle = settings('hoverFontStyle') || settings('fontStyle'),
|
|
prefix = settings('prefix') || '',
|
|
size = node[prefix + 'size'],
|
|
fontSize = (settings('labelSize') === 'fixed') ?
|
|
settings('defaultLabelSize') :
|
|
settings('labelSizeRatio') * size;
|
|
|
|
// Label background:
|
|
context.font = (fontStyle ? fontStyle + ' ' : '') +
|
|
fontSize + 'px ' + (settings('hoverFont') || settings('font'));
|
|
|
|
context.beginPath();
|
|
context.fillStyle = settings('labelHoverBGColor') === 'node' ?
|
|
(node.color || settings('defaultNodeColor')) :
|
|
settings('defaultHoverLabelBGColor');
|
|
|
|
if (node.label && settings('labelHoverShadow')) {
|
|
context.shadowOffsetX = 0;
|
|
context.shadowOffsetY = 0;
|
|
context.shadowBlur = 8;
|
|
context.shadowColor = settings('labelHoverShadowColor');
|
|
}
|
|
|
|
if (node.label && typeof node.label === 'string') {
|
|
x = Math.round(node[prefix + 'x'] - fontSize / 2 - 2);
|
|
y = Math.round(node[prefix + 'y'] - fontSize / 2 - 2);
|
|
w = Math.round(
|
|
context.measureText(node.label).width + fontSize / 2 + size + 7
|
|
);
|
|
h = Math.round(fontSize + 4);
|
|
e = Math.round(fontSize / 2 + 2);
|
|
|
|
context.moveTo(x, y + e);
|
|
context.arcTo(x, y, x + e, y, e);
|
|
context.lineTo(x + w, y);
|
|
context.lineTo(x + w, y + h);
|
|
context.lineTo(x + e, y + h);
|
|
context.arcTo(x, y + h, x, y + h - e, e);
|
|
context.lineTo(x, y + e);
|
|
|
|
context.closePath();
|
|
context.fill();
|
|
|
|
context.shadowOffsetX = 0;
|
|
context.shadowOffsetY = 0;
|
|
context.shadowBlur = 0;
|
|
}
|
|
|
|
// Node border:
|
|
if (settings('borderSize') > 0) {
|
|
context.beginPath();
|
|
context.fillStyle = settings('nodeBorderColor') === 'node' ?
|
|
(node.color || settings('defaultNodeColor')) :
|
|
settings('defaultNodeBorderColor');
|
|
context.arc(
|
|
node[prefix + 'x'],
|
|
node[prefix + 'y'],
|
|
size + settings('borderSize'),
|
|
0,
|
|
Math.PI * 2,
|
|
true
|
|
);
|
|
context.closePath();
|
|
context.fill();
|
|
}
|
|
|
|
// Node:
|
|
var nodeRenderer = sigma.canvas.nodes[node.type] || sigma.canvas.nodes.def;
|
|
nodeRenderer(node, context, settings);
|
|
|
|
// Display the label:
|
|
if (node.label && typeof node.label === 'string') {
|
|
context.fillStyle = (settings('labelHoverColor') === 'node') ?
|
|
(node.color || settings('defaultNodeColor')) :
|
|
settings('defaultLabelHoverColor');
|
|
|
|
context.fillText(
|
|
node.label,
|
|
Math.round(node[prefix + 'x'] + size + 3),
|
|
Math.round(node[prefix + 'y'] + fontSize / 3)
|
|
);
|
|
}
|
|
};
|
|
}).call(this);
|