Fantasy-Map-Generator/modules/ui/hotkeys.js
2021-12-12 23:02:38 -08:00

153 lines
7.1 KiB
JavaScript

'use strict';
// Hotkeys, see github.com/Azgaar/Fantasy-Map-Generator/wiki/Hotkeys
document.addEventListener('keydown', handleKeydown);
document.addEventListener('keyup', handleKeyup);
function handleKeydown(event) {
const {code, ctrlKey, altKey} = event;
if (altKey && !ctrlKey) event.preventDefault(); // disallow alt key combinations
if (ctrlKey && ['KeyS', 'KeyC'].includes(code)) event.preventDefault(); // disallow CTRL + S and CTRL + C
if (['F1', 'F2', 'F6', 'F9', 'Tab'].includes(code)) event.preventDefault(); // disallow default Fn and Tab
}
function handleKeyup(event) {
if (!modules.editors) return; // if editors are not loaded, do nothing
const {tagName, contentEditable} = document.activeElement;
if (['INPUT', 'SELECT', 'TEXTAREA'].includes(tagName)) return; // don't trigger if user inputs text
if (tagName === 'DIV' && contentEditable === 'true') return; // don't trigger if user inputs a text
if (document.getSelection().toString()) return; // don't trigger if user selects text
event.stopPropagation();
const {code, key, ctrlKey, metaKey, shiftKey, altKey} = event;
const ctrl = ctrlKey || metaKey || key === 'Control';
const shift = shiftKey || key === 'Shift';
const alt = altKey || key === 'Alt';
if (code === 'F1') showInfo();
else if (code === 'F2') regeneratePrompt('hotkey');
else if (code === 'F6') quickSave();
else if (code === 'F9') quickLoad();
else if (code === 'Tab') toggleOptions(event);
else if (code === 'Escape') closeAllDialogs();
else if (code === 'Delete') removeElementOnKey();
else if (code === 'KeyO' && document.getElementById('canvas3d')) toggle3dOptions();
else if (ctrl && code === 'KeyQ') toggleSaveReminder();
else if (ctrl && code === 'KeyS') dowloadMap();
else if (ctrl && code === 'KeyC') saveToDropbox();
else if (ctrl && code === 'KeyZ' && undo.offsetParent) undo.click();
else if (ctrl && code === 'KeyY' && redo.offsetParent) redo.click();
else if (shift && code === 'KeyH') editHeightmap();
else if (shift && code === 'KeyB') editBiomes();
else if (shift && code === 'KeyS') editStates();
else if (shift && code === 'KeyP') editProvinces();
else if (shift && code === 'KeyD') editDiplomacy();
else if (shift && code === 'KeyC') editCultures();
else if (shift && code === 'KeyN') editNamesbase();
else if (shift && code === 'KeyZ') editZones();
else if (shift && code === 'KeyR') editReligions();
else if (shift && code === 'KeyY') openEmblemEditor();
else if (shift && code === 'KeyQ') editUnits();
else if (shift && code === 'KeyO') editNotes();
else if (shift && code === 'KeyT') overviewBurgs();
else if (shift && code === 'KeyV') overviewRivers();
else if (shift && code === 'KeyM') overviewMilitary();
else if (shift && code === 'KeyK') overviewMarkers();
else if (shift && code === 'KeyE') viewCellDetails();
else if (key === '!') toggleAddBurg();
else if (key === '@') toggleAddLabel();
else if (key === '#') toggleAddRiver();
else if (key === '$') toggleAddRoute();
else if (key === '%') toggleAddMarker();
else if (alt && code === 'KeyB') console.table(pack.burgs);
else if (alt && code === 'KeyS') console.table(pack.states);
else if (alt && code === 'KeyC') console.table(pack.cultures);
else if (alt && code === 'KeyR') console.table(pack.religions);
else if (alt && code === 'KeyF') console.table(pack.features);
else if (code === 'KeyX') toggleTexture();
else if (code === 'KeyH') toggleHeight();
else if (code === 'KeyB') toggleBiomes();
else if (code === 'KeyE') toggleCells();
else if (code === 'KeyG') toggleGrid();
else if (code === 'KeyO') toggleCoordinates();
else if (code === 'KeyW') toggleCompass();
else if (code === 'KeyV') toggleRivers();
else if (code === 'KeyF') toggleRelief();
else if (code === 'KeyC') toggleCultures();
else if (code === 'KeyS') toggleStates();
else if (code === 'KeyP') toggleProvinces();
else if (code === 'KeyZ') toggleZones();
else if (code === 'KeyD') toggleBorders();
else if (code === 'KeyR') toggleReligions();
else if (code === 'KeyU') toggleRoutes();
else if (code === 'KeyT') toggleTemp();
else if (code === 'KeyN') togglePopulation();
else if (code === 'KeyJ') toggleIce();
else if (code === 'KeyA') togglePrec();
else if (code === 'KeyY') toggleEmblems();
else if (code === 'KeyL') toggleLabels();
else if (code === 'KeyI') toggleIcons();
else if (code === 'KeyM') toggleMilitary();
else if (code === 'KeyK') toggleMarkers();
else if (code === 'Equal') toggleRulers();
else if (code === 'Slash') toggleScaleBar();
else if (code === 'ArrowLeft') zoom.translateBy(svg, 10, 0);
else if (code === 'ArrowRight') zoom.translateBy(svg, -10, 0);
else if (code === 'ArrowUp') zoom.translateBy(svg, 0, 10);
else if (code === 'ArrowDown') zoom.translateBy(svg, 0, -10);
else if (key === '+' || key === '-') pressNumpadSign(key);
else if (key === '0') resetZoom(1000);
else if (key === '1') zoom.scaleTo(svg, 1);
else if (key === '2') zoom.scaleTo(svg, 2);
else if (key === '3') zoom.scaleTo(svg, 3);
else if (key === '4') zoom.scaleTo(svg, 4);
else if (key === '5') zoom.scaleTo(svg, 5);
else if (key === '6') zoom.scaleTo(svg, 6);
else if (key === '7') zoom.scaleTo(svg, 7);
else if (key === '8') zoom.scaleTo(svg, 8);
else if (key === '9') zoom.scaleTo(svg, 9);
else if (ctrl) toggleMode();
}
function pressNumpadSign(key) {
const change = key === '+' ? 1 : -1;
let brush = null;
if (brushRadius.offsetParent) brush = document.getElementById('brushRadius');
else if (biomesManuallyBrush.offsetParent) brush = document.getElementById('biomesManuallyBrush');
else if (statesManuallyBrush.offsetParent) brush = document.getElementById('statesManuallyBrush');
else if (provincesManuallyBrush.offsetParent) brush = document.getElementById('provincesManuallyBrush');
else if (culturesManuallyBrush.offsetParent) brush = document.getElementById('culturesManuallyBrush');
else if (zonesBrush.offsetParent) brush = document.getElementById('zonesBrush');
else if (religionsManuallyBrush.offsetParent) brush = document.getElementById('religionsManuallyBrush');
if (brush) {
const value = minmax(+brush.value + change, +brush.min, +brush.max);
brush.value = document.getElementById(brush.id + 'Number').value = value;
return;
}
const scaleBy = key === '+' ? 1.2 : 0.8;
zoom.scaleBy(svg, scaleBy); // if no brush elements displayed, zoom map
}
function toggleMode() {
if (zonesRemove.offsetParent) {
zonesRemove.classList.contains('pressed') ? zonesRemove.classList.remove('pressed') : zonesRemove.classList.add('pressed');
}
}
function removeElementOnKey() {
const fastDelete = Array.from(document.querySelectorAll("[role='dialog'] .fastDelete")).find((dialog) => dialog.style.display !== 'none');
if (fastDelete) fastDelete.click();
const visibleDialogs = Array.from(document.querySelectorAll("[role='dialog']")).filter((dialog) => dialog.style.display !== 'none');
if (!visibleDialogs.length) return;
visibleDialogs.forEach((dialog) => dialog.querySelectorAll('button').forEach((button) => button.textContent === 'Remove' && button.click()));
}
function closeAllDialogs() {
closeDialogs();
hideOptions();
}