KeyboardMoveSelection.js 2.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133
  1. import {
  2. assign
  3. } from 'min-dash';
  4. var DEFAULT_CONFIG = {
  5. moveSpeed: 1,
  6. moveSpeedAccelerated: 10
  7. };
  8. var HIGHER_PRIORITY = 1500;
  9. var LEFT = 'left';
  10. var UP = 'up';
  11. var RIGHT = 'right';
  12. var DOWN = 'down';
  13. var KEY_TO_DIRECTION = {
  14. ArrowLeft: LEFT,
  15. Left: LEFT,
  16. ArrowUp: UP,
  17. Up: UP,
  18. ArrowRight: RIGHT,
  19. Right: RIGHT,
  20. ArrowDown: DOWN,
  21. Down: DOWN
  22. };
  23. var DIRECTIONS_DELTA = {
  24. left: function(speed) {
  25. return {
  26. x: -speed,
  27. y: 0
  28. };
  29. },
  30. up: function(speed) {
  31. return {
  32. x: 0,
  33. y: -speed
  34. };
  35. },
  36. right: function(speed) {
  37. return {
  38. x: speed,
  39. y: 0
  40. };
  41. },
  42. down: function(speed) {
  43. return {
  44. x: 0,
  45. y: speed
  46. };
  47. }
  48. };
  49. /**
  50. * Enables to move selection with keyboard arrows.
  51. * Use with Shift for modified speed (default=1, with Shift=10).
  52. * Pressed Cmd/Ctrl turns the feature off.
  53. *
  54. * @param {Object} config
  55. * @param {Number} [config.moveSpeed=1]
  56. * @param {Number} [config.moveSpeedAccelerated=10]
  57. * @param {Keyboard} keyboard
  58. * @param {Modeling} modeling
  59. * @param {Selection} selection
  60. */
  61. export default function KeyboardMoveSelection(
  62. config, keyboard,
  63. modeling, selection
  64. ) {
  65. var self = this;
  66. this._config = assign({}, DEFAULT_CONFIG, config || {});
  67. keyboard.addListener(HIGHER_PRIORITY, function(event) {
  68. var keyEvent = event.keyEvent;
  69. var direction = KEY_TO_DIRECTION[keyEvent.key];
  70. if (!direction) {
  71. return;
  72. }
  73. if (keyboard.isCmd(keyEvent)) {
  74. return;
  75. }
  76. var accelerated = keyboard.isShift(keyEvent);
  77. self.moveSelection(direction, accelerated);
  78. return true;
  79. });
  80. /**
  81. * Move selected elements in the given direction,
  82. * optionally specifying accelerated movement.
  83. *
  84. * @param {String} direction
  85. * @param {Boolean} [accelerated=false]
  86. */
  87. this.moveSelection = function(direction, accelerated) {
  88. var selectedElements = selection.get();
  89. if (!selectedElements.length) {
  90. return;
  91. }
  92. var speed = this._config[
  93. accelerated ?
  94. 'moveSpeedAccelerated' :
  95. 'moveSpeed'
  96. ];
  97. var delta = DIRECTIONS_DELTA[direction](speed);
  98. modeling.moveElements(selectedElements, delta);
  99. };
  100. }
  101. KeyboardMoveSelection.$inject = [
  102. 'config.keyboardMoveSelection',
  103. 'keyboard',
  104. 'modeling',
  105. 'selection'
  106. ];