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.

156 lines
3.8 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 helper will bind any DOM renderer (for instance svg)
  9. * to its captors, to properly dispatch the good events to the sigma instance
  10. * to manage clicking, hovering etc...
  11. *
  12. * It has to be called in the scope of the related renderer.
  13. */
  14. sigma.misc.bindDOMEvents = function(container) {
  15. var self = this,
  16. graph = this.graph;
  17. // DOMElement abstraction
  18. function Element(domElement) {
  19. // Helpers
  20. this.attr = function(attrName) {
  21. return domElement.getAttributeNS(null, attrName);
  22. };
  23. // Properties
  24. this.tag = domElement.tagName;
  25. this.class = this.attr('class');
  26. this.id = this.attr('id');
  27. // Methods
  28. this.isNode = function() {
  29. return !!~this.class.indexOf(self.settings('classPrefix') + '-node');
  30. };
  31. this.isEdge = function() {
  32. return !!~this.class.indexOf(self.settings('classPrefix') + '-edge');
  33. };
  34. this.isHover = function() {
  35. return !!~this.class.indexOf(self.settings('classPrefix') + '-hover');
  36. };
  37. }
  38. // Click
  39. function click(e) {
  40. if (!self.settings('eventsEnabled'))
  41. return;
  42. // Generic event
  43. self.dispatchEvent('click', e);
  44. // Are we on a node?
  45. var element = new Element(e.target);
  46. if (element.isNode())
  47. self.dispatchEvent('clickNode', {
  48. node: graph.nodes(element.attr('data-node-id'))
  49. });
  50. else
  51. self.dispatchEvent('clickStage');
  52. e.preventDefault();
  53. e.stopPropagation();
  54. }
  55. // Double click
  56. function doubleClick(e) {
  57. if (!self.settings('eventsEnabled'))
  58. return;
  59. // Generic event
  60. self.dispatchEvent('doubleClick', e);
  61. // Are we on a node?
  62. var element = new Element(e.target);
  63. if (element.isNode())
  64. self.dispatchEvent('doubleClickNode', {
  65. node: graph.nodes(element.attr('data-node-id'))
  66. });
  67. else
  68. self.dispatchEvent('doubleClickStage');
  69. e.preventDefault();
  70. e.stopPropagation();
  71. }
  72. // On over
  73. function onOver(e) {
  74. var target = e.toElement || e.target;
  75. if (!self.settings('eventsEnabled') || !target)
  76. return;
  77. var el = new Element(target);
  78. if (el.isNode()) {
  79. self.dispatchEvent('overNode', {
  80. node: graph.nodes(el.attr('data-node-id'))
  81. });
  82. }
  83. else if (el.isEdge()) {
  84. var edge = graph.edges(el.attr('data-edge-id'));
  85. self.dispatchEvent('overEdge', {
  86. edge: edge,
  87. source: graph.nodes(edge.source),
  88. target: graph.nodes(edge.target)
  89. });
  90. }
  91. }
  92. // On out
  93. function onOut(e) {
  94. var target = e.fromElement || e.originalTarget;
  95. if (!self.settings('eventsEnabled'))
  96. return;
  97. var el = new Element(target);
  98. if (el.isNode()) {
  99. self.dispatchEvent('outNode', {
  100. node: graph.nodes(el.attr('data-node-id'))
  101. });
  102. }
  103. else if (el.isEdge()) {
  104. var edge = graph.edges(el.attr('data-edge-id'));
  105. self.dispatchEvent('outEdge', {
  106. edge: edge,
  107. source: graph.nodes(edge.source),
  108. target: graph.nodes(edge.target)
  109. });
  110. }
  111. }
  112. // Registering Events:
  113. // Click
  114. container.addEventListener('click', click, false);
  115. sigma.utils.doubleClick(container, 'click', doubleClick);
  116. // Touch counterparts
  117. container.addEventListener('touchstart', click, false);
  118. sigma.utils.doubleClick(container, 'touchstart', doubleClick);
  119. // Mouseover
  120. container.addEventListener('mouseover', onOver, true);
  121. // Mouseout
  122. container.addEventListener('mouseout', onOut, true);
  123. };
  124. }).call(this);