mirror of
				https://github.com/OpenMW/openmw.git
				synced 2025-11-04 03:26:39 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			118 lines
		
	
	
	
		
			3.3 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			118 lines
		
	
	
	
		
			3.3 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
#include "application.hpp"
 | 
						|
 | 
						|
#include <QFile>
 | 
						|
#include <QOperatingSystemVersion>
 | 
						|
#include <QStyle>
 | 
						|
#include <QStyleHints>
 | 
						|
 | 
						|
#include <components/debug/debuglog.hpp>
 | 
						|
#include <components/misc/scalableicon.hpp>
 | 
						|
 | 
						|
namespace Platform
 | 
						|
{
 | 
						|
    Application::Application(int& argc, char* argv[])
 | 
						|
        : QApplication(argc, argv)
 | 
						|
    {
 | 
						|
#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;
 | 
						|
    }
 | 
						|
}
 |