mirror of https://github.com/cutefishos/qt-plugins
				
				
				
			
			You cannot select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
	
	
		
			144 lines
		
	
	
		
			4.6 KiB
		
	
	
	
		
			C++
		
	
			
		
		
	
	
			144 lines
		
	
	
		
			4.6 KiB
		
	
	
	
		
			C++
		
	
#include "hintsettings.h"
 | 
						|
 | 
						|
#include <QDebug>
 | 
						|
#include <QDir>
 | 
						|
#include <QString>
 | 
						|
#include <QFileInfo>
 | 
						|
#include <QToolBar>
 | 
						|
#include <QPalette>
 | 
						|
#include <QToolButton>
 | 
						|
#include <QMainWindow>
 | 
						|
#include <QApplication>
 | 
						|
#include <QGuiApplication>
 | 
						|
#include <QDialogButtonBox>
 | 
						|
#include <QScreen>
 | 
						|
#include <QStandardPaths>
 | 
						|
#include <QTemporaryFile>
 | 
						|
#include <qpa/qplatformdialoghelper.h>
 | 
						|
 | 
						|
#include <QDBusArgument>
 | 
						|
#include <QDBusConnection>
 | 
						|
#include <QDBusInterface>
 | 
						|
 | 
						|
static const QByteArray s_systemFontName = QByteArrayLiteral("Font");
 | 
						|
static const QByteArray s_systemFixedFontName = QByteArrayLiteral("FixedFont");
 | 
						|
static const QByteArray s_systemPointFontSize = QByteArrayLiteral("FontSize");
 | 
						|
static const QByteArray s_darkModeName = QByteArrayLiteral("DarkMode");
 | 
						|
static const QByteArray s_lightIconName = QByteArrayLiteral("Crule");
 | 
						|
static const QByteArray s_darkIconName = QByteArrayLiteral("Crule-dark");
 | 
						|
 | 
						|
HintsSettings::HintsSettings(QObject *parent)
 | 
						|
    : QObject(parent),
 | 
						|
      m_settings(new QSettings(QSettings::UserScope, "cutefishos", "theme"))
 | 
						|
{
 | 
						|
    m_iconTheme = m_settings->value("IconTheme", "Crule").toString();
 | 
						|
 | 
						|
    if (m_iconTheme.contains("Crule"))
 | 
						|
        m_hints[QPlatformTheme::SystemIconThemeName] = darkMode() ? s_darkIconName : s_lightIconName;
 | 
						|
    else
 | 
						|
        m_hints[QPlatformTheme::SystemIconThemeName] = m_iconTheme;
 | 
						|
 | 
						|
    m_hints[QPlatformTheme::SystemIconFallbackThemeName] = s_lightIconName;
 | 
						|
    m_hints[QPlatformTheme::StyleNames] = "cutefish";
 | 
						|
    m_hints[QPlatformTheme::SystemIconFallbackThemeName] = QStringLiteral("hicolor");
 | 
						|
    m_hints[QPlatformTheme::IconThemeSearchPaths] = xdgIconThemePaths();
 | 
						|
    m_hints[QPlatformTheme::UseFullScreenForPopupMenu] = false;
 | 
						|
    m_hints[QPlatformTheme::DialogButtonBoxLayout] = QPlatformDialogHelper::MacLayout;
 | 
						|
 | 
						|
    m_settingsFile = m_settings->fileName();
 | 
						|
 | 
						|
    QMetaObject::invokeMethod(this, "lazyInit", Qt::QueuedConnection);
 | 
						|
}
 | 
						|
 | 
						|
HintsSettings::~HintsSettings()
 | 
						|
{
 | 
						|
}
 | 
						|
 | 
						|
void HintsSettings::lazyInit()
 | 
						|
{
 | 
						|
    m_fileWatcher = new QFileSystemWatcher();
 | 
						|
    m_fileWatcher->addPath(m_settingsFile);
 | 
						|
    connect(m_fileWatcher, &QFileSystemWatcher::fileChanged, this, &HintsSettings::onFileChanged);
 | 
						|
}
 | 
						|
 | 
						|
QStringList HintsSettings::xdgIconThemePaths() const
 | 
						|
{
 | 
						|
    QStringList paths;
 | 
						|
 | 
						|
    // make sure we have ~/.local/share/icons in paths if it exists
 | 
						|
    paths << QStandardPaths::locateAll(QStandardPaths::GenericDataLocation, QStringLiteral("icons"), QStandardPaths::LocateDirectory);
 | 
						|
 | 
						|
    const QFileInfo homeIconDir(QDir::homePath() + QStringLiteral("/.icons"));
 | 
						|
    if (homeIconDir.isDir()) {
 | 
						|
        paths << homeIconDir.absoluteFilePath();
 | 
						|
    }
 | 
						|
 | 
						|
    return paths;
 | 
						|
}
 | 
						|
 | 
						|
QString HintsSettings::systemFont() const
 | 
						|
{
 | 
						|
    return m_settings->value(s_systemFontName, "Noto Sans").toString();
 | 
						|
}
 | 
						|
 | 
						|
QString HintsSettings::systemFixedFont() const
 | 
						|
{
 | 
						|
    return m_settings->value(s_systemFixedFontName, "Monospace").toString();
 | 
						|
}
 | 
						|
 | 
						|
qreal HintsSettings::systemFontPointSize() const
 | 
						|
{
 | 
						|
    return m_settings->value(s_systemPointFontSize, 9).toDouble();
 | 
						|
}
 | 
						|
 | 
						|
bool HintsSettings::darkMode()
 | 
						|
{
 | 
						|
    return m_settings->value(s_darkModeName, false).toBool();
 | 
						|
}
 | 
						|
 | 
						|
void HintsSettings::onFileChanged(const QString &path)
 | 
						|
{
 | 
						|
    Q_UNUSED(path);
 | 
						|
 | 
						|
    QVariantMap map;
 | 
						|
    for (const QString &value : m_settings->allKeys()) {
 | 
						|
        map[value] = m_settings->value(value);
 | 
						|
    }
 | 
						|
 | 
						|
    m_settings->sync();
 | 
						|
 | 
						|
    for (const QString &value : m_settings->allKeys()) {
 | 
						|
        const QVariant &oldValue = map.value(value);
 | 
						|
        const QVariant &newValue = m_settings->value(value);
 | 
						|
 | 
						|
        if (oldValue != newValue) {
 | 
						|
            if (value == s_systemFontName)
 | 
						|
                emit systemFontChanged(newValue.toString());
 | 
						|
            else if (value == s_systemFixedFontName)
 | 
						|
                emit systemFixedFontChanged(newValue.toString());
 | 
						|
            else if (value == s_systemPointFontSize)
 | 
						|
                emit systemFontPointSizeChanged(newValue.toDouble());
 | 
						|
            else if (value == s_darkModeName) {
 | 
						|
                emit darkModeChanged(newValue.toBool());
 | 
						|
                // Need to update the icon to dark
 | 
						|
 | 
						|
                if (m_iconTheme.contains("Crule"))
 | 
						|
                    m_hints[QPlatformTheme::SystemIconThemeName] = darkMode() ? s_darkIconName : s_lightIconName;
 | 
						|
 | 
						|
                emit iconThemeChanged();
 | 
						|
            } else if (value == "IconTheme") {
 | 
						|
                if (!m_iconTheme.contains("Crule")) {
 | 
						|
                    m_iconTheme = newValue.toString();
 | 
						|
                    m_hints[QPlatformTheme::SystemIconThemeName] = m_iconTheme;
 | 
						|
                }
 | 
						|
 | 
						|
                emit iconThemeChanged();
 | 
						|
            }
 | 
						|
        }
 | 
						|
    }
 | 
						|
 | 
						|
    bool fileDeleted = !m_fileWatcher->files().contains(m_settingsFile);
 | 
						|
    if (fileDeleted)
 | 
						|
        m_fileWatcher->addPath(m_settingsFile);
 | 
						|
}
 |