221 lines
5.8 KiB
JavaScript
221 lines
5.8 KiB
JavaScript
;(function(undefined) {
|
|
'use strict';
|
|
|
|
if (typeof sigma === 'undefined')
|
|
throw 'sigma is not declared';
|
|
|
|
// Initialize packages:
|
|
sigma.utils.pkg('sigma.misc');
|
|
|
|
/**
|
|
* This method listens to "overNode", "outNode", "overEdge" and "outEdge"
|
|
* events from a renderer and renders the nodes differently on the top layer.
|
|
* The goal is to make any node label readable with the mouse, and to
|
|
* highlight hovered nodes and edges.
|
|
*
|
|
* It has to be called in the scope of the related renderer.
|
|
*/
|
|
sigma.misc.drawHovers = function(prefix) {
|
|
var self = this,
|
|
hoveredNodes = {},
|
|
hoveredEdges = {};
|
|
|
|
this.bind('overNode', function(event) {
|
|
var node = event.data.node;
|
|
if (!node.hidden) {
|
|
hoveredNodes[node.id] = node;
|
|
draw();
|
|
}
|
|
});
|
|
|
|
this.bind('outNode', function(event) {
|
|
delete hoveredNodes[event.data.node.id];
|
|
draw();
|
|
});
|
|
|
|
this.bind('overEdge', function(event) {
|
|
var edge = event.data.edge;
|
|
if (!edge.hidden) {
|
|
hoveredEdges[edge.id] = edge;
|
|
draw();
|
|
}
|
|
});
|
|
|
|
this.bind('outEdge', function(event) {
|
|
delete hoveredEdges[event.data.edge.id];
|
|
draw();
|
|
});
|
|
|
|
this.bind('render', function(event) {
|
|
draw();
|
|
});
|
|
|
|
function draw() {
|
|
// Clear self.contexts.hover:
|
|
self.contexts.hover.canvas.width = self.contexts.hover.canvas.width;
|
|
|
|
var k,
|
|
source,
|
|
target,
|
|
hoveredNode,
|
|
hoveredEdge,
|
|
defaultNodeType = self.settings('defaultNodeType'),
|
|
defaultEdgeType = self.settings('defaultEdgeType'),
|
|
nodeRenderers = sigma.canvas.hovers,
|
|
edgeRenderers = sigma.canvas.edgehovers,
|
|
extremitiesRenderers = sigma.canvas.extremities,
|
|
embedSettings = self.settings.embedObjects({
|
|
prefix: prefix
|
|
});
|
|
|
|
// Node render: single hover
|
|
if (
|
|
embedSettings('enableHovering') &&
|
|
embedSettings('singleHover') &&
|
|
Object.keys(hoveredNodes).length
|
|
) {
|
|
hoveredNode = hoveredNodes[Object.keys(hoveredNodes)[0]];
|
|
(
|
|
nodeRenderers[hoveredNode.type] ||
|
|
nodeRenderers[defaultNodeType] ||
|
|
nodeRenderers.def
|
|
)(
|
|
hoveredNode,
|
|
self.contexts.hover,
|
|
embedSettings
|
|
);
|
|
}
|
|
|
|
// Node render: multiple hover
|
|
if (
|
|
embedSettings('enableHovering') &&
|
|
!embedSettings('singleHover')
|
|
)
|
|
for (k in hoveredNodes)
|
|
(
|
|
nodeRenderers[hoveredNodes[k].type] ||
|
|
nodeRenderers[defaultNodeType] ||
|
|
nodeRenderers.def
|
|
)(
|
|
hoveredNodes[k],
|
|
self.contexts.hover,
|
|
embedSettings
|
|
);
|
|
|
|
// Edge render: single hover
|
|
if (
|
|
embedSettings('enableEdgeHovering') &&
|
|
embedSettings('singleHover') &&
|
|
Object.keys(hoveredEdges).length
|
|
) {
|
|
hoveredEdge = hoveredEdges[Object.keys(hoveredEdges)[0]];
|
|
source = self.graph.nodes(hoveredEdge.source);
|
|
target = self.graph.nodes(hoveredEdge.target);
|
|
|
|
if (! hoveredEdge.hidden) {
|
|
(
|
|
edgeRenderers[hoveredEdge.type] ||
|
|
edgeRenderers[defaultEdgeType] ||
|
|
edgeRenderers.def
|
|
) (
|
|
hoveredEdge,
|
|
source,
|
|
target,
|
|
self.contexts.hover,
|
|
embedSettings
|
|
);
|
|
|
|
if (embedSettings('edgeHoverExtremities')) {
|
|
(
|
|
extremitiesRenderers[hoveredEdge.type] ||
|
|
extremitiesRenderers.def
|
|
)(
|
|
hoveredEdge,
|
|
source,
|
|
target,
|
|
self.contexts.hover,
|
|
embedSettings
|
|
);
|
|
|
|
} else {
|
|
// Avoid edges rendered over nodes:
|
|
(
|
|
sigma.canvas.nodes[source.type] ||
|
|
sigma.canvas.nodes.def
|
|
) (
|
|
source,
|
|
self.contexts.hover,
|
|
embedSettings
|
|
);
|
|
(
|
|
sigma.canvas.nodes[target.type] ||
|
|
sigma.canvas.nodes.def
|
|
) (
|
|
target,
|
|
self.contexts.hover,
|
|
embedSettings
|
|
);
|
|
}
|
|
}
|
|
}
|
|
|
|
// Edge render: multiple hover
|
|
if (
|
|
embedSettings('enableEdgeHovering') &&
|
|
!embedSettings('singleHover')
|
|
) {
|
|
for (k in hoveredEdges) {
|
|
hoveredEdge = hoveredEdges[k];
|
|
source = self.graph.nodes(hoveredEdge.source);
|
|
target = self.graph.nodes(hoveredEdge.target);
|
|
|
|
if (!hoveredEdge.hidden) {
|
|
(
|
|
edgeRenderers[hoveredEdge.type] ||
|
|
edgeRenderers[defaultEdgeType] ||
|
|
edgeRenderers.def
|
|
) (
|
|
hoveredEdge,
|
|
source,
|
|
target,
|
|
self.contexts.hover,
|
|
embedSettings
|
|
);
|
|
|
|
if (embedSettings('edgeHoverExtremities')) {
|
|
(
|
|
extremitiesRenderers[hoveredEdge.type] ||
|
|
extremitiesRenderers.def
|
|
)(
|
|
hoveredEdge,
|
|
source,
|
|
target,
|
|
self.contexts.hover,
|
|
embedSettings
|
|
);
|
|
} else {
|
|
// Avoid edges rendered over nodes:
|
|
(
|
|
sigma.canvas.nodes[source.type] ||
|
|
sigma.canvas.nodes.def
|
|
) (
|
|
source,
|
|
self.contexts.hover,
|
|
embedSettings
|
|
);
|
|
(
|
|
sigma.canvas.nodes[target.type] ||
|
|
sigma.canvas.nodes.def
|
|
) (
|
|
target,
|
|
self.contexts.hover,
|
|
embedSettings
|
|
);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
};
|
|
}).call(this);
|