webamp/js/hotkeys.js
2017-03-20 23:14:15 +00:00

123 lines
2.8 KiB
JavaScript

import {
play,
pause,
stop,
adjustVolume,
toggleRepeat,
toggleShuffle,
openFileDialog,
seekForward,
seekBackward
} from "./actionCreators";
import {
TOGGLE_DOUBLESIZE_MODE,
TOGGLE_TIME_MODE,
TOGGLE_LLAMA_MODE
} from "./actionTypes";
export default function(winamp, { dispatch }) {
let keylog = [];
const trigger = [
78, // N
85, // U
76, // L
76, // L
83, // S
79, // O
70, // F
84 // T
];
document.addEventListener("keydown", e => {
if (e.ctrlKey) {
// Is CTRL depressed?
switch (e.keyCode) {
case 68: // CTRL+D
dispatch({ type: TOGGLE_DOUBLESIZE_MODE });
break;
case 76: // CTRL+L FIXME
break;
case 84: // CTRL+T
dispatch({ type: TOGGLE_TIME_MODE });
break;
}
} else {
switch (e.keyCode) {
case 37: // left arrow
dispatch(seekBackward(5));
break;
case 38: // up arrow
dispatch(adjustVolume(1));
break;
case 39: // right arrow
dispatch(seekForward(5));
break;
case 40: // down arrow
dispatch(adjustVolume(-1));
break;
case 66: // B
// Next
break;
case 67: // C
dispatch(pause());
break;
case 76: // L
dispatch(openFileDialog(winamp.fileInput));
break;
case 82: // R
dispatch(toggleRepeat());
break;
case 83: // S
dispatch(toggleShuffle());
break;
case 86: // V
dispatch(stop());
break;
case 88: // X
dispatch(play());
break;
case 90: // Z
// Previous
break;
case 96: // numpad 0
dispatch(openFileDialog(winamp.fileInput));
break;
case 97: // numpad 1
// Previous (10 tracks)
break;
case 98: // numpad 2
dispatch(adjustVolume(-1));
break;
case 99: // numpad 3
// Next (10 tracks)
break;
case 100: // numpad 4
// Previous
break;
case 101: // numpad 5
dispatch(play());
break;
case 102: // numpad 6
// Next
break;
case 103: // numpad 7
dispatch(seekBackward(5));
break;
case 104: // numpad 8
dispatch(adjustVolume(1));
break;
case 105: // numpad 9
dispatch(seekForward(5));
break;
}
}
// Easter Egg
keylog.push(e.keyCode);
keylog = keylog.slice(-10);
// TODO: Find a less stupid way to compare arrays.
if (keylog.toString() === trigger.toString()) {
dispatch({ type: TOGGLE_LLAMA_MODE });
}
});
}