pixelplanet/src/controls/keypress.js

231 lines
5.5 KiB
JavaScript
Raw Permalink Normal View History

/*
* keypress actions
*/
import { t } from 'ttag';
import copy from '../utils/clipboard';
import {
toggleGrid,
2020-06-23 16:49:56 +00:00
toggleHistoricalView,
2024-01-24 12:51:26 +00:00
toggleEasterEgg,
togglePixelNotify,
2024-01-22 23:39:29 +00:00
toggleMvmCtrls,
toggleMute,
selectCanvas,
selectHoverColor,
selectHoldPaint,
setMoveU,
setMoveV,
setMoveW,
2022-07-11 12:42:09 +00:00
} from '../store/actions';
2024-02-04 21:59:07 +00:00
import {
toggleOVEnabled,
} from '../store/actions/templates';
2024-01-23 23:59:22 +00:00
import { HOLD_PAINT } from '../core/constants';
import { notify } from '../store/actions/thunks';
const charKeys = ['g', 'h', 'x', 'm', 't', 'r', 'l', '+', '-'];
export function createKeyUpHandler(store) {
return (event) => {
/*
* key locations
*/
switch (event.code) {
case 'ArrowUp':
case 'KeyW':
store.dispatch(setMoveV(0));
return;
case 'ArrowLeft':
case 'KeyA':
store.dispatch(setMoveU(0));
return;
case 'ArrowDown':
case 'KeyS':
store.dispatch(setMoveV(0));
return;
case 'ArrowRight':
case 'KeyD':
store.dispatch(setMoveU(0));
return;
case 'KeyE':
store.dispatch(setMoveW(0));
return;
case 'KeyQ':
store.dispatch(setMoveW(0));
return;
default:
}
/*
* key char
*/
switch (event.key) {
case '+':
store.dispatch(setMoveW(0));
return;
case '-':
store.dispatch(setMoveW(0));
return;
case 'Shift':
case 'CapsLock':
store.dispatch(selectHoldPaint(HOLD_PAINT.OFF));
break;
default:
}
};
}
export function createKeyDownHandler(store) {
2022-07-11 13:33:29 +00:00
return (event) => {
// ignore key presses if modal is open or chat is used
if (event.target.nodeName === 'INPUT'
|| event.target.nodeName === 'TEXTAREA'
) {
return;
}
2022-07-11 13:33:29 +00:00
let { key } = event;
2022-07-11 13:33:29 +00:00
const num = Number(key);
if (!Number.isNaN(num) && num > 0) {
// switch to canvas on num keys
const { canvases, canvasId: curCanvasId } = store.getState().canvas;
const canvasIds = Object.keys(canvases).filter((id) => !canvases[id].hid);
if (num <= canvasIds.length) {
const canvasId = canvasIds[num - 1];
if (canvasId !== curCanvasId) {
2022-07-11 13:33:29 +00:00
store.dispatch(selectCanvas(canvasId));
const canvasName = canvases[canvasId].title;
store.dispatch(notify(t`Switched to ${canvasName}`));
}
2021-07-16 10:06:20 +00:00
}
2022-07-11 13:33:29 +00:00
return;
}
/*
* key locations
*/
switch (event.code) {
case 'ArrowUp':
case 'KeyW':
store.dispatch(setMoveV(-1));
return;
case 'ArrowLeft':
case 'KeyA':
store.dispatch(setMoveU(-1));
return;
case 'ArrowDown':
case 'KeyS':
store.dispatch(setMoveV(1));
return;
case 'ArrowRight':
case 'KeyD':
store.dispatch(setMoveU(1));
return;
case 'KeyE':
store.dispatch(setMoveW(1));
return;
case 'KeyQ':
store.dispatch(setMoveW(-1));
return;
default:
}
/*
* key char
*/
switch (event.key) {
case '+':
store.dispatch(setMoveW(1));
return;
case '-':
store.dispatch(setMoveW(-1));
return;
case 'Control':
store.dispatch(selectHoverColor(-1));
return;
case 'Shift': {
if (event.location === KeyboardEvent.DOM_KEY_LOCATION_LEFT) {
// left shift
store.dispatch(selectHoldPaint(HOLD_PAINT.PENCIL, true));
return;
}
if (event.location === KeyboardEvent.DOM_KEY_LOCATION_RIGHT) {
// right shift
2024-02-04 21:59:07 +00:00
store.dispatch(selectHoldPaint(
(store.getState().templates.oRightShift)
? HOLD_PAINT.OVERLAY : HOLD_PAINT.HISTORY,
2024-02-04 21:59:07 +00:00
true,
));
return;
}
return;
}
default:
}
2022-07-11 13:33:29 +00:00
/*
* if char of key isn't used by a keybind,
* we check if the key location is where a
* key that is used would be on QWERTY
*/
if (!charKeys.includes(key)) {
2022-07-11 13:33:29 +00:00
key = event.code;
if (!key.startsWith('Key')) {
return;
}
key = key.slice(-1).toLowerCase();
2021-01-29 21:46:58 +00:00
}
2022-07-11 13:33:29 +00:00
switch (key) {
case 'g':
store.dispatch(toggleGrid());
store.dispatch(notify((store.getState().gui.showGrid)
? t`Grid ON`
: t`Grid OFF`));
return;
case 'h':
if (window?.ssv.backupurl) {
2022-07-11 13:33:29 +00:00
store.dispatch(toggleHistoricalView());
}
return;
case 'x':
store.dispatch(togglePixelNotify());
store.dispatch(notify((store.getState().gui.showPixelNotify)
? t`Pixel Notify ON`
: t`Pixel Notify OFF`));
return;
case 'm':
store.dispatch(toggleMute());
2022-09-05 08:59:06 +00:00
store.dispatch(notify((store.getState().gui.mute)
2022-07-11 13:33:29 +00:00
? t`Muted Sound`
: t`Unmuted Sound`));
return;
2024-01-22 23:39:29 +00:00
case 'n':
store.dispatch(toggleMvmCtrls());
return;
2022-07-11 13:33:29 +00:00
case 'r': {
2022-08-17 19:48:50 +00:00
const { hover } = store.getState().canvas;
2022-07-11 13:33:29 +00:00
const text = hover.join('_');
copy(text);
store.dispatch(notify(t`Copied`));
2022-07-11 13:33:29 +00:00
return;
}
2024-02-04 21:59:07 +00:00
case 't': {
store.dispatch(toggleOVEnabled());
store.dispatch(notify((store.getState().templates.ovEnabled)
? t`Overlay ON`
: t`Overlay OFF`));
return;
}
case 'l':
2024-01-24 12:51:26 +00:00
store.dispatch(toggleEasterEgg());
store.dispatch(notify((store.getState().gui.easterEgg)
? t`Easter Egg ON`
: t`Easter Egg OFF`));
2022-07-11 13:33:29 +00:00
break;
default:
}
2022-07-11 13:33:29 +00:00
};
}