Mercurial > minori
annotate src/gui/theme.cc @ 374:f7bb2978de48
gui/pages/anime_list: add Search right-click menu, don't create menu items that do nothing
author | Paper <paper@tflc.us> |
---|---|
date | Fri, 25 Jul 2025 11:03:34 -0400 |
parents | 47c9f8502269 |
children |
rev | line source |
---|---|
369 | 1 #include "gui/theme.h" |
102 | 2 #include "core/config.h" |
3 #include "core/session.h" | |
4 #include <QApplication> | |
258 | 5 #include <QDebug> |
102 | 6 #include <QFile> |
369 | 7 #include <QStyle> |
258 | 8 #include <QStyleFactory> |
102 | 9 #include <QTextStream> |
291 | 10 #include <QtGlobal> |
102 | 11 #ifdef MACOSX |
369 | 12 # include "sys/osx/dark_theme.h" |
279 | 13 #elif defined(WIN32) |
369 | 14 # include "sys/win32/dark_theme.h" |
232
ff0061e75f0f
theme: add OS detection with glib
Paper <mrpapersonic@gmail.com>
parents:
230
diff
changeset
|
15 #else |
369 | 16 # ifdef GLIB |
17 # include "sys/glib/dark_theme.h" | |
18 # endif | |
19 # ifdef HAVE_XCB | |
20 # include "sys/x11/dark_theme.h" | |
21 # endif | |
102 | 22 #endif |
23 | |
229
adc20fa321c1
theme: force Fusion style on platforms other than Win32 or OS X
Paper <paper@paper.us.eu.org>
parents:
183
diff
changeset
|
24 /* Weird quirks of this implementation: |
adc20fa321c1
theme: force Fusion style on platforms other than Win32 or OS X
Paper <paper@paper.us.eu.org>
parents:
183
diff
changeset
|
25 * 1. Dark mode stuff in Qt changes a lot and Qt 5 and Qt 6 are massively different |
adc20fa321c1
theme: force Fusion style on platforms other than Win32 or OS X
Paper <paper@paper.us.eu.org>
parents:
183
diff
changeset
|
26 * 2. Some widgets, i.e. QTabWidget, QTabBar, etc., just completely IGNORE the QPalette setting |
adc20fa321c1
theme: force Fusion style on platforms other than Win32 or OS X
Paper <paper@paper.us.eu.org>
parents:
183
diff
changeset
|
27 * on different platforms and the only way to fix it is by using Fusion |
adc20fa321c1
theme: force Fusion style on platforms other than Win32 or OS X
Paper <paper@paper.us.eu.org>
parents:
183
diff
changeset
|
28 * 3. Windows dark mode support in Qt 6.5 (with Fusion) is completely unavoidable |
258 | 29 */ |
102 | 30 |
31 namespace Theme { | |
32 | |
369 | 33 ThemeManager::ThemeManager(Theme theme) |
34 { | |
102 | 35 this->theme = theme; |
36 } | |
37 | |
369 | 38 Theme ThemeManager::GetTheme() const |
39 { | |
102 | 40 return theme; |
41 } | |
42 | |
369 | 43 bool ThemeManager::IsInDarkTheme() const |
44 { | |
279 | 45 switch (theme) { |
46 case Theme::Default: | |
102 | 47 #ifdef MACOSX |
279 | 48 if (osx::DarkThemeAvailable()) |
49 return osx::IsInDarkTheme(); | |
102 | 50 #elif defined(WIN32) |
279 | 51 if (win32::DarkThemeAvailable()) |
52 return win32::IsInDarkTheme(); | |
232
ff0061e75f0f
theme: add OS detection with glib
Paper <mrpapersonic@gmail.com>
parents:
230
diff
changeset
|
53 #else |
369 | 54 # ifdef HAVE_XCB |
351
c844f8bb87ce
gui/theme: add xsettings backend
Paper <paper@paper.us.eu.org>
parents:
305
diff
changeset
|
55 if (x11::IsInDarkTheme()) |
c844f8bb87ce
gui/theme: add xsettings backend
Paper <paper@paper.us.eu.org>
parents:
305
diff
changeset
|
56 return true; |
369 | 57 # endif |
58 # ifdef GLIB | |
351
c844f8bb87ce
gui/theme: add xsettings backend
Paper <paper@paper.us.eu.org>
parents:
305
diff
changeset
|
59 if (glib::IsInDarkTheme()) |
c844f8bb87ce
gui/theme: add xsettings backend
Paper <paper@paper.us.eu.org>
parents:
305
diff
changeset
|
60 return true; |
369 | 61 # endif |
351
c844f8bb87ce
gui/theme: add xsettings backend
Paper <paper@paper.us.eu.org>
parents:
305
diff
changeset
|
62 break; |
102 | 63 #endif |
369 | 64 default: break; |
279 | 65 } |
66 return (theme == Theme::Dark); | |
102 | 67 } |
68 | |
369 | 69 void ThemeManager::SetToDarkTheme() |
70 { | |
102 | 71 /* macOS >= 10.14 has its own global dark theme, |
72 use it :) */ | |
105
6d8da6e64d61
theme: add dark stylesheet, make it actually usable
Paper <mrpapersonic@gmail.com>
parents:
102
diff
changeset
|
73 #ifdef MACOSX |
102 | 74 if (osx::DarkThemeAvailable()) |
75 osx::SetToDarkTheme(); | |
76 else | |
105
6d8da6e64d61
theme: add dark stylesheet, make it actually usable
Paper <mrpapersonic@gmail.com>
parents:
102
diff
changeset
|
77 #elif defined(WIN32) |
6d8da6e64d61
theme: add dark stylesheet, make it actually usable
Paper <mrpapersonic@gmail.com>
parents:
102
diff
changeset
|
78 if (win32::DarkThemeAvailable()) |
6d8da6e64d61
theme: add dark stylesheet, make it actually usable
Paper <mrpapersonic@gmail.com>
parents:
102
diff
changeset
|
79 win32::SetTitleBarsToBlack(true); |
102 | 80 #endif |
279 | 81 SetStyleSheet(Theme::Dark); |
102 | 82 } |
83 | |
369 | 84 void ThemeManager::SetToLightTheme() |
85 { | |
105
6d8da6e64d61
theme: add dark stylesheet, make it actually usable
Paper <mrpapersonic@gmail.com>
parents:
102
diff
changeset
|
86 #ifdef MACOSX |
102 | 87 if (osx::DarkThemeAvailable()) |
88 osx::SetToLightTheme(); | |
89 else | |
105
6d8da6e64d61
theme: add dark stylesheet, make it actually usable
Paper <mrpapersonic@gmail.com>
parents:
102
diff
changeset
|
90 #elif defined(WIN32) |
6d8da6e64d61
theme: add dark stylesheet, make it actually usable
Paper <mrpapersonic@gmail.com>
parents:
102
diff
changeset
|
91 if (win32::DarkThemeAvailable()) |
6d8da6e64d61
theme: add dark stylesheet, make it actually usable
Paper <mrpapersonic@gmail.com>
parents:
102
diff
changeset
|
92 win32::SetTitleBarsToBlack(false); |
102 | 93 #endif |
279 | 94 SetStyleSheet(Theme::Light); |
102 | 95 } |
96 | |
369 | 97 Theme ThemeManager::GetCurrentOSTheme() const |
98 { | |
279 | 99 return IsInDarkTheme() ? Theme::Dark : Theme::Light; |
102 | 100 } |
101 | |
102 /* this function is private, and should stay that way */ | |
369 | 103 void ThemeManager::SetStyleSheet(Theme theme) |
104 { | |
102 | 105 switch (theme) { |
279 | 106 case Theme::Dark: { |
230
2f5a9247e501
torrents: implement download button
Paper <paper@paper.us.eu.org>
parents:
229
diff
changeset
|
107 const QColor darkGray(53, 53, 53); |
2f5a9247e501
torrents: implement download button
Paper <paper@paper.us.eu.org>
parents:
229
diff
changeset
|
108 const QColor gray(128, 128, 128); |
2f5a9247e501
torrents: implement download button
Paper <paper@paper.us.eu.org>
parents:
229
diff
changeset
|
109 const QColor black(25, 25, 25); |
2f5a9247e501
torrents: implement download button
Paper <paper@paper.us.eu.org>
parents:
229
diff
changeset
|
110 const QColor blue(42, 130, 218); |
102 | 111 |
305
91ac90a34003
core/time: remove Duration class, use regular functions instead
Paper <paper@paper.us.eu.org>
parents:
291
diff
changeset
|
112 QPalette pal; |
91ac90a34003
core/time: remove Duration class, use regular functions instead
Paper <paper@paper.us.eu.org>
parents:
291
diff
changeset
|
113 |
105
6d8da6e64d61
theme: add dark stylesheet, make it actually usable
Paper <mrpapersonic@gmail.com>
parents:
102
diff
changeset
|
114 pal.setColor(QPalette::Window, darkGray); |
6d8da6e64d61
theme: add dark stylesheet, make it actually usable
Paper <mrpapersonic@gmail.com>
parents:
102
diff
changeset
|
115 pal.setColor(QPalette::WindowText, Qt::white); |
6d8da6e64d61
theme: add dark stylesheet, make it actually usable
Paper <mrpapersonic@gmail.com>
parents:
102
diff
changeset
|
116 pal.setColor(QPalette::Base, black); |
6d8da6e64d61
theme: add dark stylesheet, make it actually usable
Paper <mrpapersonic@gmail.com>
parents:
102
diff
changeset
|
117 pal.setColor(QPalette::AlternateBase, darkGray); |
6d8da6e64d61
theme: add dark stylesheet, make it actually usable
Paper <mrpapersonic@gmail.com>
parents:
102
diff
changeset
|
118 pal.setColor(QPalette::ToolTipBase, blue); |
6d8da6e64d61
theme: add dark stylesheet, make it actually usable
Paper <mrpapersonic@gmail.com>
parents:
102
diff
changeset
|
119 pal.setColor(QPalette::ToolTipText, Qt::white); |
6d8da6e64d61
theme: add dark stylesheet, make it actually usable
Paper <mrpapersonic@gmail.com>
parents:
102
diff
changeset
|
120 pal.setColor(QPalette::Text, Qt::white); |
6d8da6e64d61
theme: add dark stylesheet, make it actually usable
Paper <mrpapersonic@gmail.com>
parents:
102
diff
changeset
|
121 pal.setColor(QPalette::Button, darkGray); |
6d8da6e64d61
theme: add dark stylesheet, make it actually usable
Paper <mrpapersonic@gmail.com>
parents:
102
diff
changeset
|
122 pal.setColor(QPalette::ButtonText, Qt::white); |
6d8da6e64d61
theme: add dark stylesheet, make it actually usable
Paper <mrpapersonic@gmail.com>
parents:
102
diff
changeset
|
123 pal.setColor(QPalette::Link, blue); |
6d8da6e64d61
theme: add dark stylesheet, make it actually usable
Paper <mrpapersonic@gmail.com>
parents:
102
diff
changeset
|
124 pal.setColor(QPalette::Highlight, blue); |
6d8da6e64d61
theme: add dark stylesheet, make it actually usable
Paper <mrpapersonic@gmail.com>
parents:
102
diff
changeset
|
125 pal.setColor(QPalette::HighlightedText, Qt::black); |
102 | 126 |
105
6d8da6e64d61
theme: add dark stylesheet, make it actually usable
Paper <mrpapersonic@gmail.com>
parents:
102
diff
changeset
|
127 pal.setColor(QPalette::Active, QPalette::Button, gray.darker()); |
6d8da6e64d61
theme: add dark stylesheet, make it actually usable
Paper <mrpapersonic@gmail.com>
parents:
102
diff
changeset
|
128 pal.setColor(QPalette::Disabled, QPalette::ButtonText, gray); |
6d8da6e64d61
theme: add dark stylesheet, make it actually usable
Paper <mrpapersonic@gmail.com>
parents:
102
diff
changeset
|
129 pal.setColor(QPalette::Disabled, QPalette::WindowText, gray); |
6d8da6e64d61
theme: add dark stylesheet, make it actually usable
Paper <mrpapersonic@gmail.com>
parents:
102
diff
changeset
|
130 pal.setColor(QPalette::Disabled, QPalette::Text, gray); |
6d8da6e64d61
theme: add dark stylesheet, make it actually usable
Paper <mrpapersonic@gmail.com>
parents:
102
diff
changeset
|
131 pal.setColor(QPalette::Disabled, QPalette::Light, darkGray); |
305
91ac90a34003
core/time: remove Duration class, use regular functions instead
Paper <paper@paper.us.eu.org>
parents:
291
diff
changeset
|
132 |
105
6d8da6e64d61
theme: add dark stylesheet, make it actually usable
Paper <mrpapersonic@gmail.com>
parents:
102
diff
changeset
|
133 qApp->setPalette(pal); |
6d8da6e64d61
theme: add dark stylesheet, make it actually usable
Paper <mrpapersonic@gmail.com>
parents:
102
diff
changeset
|
134 |
229
adc20fa321c1
theme: force Fusion style on platforms other than Win32 or OS X
Paper <paper@paper.us.eu.org>
parents:
183
diff
changeset
|
135 #ifdef WIN32 |
258 | 136 qApp->setStyleSheet([] { |
230
2f5a9247e501
torrents: implement download button
Paper <paper@paper.us.eu.org>
parents:
229
diff
changeset
|
137 QFile f(":/dark.qss"); |
2f5a9247e501
torrents: implement download button
Paper <paper@paper.us.eu.org>
parents:
229
diff
changeset
|
138 if (!f.exists()) |
2f5a9247e501
torrents: implement download button
Paper <paper@paper.us.eu.org>
parents:
229
diff
changeset
|
139 return QStringLiteral(""); |
2f5a9247e501
torrents: implement download button
Paper <paper@paper.us.eu.org>
parents:
229
diff
changeset
|
140 f.open(QFile::ReadOnly | QFile::Text); |
2f5a9247e501
torrents: implement download button
Paper <paper@paper.us.eu.org>
parents:
229
diff
changeset
|
141 QTextStream ts(&f); |
2f5a9247e501
torrents: implement download button
Paper <paper@paper.us.eu.org>
parents:
229
diff
changeset
|
142 return ts.readAll(); |
2f5a9247e501
torrents: implement download button
Paper <paper@paper.us.eu.org>
parents:
229
diff
changeset
|
143 }()); |
229
adc20fa321c1
theme: force Fusion style on platforms other than Win32 or OS X
Paper <paper@paper.us.eu.org>
parents:
183
diff
changeset
|
144 #endif |
102 | 145 break; |
146 } | |
147 default: | |
305
91ac90a34003
core/time: remove Duration class, use regular functions instead
Paper <paper@paper.us.eu.org>
parents:
291
diff
changeset
|
148 /* this sucks */ |
105
6d8da6e64d61
theme: add dark stylesheet, make it actually usable
Paper <mrpapersonic@gmail.com>
parents:
102
diff
changeset
|
149 QPalette pal(QApplication::style()->standardPalette()); |
6d8da6e64d61
theme: add dark stylesheet, make it actually usable
Paper <mrpapersonic@gmail.com>
parents:
102
diff
changeset
|
150 #ifdef WIN32 /* fuck you Qt 6 */ |
6d8da6e64d61
theme: add dark stylesheet, make it actually usable
Paper <mrpapersonic@gmail.com>
parents:
102
diff
changeset
|
151 pal.setColor(QPalette::Window, QColor(0xF0, 0xF0, 0xF0)); |
6d8da6e64d61
theme: add dark stylesheet, make it actually usable
Paper <mrpapersonic@gmail.com>
parents:
102
diff
changeset
|
152 #endif |
6d8da6e64d61
theme: add dark stylesheet, make it actually usable
Paper <mrpapersonic@gmail.com>
parents:
102
diff
changeset
|
153 qApp->setPalette(pal); |
6d8da6e64d61
theme: add dark stylesheet, make it actually usable
Paper <mrpapersonic@gmail.com>
parents:
102
diff
changeset
|
154 |
6d8da6e64d61
theme: add dark stylesheet, make it actually usable
Paper <mrpapersonic@gmail.com>
parents:
102
diff
changeset
|
155 qApp->setStyleSheet(""); |
102 | 156 break; |
157 } | |
158 } | |
159 | |
369 | 160 void ThemeManager::SetTheme(Theme theme) |
161 { | |
102 | 162 switch (theme) { |
279 | 163 case Theme::Light: SetToLightTheme(); break; |
164 case Theme::Dark: SetToDarkTheme(); break; | |
165 case Theme::Default: | |
166 if (GetCurrentOSTheme() == Theme::Light) | |
102 | 167 SetToLightTheme(); |
168 else | |
169 SetToDarkTheme(); | |
170 break; | |
171 } | |
172 this->theme = theme; | |
173 } | |
174 | |
369 | 175 void ThemeManager::RepaintCurrentTheme() |
176 { | |
279 | 177 SetTheme(theme); |
105
6d8da6e64d61
theme: add dark stylesheet, make it actually usable
Paper <mrpapersonic@gmail.com>
parents:
102
diff
changeset
|
178 } |
6d8da6e64d61
theme: add dark stylesheet, make it actually usable
Paper <mrpapersonic@gmail.com>
parents:
102
diff
changeset
|
179 |
258 | 180 } // namespace Theme |