Skip to content

Commit 0e0aeec

Browse files
authored
Rollup merge of rust-lang#78876 - GuillaumeGomez:better-setting-keyboard-ux, r=jyn514
Make keyboard interactions in the settings menu more pleasant rust-lang#78868 improved the keyboard interactions with the settings page. This PR goes a bit further by allowing more than just "space" to toggle the checkboxes. r? `@jyn514`
2 parents 9905bb7 + 14ecee7 commit 0e0aeec

File tree

2 files changed

+62
-55
lines changed

2 files changed

+62
-55
lines changed

src/librustdoc/html/static/main.js

+23-22
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,29 @@ if (!DOMTokenList.prototype.remove) {
4040
};
4141
}
4242

43+
44+
// Gets the human-readable string for the virtual-key code of the
45+
// given KeyboardEvent, ev.
46+
//
47+
// This function is meant as a polyfill for KeyboardEvent#key,
48+
// since it is not supported in IE 11 or Chrome for Android. We also test for
49+
// KeyboardEvent#keyCode because the handleShortcut handler is
50+
// also registered for the keydown event, because Blink doesn't fire
51+
// keypress on hitting the Escape key.
52+
//
53+
// So I guess you could say things are getting pretty interoperable.
54+
function getVirtualKey(ev) {
55+
if ("key" in ev && typeof ev.key != "undefined") {
56+
return ev.key;
57+
}
58+
59+
var c = ev.charCode || ev.keyCode;
60+
if (c == 27) {
61+
return "Escape";
62+
}
63+
return String.fromCharCode(c);
64+
}
65+
4366
function getSearchInput() {
4467
return document.getElementsByClassName("search-input")[0];
4568
}
@@ -326,28 +349,6 @@ function defocusSearchBar() {
326349
}
327350
}
328351

329-
// Gets the human-readable string for the virtual-key code of the
330-
// given KeyboardEvent, ev.
331-
//
332-
// This function is meant as a polyfill for KeyboardEvent#key,
333-
// since it is not supported in Trident. We also test for
334-
// KeyboardEvent#keyCode because the handleShortcut handler is
335-
// also registered for the keydown event, because Blink doesn't fire
336-
// keypress on hitting the Escape key.
337-
//
338-
// So I guess you could say things are getting pretty interoperable.
339-
function getVirtualKey(ev) {
340-
if ("key" in ev && typeof ev.key != "undefined") {
341-
return ev.key;
342-
}
343-
344-
var c = ev.charCode || ev.keyCode;
345-
if (c == 27) {
346-
return "Escape";
347-
}
348-
return String.fromCharCode(c);
349-
}
350-
351352
function getHelpElement() {
352353
buildHelperPopup();
353354
return document.getElementById("help");
+39-33
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
// Local js definitions:
2-
/* global getCurrentValue, updateLocalStorage, updateSystemTheme */
2+
/* global getCurrentValue, getVirtualKey, updateLocalStorage, updateSystemTheme */
33

44
(function () {
55
function changeSetting(settingName, value) {
@@ -14,41 +14,47 @@
1414
}
1515
}
1616

17-
function setEvents() {
18-
var elems = {
19-
toggles: document.getElementsByClassName("slider"),
20-
selects: document.getElementsByClassName("select-wrapper")
21-
};
22-
var i;
23-
24-
if (elems.toggles && elems.toggles.length > 0) {
25-
for (i = 0; i < elems.toggles.length; ++i) {
26-
var toggle = elems.toggles[i].previousElementSibling;
27-
var settingId = toggle.id;
28-
var settingValue = getSettingValue(settingId);
29-
if (settingValue !== null) {
30-
toggle.checked = settingValue === "true";
31-
}
32-
toggle.onchange = function() {
33-
changeSetting(this.id, this.checked);
34-
};
35-
}
17+
function handleKey(ev) {
18+
// Don't interfere with browser shortcuts
19+
if (ev.ctrlKey || ev.altKey || ev.metaKey) {
20+
return;
21+
}
22+
switch (getVirtualKey(ev)) {
23+
case "Enter":
24+
case "Return":
25+
case "Space":
26+
ev.target.checked = !ev.target.checked;
27+
ev.preventDefault();
28+
break;
3629
}
30+
}
3731

38-
if (elems.selects && elems.selects.length > 0) {
39-
for (i = 0; i < elems.selects.length; ++i) {
40-
var select = elems.selects[i].getElementsByTagName("select")[0];
41-
var settingId = select.id;
42-
var settingValue = getSettingValue(settingId);
43-
if (settingValue !== null) {
44-
select.value = settingValue;
45-
}
46-
select.onchange = function() {
47-
changeSetting(this.id, this.value);
48-
};
32+
function setEvents() {
33+
onEachLazy(document.getElementsByClassName("slider"), function(elem) {
34+
var toggle = elem.previousElementSibling;
35+
var settingId = toggle.id;
36+
var settingValue = getSettingValue(settingId);
37+
if (settingValue !== null) {
38+
toggle.checked = settingValue === "true";
4939
}
50-
}
40+
toggle.onchange = function() {
41+
changeSetting(this.id, this.checked);
42+
};
43+
toggle.onkeyup = handleKey;
44+
toggle.onkeyrelease = handleKey;
45+
});
46+
onEachLazy(document.getElementsByClassName("select-wrapper"), function(elem) {
47+
var select = elem.getElementsByTagName("select")[0];
48+
var settingId = select.id;
49+
var settingValue = getSettingValue(settingId);
50+
if (settingValue !== null) {
51+
select.value = settingValue;
52+
}
53+
select.onchange = function() {
54+
changeSetting(this.id, this.value);
55+
};
56+
});
5157
}
5258

53-
setEvents();
59+
window.addEventListener("DOMContentLoaded", setEvents);
5460
})();

0 commit comments

Comments
 (0)