Skip to content

Commit 1e27e65

Browse files
Merge pull request qbittorrent#21748 from sledgehammer999/backport_webui_color_switcher
WebUI: Add color scheme switcher (v5_0_x) Bacport of qbittorrent#21613
2 parents 9413626 + 6d6f9bc commit 1e27e65

File tree

4 files changed

+56
-26
lines changed

4 files changed

+56
-26
lines changed

src/webui/www/private/css/palette.css

+5-17
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
/* Adaptive color palette */
22

33
/* Default rules */
4-
* {
4+
:root {
55
--color-accent-blue: hsl(210deg 65% 55%);
66
--color-text-blue: hsl(210deg 100% 55%);
77
--color-text-orange: hsl(26deg 100% 45%);
@@ -16,26 +16,12 @@
1616
--color-background-hover: hsl(26deg 80% 60%);
1717
--color-border-blue: hsl(210deg 42% 48%);
1818
--color-border-default: hsl(0deg 0% 85%);
19-
}
20-
21-
:root {
22-
color-scheme: light dark;
23-
}
2419

25-
/* Light corrections */
26-
@media (prefers-color-scheme: light) {
27-
:root {
20+
&:not(.dark) {
2821
color-scheme: light;
2922
}
30-
}
3123

32-
/* Dark corrections */
33-
@media (prefers-color-scheme: dark) {
34-
:root {
35-
color-scheme: dark;
36-
}
37-
38-
* {
24+
&.dark {
3925
--color-accent-blue: hsl(210deg 42% 48%);
4026
--color-text-blue: hsl(210deg 88.1% 73.5%);
4127
--color-text-orange: hsl(26deg 65% 70%);
@@ -45,5 +31,7 @@
4531
--color-background-default: hsl(0deg 0% 25%);
4632
--color-background-hover: hsl(26deg 50% 55%);
4733
--color-border-default: hsl(0deg 0% 33%);
34+
35+
color-scheme: dark;
4836
}
4937
}

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
@@ -1667,6 +1667,19 @@ window.addEventListener("load", () => {
16671667
window.qBittorrent.Cache.preferences.init();
16681668
window.qBittorrent.Cache.qbtVersion.init();
16691669

1670+
// Setup color scheme switching
1671+
const colorSchemeQuery = window.matchMedia("(prefers-color-scheme: dark)");
1672+
const updateColorScheme = () => {
1673+
const root = document.documentElement;
1674+
const colorScheme = LocalPreferences.get("color_scheme");
1675+
const validScheme = (colorScheme === "light") || (colorScheme === "dark");
1676+
const isDark = colorSchemeQuery.matches;
1677+
root.classList.toggle("dark", ((!validScheme && isDark) || (colorScheme === "dark")));
1678+
};
1679+
1680+
colorSchemeQuery.addEventListener("change", updateColorScheme);
1681+
updateColorScheme();
1682+
16701683
// switch to previously used tab
16711684
const previouslyUsedTab = LocalPreferences.get("selected_window_tab", "transfers");
16721685
switch (previouslyUsedTab) {

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

+36-8
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>
1222
<input type="checkbox" id="filelog_checkbox" onclick="qBittorrent.Preferences.updateFileLogEnabled();" />
@@ -2011,10 +2021,26 @@
20112021
$("locale_select").setProperty("value", selected);
20122022
};
20132023

2024+
const updateColoSchemeSelect = () => {
2025+
const combobox = document.getElementById("colorSchemeSelect");
2026+
const colorScheme = LocalPreferences.get("color_scheme");
2027+
2028+
if (colorScheme === "light")
2029+
combobox.options[1].selected = true;
2030+
else if (colorScheme === "dark")
2031+
combobox.options[2].selected = true;
2032+
else
2033+
combobox.options[0].selected = true;
2034+
};
2035+
20142036
const loadPreferences = function() {
20152037
window.parent.qBittorrent.Cache.preferences.init({
20162038
onSuccess: (pref) => {
20172039
// Behavior tab
2040+
// Language
2041+
updateWebuiLocaleSelect(pref.locale);
2042+
updateColoSchemeSelect();
2043+
$("performanceWarning").setProperty("checked", pref.performance_warning);
20182044
$("filelog_checkbox").setProperty("checked", pref.file_log_enabled);
20192045
$("filelog_save_path_input").setProperty("value", pref.file_log_path);
20202046
$("filelog_backup_checkbox").setProperty("checked", pref.file_log_backup_enabled);
@@ -2294,10 +2320,6 @@
22942320
$("rss_filter_textarea").setProperty("value", pref.rss_smart_episode_filters);
22952321

22962322
// WebUI tab
2297-
// Language
2298-
updateWebuiLocaleSelect(pref.locale);
2299-
$("performanceWarning").setProperty("checked", pref.performance_warning);
2300-
23012323
// HTTP Server
23022324
$("webui_domain_textarea").setProperty("value", pref.web_ui_domain_list);
23032325
$("webui_address_value").setProperty("value", pref.web_ui_address);
@@ -2426,6 +2448,16 @@
24262448
// Validate form data
24272449

24282450
// Behavior tab
2451+
// Language
2452+
settings["locale"] = $("locale_select").getProperty("value");
2453+
const colorScheme = Number(document.getElementById("colorSchemeSelect").value);
2454+
if (colorScheme === 0)
2455+
LocalPreferences.remove("color_scheme");
2456+
else if (colorScheme === 1)
2457+
LocalPreferences.set("color_scheme", "light");
2458+
else
2459+
LocalPreferences.set("color_scheme", "dark");
2460+
settings["performance_warning"] = $("performanceWarning").getProperty("checked");
24292461
settings["file_log_enabled"] = $("filelog_checkbox").getProperty("checked");
24302462
settings["file_log_path"] = $("filelog_save_path_input").getProperty("value");
24312463
settings["file_log_backup_enabled"] = $("filelog_backup_checkbox").getProperty("checked");
@@ -2712,10 +2744,6 @@
27122744
settings["rss_smart_episode_filters"] = $("rss_filter_textarea").getProperty("value");
27132745

27142746
// WebUI tab
2715-
// Language
2716-
settings["locale"] = $("locale_select").getProperty("value");
2717-
settings["performance_warning"] = $("performanceWarning").getProperty("checked");
2718-
27192747
// HTTP Server
27202748
settings["web_ui_domain_list"] = $("webui_domain_textarea").getProperty("value");
27212749
const web_ui_address = $("webui_address_value").getProperty("value").toString();

0 commit comments

Comments
 (0)