KeyboardMove.js 2.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120
  1. import { assign } from 'min-dash';
  2. var DEFAULT_CONFIG = {
  3. moveSpeed: 50,
  4. moveSpeedAccelerated: 200
  5. };
  6. /**
  7. * A feature that allows users to move the canvas using the keyboard.
  8. *
  9. * @param {Object} config
  10. * @param {Number} [config.moveSpeed=50]
  11. * @param {Number} [config.moveSpeedAccelerated=200]
  12. * @param {Keyboard} keyboard
  13. * @param {Canvas} canvas
  14. */
  15. export default function KeyboardMove(
  16. config,
  17. keyboard,
  18. canvas
  19. ) {
  20. var self = this;
  21. this._config = assign({}, DEFAULT_CONFIG, config || {});
  22. keyboard.addListener(arrowsListener);
  23. function arrowsListener(context) {
  24. var event = context.keyEvent,
  25. config = self._config;
  26. if (!keyboard.isCmd(event)) {
  27. return;
  28. }
  29. if (keyboard.isKey([
  30. 'ArrowLeft', 'Left',
  31. 'ArrowUp', 'Up',
  32. 'ArrowDown', 'Down',
  33. 'ArrowRight', 'Right'
  34. ], event)) {
  35. var speed = (
  36. keyboard.isShift(event) ?
  37. config.moveSpeedAccelerated :
  38. config.moveSpeed
  39. );
  40. var direction;
  41. switch (event.key) {
  42. case 'ArrowLeft':
  43. case 'Left':
  44. direction = 'left';
  45. break;
  46. case 'ArrowUp':
  47. case 'Up':
  48. direction = 'up';
  49. break;
  50. case 'ArrowRight':
  51. case 'Right':
  52. direction = 'right';
  53. break;
  54. case 'ArrowDown':
  55. case 'Down':
  56. direction = 'down';
  57. break;
  58. }
  59. self.moveCanvas({
  60. speed: speed,
  61. direction: direction
  62. });
  63. return true;
  64. }
  65. }
  66. this.moveCanvas = function(opts) {
  67. var dx = 0,
  68. dy = 0,
  69. speed = opts.speed;
  70. var actualSpeed = speed / Math.min(Math.sqrt(canvas.viewbox().scale), 1);
  71. switch (opts.direction) {
  72. case 'left': // Left
  73. dx = actualSpeed;
  74. break;
  75. case 'up': // Up
  76. dy = actualSpeed;
  77. break;
  78. case 'right': // Right
  79. dx = -actualSpeed;
  80. break;
  81. case 'down': // Down
  82. dy = -actualSpeed;
  83. break;
  84. }
  85. canvas.scroll({
  86. dx: dx,
  87. dy: dy
  88. });
  89. };
  90. }
  91. KeyboardMove.$inject = [
  92. 'config.keyboardMove',
  93. 'keyboard',
  94. 'canvas'
  95. ];