forked from github_mirror/framelesshelper
parent
66c2c60a09
commit
8d5ea49d52
|
@ -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();
|
||||||
|
|
|
@ -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;
|
||||||
|
|
|
@ -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
|
||||||
|
|
Loading…
Reference in New Issue