|
|
- ;(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() {
-
- var k,
- source,
- target,
- hoveredNode,
- hoveredEdge,
- c = self.contexts.hover.canvas,
- 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
- });
-
- // Clear self.contexts.hover:
- self.contexts.hover.clearRect(0, 0, c.width, c.height);
-
- // 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);
|