You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 

196 lines
3.5 KiB

  1. define([
  2. 'js/system/events'
  3. ], function (
  4. events
  5. ) {
  6. return {
  7. axes: {
  8. horizontal: {
  9. negative: ['left', 'a', 'q', 'z'],
  10. positive: ['right', 'd', 'e', 'c']
  11. },
  12. vertical: {
  13. negative: ['up', 'w', 'q', 'e'],
  14. positive: ['down', 's', 'x', 'z', 'c']
  15. }
  16. },
  17. mappings: {
  18. 8: 'backspace',
  19. 9: 'tab',
  20. 13: 'enter',
  21. 16: 'shift',
  22. 17: 'ctrl',
  23. 27: 'esc',
  24. 37: 'left',
  25. 38: 'up',
  26. 39: 'right',
  27. 40: 'down',
  28. 46: 'del',
  29. //hacks for mac cmd key
  30. 17: 'ctrl',
  31. 224: 'ctrl',
  32. 91: 'ctrl',
  33. 93: 'ctrl'
  34. },
  35. mouse: {
  36. button: null,
  37. x: 0,
  38. y: 0
  39. },
  40. mouseRaw: null,
  41. keys: {},
  42. enabled: true,
  43. init: function (el) {
  44. el
  45. .on('mousedown', this.events.mouse.mouseDown.bind(this))
  46. .on('mouseup', this.events.mouse.mouseUp.bind(this))
  47. .on('mousemove', this.events.mouse.mouseMove.bind(this));
  48. },
  49. resetKeys: function () {
  50. for (let k in this.keys)
  51. events.emit('onKeyUp', k);
  52. this.keys = {};
  53. },
  54. getMapping: function (charCode) {
  55. if (charCode >= 97)
  56. return (charCode - 96).toString();
  57. return (
  58. this.mappings[charCode] ||
  59. String.fromCharCode(charCode).toLowerCase()
  60. );
  61. },
  62. isKeyDown: function (key, noConsume) {
  63. let down = this.keys[key];
  64. if (down != null) {
  65. if (noConsume)
  66. return true;
  67. this.keys[key] = 2;
  68. return (down == 1);
  69. } return false;
  70. },
  71. getAxis: function (name) {
  72. let axis = this.axes[name];
  73. if (!axis)
  74. return 0;
  75. let result = 0;
  76. for (var i = 0; i < axis.negative.length; i++) {
  77. if (this.keys[axis.negative[i]]) {
  78. result--;
  79. break;
  80. }
  81. }
  82. for (var i = 0; i < axis.positive.length; i++) {
  83. if (this.keys[axis.positive[i]]) {
  84. result++;
  85. break;
  86. }
  87. }
  88. return result;
  89. },
  90. events: {
  91. keyboard: {
  92. keyDown: function (e) {
  93. if (!this.enabled)
  94. return;
  95. if (e.target != document.body)
  96. return true;
  97. if ((e.keyCode == 9) || (e.keyCode == 8) || (e.keyCode == 122))
  98. e.preventDefault();
  99. let key = this.getMapping(e.which);
  100. if (this.keys[key] != null)
  101. this.keys[key] = 2;
  102. else {
  103. this.keys[key] = 1;
  104. events.emit('onKeyDown', key);
  105. }
  106. if (key == 'backspace')
  107. return false;
  108. else if (e.key == 'F11')
  109. events.emit('onToggleFullscreen');
  110. },
  111. keyUp: function (e) {
  112. if (!this.enabled)
  113. return;
  114. if (e.target != document.body)
  115. return;
  116. let key = this.getMapping(e.which);
  117. delete this.keys[key];
  118. events.emit('onKeyUp', key);
  119. }
  120. },
  121. mouse: {
  122. mouseDown: function (e) {
  123. let el = $(e.target);
  124. if ((!el.hasClass('canvas')) || (el.hasClass('blocking')))
  125. return;
  126. let button = e.button;
  127. this.mouse.button = button;
  128. this.mouse.down = true;
  129. this.mouse.event = e;
  130. this.mouse.raw = e;
  131. events.emit('uiMouseDown', this.mouse);
  132. },
  133. mouseUp: function (e) {
  134. let el = $(e.target);
  135. if ((!el.hasClass('canvas')) || (el.hasClass('blocking')))
  136. return;
  137. let button = e.button;
  138. this.mouse.button = null;
  139. this.mouse.down = false;
  140. this.mouse.raw = e;
  141. events.emit('uiMouseUp', this.mouse);
  142. },
  143. mouseMove: function (e) {
  144. if (e)
  145. this.mouseRaw = e;
  146. else
  147. e = this.mouseRaw;
  148. if (!e)
  149. return;
  150. let el = $(e.target);
  151. if ((!el.hasClass('canvas')) || (el.hasClass('blocking')))
  152. return;
  153. this.mouse.x = e.offsetX;
  154. this.mouse.y = e.offsetY;
  155. this.mouse.raw = e;
  156. events.emit('uiMouseMove', this.mouse);
  157. }
  158. }
  159. }
  160. };
  161. });