allow user override system theme

Task-number: #216
This commit is contained in:
Yuhang Zhao 2023-05-18 16:08:33 +08:00
parent 66c2c60a09
commit 8d5ea49d52
3 changed files with 37 additions and 2 deletions

View File

@ -36,7 +36,7 @@ class FRAMELESSHELPER_CORE_API FramelessManager : public QObject
Q_OBJECT Q_OBJECT
Q_DECLARE_PRIVATE(FramelessManager) Q_DECLARE_PRIVATE(FramelessManager)
Q_DISABLE_COPY_MOVE(FramelessManager) Q_DISABLE_COPY_MOVE(FramelessManager)
Q_PROPERTY(Global::SystemTheme systemTheme READ systemTheme NOTIFY systemThemeChanged FINAL) Q_PROPERTY(Global::SystemTheme systemTheme READ systemTheme WRITE setOverrideTheme NOTIFY systemThemeChanged FINAL)
Q_PROPERTY(QColor systemAccentColor READ systemAccentColor NOTIFY systemThemeChanged FINAL) Q_PROPERTY(QColor systemAccentColor READ systemAccentColor NOTIFY systemThemeChanged FINAL)
Q_PROPERTY(QString wallpaper READ wallpaper NOTIFY wallpaperChanged FINAL) Q_PROPERTY(QString wallpaper READ wallpaper NOTIFY wallpaperChanged FINAL)
Q_PROPERTY(Global::WallpaperAspectStyle wallpaperAspectStyle READ wallpaperAspectStyle NOTIFY wallpaperChanged FINAL) Q_PROPERTY(Global::WallpaperAspectStyle wallpaperAspectStyle READ wallpaperAspectStyle NOTIFY wallpaperChanged FINAL)
@ -55,6 +55,7 @@ public:
public Q_SLOTS: public Q_SLOTS:
void addWindow(const SystemParameters *params); void addWindow(const SystemParameters *params);
void removeWindow(const WId windowId); void removeWindow(const WId windowId);
void setOverrideTheme(const Global::SystemTheme theme);
Q_SIGNALS: Q_SIGNALS:
void systemThemeChanged(); void systemThemeChanged();

View File

@ -60,12 +60,16 @@ public:
Q_NODISCARD static bool usePureQtImplementation(); Q_NODISCARD static bool usePureQtImplementation();
void setOverrideTheme(const Global::SystemTheme theme);
Q_NODISCARD bool isThemeOverrided() const;
private: private:
void initialize(); void initialize();
private: private:
FramelessManager *q_ptr = nullptr; FramelessManager *q_ptr = nullptr;
Global::SystemTheme m_systemTheme = Global::SystemTheme::Unknown; Global::SystemTheme m_systemTheme = Global::SystemTheme::Unknown;
std::optional<Global::SystemTheme> m_overrideTheme = std::nullopt;
QColor m_accentColor = {}; QColor m_accentColor = {};
#ifdef Q_OS_WINDOWS #ifdef Q_OS_WINDOWS
Global::DwmColorizationArea m_colorizationArea = Global::DwmColorizationArea::None; Global::DwmColorizationArea m_colorizationArea = Global::DwmColorizationArea::None;

View File

@ -168,6 +168,11 @@ QFont FramelessManagerPrivate::getIconFont()
SystemTheme FramelessManagerPrivate::systemTheme() const SystemTheme FramelessManagerPrivate::systemTheme() const
{ {
// The user's choice has top priority.
if (isThemeOverrided()) {
const QMutexLocker locker(&g_helper()->mutex);
return m_overrideTheme.value();
}
const QMutexLocker locker(&g_helper()->mutex); const QMutexLocker locker(&g_helper()->mutex);
return m_systemTheme; return m_systemTheme;
} }
@ -270,7 +275,8 @@ void FramelessManagerPrivate::notifySystemThemeHasChangedOrNot()
notify = true; notify = true;
} }
#endif #endif
if (notify) { // Don't emit the signal if the user has overrided the global theme.
if (notify && (m_overrideTheme.value_or(SystemTheme::Unknown) == SystemTheme::Unknown)) {
Q_Q(FramelessManager); Q_Q(FramelessManager);
Q_EMIT q->systemThemeChanged(); Q_EMIT q->systemThemeChanged();
DEBUG.nospace() << "System theme changed. Current theme: " << m_systemTheme DEBUG.nospace() << "System theme changed. Current theme: " << m_systemTheme
@ -316,6 +322,24 @@ bool FramelessManagerPrivate::usePureQtImplementation()
return result; return result;
} }
void FramelessManagerPrivate::setOverrideTheme(const SystemTheme theme)
{
const QMutexLocker locker(&g_helper()->mutex);
if (theme == SystemTheme::Unknown) {
m_overrideTheme = std::nullopt;
} else {
m_overrideTheme = theme;
}
Q_Q(FramelessManager);
Q_EMIT q->systemThemeChanged();
}
bool FramelessManagerPrivate::isThemeOverrided() const
{
const QMutexLocker locker(&g_helper()->mutex);
return (m_overrideTheme.value_or(SystemTheme::Unknown) != SystemTheme::Unknown);
}
void FramelessManagerPrivate::initialize() void FramelessManagerPrivate::initialize()
{ {
const QMutexLocker locker(&g_helper()->mutex); const QMutexLocker locker(&g_helper()->mutex);
@ -409,4 +433,10 @@ void FramelessManager::removeWindow(const WId windowId)
d->removeWindow(windowId); d->removeWindow(windowId);
} }
void FramelessManager::setOverrideTheme(const SystemTheme theme)
{
Q_D(FramelessManager);
d->setOverrideTheme(theme);
}
FRAMELESSHELPER_END_NAMESPACE FRAMELESSHELPER_END_NAMESPACE