SelectionBehavior.js 2.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117
  1. import {
  2. hasPrimaryModifier,
  3. hasSecondaryModifier,
  4. isPrimaryButton
  5. } from '../../util/Mouse';
  6. import {
  7. find,
  8. isArray
  9. } from 'min-dash';
  10. export default function SelectionBehavior(eventBus, selection, canvas, elementRegistry) {
  11. // Select elements on create
  12. eventBus.on('create.end', 500, function(event) {
  13. var context = event.context,
  14. canExecute = context.canExecute,
  15. elements = context.elements,
  16. hints = context.hints || {},
  17. autoSelect = hints.autoSelect;
  18. if (canExecute) {
  19. if (autoSelect === false) {
  20. // Select no elements
  21. return;
  22. }
  23. if (isArray(autoSelect)) {
  24. selection.select(autoSelect);
  25. } else {
  26. // Select all elements by default
  27. selection.select(elements.filter(isShown));
  28. }
  29. }
  30. });
  31. // Select connection targets on connect
  32. eventBus.on('connect.end', 500, function(event) {
  33. var context = event.context,
  34. connection = context.connection;
  35. if (connection) {
  36. selection.select(connection);
  37. }
  38. });
  39. // Select shapes on move
  40. eventBus.on('shape.move.end', 500, function(event) {
  41. var previousSelection = event.previousSelection || [];
  42. var shape = elementRegistry.get(event.context.shape.id);
  43. // Always select main shape on move
  44. var isSelected = find(previousSelection, function(selectedShape) {
  45. return shape.id === selectedShape.id;
  46. });
  47. if (!isSelected) {
  48. selection.select(shape);
  49. }
  50. });
  51. // Select elements on click
  52. eventBus.on('element.click', function(event) {
  53. if (!isPrimaryButton(event)) {
  54. return;
  55. }
  56. var element = event.element;
  57. if (element === canvas.getRootElement()) {
  58. element = null;
  59. }
  60. var isSelected = selection.isSelected(element),
  61. isMultiSelect = selection.get().length > 1;
  62. // Add to selection if CTRL or SHIFT pressed
  63. var add = hasPrimaryModifier(event) || hasSecondaryModifier(event);
  64. if (isSelected && isMultiSelect) {
  65. if (add) {
  66. // Deselect element
  67. return selection.deselect(element);
  68. } else {
  69. // Select element only
  70. return selection.select(element);
  71. }
  72. } else if (!isSelected) {
  73. // Select element
  74. selection.select(element, add);
  75. } else {
  76. // Deselect element
  77. selection.deselect(element);
  78. }
  79. });
  80. }
  81. SelectionBehavior.$inject = [
  82. 'eventBus',
  83. 'selection',
  84. 'canvas',
  85. 'elementRegistry'
  86. ];
  87. function isShown(element) {
  88. return !element.hidden;
  89. }