Skip to content

Commit 3aefc16

Browse files
Webui: Add color scheme switcher
Closes qbittorrent#21600
1 parent 7b0b3a1 commit 3aefc16

File tree

4 files changed

+53
-17
lines changed

4 files changed

+53
-17
lines changed

src/webui/www/private/css/style.css

+8-16
Original file line numberDiff line numberDiff line change
@@ -19,19 +19,11 @@
1919
--color-icon-hover: brightness(0) invert(100%) sepia(100%) saturate(0%)
2020
hue-rotate(108deg) brightness(104%) contrast(104%);
2121

22-
color-scheme: light dark;
23-
}
24-
25-
/* Light corrections */
26-
@media (prefers-color-scheme: light) {
27-
:root {
22+
&:not(.dark) {
2823
color-scheme: light;
2924
}
30-
}
3125

32-
/* Dark corrections */
33-
@media (prefers-color-scheme: dark) {
34-
:root {
26+
&.dark {
3527
--color-accent-blue: hsl(210deg 42% 48%);
3628
--color-text-blue: hsl(210deg 88.1% 73.5%);
3729
--color-text-orange: hsl(26deg 65% 70%);
@@ -43,13 +35,13 @@
4335
--color-border-default: hsl(0deg 0% 33%);
4436

4537
color-scheme: dark;
46-
}
4738

48-
#rssButtonBar img,
49-
#startSearchButton img,
50-
#manageSearchPlugins img {
51-
filter: brightness(0) saturate(100%) invert(100%) sepia(0%) saturate(1%)
52-
hue-rotate(156deg) brightness(106%) contrast(101%);
39+
#rssButtonBar img,
40+
#startSearchButton img,
41+
#manageSearchPlugins img {
42+
filter: brightness(0) saturate(100%) invert(100%) sepia(0%)
43+
saturate(1%) hue-rotate(156deg) brightness(106%) contrast(101%);
44+
}
5345
}
5446
}
5547

src/webui/www/private/index.html

+2-1
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
<!DOCTYPE html>
2-
<html lang="${LANG}">
2+
<!-- Add the 'dark' class to prevent bright flash on page load -->
3+
<html lang="${LANG}" class="dark">
34

45
<head>
56
<meta charset="UTF-8">

src/webui/www/private/scripts/client.js

+13
Original file line numberDiff line numberDiff line change
@@ -1738,6 +1738,19 @@ window.addEventListener("load", () => {
17381738
window.qBittorrent.Cache.preferences.init();
17391739
window.qBittorrent.Cache.qbtVersion.init();
17401740

1741+
// Setup color scheme switching
1742+
const colorSchemeQuery = window.matchMedia("(prefers-color-scheme: dark)");
1743+
const updateColorScheme = () => {
1744+
const root = document.documentElement;
1745+
const colorScheme = LocalPreferences.get("color_scheme");
1746+
const validScheme = (colorScheme === "light") || (colorScheme === "dark");
1747+
const isDark = colorSchemeQuery.matches;
1748+
root.classList.toggle("dark", ((!validScheme && isDark) || (colorScheme === "dark")));
1749+
};
1750+
1751+
colorSchemeQuery.addEventListener("change", updateColorScheme);
1752+
updateColorScheme();
1753+
17411754
// switch to previously used tab
17421755
const previouslyUsedTab = LocalPreferences.get("selected_window_tab", "transfers");
17431756
switch (previouslyUsedTab) {

src/webui/www/private/views/preferences.html

+30
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,16 @@
77
</select>
88
</fieldset>
99

10+
<fieldset class="settings">
11+
<legend>QBT_TR(Interface)QBT_TR[CONTEXT=OptionsDialog]</legend>
12+
<label for="colorSchemeSelect">QBT_TR(Color scheme:)QBT_TR[CONTEXT=OptionsDialog]</label>
13+
<select id="colorSchemeSelect">
14+
<option value="0">QBT_TR(Auto)QBT_TR[CONTEXT=OptionsDialog]</option>
15+
<option value="1">QBT_TR(Light)QBT_TR[CONTEXT=OptionsDialog]</option>
16+
<option value="2">QBT_TR(Dark)QBT_TR[CONTEXT=OptionsDialog]</option>
17+
</select>
18+
</fieldset>
19+
1020
<fieldset class="settings">
1121
<legend>QBT_TR(Transfer list)QBT_TR[CONTEXT=OptionsDialog]</legend>
1222
<div class="formRow" style="margin-bottom: 3px;" title="QBT_TR(Shows a confirmation dialog upon torrent deletion)QBT_TR[CONTEXT=OptionsDialog]">
@@ -2128,6 +2138,18 @@
21282138
$("locale_select").value = selected;
21292139
};
21302140

2141+
const updateColoSchemeSelect = () => {
2142+
const combobox = document.getElementById("colorSchemeSelect");
2143+
const colorScheme = LocalPreferences.get("color_scheme");
2144+
2145+
if (colorScheme === "light")
2146+
combobox.options[1].selected = true;
2147+
else if (colorScheme === "dark")
2148+
combobox.options[2].selected = true;
2149+
else
2150+
combobox.options[0].selected = true;
2151+
};
2152+
21312153
const loadPreferences = () => {
21322154
window.parent.qBittorrent.Cache.preferences.init({
21332155
onSuccess: (pref) => {
@@ -2419,6 +2441,7 @@
24192441
// WebUI tab
24202442
// Language
24212443
updateWebuiLocaleSelect(pref.locale);
2444+
updateColoSchemeSelect();
24222445
$("performanceWarning").checked = pref.performance_warning;
24232446

24242447
// HTTP Server
@@ -2845,6 +2868,13 @@
28452868
// WebUI tab
28462869
// Language
28472870
settings["locale"] = $("locale_select").value;
2871+
const colorScheme = Number(document.getElementById("colorSchemeSelect").value);
2872+
if (colorScheme === 0)
2873+
LocalPreferences.remove("color_scheme");
2874+
else if (colorScheme === 1)
2875+
LocalPreferences.set("color_scheme", "light");
2876+
else
2877+
LocalPreferences.set("color_scheme", "dark");
28482878
settings["performance_warning"] = $("performanceWarning").checked;
28492879

28502880
// HTTP Server

0 commit comments

Comments
 (0)