comparison src/gui/theme.cc @ 105:6d8da6e64d61

theme: add dark stylesheet, make it actually usable win32: make the titlebar black where available
author Paper <mrpapersonic@gmail.com>
date Sun, 05 Nov 2023 03:54:26 -0500
parents b315f3759c56
children 2004b41d4a59
comparison
equal deleted inserted replaced
104:27455104ea37 105:6d8da6e64d61
5 #include <QDebug> 5 #include <QDebug>
6 #include <QTextStream> 6 #include <QTextStream>
7 #include <QStyleFactory> 7 #include <QStyleFactory>
8 #ifdef MACOSX 8 #ifdef MACOSX
9 # include "sys/osx/dark_theme.h" 9 # include "sys/osx/dark_theme.h"
10 #else 10 #elif WIN32
11 # include "sys/win32/dark_theme.h" 11 # include "sys/win32/dark_theme.h"
12 #endif 12 #endif
13 13
14 /* This is, believe it or not, one of the hardest things I've implemented :/ 14 /* This is, believe it or not, one of the hardest things I've implemented :/
15 1. Dark mode stuff in Qt changes a lot and Qt 5 and Qt 6 are massively different 15 1. Dark mode stuff in Qt changes a lot and Qt 5 and Qt 6 are massively different
45 } 45 }
46 46
47 void Theme::SetToDarkTheme() { 47 void Theme::SetToDarkTheme() {
48 /* macOS >= 10.14 has its own global dark theme, 48 /* macOS >= 10.14 has its own global dark theme,
49 use it :) */ 49 use it :) */
50 #if MACOSX 50 #ifdef MACOSX
51 if (osx::DarkThemeAvailable()) 51 if (osx::DarkThemeAvailable())
52 osx::SetToDarkTheme(); 52 osx::SetToDarkTheme();
53 else 53 else
54 #elif defined(WIN32)
55 if (win32::DarkThemeAvailable())
56 win32::SetTitleBarsToBlack(true);
54 #endif 57 #endif
55 SetStyleSheet(Themes::DARK); 58 SetStyleSheet(Themes::DARK);
56 } 59 }
57 60
58 void Theme::SetToLightTheme() { 61 void Theme::SetToLightTheme() {
59 #if MACOSX 62 #ifdef MACOSX
60 if (osx::DarkThemeAvailable()) 63 if (osx::DarkThemeAvailable())
61 osx::SetToLightTheme(); 64 osx::SetToLightTheme();
62 else 65 else
66 #elif defined(WIN32)
67 if (win32::DarkThemeAvailable())
68 win32::SetTitleBarsToBlack(false);
63 #endif 69 #endif
64 SetStyleSheet(Themes::LIGHT); 70 SetStyleSheet(Themes::LIGHT);
65 } 71 }
66 72
67 Themes Theme::GetCurrentOSTheme() { 73 Themes Theme::GetCurrentOSTheme() {
68 #if MACOSX 74 #ifdef MACOSX
69 if (osx::DarkThemeAvailable()) 75 if (osx::DarkThemeAvailable())
70 return osx::IsInDarkTheme() ? Themes::DARK : Themes::LIGHT; 76 return osx::IsInDarkTheme() ? Themes::DARK : Themes::LIGHT;
71 #elif defined(WIN32) 77 #elif defined(WIN32)
72 if (win32::DarkThemeAvailable()) 78 if (win32::DarkThemeAvailable())
73 return win32::IsInDarkTheme() ? Themes::DARK : Themes::LIGHT; 79 return win32::IsInDarkTheme() ? Themes::DARK : Themes::LIGHT;
85 QColor darkGray(53, 53, 53); 91 QColor darkGray(53, 53, 53);
86 QColor gray(128, 128, 128); 92 QColor gray(128, 128, 128);
87 QColor black(25, 25, 25); 93 QColor black(25, 25, 25);
88 QColor blue(42, 130, 218); 94 QColor blue(42, 130, 218);
89 95
90 QPalette darkPalette; 96 QPalette pal(QApplication::style()->standardPalette());
91 darkPalette.setColor(QPalette::Window, darkGray); 97 pal.setColor(QPalette::Window, darkGray);
92 darkPalette.setColor(QPalette::WindowText, Qt::white); 98 pal.setColor(QPalette::WindowText, Qt::white);
93 darkPalette.setColor(QPalette::Base, black); 99 pal.setColor(QPalette::Base, black);
94 darkPalette.setColor(QPalette::AlternateBase, darkGray); 100 pal.setColor(QPalette::AlternateBase, darkGray);
95 darkPalette.setColor(QPalette::ToolTipBase, blue); 101 pal.setColor(QPalette::ToolTipBase, blue);
96 darkPalette.setColor(QPalette::ToolTipText, Qt::white); 102 pal.setColor(QPalette::ToolTipText, Qt::white);
97 darkPalette.setColor(QPalette::Text, Qt::white); 103 pal.setColor(QPalette::Text, Qt::white);
98 darkPalette.setColor(QPalette::Button, darkGray); 104 pal.setColor(QPalette::Button, darkGray);
99 darkPalette.setColor(QPalette::ButtonText, Qt::white); 105 pal.setColor(QPalette::ButtonText, Qt::white);
100 darkPalette.setColor(QPalette::Link, blue); 106 pal.setColor(QPalette::Link, blue);
101 darkPalette.setColor(QPalette::Highlight, blue); 107 pal.setColor(QPalette::Highlight, blue);
102 darkPalette.setColor(QPalette::HighlightedText, Qt::black); 108 pal.setColor(QPalette::HighlightedText, Qt::black);
103 109
104 darkPalette.setColor(QPalette::Active, QPalette::Button, gray.darker()); 110 pal.setColor(QPalette::Active, QPalette::Button, gray.darker());
105 darkPalette.setColor(QPalette::Disabled, QPalette::ButtonText, gray); 111 pal.setColor(QPalette::Disabled, QPalette::ButtonText, gray);
106 darkPalette.setColor(QPalette::Disabled, QPalette::WindowText, gray); 112 pal.setColor(QPalette::Disabled, QPalette::WindowText, gray);
107 darkPalette.setColor(QPalette::Disabled, QPalette::Text, gray); 113 pal.setColor(QPalette::Disabled, QPalette::Text, gray);
108 darkPalette.setColor(QPalette::Disabled, QPalette::Light, darkGray); 114 pal.setColor(QPalette::Disabled, QPalette::Light, darkGray);
109 qApp->setPalette(darkPalette); 115 qApp->setPalette(pal);
116
117 QFile f(":dark.qss");
118 if (!f.exists())
119 break; // how?
120 f.open(QFile::ReadOnly | QFile::Text);
121 QTextStream ts(&f);
122 qApp->setStyleSheet(ts.readAll());
110 break; 123 break;
111 } 124 }
112 default: 125 default:
113 qApp->setPalette(QApplication::style()->standardPalette()); 126 QPalette pal(QApplication::style()->standardPalette());
127 #ifdef WIN32 /* fuck you Qt 6 */
128 pal.setColor(QPalette::Window, QColor(0xF0, 0xF0, 0xF0));
129 #endif
130 pal.setColor(QPalette::WindowText, Qt::black);
131 pal.setColor(QPalette::ToolTipText, Qt::black);
132 pal.setColor(QPalette::Text, Qt::black);
133 pal.setColor(QPalette::ButtonText, Qt::black);
134 qApp->setPalette(pal);
135
136 qApp->setStyleSheet("");
114 break; 137 break;
115 } 138 }
116 } 139 }
117 140
118 void Theme::SetTheme(Themes theme) { 141 void Theme::SetTheme(Themes theme) {
131 break; 154 break;
132 } 155 }
133 this->theme = theme; 156 this->theme = theme;
134 } 157 }
135 158
159 void Theme::RepaintCurrentTheme() {
160 Theme::SetTheme(theme);
161 }
162
136 } // namespace DarkTheme 163 } // namespace DarkTheme