HandTool.js 2.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116
  1. import { hasPrimaryModifier } from '../../util/Mouse';
  2. var HIGH_PRIORITY = 1500;
  3. var HAND_CURSOR = 'grab';
  4. export default function HandTool(eventBus, canvas, dragging, toolManager) {
  5. this._dragging = dragging;
  6. toolManager.registerTool('hand', {
  7. tool: 'hand',
  8. dragging: 'hand.move'
  9. });
  10. eventBus.on('element.mousedown', HIGH_PRIORITY, function(event) {
  11. if (hasPrimaryModifier(event)) {
  12. this.activateMove(event.originalEvent);
  13. return false;
  14. }
  15. }, this);
  16. eventBus.on('hand.end', function(event) {
  17. var target = event.originalEvent.target;
  18. // only reactive on diagram click
  19. // on some occasions, event.hover is not set and we have to check if the target is an svg
  20. if (!event.hover && !(target instanceof SVGElement)) {
  21. return false;
  22. }
  23. eventBus.once('hand.ended', function() {
  24. this.activateMove(event.originalEvent, { reactivate: true });
  25. }, this);
  26. }, this);
  27. eventBus.on('hand.move.move', function(event) {
  28. var scale = canvas.viewbox().scale;
  29. canvas.scroll({
  30. dx: event.dx * scale,
  31. dy: event.dy * scale
  32. });
  33. });
  34. eventBus.on('hand.move.end', function(event) {
  35. var context = event.context,
  36. reactivate = context.reactivate;
  37. // Don't reactivate if the user is using the keyboard keybinding
  38. if (!hasPrimaryModifier(event) && reactivate) {
  39. eventBus.once('hand.move.ended', function(event) {
  40. this.activateHand(event.originalEvent, true, true);
  41. }, this);
  42. }
  43. return false;
  44. }, this);
  45. }
  46. HandTool.$inject = [
  47. 'eventBus',
  48. 'canvas',
  49. 'dragging',
  50. 'toolManager'
  51. ];
  52. HandTool.prototype.activateMove = function(event, autoActivate, context) {
  53. if (typeof autoActivate === 'object') {
  54. context = autoActivate;
  55. autoActivate = false;
  56. }
  57. this._dragging.init(event, 'hand.move', {
  58. autoActivate: autoActivate,
  59. cursor: HAND_CURSOR,
  60. data: {
  61. context: context || {}
  62. }
  63. });
  64. };
  65. HandTool.prototype.activateHand = function(event, autoActivate, reactivate) {
  66. this._dragging.init(event, 'hand', {
  67. trapClick: false,
  68. autoActivate: autoActivate,
  69. cursor: HAND_CURSOR,
  70. data: {
  71. context: {
  72. reactivate: reactivate
  73. }
  74. }
  75. });
  76. };
  77. HandTool.prototype.toggle = function() {
  78. if (this.isActive()) {
  79. this._dragging.cancel();
  80. } else {
  81. this.activateHand();
  82. }
  83. };
  84. HandTool.prototype.isActive = function() {
  85. var context = this._dragging.context();
  86. return context && /^hand/.test(context.prefix);
  87. };