Mercurial > minori
annotate src/gui/theme.cc @ 393:963047512d34
*: clang-format
| author | Paper <paper@tflc.us> |
|---|---|
| date | Fri, 07 Nov 2025 07:16:15 -0500 |
| 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) { |
| 393 | 46 case Theme::Default: |
| 102 | 47 #ifdef MACOSX |
| 393 | 48 if (osx::DarkThemeAvailable()) |
| 49 return osx::IsInDarkTheme(); | |
| 102 | 50 #elif defined(WIN32) |
| 393 | 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 |
| 393 | 55 if (x11::IsInDarkTheme()) |
| 56 return true; | |
| 369 | 57 # endif |
| 58 # ifdef GLIB | |
| 393 | 59 if (glib::IsInDarkTheme()) |
| 60 return true; | |
| 369 | 61 # endif |
| 393 | 62 break; |
| 102 | 63 #endif |
| 393 | 64 default: |
| 65 break; | |
| 279 | 66 } |
| 67 return (theme == Theme::Dark); | |
| 102 | 68 } |
| 69 | |
| 369 | 70 void ThemeManager::SetToDarkTheme() |
| 71 { | |
| 102 | 72 /* macOS >= 10.14 has its own global dark theme, |
| 73 use it :) */ | |
|
105
6d8da6e64d61
theme: add dark stylesheet, make it actually usable
Paper <mrpapersonic@gmail.com>
parents:
102
diff
changeset
|
74 #ifdef MACOSX |
| 102 | 75 if (osx::DarkThemeAvailable()) |
| 76 osx::SetToDarkTheme(); | |
| 77 else | |
|
105
6d8da6e64d61
theme: add dark stylesheet, make it actually usable
Paper <mrpapersonic@gmail.com>
parents:
102
diff
changeset
|
78 #elif defined(WIN32) |
|
6d8da6e64d61
theme: add dark stylesheet, make it actually usable
Paper <mrpapersonic@gmail.com>
parents:
102
diff
changeset
|
79 if (win32::DarkThemeAvailable()) |
|
6d8da6e64d61
theme: add dark stylesheet, make it actually usable
Paper <mrpapersonic@gmail.com>
parents:
102
diff
changeset
|
80 win32::SetTitleBarsToBlack(true); |
| 102 | 81 #endif |
| 279 | 82 SetStyleSheet(Theme::Dark); |
| 102 | 83 } |
| 84 | |
| 369 | 85 void ThemeManager::SetToLightTheme() |
| 86 { | |
|
105
6d8da6e64d61
theme: add dark stylesheet, make it actually usable
Paper <mrpapersonic@gmail.com>
parents:
102
diff
changeset
|
87 #ifdef MACOSX |
| 102 | 88 if (osx::DarkThemeAvailable()) |
| 89 osx::SetToLightTheme(); | |
| 90 else | |
|
105
6d8da6e64d61
theme: add dark stylesheet, make it actually usable
Paper <mrpapersonic@gmail.com>
parents:
102
diff
changeset
|
91 #elif defined(WIN32) |
|
6d8da6e64d61
theme: add dark stylesheet, make it actually usable
Paper <mrpapersonic@gmail.com>
parents:
102
diff
changeset
|
92 if (win32::DarkThemeAvailable()) |
|
6d8da6e64d61
theme: add dark stylesheet, make it actually usable
Paper <mrpapersonic@gmail.com>
parents:
102
diff
changeset
|
93 win32::SetTitleBarsToBlack(false); |
| 102 | 94 #endif |
| 279 | 95 SetStyleSheet(Theme::Light); |
| 102 | 96 } |
| 97 | |
| 369 | 98 Theme ThemeManager::GetCurrentOSTheme() const |
| 99 { | |
| 279 | 100 return IsInDarkTheme() ? Theme::Dark : Theme::Light; |
| 102 | 101 } |
| 102 | |
| 103 /* this function is private, and should stay that way */ | |
| 369 | 104 void ThemeManager::SetStyleSheet(Theme theme) |
| 105 { | |
| 102 | 106 switch (theme) { |
| 393 | 107 case Theme::Dark: { |
| 108 const QColor darkGray(53, 53, 53); | |
| 109 const QColor gray(128, 128, 128); | |
| 110 const QColor black(25, 25, 25); | |
| 111 const QColor blue(42, 130, 218); | |
| 102 | 112 |
| 393 | 113 QPalette pal; |
|
305
91ac90a34003
core/time: remove Duration class, use regular functions instead
Paper <paper@paper.us.eu.org>
parents:
291
diff
changeset
|
114 |
| 393 | 115 pal.setColor(QPalette::Window, darkGray); |
| 116 pal.setColor(QPalette::WindowText, Qt::white); | |
| 117 pal.setColor(QPalette::Base, black); | |
| 118 pal.setColor(QPalette::AlternateBase, darkGray); | |
| 119 pal.setColor(QPalette::ToolTipBase, blue); | |
| 120 pal.setColor(QPalette::ToolTipText, Qt::white); | |
| 121 pal.setColor(QPalette::Text, Qt::white); | |
| 122 pal.setColor(QPalette::Button, darkGray); | |
| 123 pal.setColor(QPalette::ButtonText, Qt::white); | |
| 124 pal.setColor(QPalette::Link, blue); | |
| 125 pal.setColor(QPalette::Highlight, blue); | |
| 126 pal.setColor(QPalette::HighlightedText, Qt::black); | |
| 102 | 127 |
| 393 | 128 pal.setColor(QPalette::Active, QPalette::Button, gray.darker()); |
| 129 pal.setColor(QPalette::Disabled, QPalette::ButtonText, gray); | |
| 130 pal.setColor(QPalette::Disabled, QPalette::WindowText, gray); | |
| 131 pal.setColor(QPalette::Disabled, QPalette::Text, gray); | |
| 132 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
|
133 |
| 393 | 134 qApp->setPalette(pal); |
|
105
6d8da6e64d61
theme: add dark stylesheet, make it actually usable
Paper <mrpapersonic@gmail.com>
parents:
102
diff
changeset
|
135 |
|
229
adc20fa321c1
theme: force Fusion style on platforms other than Win32 or OS X
Paper <paper@paper.us.eu.org>
parents:
183
diff
changeset
|
136 #ifdef WIN32 |
| 393 | 137 qApp->setStyleSheet([] { |
| 138 QFile f(":/dark.qss"); | |
| 139 if (!f.exists()) | |
| 140 return QStringLiteral(""); | |
| 141 f.open(QFile::ReadOnly | QFile::Text); | |
| 142 QTextStream ts(&f); | |
| 143 return ts.readAll(); | |
| 144 }()); | |
|
229
adc20fa321c1
theme: force Fusion style on platforms other than Win32 or OS X
Paper <paper@paper.us.eu.org>
parents:
183
diff
changeset
|
145 #endif |
| 393 | 146 break; |
| 147 } | |
| 148 default: | |
| 149 /* this sucks */ | |
| 150 QPalette pal(QApplication::style()->standardPalette()); | |
|
105
6d8da6e64d61
theme: add dark stylesheet, make it actually usable
Paper <mrpapersonic@gmail.com>
parents:
102
diff
changeset
|
151 #ifdef WIN32 /* fuck you Qt 6 */ |
| 393 | 152 pal.setColor(QPalette::Window, QColor(0xF0, 0xF0, 0xF0)); |
|
105
6d8da6e64d61
theme: add dark stylesheet, make it actually usable
Paper <mrpapersonic@gmail.com>
parents:
102
diff
changeset
|
153 #endif |
| 393 | 154 qApp->setPalette(pal); |
|
105
6d8da6e64d61
theme: add dark stylesheet, make it actually usable
Paper <mrpapersonic@gmail.com>
parents:
102
diff
changeset
|
155 |
| 393 | 156 qApp->setStyleSheet(""); |
| 157 break; | |
| 102 | 158 } |
| 159 } | |
| 160 | |
| 369 | 161 void ThemeManager::SetTheme(Theme theme) |
| 162 { | |
| 102 | 163 switch (theme) { |
| 393 | 164 case Theme::Light: |
| 165 SetToLightTheme(); | |
| 166 break; | |
| 167 case Theme::Dark: | |
| 168 SetToDarkTheme(); | |
| 169 break; | |
| 170 case Theme::Default: | |
| 171 if (GetCurrentOSTheme() == Theme::Light) | |
| 172 SetToLightTheme(); | |
| 173 else | |
| 174 SetToDarkTheme(); | |
| 175 break; | |
| 102 | 176 } |
| 177 this->theme = theme; | |
| 178 } | |
| 179 | |
| 369 | 180 void ThemeManager::RepaintCurrentTheme() |
| 181 { | |
| 279 | 182 SetTheme(theme); |
|
105
6d8da6e64d61
theme: add dark stylesheet, make it actually usable
Paper <mrpapersonic@gmail.com>
parents:
102
diff
changeset
|
183 } |
|
6d8da6e64d61
theme: add dark stylesheet, make it actually usable
Paper <mrpapersonic@gmail.com>
parents:
102
diff
changeset
|
184 |
| 258 | 185 } // namespace Theme |
