Something went wrong. Try again.
OpenMW is an open implementation of the Morrowind engine
Something went wrong. Try again.
4.2 kB · 149 lines
C++
at master
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150#include "application.hpp"
#include <string>
#include <QFile>#include <QOperatingSystemVersion>#include <QStyle>#include <QStyleHints>
#include <components/debug/debuglog.hpp>#include <components/misc/scalableicon.hpp>
namespace Platform{ static void qtMessageHandler(QtMsgType type, const QMessageLogContext& context, const QString& msg) { Debug::Level level; switch (type) { case QtDebugMsg: level = Debug::Debug; break; case QtInfoMsg: level = Debug::Info; break; case QtWarningMsg: level = Debug::Warning; break; case QtCriticalMsg: level = Debug::Error; break; case QtFatalMsg: level = Debug::Error; break; default: level = Debug::Debug; break; }
Log(level) << qUtf8Printable(qFormatLogMessage(type, context, msg)); }
Application::Application(int& argc, char* argv[]) : QApplication(argc, argv) { qInstallMessageHandler(qtMessageHandler);#if defined(WIN32) && QT_VERSION >= QT_VERSION_CHECK(6, 5, 0) init(); }
static QString getStyleSheetPath() { QString qssPath(":/dark/dark_win10.qss"); if (QOperatingSystemVersion::current() >= QOperatingSystemVersion::Windows11) qssPath = ":/dark/dark_win11.qss";
return qssPath; }
void Application::init() { connect(this, &Application::darkModeChanged, this, &Application::updateStyle);
const auto* hints = QGuiApplication::styleHints(); const auto currentStyle = QApplication::style()->objectName(); mInitialStyle = currentStyle.toStdString(); mCurrentStyle = currentStyle.toStdString(); if (hints->colorScheme() == Qt::ColorScheme::Dark) { mDarkMode = true; if (currentStyle == "windowsvista") { mCurrentStyle = "windows"; setStyle("windows");
QFile file(getStyleSheetPath()); if (!file.open(QIODevice::ReadOnly)) { qDebug() << "Failed to open style sheet file:" << getStyleSheetPath(); return; }
setStyleSheet(file.readAll()); } } }
void Application::updateStyle(bool isDark) { if (mInitialStyle != "windowsvista") return;
if (isDark) { mCurrentStyle = "windows"; setStyle("windows");
QFile file(getStyleSheetPath()); if (!file.open(QIODevice::ReadOnly)) { qDebug() << "Failed to open style sheet file:" << getStyleSheetPath(); return; }
setStyleSheet(file.readAll()); } else { mCurrentStyle = mInitialStyle; setStyleSheet(""); setStyle(mInitialStyle.c_str()); }#endif }
bool Application::notify(QObject* receiver, QEvent* event) { try { if (event->type() == QEvent::ThemeChange || event->type() == QEvent::PaletteChange) {#if defined(WIN32) && QT_VERSION >= QT_VERSION_CHECK(6, 5, 0) const auto* hints = QGuiApplication::styleHints(); const auto currentStyle = QApplication::style()->objectName(); bool isDark = hints->colorScheme() == Qt::ColorScheme::Dark; if (isDark != mDarkMode) { mDarkMode = isDark;
bool result = QApplication::notify(receiver, event);
emit darkModeChanged(isDark);
return result; }#endif Misc::ScalableIcon::updateAllIcons(); }
return QApplication::notify(receiver, event); } catch (const std::exception& exception) { Log(Debug::Error) << "An exception has been caught: " << exception.what(); }
return false; }}