Add support for dynamic color scheme update

This commit is contained in:
Nikolaj Schlej 2023-04-22 23:48:25 -07:00
parent 84ea44829a
commit cbf26d125d
2 changed files with 31 additions and 3 deletions

View File

@ -15,6 +15,10 @@
#include "uefitool.h" #include "uefitool.h"
#include "ui_uefitool.h" #include "ui_uefitool.h"
#if QT_VERSION_MAJOR >= 6
#include <QStyleHints>
#endif
UEFITool::UEFITool(QWidget *parent) : UEFITool::UEFITool(QWidget *parent) :
QMainWindow(parent), QMainWindow(parent),
ui(new Ui::UEFITool), ui(new Ui::UEFITool),
@ -167,13 +171,13 @@ void UEFITool::init()
ui->finderMessagesListWidget->installEventFilter(this); ui->finderMessagesListWidget->installEventFilter(this);
ui->builderMessagesListWidget->installEventFilter(this); ui->builderMessagesListWidget->installEventFilter(this);
// Detect UI dark mode // Detect and set UI light or dark mode
#if QT_VERSION_MAJOR >= 6 #if QT_VERSION_MAJOR >= 6
#if QT_VERSION_MINOR < 5
#if defined Q_OS_WIN #if defined Q_OS_WIN
QSettings settings("HKEY_CURRENT_USER\\Software\\Microsoft\\Windows\\CurrentVersion\\Themes\\Personalize", QSettings::NativeFormat); QSettings settings("HKEY_CURRENT_USER\\Software\\Microsoft\\Windows\\CurrentVersion\\Themes\\Personalize", QSettings::NativeFormat);
if (settings.value("AppsUseLightTheme", 1).toInt() == 0) { if (settings.value("AppsUseLightTheme", 1).toInt() == 0) {
model->setMarkingDarkMode(true); model->setMarkingDarkMode(true);
// TODO: remove this once default style gains dark theme support
QApplication::setStyle(QStyleFactory::create("Fusion")); QApplication::setStyle(QStyleFactory::create("Fusion"));
QApplication::setPalette(QApplication::style()->standardPalette()); QApplication::setPalette(QApplication::style()->standardPalette());
} }
@ -183,10 +187,30 @@ void UEFITool::init()
if (color.lightness() < 127) { // TreeView has dark background if (color.lightness() < 127) { // TreeView has dark background
model->setMarkingDarkMode(true); model->setMarkingDarkMode(true);
} }
#endif // defined Q_OS_WIN
#else // QT_VERSION_MINOR >= 5
// Qt 6.5.0 added proper support for dark UI mode, including detection and notification on mode change
// It also supposed to work in all OSes, but still requires changing the default style on Windows from Vista to Fusion
auto styleHints = QGuiApplication::styleHints();
model->setMarkingDarkMode(styleHints->colorScheme() == Qt::ColorScheme::Dark);
connect(styleHints, SIGNAL(colorSchemeChanged(Qt::ColorScheme)), this, SLOT(updateUiForNewColorScheme(Qt::ColorScheme)));
#if defined Q_OS_WIN
QApplication::setStyle(QStyleFactory::create("Fusion"));
QApplication::setPalette(QApplication::style()->standardPalette());
#endif #endif
#endif #endif // QT_VERSION_MINOR
#endif // QT_VERSION_MAJOR
} }
#if QT_VERSION_MAJOR >= 6 && QT_VERSION_MINOR >= 5
void UEFITool::updateUiForNewColorScheme(Qt::ColorScheme scheme)
{
model->setMarkingDarkMode(scheme == Qt::ColorScheme::Dark);
QApplication::setPalette(QApplication::style()->standardPalette());
}
#endif
void UEFITool::populateUi(const QItemSelection &selected) void UEFITool::populateUi(const QItemSelection &selected)
{ {
if (selected.isEmpty()) { if (selected.isEmpty()) {

View File

@ -127,6 +127,10 @@ private slots:
void currentTabChanged(int index); void currentTabChanged(int index);
#if QT_VERSION_MAJOR >= 6 && QT_VERSION_MINOR >= 5
void updateUiForNewColorScheme(Qt::ColorScheme scheme);
#endif
private: private:
Ui::UEFITool* ui; Ui::UEFITool* ui;
TreeModel* model; TreeModel* model;