Graph database Analysis of the Steam Network
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

222 lines
5.9 KiB

  1. ;(function(undefined) {
  2. 'use strict';
  3. if (typeof sigma === 'undefined')
  4. throw 'sigma is not declared';
  5. // Initialize packages:
  6. sigma.utils.pkg('sigma.misc');
  7. /**
  8. * This method listens to "overNode", "outNode", "overEdge" and "outEdge"
  9. * events from a renderer and renders the nodes differently on the top layer.
  10. * The goal is to make any node label readable with the mouse, and to
  11. * highlight hovered nodes and edges.
  12. *
  13. * It has to be called in the scope of the related renderer.
  14. */
  15. sigma.misc.drawHovers = function(prefix) {
  16. var self = this,
  17. hoveredNodes = {},
  18. hoveredEdges = {};
  19. this.bind('overNode', function(event) {
  20. var node = event.data.node;
  21. if (!node.hidden) {
  22. hoveredNodes[node.id] = node;
  23. draw();
  24. }
  25. });
  26. this.bind('outNode', function(event) {
  27. delete hoveredNodes[event.data.node.id];
  28. draw();
  29. });
  30. this.bind('overEdge', function(event) {
  31. var edge = event.data.edge;
  32. if (!edge.hidden) {
  33. hoveredEdges[edge.id] = edge;
  34. draw();
  35. }
  36. });
  37. this.bind('outEdge', function(event) {
  38. delete hoveredEdges[event.data.edge.id];
  39. draw();
  40. });
  41. this.bind('render', function(event) {
  42. draw();
  43. });
  44. function draw() {
  45. var k,
  46. source,
  47. target,
  48. hoveredNode,
  49. hoveredEdge,
  50. c = self.contexts.hover.canvas,
  51. defaultNodeType = self.settings('defaultNodeType'),
  52. defaultEdgeType = self.settings('defaultEdgeType'),
  53. nodeRenderers = sigma.canvas.hovers,
  54. edgeRenderers = sigma.canvas.edgehovers,
  55. extremitiesRenderers = sigma.canvas.extremities,
  56. embedSettings = self.settings.embedObjects({
  57. prefix: prefix
  58. });
  59. // Clear self.contexts.hover:
  60. self.contexts.hover.clearRect(0, 0, c.width, c.height);
  61. // Node render: single hover
  62. if (
  63. embedSettings('enableHovering') &&
  64. embedSettings('singleHover') &&
  65. Object.keys(hoveredNodes).length
  66. ) {
  67. hoveredNode = hoveredNodes[Object.keys(hoveredNodes)[0]];
  68. (
  69. nodeRenderers[hoveredNode.type] ||
  70. nodeRenderers[defaultNodeType] ||
  71. nodeRenderers.def
  72. )(
  73. hoveredNode,
  74. self.contexts.hover,
  75. embedSettings
  76. );
  77. }
  78. // Node render: multiple hover
  79. if (
  80. embedSettings('enableHovering') &&
  81. !embedSettings('singleHover')
  82. )
  83. for (k in hoveredNodes)
  84. (
  85. nodeRenderers[hoveredNodes[k].type] ||
  86. nodeRenderers[defaultNodeType] ||
  87. nodeRenderers.def
  88. )(
  89. hoveredNodes[k],
  90. self.contexts.hover,
  91. embedSettings
  92. );
  93. // Edge render: single hover
  94. if (
  95. embedSettings('enableEdgeHovering') &&
  96. embedSettings('singleHover') &&
  97. Object.keys(hoveredEdges).length
  98. ) {
  99. hoveredEdge = hoveredEdges[Object.keys(hoveredEdges)[0]];
  100. source = self.graph.nodes(hoveredEdge.source);
  101. target = self.graph.nodes(hoveredEdge.target);
  102. if (! hoveredEdge.hidden) {
  103. (
  104. edgeRenderers[hoveredEdge.type] ||
  105. edgeRenderers[defaultEdgeType] ||
  106. edgeRenderers.def
  107. ) (
  108. hoveredEdge,
  109. source,
  110. target,
  111. self.contexts.hover,
  112. embedSettings
  113. );
  114. if (embedSettings('edgeHoverExtremities')) {
  115. (
  116. extremitiesRenderers[hoveredEdge.type] ||
  117. extremitiesRenderers.def
  118. )(
  119. hoveredEdge,
  120. source,
  121. target,
  122. self.contexts.hover,
  123. embedSettings
  124. );
  125. } else {
  126. // Avoid edges rendered over nodes:
  127. (
  128. sigma.canvas.nodes[source.type] ||
  129. sigma.canvas.nodes.def
  130. ) (
  131. source,
  132. self.contexts.hover,
  133. embedSettings
  134. );
  135. (
  136. sigma.canvas.nodes[target.type] ||
  137. sigma.canvas.nodes.def
  138. ) (
  139. target,
  140. self.contexts.hover,
  141. embedSettings
  142. );
  143. }
  144. }
  145. }
  146. // Edge render: multiple hover
  147. if (
  148. embedSettings('enableEdgeHovering') &&
  149. !embedSettings('singleHover')
  150. ) {
  151. for (k in hoveredEdges) {
  152. hoveredEdge = hoveredEdges[k];
  153. source = self.graph.nodes(hoveredEdge.source);
  154. target = self.graph.nodes(hoveredEdge.target);
  155. if (!hoveredEdge.hidden) {
  156. (
  157. edgeRenderers[hoveredEdge.type] ||
  158. edgeRenderers[defaultEdgeType] ||
  159. edgeRenderers.def
  160. ) (
  161. hoveredEdge,
  162. source,
  163. target,
  164. self.contexts.hover,
  165. embedSettings
  166. );
  167. if (embedSettings('edgeHoverExtremities')) {
  168. (
  169. extremitiesRenderers[hoveredEdge.type] ||
  170. extremitiesRenderers.def
  171. )(
  172. hoveredEdge,
  173. source,
  174. target,
  175. self.contexts.hover,
  176. embedSettings
  177. );
  178. } else {
  179. // Avoid edges rendered over nodes:
  180. (
  181. sigma.canvas.nodes[source.type] ||
  182. sigma.canvas.nodes.def
  183. ) (
  184. source,
  185. self.contexts.hover,
  186. embedSettings
  187. );
  188. (
  189. sigma.canvas.nodes[target.type] ||
  190. sigma.canvas.nodes.def
  191. ) (
  192. target,
  193. self.contexts.hover,
  194. embedSettings
  195. );
  196. }
  197. }
  198. }
  199. }
  200. }
  201. };
  202. }).call(this);