mirror of
git://git.tartarus.org/simon/puzzles.git
synced 2025-04-21 08:01:30 -07:00
js: Quicker keyboard access to menu items
Now pressing "1" to "9" or "0" activate the first ten items of the current menu, to save so much pressing of the arrow keys. There isn't any visible indication of this, so it's a bit of an Easter egg.
This commit is contained in:
45
emccpre.js
45
emccpre.js
@ -476,7 +476,9 @@ function initPuzzle() {
|
|||||||
}
|
}
|
||||||
// Keyboard handlers for the menus.
|
// Keyboard handlers for the menus.
|
||||||
function menukey(event) {
|
function menukey(event) {
|
||||||
var thisitem = event.target.closest("li");
|
var target = event.target;
|
||||||
|
var key = event.key;
|
||||||
|
var thisitem = target.closest("li");
|
||||||
var thismenu = thisitem.closest("ul");
|
var thismenu = thisitem.closest("ul");
|
||||||
var targetitem = null;
|
var targetitem = null;
|
||||||
var parentitem;
|
var parentitem;
|
||||||
@ -490,19 +492,30 @@ function initPuzzle() {
|
|||||||
}
|
}
|
||||||
if (dlg_dimmer !== null)
|
if (dlg_dimmer !== null)
|
||||||
return;
|
return;
|
||||||
|
if (["1", "2", "3", "4", "5", "6", "7", "8", "9", "0"]
|
||||||
|
.includes(key)) {
|
||||||
|
var shortcutitem = thismenu.querySelectorAll(
|
||||||
|
":scope > li:not([role='separator']")[(Number(key) + 9) % 10];
|
||||||
|
if (shortcutitem) {
|
||||||
|
target = shortcutitem.firstElementChild;
|
||||||
|
target.focus();
|
||||||
|
thisitem = target.closest("li");
|
||||||
|
key = "Enter";
|
||||||
|
}
|
||||||
|
}
|
||||||
if (!["ArrowLeft", "ArrowRight", "ArrowUp", "ArrowDown", "Enter",
|
if (!["ArrowLeft", "ArrowRight", "ArrowUp", "ArrowDown", "Enter",
|
||||||
"Escape", "Backspace", "SoftRight", "F10"]
|
"Escape", "Backspace", "SoftRight", "F10"]
|
||||||
.includes(event.key))
|
.includes(key))
|
||||||
return;
|
return;
|
||||||
if (ishorizontal(thismenu)) {
|
if (ishorizontal(thismenu)) {
|
||||||
// Top-level menu bar.
|
// Top-level menu bar.
|
||||||
if (event.key == "ArrowLeft")
|
if (key == "ArrowLeft")
|
||||||
targetitem = prevmenuitem(thisitem) || lastmenuitem(thismenu);
|
targetitem = prevmenuitem(thisitem) || lastmenuitem(thismenu);
|
||||||
else if (event.key == "ArrowRight")
|
else if (key == "ArrowRight")
|
||||||
targetitem = nextmenuitem(thisitem) || firstmenuitem(thismenu);
|
targetitem = nextmenuitem(thisitem) || firstmenuitem(thismenu);
|
||||||
else if (event.key == "ArrowUp")
|
else if (key == "ArrowUp")
|
||||||
targetitem = lastmenuitem(thisitem.querySelector("ul"));
|
targetitem = lastmenuitem(thisitem.querySelector("ul"));
|
||||||
else if (event.key == "ArrowDown" || event.key == "Enter")
|
else if (key == "ArrowDown" || key == "Enter")
|
||||||
targetitem = firstmenuitem(thisitem.querySelector("ul"));
|
targetitem = firstmenuitem(thisitem.querySelector("ul"));
|
||||||
} else {
|
} else {
|
||||||
// Ordinary vertical menu.
|
// Ordinary vertical menu.
|
||||||
@ -513,29 +526,29 @@ function initPuzzle() {
|
|||||||
else
|
else
|
||||||
parentitem_sideways = parentitem;
|
parentitem_sideways = parentitem;
|
||||||
}
|
}
|
||||||
if (event.key == "ArrowUp")
|
if (key == "ArrowUp")
|
||||||
targetitem = prevmenuitem(thisitem) || parentitem_up ||
|
targetitem = prevmenuitem(thisitem) || parentitem_up ||
|
||||||
lastmenuitem(thismenu);
|
lastmenuitem(thismenu);
|
||||||
else if (event.key == "ArrowDown")
|
else if (key == "ArrowDown")
|
||||||
targetitem = nextmenuitem(thisitem) || parentitem_up ||
|
targetitem = nextmenuitem(thisitem) || parentitem_up ||
|
||||||
firstmenuitem(thismenu);
|
firstmenuitem(thismenu);
|
||||||
else if (event.key == "ArrowRight")
|
else if (key == "ArrowRight")
|
||||||
targetitem = thisitem.querySelector("li") ||
|
targetitem = thisitem.querySelector("li") ||
|
||||||
(parentitem_up && nextmenuitem(parentitem_up));
|
(parentitem_up && nextmenuitem(parentitem_up));
|
||||||
else if (event.key == "Enter")
|
else if (key == "Enter")
|
||||||
targetitem = thisitem.querySelector("li");
|
targetitem = thisitem.querySelector("li");
|
||||||
else if (event.key == "ArrowLeft")
|
else if (key == "ArrowLeft")
|
||||||
targetitem = parentitem_sideways ||
|
targetitem = parentitem_sideways ||
|
||||||
(parentitem_up && prevmenuitem(parentitem_up));
|
(parentitem_up && prevmenuitem(parentitem_up));
|
||||||
else if (event.key == "Backspace")
|
else if (key == "Backspace")
|
||||||
targetitem = parentitem;
|
targetitem = parentitem;
|
||||||
}
|
}
|
||||||
if (targetitem)
|
if (targetitem)
|
||||||
targetitem.firstElementChild.focus();
|
targetitem.firstElementChild.focus();
|
||||||
else if (event.key == "Enter")
|
else if (key == "Enter")
|
||||||
event.target.click();
|
target.click();
|
||||||
else if (event.key == "Escape" || event.key == "SoftRight" ||
|
else if (key == "Escape" || key == "SoftRight" ||
|
||||||
event.key == "F10" || event.key == "Backspace")
|
key == "F10" || key == "Backspace")
|
||||||
// Leave the menu entirely.
|
// Leave the menu entirely.
|
||||||
onscreen_canvas.focus();
|
onscreen_canvas.focus();
|
||||||
// Prevent default even if we didn't do anything, as long as this
|
// Prevent default even if we didn't do anything, as long as this
|
||||||
|
Reference in New Issue
Block a user