]> git.lizzy.rs Git - rust.git/blob - src/librustdoc/html/static/js/settings.js
Merge commit '57b3c4b90f4346b3990c1be387c3b3ca7b78412c' into clippyup
[rust.git] / src / librustdoc / html / static / js / settings.js
1 // Local js definitions:
2 /* global getSettingValue, getVirtualKey, onEachLazy, updateLocalStorage, updateSystemTheme */
3 /* global addClass, removeClass */
4
5 (function () {
6     function changeSetting(settingName, value) {
7         updateLocalStorage(settingName, value);
8
9         switch (settingName) {
10             case "theme":
11             case "preferred-dark-theme":
12             case "preferred-light-theme":
13             case "use-system-theme":
14                 updateSystemTheme();
15                 updateLightAndDark();
16                 break;
17         }
18     }
19
20     function handleKey(ev) {
21         // Don't interfere with browser shortcuts
22         if (ev.ctrlKey || ev.altKey || ev.metaKey) {
23             return;
24         }
25         switch (getVirtualKey(ev)) {
26             case "Enter":
27             case "Return":
28             case "Space":
29                 ev.target.checked = !ev.target.checked;
30                 ev.preventDefault();
31                 break;
32         }
33     }
34
35     function showLightAndDark() {
36         addClass(document.getElementById("theme").parentElement, "hidden");
37         removeClass(document.getElementById("preferred-light-theme").parentElement, "hidden");
38         removeClass(document.getElementById("preferred-dark-theme").parentElement, "hidden");
39     }
40
41     function hideLightAndDark() {
42         addClass(document.getElementById("preferred-light-theme").parentElement, "hidden");
43         addClass(document.getElementById("preferred-dark-theme").parentElement, "hidden");
44         removeClass(document.getElementById("theme").parentElement, "hidden");
45     }
46
47     function updateLightAndDark() {
48         if (getSettingValue("use-system-theme") !== "false") {
49             showLightAndDark();
50         } else {
51             hideLightAndDark();
52         }
53     }
54
55     function setEvents() {
56         updateLightAndDark();
57         onEachLazy(document.getElementsByClassName("slider"), function(elem) {
58             var toggle = elem.previousElementSibling;
59             var settingId = toggle.id;
60             var settingValue = getSettingValue(settingId);
61             if (settingValue !== null) {
62                 toggle.checked = settingValue === "true";
63             }
64             toggle.onchange = function() {
65                 changeSetting(this.id, this.checked);
66             };
67             toggle.onkeyup = handleKey;
68             toggle.onkeyrelease = handleKey;
69         });
70         onEachLazy(document.getElementsByClassName("select-wrapper"), function(elem) {
71             var select = elem.getElementsByTagName("select")[0];
72             var settingId = select.id;
73             var settingValue = getSettingValue(settingId);
74             if (settingValue !== null) {
75                 select.value = settingValue;
76             }
77             select.onchange = function() {
78                 changeSetting(this.id, this.value);
79             };
80         });
81         onEachLazy(document.querySelectorAll("input[type=\"radio\"]"), function(elem) {
82             const settingId = elem.name;
83             const settingValue = getSettingValue(settingId);
84             if (settingValue !== null && settingValue !== "null") {
85                 elem.checked = settingValue === elem.value;
86             }
87             elem.addEventListener("change", function(ev) {
88                 changeSetting(ev.target.name, ev.target.value);
89             });
90         });
91         document.getElementById("back").addEventListener("click", function() {
92             history.back();
93         });
94     }
95
96     window.addEventListener("DOMContentLoaded", setEvents);
97 })();