Keyboard.js 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343
  1. SC.loadPackage({ 'Keyboard': {
  2. comment: 'I am a controller for keyboard commands.',
  3. properties: {
  4. helperOverlay: { comment: 'I store the helper overlay DOM node.' }
  5. },
  6. methods: {
  7. init: {
  8. comment: 'method comment',
  9. code: function(){
  10. var self = this,
  11. spaceBarDown = false;
  12. document.addEventListener('keydown', function(evt){
  13. if(evt.target.tagName === 'INPUT' || evt.target.tagName === 'TEXTAREA' ){
  14. return;
  15. }
  16. self.do('processKeyEvent', evt);
  17. }, false);
  18. var helperOverlay = document.createElement('div');
  19. helperOverlay.setAttribute('id', 'sg-editing-helperOverlay');
  20. this.set({ helperOverlay: helperOverlay })
  21. document.addEventListener('keydown', function(evt){
  22. if(evt.target.tagName === 'INPUT' || evt.target.tagName === 'TEXTAREA' ){
  23. return;
  24. }
  25. if(evt.keyCode === 72){
  26. var helperOverlay = self.get('helperOverlay');
  27. helperOverlay.style.width = window.innerWidth + 'px';
  28. helperOverlay.style.height = window.innerHeight + 'px';
  29. document.body.appendChild(helperOverlay);
  30. } else if(evt.keyCode === 32){
  31. if(spaceBarDown === false){
  32. var myDocument = SuperGlue.get('document');
  33. myDocument.set({ showOutlines: !myDocument.get('showOutlines') });
  34. spaceBarDown = true;
  35. }
  36. }
  37. }, false);
  38. document.addEventListener('keyup', function(evt){
  39. if(evt.target.tagName === 'INPUT' || evt.target.tagName === 'TEXTAREA' ){
  40. return;
  41. }
  42. if(evt.keyCode === 72){
  43. document.body.removeChild(self.get('helperOverlay'));
  44. } else if(evt.keyCode === 32){
  45. if(spaceBarDown === true){
  46. var myDocument = SuperGlue.get('document');
  47. myDocument.set({ showOutlines: !myDocument.get('showOutlines') });
  48. spaceBarDown = false;
  49. }
  50. }
  51. }, false);
  52. }
  53. },
  54. processKeyEvent: {
  55. comment: 'I process key events.',
  56. code: function(evt){
  57. var relevant = true;
  58. if(evt.ctrlKey){
  59. switch(evt.keyCode){
  60. case 38:
  61. // Ctrl+ArrowUp
  62. SuperGlue.get('selection').do('callWidgetAction', {
  63. widget: 'WidgetLayerTop',
  64. modifier: evt.shiftKey
  65. });
  66. break;
  67. case 40:
  68. // Ctrl+ArrowDown
  69. SuperGlue.get('selection').do('callWidgetAction', {
  70. widget: 'WidgetLayerBottom',
  71. modifier: evt.shiftKey
  72. });
  73. break;
  74. case 65:
  75. // Ctrl+A
  76. this.do('selectAll');
  77. break;
  78. case 67:
  79. // Ctrl+C
  80. SuperGlue.get('selection').do('callWidgetAction', {
  81. widget: 'WidgetCopy'
  82. });
  83. break;
  84. case 71:
  85. // Ctrl+G
  86. SuperGlue.get('selection').do('callWidgetAction', {
  87. widget: 'WidgetLock'
  88. });
  89. break;
  90. case 73:
  91. // Ctrl+I
  92. SuperGlue.get('document').get('documentMenu').do('callMenuItemAction', {
  93. menuItem: 'MenuItemNewPage'
  94. });
  95. break;
  96. case 79:
  97. // Ctrl+O
  98. SuperGlue.get('document').get('documentMenu').do('callMenuItemAction', {
  99. menuItem: 'MenuItemFileManager'
  100. });
  101. break;
  102. case 83:
  103. // Ctrl+S
  104. if(evt.shiftKey){
  105. SuperGlue.get('document').get('documentMenu').do('callMenuItemAction', {
  106. menuItem: 'MenuItemSaveAs'
  107. });
  108. }else{
  109. SuperGlue.get('document').get('documentMenu').do('callMenuItemAction', {
  110. menuItem: 'MenuItemSave'
  111. });
  112. }
  113. break;
  114. case 86:
  115. // Ctrl+V
  116. SuperGlue.get('selection').do('clearAll');
  117. SuperGlue.get('document').get('documentMenu').do('callMenuItemAction', {
  118. menuItem: 'MenuItemPaste'
  119. });
  120. break;
  121. case 89:
  122. // Ctrl+Y
  123. SuperGlue.get('selection').do('clearAll');
  124. SuperGlue.get('document').get('documentMenu').do('callMenuItemAction', {
  125. menuItem: 'MenuItemRedo'
  126. });
  127. break;
  128. case 90:
  129. // Ctrl+Z
  130. SuperGlue.get('selection').do('clearAll');
  131. SuperGlue.get('document').get('documentMenu').do('callMenuItemAction', {
  132. menuItem: 'MenuItemUndo'
  133. });
  134. break;
  135. default:
  136. relevant = false;
  137. break;
  138. }
  139. }else{
  140. switch(evt.keyCode){
  141. case 46:
  142. SuperGlue.get('selection').do('callWidgetAction', {
  143. widget: 'WidgetDelete'
  144. });
  145. break;
  146. case 37:
  147. // ArrowLeft
  148. this.do('moveSelection', 'left');
  149. break;
  150. case 38:
  151. // ArrowUp
  152. this.do('moveSelection', 'up');
  153. break;
  154. case 39:
  155. // ArrowRight
  156. this.do('moveSelection', 'right');
  157. break;
  158. case 40:
  159. // ArrowDown
  160. this.do('moveSelection', 'down');
  161. break;
  162. default:
  163. relevant = false;
  164. break;
  165. }
  166. }
  167. if(relevant){
  168. evt.stopPropagation();
  169. evt.preventDefault();
  170. }
  171. }
  172. },
  173. selectAll: {
  174. comment: 'I select all (Ctrl+A)',
  175. code: function(){
  176. for(var selection = SuperGlue.get('selection'),
  177. allElements = SuperGlue.get('document').get('children'),
  178. i = 0, l = allElements.length;
  179. i < l; i++){
  180. selection.do('addElement', allElements[i]);
  181. }
  182. }
  183. },
  184. moveSelection: {
  185. comment: 'I move the selected elements on arrow key strokes in the given direction.',
  186. code: function(direction){
  187. var elements = SuperGlue.get('selection').get('elements'),
  188. stepSize = SuperGlue.get('document').get('grid').get('active')
  189. ? SuperGlue.get('document').get('grid').get('gridSize')
  190. : 1,
  191. layout = SuperGlue.get('document').get('layout');
  192. for(var i = 0, l = elements.length; i < l; i++){
  193. switch(direction){
  194. case 'up':
  195. elements[i].set({ top: (elements[i].get('top') - stepSize) });
  196. break;
  197. case 'down':
  198. elements[i].set({ top: (elements[i].get('top') + stepSize) });
  199. break;
  200. case 'left':
  201. elements[i].set({ left: (elements[i].get('left') - stepSize) });
  202. break;
  203. case 'right':
  204. if(layout.centered){
  205. if(layout.width >= elements[i].get('left') + elements[i].get('width') + stepSize){
  206. elements[i].set({ left: (elements[i].get('left') + stepSize) });
  207. }
  208. }else{
  209. elements[i].set({ left: (elements[i].get('left') + stepSize) });
  210. }
  211. break;
  212. }
  213. }
  214. SuperGlue.get('selection').do('updateDimensions');
  215. }
  216. }
  217. }
  218. }});