diff options
author | Axel Spoerl <[email protected]> | 2025-02-28 08:35:20 +0100 |
---|---|---|
committer | Axel Spoerl <[email protected]> | 2025-03-17 20:41:29 +0100 |
commit | 70b8dd2b7eb1a874ff0ac8b4e42b03d639321394 (patch) | |
tree | 70fccc906a5bfb5ff95d0e99b7917cbd524467c4 | |
parent | dd7065616665e983349263bc5d600d764e164003 (diff) |
Re-implement QPlatformTheme::requestColorScheme() in QKdeTheme
QKdeTheme remained unresponsive to programmatic color scheme changes,
after QPlatformTheme::requestColorScheme() had been introduced.
Add functionality to QKdeTheme.
Fall back to qt_fusion_palette, when the requested color scheme isn't
supported by the current KDE theme (e.g. Adwaita-dark doesn't support
light mode).
Functionality has to be manually tested with the widget gallery
example.
Task-number: QTBUG-132929
Fixes: QTBUG-134023
Change-Id: I37e56cc36803dcb8527a897ddcada29b322a5ada
Reviewed-by: Santhosh Kumar <[email protected]>
Reviewed-by: Piotr WierciĆski <[email protected]>
-rw-r--r-- | src/gui/platform/unix/qkdetheme.cpp | 57 | ||||
-rw-r--r-- | src/gui/platform/unix/qkdetheme_p.h | 2 |
2 files changed, 46 insertions, 13 deletions
diff --git a/src/gui/platform/unix/qkdetheme.cpp b/src/gui/platform/unix/qkdetheme.cpp index 8a1e566c181..be5655028a9 100644 --- a/src/gui/platform/unix/qkdetheme.cpp +++ b/src/gui/platform/unix/qkdetheme.cpp @@ -114,6 +114,7 @@ public: int startDragTime = 500; int cursorBlinkRate = 1000; Qt::ColorScheme m_colorScheme = Qt::ColorScheme::Unknown; + Qt::ColorScheme m_requestedColorScheme = Qt::ColorScheme::Unknown; void updateColorScheme(const QString &themeName); private: @@ -124,6 +125,7 @@ private: void settingChangedHandler(QDBusListener::Provider provider, QDBusListener::Setting setting, const QString &value); + Qt::ColorScheme colorSchemeFromPalette() const; #endif // QT_NO_DBUS }; @@ -647,9 +649,29 @@ QIcon QKdeTheme::fileIcon(const QFileInfo &fileInfo, QPlatformTheme::IconOptions #endif } +void QKdeTheme::requestColorScheme(Qt::ColorScheme scheme) +{ + Q_D(QKdeTheme); + if (d->m_requestedColorScheme == scheme) + return; + qCDebug(lcQpaThemeKde) << scheme << "has been requested. Theme supports color scheme:" + << d->m_colorScheme; + d->m_requestedColorScheme = scheme; + d->refresh(); +} + Qt::ColorScheme QKdeTheme::colorScheme() const { - return d_func()->m_colorScheme; + Q_D(const QKdeTheme); +#ifdef QT_DEBUG + if (d->m_requestedColorScheme != Qt::ColorScheme::Unknown + && d->m_requestedColorScheme != d->m_colorScheme) { + qCDebug(lcQpaThemeKde) << "Reuqested color scheme" << d->m_requestedColorScheme + << "differs from theme color scheme" << d->m_colorScheme; + } +#endif + return (d->m_requestedColorScheme == Qt::ColorScheme::Unknown) + ? d->m_colorScheme :d->m_requestedColorScheme; } /*! @@ -674,23 +696,34 @@ void QKdeThemePrivate::updateColorScheme(const QString &themeName) return; } - if (systemPalette) { - if (systemPalette->text().color().lightness() < systemPalette->base().color().lightness()) { - m_colorScheme = Qt::ColorScheme::Light; - return; - } - if (systemPalette->text().color().lightness() > systemPalette->base().color().lightness()) { - m_colorScheme = Qt::ColorScheme::Dark; - return; - } - } + m_colorScheme = colorSchemeFromPalette(); +} - m_colorScheme = Qt::ColorScheme::Unknown; +Qt::ColorScheme QKdeThemePrivate::colorSchemeFromPalette() const +{ + if (!systemPalette) + return Qt::ColorScheme::Unknown; + if (systemPalette->text().color().lightness() < systemPalette->base().color().lightness()) + return Qt::ColorScheme::Light; + if (systemPalette->text().color().lightness() > systemPalette->base().color().lightness()) + return Qt::ColorScheme::Dark; + return Qt::ColorScheme::Unknown; } const QPalette *QKdeTheme::palette(Palette type) const { Q_D(const QKdeTheme); + if (d->m_requestedColorScheme != Qt::ColorScheme::Unknown + && d->m_requestedColorScheme != d->m_colorScheme) { + qCDebug(lcQpaThemeKde) << "Current KDE theme doesn't support reuqested color scheme" + << d->m_requestedColorScheme << "Falling back to fusion palette:" + << type; + return QPlatformTheme::palette(type); + } + + if (colorScheme() != d->m_requestedColorScheme) + return d->resources.palettes[Palette::SystemPalette]; + return d->resources.palettes[type]; } diff --git a/src/gui/platform/unix/qkdetheme_p.h b/src/gui/platform/unix/qkdetheme_p.h index 878075585c3..e0ac51d7fa4 100644 --- a/src/gui/platform/unix/qkdetheme_p.h +++ b/src/gui/platform/unix/qkdetheme_p.h @@ -51,7 +51,7 @@ public: const QPalette *palette(Palette type = SystemPalette) const override; Qt::ColorScheme colorScheme() const override; - //void requestColorScheme(Qt::ColorScheme scheme) override; + void requestColorScheme(Qt::ColorScheme scheme) override; const QFont *font(Font type) const override; #ifndef QT_NO_DBUS |