From 2c715bf59259a3724ce54be38fc8c800370a5c19 Mon Sep 17 00:00:00 2001 From: Thijs Wenker Date: Wed, 14 Nov 2018 00:48:16 +0100 Subject: [PATCH] make window shortcuts work on OSX --- scripts/system/edit.js | 38 ++++++++++++---------- scripts/system/html/js/entityList.js | 25 ++++++++++++-- scripts/system/html/js/entityProperties.js | 23 ++++++++++++- scripts/system/html/js/gridControls.js | 23 ++++++++++++- 4 files changed, 87 insertions(+), 22 deletions(-) diff --git a/scripts/system/edit.js b/scripts/system/edit.js index 46520dbf60..3876b1b074 100644 --- a/scripts/system/edit.js +++ b/scripts/system/edit.js @@ -12,7 +12,8 @@ /* global Script, SelectionDisplay, LightOverlayManager, CameraManager, Grid, GridTool, EntityListTool, Vec3, SelectionManager, Overlays, OverlayWebWindow, UserActivityLogger, Settings, Entities, Tablet, Toolbars, Messages, Menu, Camera, - progressDialog, tooltip, MyAvatar, Quat, Controller, Clipboard, HMD, UndoStack, OverlaySystemWindow */ + progressDialog, tooltip, MyAvatar, Quat, Controller, Clipboard, HMD, UndoStack, OverlaySystemWindow, + keyUpEventFromUIWindow:true */ (function() { // BEGIN LOCAL_SCOPE @@ -2706,42 +2707,44 @@ mapping.from([Controller.Hardware.Keyboard.P]) .when([Controller.Hardware.Keyboard.Control, !Controller.Hardware.Keyboard.Shift]) .to(whenReleased(function() { parentSelectedEntities(); })); -function keyUpEventFromUIWindow(keyUpEvent) { +keyUpEventFromUIWindow = function(keyUpEvent) { var WANT_DEBUG_MISSING_SHORTCUTS = false; var pressedValue = 0.0; - // Note: For some reason the keyboardEvent for delete does not show a code, using key instead: - if ((!isOnMacPlatform && keyUpEvent.key === "Delete") || (isOnMacPlatform && keyUpEvent.code === "Backspace")) { + + if ((!isOnMacPlatform && keyUpEvent.keyCodeString === "Delete") + || (isOnMacPlatform && keyUpEvent.keyCodeString === "Backspace")) { + deleteKey(pressedValue); - } else if (keyUpEvent.code === "KeyT") { + } else if (keyUpEvent.keyCodeString === "T") { toggleKey(pressedValue); - } else if (keyUpEvent.code === "KeyF") { + } else if (keyUpEvent.keyCodeString === "F") { focusKey(pressedValue); - } else if (keyUpEvent.code === "KeyG") { + } else if (keyUpEvent.keyCodeString === "G") { gridKey(pressedValue); - } else if (keyUpEvent.ctrlKey && keyUpEvent.code === "KeyX") { + } else if (keyUpEvent.ctrlKey && keyUpEvent.keyCodeString === "X") { selectionManager.cutSelectedEntities(); - } else if (keyUpEvent.ctrlKey && keyUpEvent.code === "KeyC") { + } else if (keyUpEvent.ctrlKey && keyUpEvent.keyCodeString === "C") { selectionManager.copySelectedEntities(); - } else if (keyUpEvent.ctrlKey && keyUpEvent.code === "KeyV") { + } else if (keyUpEvent.ctrlKey && keyUpEvent.keyCodeString === "V") { selectionManager.pasteEntities(); - } else if (keyUpEvent.ctrlKey && keyUpEvent.code === "KeyD") { + } else if (keyUpEvent.ctrlKey && keyUpEvent.keyCodeString === "D") { selectionManager.duplicateSelection(); - } else if (keyUpEvent.ctrlKey && !keyUpEvent.shiftKey && keyUpEvent.code === "KeyZ") { + } else if (keyUpEvent.ctrlKey && !keyUpEvent.shiftKey && keyUpEvent.keyCodeString === "Z") { undoHistory.undo(); - } else if (keyUpEvent.ctrlKey && !keyUpEvent.shiftKey && keyUpEvent.code === "KeyP") { + } else if (keyUpEvent.ctrlKey && !keyUpEvent.shiftKey && keyUpEvent.keyCodeString === "P") { parentSelectedEntities(); - } else if (keyUpEvent.ctrlKey && keyUpEvent.shiftKey && keyUpEvent.code === "KeyP") { + } else if (keyUpEvent.ctrlKey && keyUpEvent.shiftKey && keyUpEvent.keyCodeString === "P") { unparentSelectedEntities(); } else if ( - (keyUpEvent.ctrlKey && keyUpEvent.shiftKey && keyUpEvent.code === "KeyZ") || - (keyUpEvent.ctrlKey && keyUpEvent.code === "KeyY")) { + (keyUpEvent.ctrlKey && keyUpEvent.shiftKey && keyUpEvent.keyCodeString === "Z") || + (keyUpEvent.ctrlKey && keyUpEvent.keyCodeString === "Y")) { undoHistory.redo(); } else if (WANT_DEBUG_MISSING_SHORTCUTS) { console.warn("unhandled key event: " + JSON.stringify(keyUpEvent)) } -} +}; var propertyMenu = new PopupMenu(); @@ -2756,7 +2759,6 @@ var showMenuItem = propertyMenu.addMenuItem("Show in Marketplace"); var propertiesTool = new PropertiesTool(); - selectionDisplay.onSpaceModeChange = function(spaceMode) { entityListTool.setSpaceMode(spaceMode); propertiesTool.setSpaceMode(spaceMode); diff --git a/scripts/system/html/js/entityList.js b/scripts/system/html/js/entityList.js index e4220ddd53..ea096be5e2 100644 --- a/scripts/system/html/js/entityList.js +++ b/scripts/system/html/js/entityList.js @@ -1112,13 +1112,33 @@ function loaded() { elToggleSpaceMode.innerText = "World"; } } + + const KEY_CODES = { + BACKSPACE: 8, + DELETE: 46 + }; document.addEventListener("keyup", function (keyUpEvent) { if (keyUpEvent.target.nodeName === "INPUT") { return; } - if (keyUpEvent.ctrlKey && keyUpEvent.code === "KeyA") { + let {code, key, keyCode, altKey, ctrlKey, shiftKey} = keyUpEvent; + + let keyCodeString; + switch (keyCode) { + case KEY_CODES.DELETE: + keyCodeString = "Delete"; + break; + case KEY_CODES.BACKSPACE: + keyCodeString = "Backspace"; + break; + default: + keyCodeString = String.fromCharCode(keyUpEvent.keyCode); + break; + } + + if (ctrlKey && keyCodeString === "A") { let visibleEntityIDs = visibleEntities.map(visibleEntity => visibleEntity.id); let selectionIncludesAllVisibleEntityIDs = visibleEntityIDs.every(visibleEntityID => { return selectedEntities.includes(visibleEntityID); @@ -1142,12 +1162,13 @@ function loaded() { } - let {code, key, altKey, ctrlKey, shiftKey} = keyUpEvent; EventBridge.emitWebEvent(JSON.stringify({ type: 'keyUpEvent', keyUpEvent: { code, key, + keyCode, + keyCodeString, altKey, ctrlKey, shiftKey diff --git a/scripts/system/html/js/entityProperties.js b/scripts/system/html/js/entityProperties.js index 29dfb6a840..9bb8a2c5a4 100644 --- a/scripts/system/html/js/entityProperties.js +++ b/scripts/system/html/js/entityProperties.js @@ -3493,16 +3493,37 @@ function loaded() { elDropdowns = document.getElementsByTagName("select"); } + const KEY_CODES = { + BACKSPACE: 8, + DELETE: 46 + }; + document.addEventListener("keyup", function (keyUpEvent) { if (keyUpEvent.target.nodeName === "INPUT") { return; } - let {code, key, altKey, ctrlKey, shiftKey} = keyUpEvent; + let {code, key, keyCode, altKey, ctrlKey, shiftKey} = keyUpEvent; + + let keyCodeString; + switch (keyCode) { + case KEY_CODES.DELETE: + keyCodeString = "Delete"; + break; + case KEY_CODES.BACKSPACE: + keyCodeString = "Backspace"; + break; + default: + keyCodeString = String.fromCharCode(keyUpEvent.keyCode); + break; + } + EventBridge.emitWebEvent(JSON.stringify({ type: 'keyUpEvent', keyUpEvent: { code, key, + keyCode, + keyCodeString, altKey, ctrlKey, shiftKey diff --git a/scripts/system/html/js/gridControls.js b/scripts/system/html/js/gridControls.js index fa3d86a293..6f7024ccaa 100644 --- a/scripts/system/html/js/gridControls.js +++ b/scripts/system/html/js/gridControls.js @@ -130,16 +130,37 @@ function loaded() { EventBridge.emitWebEvent(JSON.stringify({ type: 'init' })); }); + const KEY_CODES = { + BACKSPACE: 8, + DELETE: 46 + }; + document.addEventListener("keyup", function (keyUpEvent) { if (keyUpEvent.target.nodeName === "INPUT") { return; } - let {code, key, altKey, ctrlKey, shiftKey} = keyUpEvent; + let {code, key, keyCode, altKey, ctrlKey, shiftKey} = keyUpEvent; + + let keyCodeString; + switch (keyCode) { + case KEY_CODES.DELETE: + keyCodeString = "Delete"; + break; + case KEY_CODES.BACKSPACE: + keyCodeString = "Backspace"; + break; + default: + keyCodeString = String.fromCharCode(keyUpEvent.keyCode); + break; + } + EventBridge.emitWebEvent(JSON.stringify({ type: 'keyUpEvent', keyUpEvent: { code, key, + keyCode, + keyCodeString, altKey, ctrlKey, shiftKey