mirror of
				https://github.com/node-red/node-red.git
				synced 2025-03-01 10:36:34 +00:00 
			
		
		
		
	This gets rid of the need to enable/disable the keyboard handling at various times. Allows Ctrl-C to work as expected when selecting text in debug/info sidebar. Downside is shortcuts that apply to the workspace (select-all, copy etc) now require the workspace to be focussed.
		
			
				
	
	
		
			151 lines
		
	
	
		
			5.8 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			151 lines
		
	
	
		
			5.8 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
| /**
 | |
|  * Copyright 2013 IBM Corp.
 | |
|  *
 | |
|  * Licensed under the Apache License, Version 2.0 (the "License");
 | |
|  * you may not use this file except in compliance with the License.
 | |
|  * You may obtain a copy of the License at
 | |
|  *
 | |
|  * http://www.apache.org/licenses/LICENSE-2.0
 | |
|  *
 | |
|  * Unless required by applicable law or agreed to in writing, software
 | |
|  * distributed under the License is distributed on an "AS IS" BASIS,
 | |
|  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 | |
|  * See the License for the specific language governing permissions and
 | |
|  * limitations under the License.
 | |
|  **/
 | |
| RED.keyboard = (function() {
 | |
| 
 | |
|     var handlers = {};
 | |
| 
 | |
|     function resolveKeyEvent(evt) {
 | |
|         var slot = handlers;
 | |
|         if (evt.ctrlKey || evt.metaKey) {
 | |
|             slot = slot.ctrl;
 | |
|         }
 | |
|         if (slot && evt.shiftKey) {
 | |
|             slot = slot.shift;
 | |
|         }
 | |
|         if (slot && evt.altKey) {
 | |
|             slot = slot.alt;
 | |
|         }
 | |
|         if (slot && slot[evt.keyCode]) {
 | |
|             var handler = slot[evt.keyCode];
 | |
|             if (handler.scope && handler.scope !== "*") {
 | |
|                 var target = evt.target;
 | |
|                 while (target.nodeName !== 'BODY' && target.id !== handler.scope) {
 | |
|                     target = target.parentElement;
 | |
|                 }
 | |
|                 if (target.nodeName === 'BODY') {
 | |
|                     handler = null;
 | |
|                 }
 | |
|             }
 | |
|             return handler;
 | |
|         }
 | |
|     }
 | |
|     d3.select(window).on("keydown",function() {
 | |
|         var handler = resolveKeyEvent(d3.event);
 | |
|         if (handler && handler.ondown) {
 | |
|             handler.ondown();
 | |
|         }
 | |
|     });
 | |
|     d3.select(window).on("keyup",function() {
 | |
|         var handler = resolveKeyEvent(d3.event);
 | |
|         if (handler && handler.onup) {
 | |
|             handler.onup();
 | |
|         }
 | |
|     });
 | |
| 
 | |
|     function addHandler(scope,key,modifiers,ondown,onup) {
 | |
|         var mod = modifiers;
 | |
|         var cbdown = ondown;
 | |
|         var cbup = onup;
 | |
|         if (typeof modifiers == "function") {
 | |
|             mod = {};
 | |
|             cbdown = modifiers;
 | |
|             cbup = ondown;
 | |
|         }
 | |
|         var slot = handlers;
 | |
|         if (mod.ctrl) {
 | |
|             slot.ctrl = slot.ctrl||{};
 | |
|             slot = slot.ctrl;
 | |
|         }
 | |
|         if (mod.shift) {
 | |
|             slot.shift = slot.shift||{};
 | |
|             slot = slot.shift;
 | |
|         }
 | |
|         if (mod.alt) {
 | |
|             slot.alt = slot.alt||{};
 | |
|             slot = slot.alt;
 | |
|         }
 | |
|         slot[key] = {scope: scope, ondown:cbdown, onup:cbup};
 | |
|     }
 | |
| 
 | |
|     function removeHandler(key,modifiers) {
 | |
|         var mod = modifiers || {};
 | |
|         var slot = handlers;
 | |
|         if (mod.ctrl) {
 | |
|             slot = slot.ctrl;
 | |
|         }
 | |
|         if (slot && mod.shift) {
 | |
|             slot = slot.shift;
 | |
|         }
 | |
|         if (slot && mod.alt) {
 | |
|             slot = slot.alt;
 | |
|         }
 | |
|         if (slot) {
 | |
|             delete slot[key];
 | |
|         }
 | |
|     }
 | |
| 
 | |
|     var dialog = null;
 | |
| 
 | |
|     function showKeyboardHelp() {
 | |
|         if (!RED.settings.theme("menu.menu-item-keyboard-shortcuts",true)) {
 | |
|             return;
 | |
|         }
 | |
|         if (!dialog) {
 | |
|             dialog = $('<div id="keyboard-help-dialog" class="hide">'+
 | |
|                 '<div style="vertical-align: top;display:inline-block; box-sizing: border-box; width:50%; padding: 10px;">'+
 | |
|                     '<table class="keyboard-shortcuts">'+
 | |
|                         '<tr><td><span class="help-key">Ctrl/⌘</span> + <span class="help-key">a</span></td><td>'+RED._("keyboard.selectAll")+'</td></tr>'+
 | |
|                         '<tr><td><span class="help-key">Shift</span> + <span class="help-key">Click</span></td><td>'+RED._("keyboard.selectAllConnected")+'</td></tr>'+
 | |
|                         '<tr><td><span class="help-key">Ctrl/⌘</span> + <span class="help-key">Click</span></td><td>'+RED._("keyboard.addRemoveNode")+'</td></tr>'+
 | |
|                         '<tr><td><span class="help-key">Delete</span></td><td>'+RED._("keyboard.deleteSelected")+'</td></tr>'+
 | |
|                         '<tr><td> </td><td></td></tr>'+
 | |
|                         '<tr><td><span class="help-key">Ctrl/⌘</span> + <span class="help-key">i</span></td><td>'+RED._("keyboard.importNode")+'</td></tr>'+
 | |
|                         '<tr><td><span class="help-key">Ctrl/⌘</span> + <span class="help-key">e</span></td><td>'+RED._("keyboard.exportNode")+'</td></tr>'+
 | |
|                     '</table>'+
 | |
|                 '</div>'+
 | |
|                 '<div style="vertical-align: top;display:inline-block; box-sizing: border-box; width:50%; padding: 10px;">'+
 | |
|                     '<table class="keyboard-shortcuts">'+
 | |
|                         '<tr><td><span class="help-key">Ctrl/⌘</span> + <span class="help-key">Space</span></td><td>'+RED._("keyboard.toggleSidebar")+'</td></tr>'+
 | |
|                         '<tr><td></td><td></td></tr>'+
 | |
|                         '<tr><td><span class="help-key">Delete</span></td><td>'+RED._("keyboard.deleteNode")+'</td></tr>'+
 | |
|                         '<tr><td></td><td></td></tr>'+
 | |
|                         '<tr><td><span class="help-key">Ctrl/⌘</span> + <span class="help-key">c</span></td><td>'+RED._("keyboard.copyNode")+'</td></tr>'+
 | |
|                         '<tr><td><span class="help-key">Ctrl/⌘</span> + <span class="help-key">x</span></td><td>'+RED._("keyboard.cutNode")+'</td></tr>'+
 | |
|                         '<tr><td><span class="help-key">Ctrl/⌘</span> + <span class="help-key">v</span></td><td>'+RED._("keyboard.pasteNode")+'</td></tr>'+
 | |
|                     '</table>'+
 | |
|                 '</div>'+
 | |
|                 '</div>')
 | |
|             .appendTo("body")
 | |
|             .dialog({
 | |
|                 modal: true,
 | |
|                 autoOpen: false,
 | |
|                 width: "800",
 | |
|                 title:"Keyboard shortcuts",
 | |
|                 resizable: false
 | |
|             });
 | |
|         }
 | |
| 
 | |
|         dialog.dialog("open");
 | |
|     }
 | |
| 
 | |
|     return {
 | |
|         add: addHandler,
 | |
|         remove: removeHandler,
 | |
|         showHelp: showKeyboardHelp
 | |
|     }
 | |
| 
 | |
| })();
 |