Não pode escolher mais do que 25 tópicos Os tópicos devem começar com uma letra ou um número, podem incluir traços ('-') e podem ter até 35 caracteres.
 
 
 

191 linhas
4.0 KiB

  1. define([
  2. 'js/tplNode',
  3. 'js/events',
  4. 'js/client',
  5. 'js/input'
  6. ], function (
  7. tplNode,
  8. events,
  9. client,
  10. input
  11. ) {
  12. return {
  13. links: [],
  14. nodes: [],
  15. init: function () {
  16. events.on('onAreaSelect', this.events.onAreaSelect.bind(this));
  17. },
  18. findNode: function (x, y) {
  19. var res = this.nodes.find(n => ((n.pos.x == x) && (n.pos.y == y)));
  20. if (!res) {
  21. res = this.nodes.find(function (n) {
  22. return ((n.size > 0) && (Math.abs(n.pos.x - x) <= 1) && (Math.abs(n.pos.y - y) <= 1))
  23. });
  24. }
  25. return res;
  26. },
  27. callAction: function (action, options = {}) {
  28. var node = options.node || this.findNode(options.x, options.y);
  29. options.node = node;
  30. return !this.actions[action].call(this, options);
  31. },
  32. getSelected: function (single) {
  33. var selected = this.nodes.filter(n => n.selected);
  34. if ((single) && (selected.length != 1))
  35. return null;
  36. if (single)
  37. return selected[0];
  38. else
  39. return selected;
  40. },
  41. serialize: function () {
  42. return JSON.stringify({
  43. nodes: this.nodes,
  44. links: this.links
  45. });
  46. },
  47. actions: {
  48. load: function (data) {
  49. this.nodes = data.nodes;
  50. this.links = data.links.map(function (l) {
  51. l.from = this.nodes.find(n => (n.id == l.from.id));
  52. l.to = this.nodes.find(n => (n.id == l.to.id));
  53. return l;
  54. }, this);
  55. },
  56. selectNode: function (options) {
  57. if (
  58. (
  59. (!options.node) ||
  60. (!this.nodes.some(n => ((n.selected) && (n == options.node))))
  61. ) &&
  62. (!input.isKeyDown('ctrl'))
  63. )
  64. this.nodes.forEach(n => (n.selected = false));
  65. if (options.node)
  66. options.node.selected = true;
  67. return !options.node;
  68. },
  69. addNode: function (options) {
  70. this.nodes.push(tplNode.build({
  71. id: this.nodes.length,
  72. x: options.x,
  73. y: options.y
  74. }));
  75. },
  76. connectNode: function (options) {
  77. var node = options.node;
  78. if (!node)
  79. return true;
  80. var singleSelected = this.getSelected(true);
  81. if (singleSelected) {
  82. if (options.shiftDown) {
  83. this.links.spliceWhere(l => (
  84. (
  85. (l.from == node) ||
  86. (l.to == node)
  87. ) &&
  88. (
  89. (l.from == singleSelected) ||
  90. (l.to == singleSelected)
  91. ) &&
  92. (node != singleSelected)
  93. ));
  94. } else {
  95. this.links.push({
  96. from: singleSelected,
  97. to: node
  98. });
  99. }
  100. return this.callAction('selectNode');
  101. } else {
  102. return this.callAction('selectNode', {
  103. node: node
  104. })
  105. }
  106. },
  107. moveNode: function (options) {
  108. var selected = this.getSelected();
  109. if (!selected.length)
  110. return true;
  111. if (selected.length == 0)
  112. return;
  113. selected.sort(function (a, b) {
  114. var distanceA = Math.abs(a.pos.x - options.x) + Math.abs(a.pos.y - options.y);
  115. var distanceB = Math.abs(b.pos.x - options.x) + Math.abs(b.pos.y - options.y);
  116. return (distanceA > distanceB) ? 1 : -1;
  117. });
  118. var deltaX = selected[0].pos.x - options.x;
  119. var deltaY = selected[0].pos.y - options.y;
  120. selected.forEach(function (s) {
  121. s.pos.x -= deltaX;
  122. s.pos.y -= deltaY;
  123. });
  124. },
  125. deleteNode: function (options) {
  126. var selected = this.getSelected(true);
  127. this.nodes.spliceWhere(n => (n == selected));
  128. this.links.spliceWhere(n => ((n.from == selected) || (n.to == selected)));
  129. selected.selected = false;
  130. },
  131. recolorNode: function () {
  132. var selected = this.getSelected(true);
  133. if (!selected)
  134. return true;
  135. selected.color = (selected.color + 1) % 4;
  136. },
  137. resizeNode: function () {
  138. var selected = this.getSelected(true);
  139. if (!selected)
  140. return true;
  141. selected.size = (selected.size + 1) % 3;
  142. }
  143. },
  144. events: {
  145. onAreaSelect: function (from, to) {
  146. if (!input.isKeyDown('ctrl'))
  147. this.nodes.forEach(n => (n.selected = false));
  148. for (var i = from.x; i <= to.x; i++) {
  149. for (var j = from.y; j <= to.y; j++) {
  150. var node = this.findNode(i, j);
  151. if (!node)
  152. continue;
  153. node.selected = true;
  154. }
  155. }
  156. }
  157. }
  158. };
  159. });