Mercurial > minori
comparison src/gui/theme.cc @ 102:b315f3759c56
*: big patch
1. use a wrapper for mINI that enables case sensitivity
(personal preference)
2. rename dark_theme.cc to theme.cc and change it to be
a class
3. include the "dep" folder so we don't have stupidity in
json.h or ini.h
4. I think the graph was also tweaked a lot in this, nothing
is constexpr and size is found at runtime...
| author | Paper <mrpapersonic@gmail.com> |
|---|---|
| date | Fri, 03 Nov 2023 21:32:52 -0400 |
| parents | |
| children | 6d8da6e64d61 |
comparison
equal
deleted
inserted
replaced
| 101:c537996cf67b | 102:b315f3759c56 |
|---|---|
| 1 #include "core/config.h" | |
| 2 #include "core/session.h" | |
| 3 #include <QApplication> | |
| 4 #include <QFile> | |
| 5 #include <QDebug> | |
| 6 #include <QTextStream> | |
| 7 #include <QStyleFactory> | |
| 8 #ifdef MACOSX | |
| 9 # include "sys/osx/dark_theme.h" | |
| 10 #else | |
| 11 # include "sys/win32/dark_theme.h" | |
| 12 #endif | |
| 13 | |
| 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 | |
| 16 2. Some widgets, i.e. QTabWidget, QTabBar, etc., just completely IGNORE the QPalette setting | |
| 17 3. I don't want to use the Fusion style on every single platform | |
| 18 4. Windows dark mode support in Qt 6.5 (with Fusion) is completely unavoidable | |
| 19 (not a joke btw, it's retarded) | |
| 20 These three already make it really hard, but along with that, I don't even remember if | |
| 21 OS X dark mode support even works still; I remember the background of some of the widgets | |
| 22 would refuse to update for whatever reason. */ | |
| 23 | |
| 24 namespace Theme { | |
| 25 | |
| 26 Theme::Theme(Themes theme) { | |
| 27 this->theme = theme; | |
| 28 } | |
| 29 | |
| 30 Themes Theme::GetTheme() { | |
| 31 return theme; | |
| 32 } | |
| 33 | |
| 34 bool Theme::IsInDarkMode() { | |
| 35 if (theme != Themes::OS) | |
| 36 return (theme == Themes::DARK); | |
| 37 #ifdef MACOSX | |
| 38 if (osx::DarkThemeAvailable()) | |
| 39 return osx::IsInDarkTheme(); | |
| 40 #elif defined(WIN32) | |
| 41 if (win32::DarkThemeAvailable()) | |
| 42 return win32::IsInDarkTheme(); | |
| 43 #endif | |
| 44 return (theme == Themes::DARK); | |
| 45 } | |
| 46 | |
| 47 void Theme::SetToDarkTheme() { | |
| 48 /* macOS >= 10.14 has its own global dark theme, | |
| 49 use it :) */ | |
| 50 #if MACOSX | |
| 51 if (osx::DarkThemeAvailable()) | |
| 52 osx::SetToDarkTheme(); | |
| 53 else | |
| 54 #endif | |
| 55 SetStyleSheet(Themes::DARK); | |
| 56 } | |
| 57 | |
| 58 void Theme::SetToLightTheme() { | |
| 59 #if MACOSX | |
| 60 if (osx::DarkThemeAvailable()) | |
| 61 osx::SetToLightTheme(); | |
| 62 else | |
| 63 #endif | |
| 64 SetStyleSheet(Themes::LIGHT); | |
| 65 } | |
| 66 | |
| 67 Themes Theme::GetCurrentOSTheme() { | |
| 68 #if MACOSX | |
| 69 if (osx::DarkThemeAvailable()) | |
| 70 return osx::IsInDarkTheme() ? Themes::DARK : Themes::LIGHT; | |
| 71 #elif defined(WIN32) | |
| 72 if (win32::DarkThemeAvailable()) | |
| 73 return win32::IsInDarkTheme() ? Themes::DARK : Themes::LIGHT; | |
| 74 #endif | |
| 75 /* Currently OS detection only supports Windows and macOS. | |
| 76 Please don't be shy if you're willing to port it to other OSes | |
| 77 (or desktop environments, or window managers) */ | |
| 78 return Themes::LIGHT; | |
| 79 } | |
| 80 | |
| 81 /* this function is private, and should stay that way */ | |
| 82 void Theme::SetStyleSheet(Themes theme) { | |
| 83 switch (theme) { | |
| 84 case Themes::DARK: { | |
| 85 QColor darkGray(53, 53, 53); | |
| 86 QColor gray(128, 128, 128); | |
| 87 QColor black(25, 25, 25); | |
| 88 QColor blue(42, 130, 218); | |
| 89 | |
| 90 QPalette darkPalette; | |
| 91 darkPalette.setColor(QPalette::Window, darkGray); | |
| 92 darkPalette.setColor(QPalette::WindowText, Qt::white); | |
| 93 darkPalette.setColor(QPalette::Base, black); | |
| 94 darkPalette.setColor(QPalette::AlternateBase, darkGray); | |
| 95 darkPalette.setColor(QPalette::ToolTipBase, blue); | |
| 96 darkPalette.setColor(QPalette::ToolTipText, Qt::white); | |
| 97 darkPalette.setColor(QPalette::Text, Qt::white); | |
| 98 darkPalette.setColor(QPalette::Button, darkGray); | |
| 99 darkPalette.setColor(QPalette::ButtonText, Qt::white); | |
| 100 darkPalette.setColor(QPalette::Link, blue); | |
| 101 darkPalette.setColor(QPalette::Highlight, blue); | |
| 102 darkPalette.setColor(QPalette::HighlightedText, Qt::black); | |
| 103 | |
| 104 darkPalette.setColor(QPalette::Active, QPalette::Button, gray.darker()); | |
| 105 darkPalette.setColor(QPalette::Disabled, QPalette::ButtonText, gray); | |
| 106 darkPalette.setColor(QPalette::Disabled, QPalette::WindowText, gray); | |
| 107 darkPalette.setColor(QPalette::Disabled, QPalette::Text, gray); | |
| 108 darkPalette.setColor(QPalette::Disabled, QPalette::Light, darkGray); | |
| 109 qApp->setPalette(darkPalette); | |
| 110 break; | |
| 111 } | |
| 112 default: | |
| 113 qApp->setPalette(QApplication::style()->standardPalette()); | |
| 114 break; | |
| 115 } | |
| 116 } | |
| 117 | |
| 118 void Theme::SetTheme(Themes theme) { | |
| 119 switch (theme) { | |
| 120 case Themes::LIGHT: | |
| 121 SetToLightTheme(); | |
| 122 break; | |
| 123 case Themes::DARK: | |
| 124 SetToDarkTheme(); | |
| 125 break; | |
| 126 case Themes::OS: | |
| 127 if (GetCurrentOSTheme() == Themes::LIGHT) | |
| 128 SetToLightTheme(); | |
| 129 else | |
| 130 SetToDarkTheme(); | |
| 131 break; | |
| 132 } | |
| 133 this->theme = theme; | |
| 134 } | |
| 135 | |
| 136 } // namespace DarkTheme |
