mirror of
https://github.com/Azgaar/Fantasy-Map-Generator.git
synced 2025-12-23 12:31:24 +01:00
153 lines
7.1 KiB
JavaScript
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();
|
|
}
|