;(function(undefined) {
|
|
'use strict';
|
|
|
|
if (typeof sigma === 'undefined')
|
|
throw 'sigma is not declared';
|
|
|
|
// Initialize packages:
|
|
sigma.utils.pkg('sigma.svg.hovers');
|
|
|
|
/**
|
|
* The default hover renderer.
|
|
*/
|
|
sigma.svg.hovers.def = {
|
|
|
|
/**
|
|
* SVG Element creation.
|
|
*
|
|
* @param {object} node The node object.
|
|
* @param {CanvasElement} measurementCanvas A fake canvas handled by
|
|
* the svg to perform some measurements and
|
|
* passed by the renderer.
|
|
* @param {DOMElement} nodeCircle The node DOM Element.
|
|
* @param {configurable} settings The settings function.
|
|
*/
|
|
create: function(node, nodeCircle, measurementCanvas, settings) {
|
|
|
|
// Defining visual properties
|
|
var x,
|
|
y,
|
|
w,
|
|
h,
|
|
e,
|
|
d,
|
|
fontStyle = settings('hoverFontStyle') || settings('fontStyle'),
|
|
prefix = settings('prefix') || '',
|
|
size = node[prefix + 'size'],
|
|
fontSize = (settings('labelSize') === 'fixed') ?
|
|
settings('defaultLabelSize') :
|
|
settings('labelSizeRatio') * size,
|
|
fontColor = (settings('labelHoverColor') === 'node') ?
|
|
(node.color || settings('defaultNodeColor')) :
|
|
settings('defaultLabelHoverColor');
|
|
|
|
// Creating elements
|
|
var group = document.createElementNS(settings('xmlns'), 'g'),
|
|
rectangle = document.createElementNS(settings('xmlns'), 'rect'),
|
|
circle = document.createElementNS(settings('xmlns'), 'circle'),
|
|
text = document.createElementNS(settings('xmlns'), 'text');
|
|
|
|
// Defining properties
|
|
group.setAttributeNS(null, 'class', settings('classPrefix') + '-hover');
|
|
group.setAttributeNS(null, 'data-node-id', node.id);
|
|
|
|
if (typeof node.label === 'string') {
|
|
|
|
// Text
|
|
text.innerHTML = node.label;
|
|
text.textContent = node.label;
|
|
text.setAttributeNS(
|
|
null,
|
|
'class',
|
|
settings('classPrefix') + '-hover-label');
|
|
text.setAttributeNS(null, 'font-size', fontSize);
|
|
text.setAttributeNS(null, 'font-family', settings('font'));
|
|
text.setAttributeNS(null, 'fill', fontColor);
|
|
text.setAttributeNS(null, 'x',
|
|
Math.round(node[prefix + 'x'] + size + 3));
|
|
text.setAttributeNS(null, 'y',
|
|
Math.round(node[prefix + 'y'] + fontSize / 3));
|
|
|
|
// Measures
|
|
// OPTIMIZE: Find a better way than a measurement canvas
|
|
x = Math.round(node[prefix + 'x'] - fontSize / 2 - 2);
|
|
y = Math.round(node[prefix + 'y'] - fontSize / 2 - 2);
|
|
w = Math.round(
|
|
measurementCanvas.measureText(node.label).width +
|
|
fontSize / 2 + size + 9
|
|
);
|
|
h = Math.round(fontSize + 4);
|
|
e = Math.round(fontSize / 2 + 2);
|
|
|
|
// Circle
|
|
circle.setAttributeNS(
|
|
null,
|
|
'class',
|
|
settings('classPrefix') + '-hover-area');
|
|
circle.setAttributeNS(null, 'fill', '#fff');
|
|
circle.setAttributeNS(null, 'cx', node[prefix + 'x']);
|
|
circle.setAttributeNS(null, 'cy', node[prefix + 'y']);
|
|
circle.setAttributeNS(null, 'r', e);
|
|
|
|
// Rectangle
|
|
rectangle.setAttributeNS(
|
|
null,
|
|
'class',
|
|
settings('classPrefix') + '-hover-area');
|
|
rectangle.setAttributeNS(null, 'fill', '#fff');
|
|
rectangle.setAttributeNS(null, 'x', node[prefix + 'x'] + e / 4);
|
|
rectangle.setAttributeNS(null, 'y', node[prefix + 'y'] - e);
|
|
rectangle.setAttributeNS(null, 'width', w);
|
|
rectangle.setAttributeNS(null, 'height', h);
|
|
}
|
|
|
|
// Appending childs
|
|
group.appendChild(circle);
|
|
group.appendChild(rectangle);
|
|
group.appendChild(text);
|
|
group.appendChild(nodeCircle);
|
|
|
|
return group;
|
|
}
|
|
};
|
|
}).call(this);
|