Simplified keyboard shortcuts

This commit is contained in:
Joel Collins 2020-07-05 18:19:44 +01:00
parent 646645cc1d
commit 3814a71a0a
3 changed files with 94 additions and 99 deletions

View file

@ -9210,6 +9210,11 @@
"minimist": "^1.2.5" "minimist": "^1.2.5"
} }
}, },
"mousetrap": {
"version": "1.6.5",
"resolved": "https://registry.npmjs.org/mousetrap/-/mousetrap-1.6.5.tgz",
"integrity": "sha512-QNo4kEepaIBwiT8CDhP98umTetp+JNfQYBWvC1pc6/OAibuXtRcxZ58Qz8skvEHYvURne/7R8T5VoOI7rDsEUA=="
},
"move-concurrently": { "move-concurrently": {
"version": "1.0.1", "version": "1.0.1",
"resolved": "https://registry.npmjs.org/move-concurrently/-/move-concurrently-1.0.1.tgz", "resolved": "https://registry.npmjs.org/move-concurrently/-/move-concurrently-1.0.1.tgz",

View file

@ -13,7 +13,8 @@
"serve": "vue-cli-service serve --mode development" "serve": "vue-cli-service serve --mode development"
}, },
"dependencies": { "dependencies": {
"material-design-icons": "^3.0.1" "material-design-icons": "^3.0.1",
"mousetrap": "^1.6.5"
}, },
"devDependencies": { "devDependencies": {
"@vue/cli-plugin-babel": "^3.12.1", "@vue/cli-plugin-babel": "^3.12.1",

View file

@ -1,9 +1,5 @@
<template> <template>
<div <div id="app" class="uk-height-1-1 uk-margin-remove uk-padding-remove" :class="handleTheme">
id="app"
class="uk-height-1-1 uk-margin-remove uk-padding-remove"
:class="handleTheme"
>
<loadingContent v-if="!$store.getters.ready" /> <loadingContent v-if="!$store.getters.ready" />
<div v-if="$store.getters.ready" id="tour-header"></div> <div v-if="$store.getters.ready" id="tour-header"></div>
<appContent v-if="$store.getters.ready" /> <appContent v-if="$store.getters.ready" />
@ -23,20 +19,26 @@ import appContent from "./components/appContent.vue";
import loadingContent from "./components/loadingContent.vue"; import loadingContent from "./components/loadingContent.vue";
import axios from "axios"; import axios from "axios";
var Mousetrap = require("mousetrap");
// Key Codes Mousetrap.prototype.stopCallback = function(e, element, combo) {
const keyCodes = { // if the element has the class "mousetrap" then no need to stop
pgup: 33, if ((" " + element.className + " ").indexOf(" mousetrap ") > -1) {
pgdn: 34, return false;
left: 37, }
up: 38,
right: 39, // if we're in a lightbox, stop mousetrap
down: 40, if (element.classList.contains("lightbox-link")) {
enter: 13, return true;
esc: 27, }
shift: 16,
alt: 18, // stop for input, select, and textarea
t: 84 return (
element.tagName == "INPUT" ||
element.tagName == "SELECT" ||
element.tagName == "TEXTAREA" ||
(element.contentEditable && element.contentEditable == "true")
);
}; };
// Export main app // Export main app
@ -52,6 +54,7 @@ export default {
return { return {
appAvailable: false, appAvailable: false,
keysDown: {}, keysDown: {},
arrowKeysDown: {},
systemDark: undefined, systemDark: undefined,
themeObserver: undefined, themeObserver: undefined,
tourCallbacks: { tourCallbacks: {
@ -166,9 +169,7 @@ export default {
created: function() { created: function() {
window.addEventListener("beforeunload", this.handleExit); window.addEventListener("beforeunload", this.handleExit);
// Key events // Scrollwheel listener
window.addEventListener("keydown", this.keyDownMonitor);
window.addEventListener("keyup", this.keyUpMonitor);
window.addEventListener("wheel", this.wheelMonitor); window.addEventListener("wheel", this.wheelMonitor);
// Watch for origin changes // Watch for origin changes
this.unwatchOriginFunction = this.$store.watch( this.unwatchOriginFunction = this.$store.watch(
@ -180,6 +181,48 @@ export default {
console.log(uriV2); console.log(uriV2);
} }
); );
// Keyboard shortcuts
// TODO: Shortcut guide
Mousetrap.bind("?", function() {
console.log("show shortcuts!");
});
// Arrow keys
Mousetrap.bind(
["up", "down", "left", "right"],
event => {
this.arrowKeysDown[event.keyCode] = true; //Add key to array
this.navigateKeyHandler();
},
"keydown"
);
Mousetrap.bind(
["up", "down", "left", "right"],
event => {
delete this.arrowKeysDown[event.keyCode]; //Remove key from array
},
"keyup"
);
// Focus keys
Mousetrap.bind("pageup", () => {
this.$root.$emit("globalMoveStepEvent", 0, 0, 1);
});
Mousetrap.bind("pagedown", () => {
this.$root.$emit("globalMoveStepEvent", 0, 0, -1);
});
// Capture
Mousetrap.bind("c", () => {
this.$root.$emit("globalCaptureEvent");
});
// Re-run tour
Mousetrap.bind("alt+t", () => {
this.$tours["guidedTour"].start();
});
}, },
beforeDestroy: function() { beforeDestroy: function() {
@ -187,14 +230,17 @@ export default {
if (this.themeObserver) { if (this.themeObserver) {
this.themeObserver.disconnect(); this.themeObserver.disconnect();
} }
// Remove key listeners // Remove scrollwheel listener
window.removeEventListener("keydown", this.keyDownMonitor);
window.removeEventListener("keyup", this.keyUpMonitor);
window.removeEventListener("wheel", this.wheelMonitor); window.removeEventListener("wheel", this.wheelMonitor);
// Remove origin watcher // Remove origin watcher
this.unwatchOriginFunction(); this.unwatchOriginFunction();
}, },
destroyed: function() {
// Remove key listeners
Mousetrap.reset();
},
methods: { methods: {
checkConnection: function() { checkConnection: function() {
var uriV2 = this.$store.getters.uriV2; var uriV2 = this.$store.getters.uriV2;
@ -231,84 +277,27 @@ export default {
} }
}, },
// Handle global key press events to be associated with navigation navigateKeyHandler: function() {
keyDownMonitor: function(event) { // Calculate movement array
this.keysDown[event.keyCode] = true; //Add key to array var x_rel = 0;
var y_rel = 0;
// Convert keyCode dict into a list of key codes var z_rel = 0;
var keyCodeList = Object.keys(keyCodes).map(function(key) { if (37 in this.arrowKeysDown) {
return keyCodes[key]; x_rel = x_rel + 1;
});
if (
// If not inside an element we want to ignore
!(event.target instanceof HTMLInputElement) &&
!event.target.classList.contains("lightbox-link") &&
// If it's a recognised key
keyCodeList.includes(event.keyCode)
) {
this.navigateKeyHandler(keyCodes);
this.captureKeyHandler(keyCodes);
this.letterKeyHandler(keyCodes);
} }
}, if (39 in this.arrowKeysDown) {
x_rel = x_rel - 1;
keyUpMonitor: function(event) {
delete this.keysDown[event.keyCode]; //Remove key from array
},
navigateKeyHandler: function(keyCodes) {
const moveKeys = [
keyCodes.left,
keyCodes.right,
keyCodes.up,
keyCodes.down,
keyCodes.pgup,
keyCodes.pgdn
];
if (
moveKeys.some(r => Object.keys(this.keysDown).includes(r.toString()))
) {
// Calculate movement array
var x_rel = 0;
var y_rel = 0;
var z_rel = 0;
if (keyCodes.left in this.keysDown) {
x_rel = x_rel + 1;
}
if (keyCodes.right in this.keysDown) {
x_rel = x_rel - 1;
}
if (keyCodes.up in this.keysDown) {
y_rel = y_rel + 1;
}
if (keyCodes.down in this.keysDown) {
y_rel = y_rel - 1;
}
if (keyCodes.pgup in this.keysDown) {
z_rel = z_rel - 1;
}
if (keyCodes.pgdn in this.keysDown) {
z_rel = z_rel + 1;
}
// Make a position request
// Emit a signal to move, acted on by panelNavigate.vue
this.$root.$emit("globalMoveStepEvent", x_rel, y_rel, z_rel);
} }
}, if (38 in this.arrowKeysDown) {
y_rel = y_rel + 1;
captureKeyHandler: function(keyCodes) {
if (keyCodes.shift in this.keysDown && keyCodes.enter in this.keysDown) {
console.log("Capturing");
this.$root.$emit("globalCaptureEvent");
} }
}, if (40 in this.arrowKeysDown) {
y_rel = y_rel - 1;
letterKeyHandler: function(keyCodes) {
if (keyCodes.alt in this.keysDown && keyCodes.t in this.keysDown) {
this.$tours["guidedTour"].start();
} }
// Make a position request
// Emit a signal to move, acted on by panelNavigate.vue
this.$root.$emit("globalMoveStepEvent", x_rel, y_rel, z_rel);
} }
} }
}; };