Simplified keyboard shortcuts
This commit is contained in:
parent
646645cc1d
commit
3814a71a0a
3 changed files with 94 additions and 99 deletions
|
|
@ -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",
|
||||||
|
|
|
||||||
|
|
@ -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",
|
||||||
|
|
|
||||||
|
|
@ -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);
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue