diff --git a/kirigami-plasmadesktop-integration/plasmadesktoptheme.h b/kirigami-plasmadesktop-integration/plasmadesktoptheme.h --- a/kirigami-plasmadesktop-integration/plasmadesktoptheme.h +++ b/kirigami-plasmadesktop-integration/plasmadesktoptheme.h @@ -25,6 +25,7 @@ #include #include #include +#include class PlasmaDesktopTheme; class KIconLoader; diff --git a/kirigami-plasmadesktop-integration/plasmadesktoptheme.cpp b/kirigami-plasmadesktop-integration/plasmadesktoptheme.cpp --- a/kirigami-plasmadesktop-integration/plasmadesktoptheme.cpp +++ b/kirigami-plasmadesktop-integration/plasmadesktoptheme.cpp @@ -40,6 +40,110 @@ Q_GLOBAL_STATIC(IconLoaderSingleton, privateIconLoaderSelf) +class StyleSingleton : public QObject +{ + Q_OBJECT + +public: + struct Colors { + QPalette palette; + KColorScheme selectionScheme; + KColorScheme scheme; + }; + + explicit StyleSingleton() + : QObject() + , buttonScheme(QPalette::Active, KColorScheme::ColorSet::Button) + , viewScheme(QPalette::Active, KColorScheme::ColorSet::View) + { + connect(qGuiApp, &QGuiApplication::paletteChanged, + this, &StyleSingleton::refresh); + } + + void refresh() + { + m_cache.clear(); + buttonScheme = KColorScheme(QPalette::Active, KColorScheme::ColorSet::Button); + viewScheme = KColorScheme(QPalette::Active, KColorScheme::ColorSet::View); + + Q_EMIT paletteChanged(); + } + + Colors loadColors(Kirigami::PlatformTheme::ColorSet cs, QPalette::ColorGroup group) + { + const auto key = qMakePair(cs, group); + auto it = m_cache.constFind(key); + if (it != m_cache.constEnd()) + return *it; + + using Kirigami::PlatformTheme; + + KColorScheme::ColorSet set; + + switch (cs) { + case PlatformTheme::Button: + set = KColorScheme::ColorSet::Button; + break; + case PlatformTheme::Selection: + set = KColorScheme::ColorSet::Selection; + break; + case PlatformTheme::Tooltip: + set = KColorScheme::ColorSet::Tooltip; + break; + case PlatformTheme::View: + set = KColorScheme::ColorSet::View; + break; + case PlatformTheme::Complementary: + set = KColorScheme::ColorSet::Complementary; + break; + case PlatformTheme::Window: + default: + set = KColorScheme::ColorSet::Window; + } + + Colors ret = {{}, KColorScheme(group, KColorScheme::ColorSet::Selection), KColorScheme(group, set)}; + + QPalette pal; + static const QPalette::ColorGroup states[3] = { QPalette::Active, QPalette::Inactive, QPalette::Disabled }; + for (int i = 0; i < 3; i++) { + QPalette::ColorGroup state = states[i]; + pal.setBrush(state, QPalette::WindowText, ret.scheme.foreground()); + pal.setBrush(state, QPalette::Window, ret.scheme.background()); + pal.setBrush(state, QPalette::Base, ret.scheme.background()); + pal.setBrush(state, QPalette::Text, ret.scheme.foreground()); + pal.setBrush(state, QPalette::Button, ret.scheme.background()); + pal.setBrush(state, QPalette::ButtonText, ret.scheme.foreground()); + pal.setBrush(state, QPalette::Highlight, ret.selectionScheme.background()); + pal.setBrush(state, QPalette::HighlightedText, ret.selectionScheme.foreground()); + pal.setBrush(state, QPalette::ToolTipBase, ret.scheme.background()); + pal.setBrush(state, QPalette::ToolTipText, ret.scheme.foreground()); + + pal.setColor(state, QPalette::Light, ret.scheme.shade(KColorScheme::LightShade)); + pal.setColor(state, QPalette::Midlight, ret.scheme.shade(KColorScheme::MidlightShade)); + pal.setColor(state, QPalette::Mid, ret.scheme.shade(KColorScheme::MidShade)); + pal.setColor(state, QPalette::Dark, ret.scheme.shade(KColorScheme::DarkShade)); + pal.setColor(state, QPalette::Shadow, ret.scheme.shade(KColorScheme::ShadowShade)); + + pal.setBrush(state, QPalette::AlternateBase, ret.scheme.background(KColorScheme::AlternateBackground)); + pal.setBrush(state, QPalette::Link, ret.scheme.foreground(KColorScheme::LinkText)); + pal.setBrush(state, QPalette::LinkVisited, ret.scheme.foreground(KColorScheme::VisitedText)); + } + ret.palette = pal; + m_cache.insert(key, ret); + return ret; + } + + KColorScheme buttonScheme; + KColorScheme viewScheme; + +Q_SIGNALS: + void paletteChanged(); + +private: + QHash, Colors> m_cache; +}; +Q_GLOBAL_STATIC_WITH_ARGS(QScopedPointer, s_style, (new StyleSingleton)); + PlasmaDesktopTheme::PlasmaDesktopTheme(QObject *parent) : PlatformTheme(parent) { @@ -69,11 +173,12 @@ } //TODO: correct? depends from https://codereview.qt-project.org/206889 - connect(qApp, &QGuiApplication::fontDatabaseChanged, this, [this]() {setDefaultFont(qApp->font());}); + connect(qGuiApp, &QGuiApplication::fontDatabaseChanged, this, [this]() {setDefaultFont(qApp->font());}); connect(this, &PlasmaDesktopTheme::colorSetChanged, this, &PlasmaDesktopTheme::syncColors); - connect(qApp, &QGuiApplication::paletteChanged, + + connect(s_style->data(), &StyleSingleton::paletteChanged, this, &PlasmaDesktopTheme::syncColors); syncColors(); @@ -101,29 +206,6 @@ void PlasmaDesktopTheme::syncColors() { - KColorScheme::ColorSet set; - - switch (colorSet()) { - case PlatformTheme::Button: - set = KColorScheme::ColorSet::Button; - break; - case PlatformTheme::Selection: - set = KColorScheme::ColorSet::Selection; - break; - case PlatformTheme::Tooltip: - set = KColorScheme::ColorSet::Tooltip; - break; - case PlatformTheme::View: - set = KColorScheme::ColorSet::View; - break; - case PlatformTheme::Complementary: - set = KColorScheme::ColorSet::Complementary; - break; - case PlatformTheme::Window: - default: - set = KColorScheme::ColorSet::Window; - } - QPalette::ColorGroup group = QPalette::Active; if (m_parentItem) { if (!m_parentItem->isEnabled()) { @@ -137,69 +219,39 @@ } } - const KColorScheme selectionScheme(group, KColorScheme::ColorSet::Selection); - const KColorScheme scheme(group, set); + const auto colors = (*s_style)->loadColors(colorSet(), group); + setPalette(colors.palette); //foreground - setTextColor(scheme.foreground(KColorScheme::NormalText).color()); - setDisabledTextColor(scheme.foreground(KColorScheme::InactiveText).color()); - setHighlightedTextColor(selectionScheme.foreground(KColorScheme::NormalText).color()); - setActiveTextColor(scheme.foreground(KColorScheme::ActiveText).color()); - setLinkColor(scheme.foreground(KColorScheme::LinkText).color()); - setVisitedLinkColor(scheme.foreground(KColorScheme::VisitedText).color()); - setNegativeTextColor(scheme.foreground(KColorScheme::NegativeText).color()); - setNeutralTextColor(scheme.foreground(KColorScheme::NeutralText).color()); - setPositiveTextColor(scheme.foreground(KColorScheme::PositiveText).color()); + setTextColor(colors.scheme.foreground(KColorScheme::NormalText).color()); + setDisabledTextColor(colors.scheme.foreground(KColorScheme::InactiveText).color()); + setHighlightedTextColor(colors.selectionScheme.foreground(KColorScheme::NormalText).color()); + setActiveTextColor(colors.scheme.foreground(KColorScheme::ActiveText).color()); + setLinkColor(colors.scheme.foreground(KColorScheme::LinkText).color()); + setVisitedLinkColor(colors.scheme.foreground(KColorScheme::VisitedText).color()); + setNegativeTextColor(colors.scheme.foreground(KColorScheme::NegativeText).color()); + setNeutralTextColor(colors.scheme.foreground(KColorScheme::NeutralText).color()); + setPositiveTextColor(colors.scheme.foreground(KColorScheme::PositiveText).color()); //background - setBackgroundColor(scheme.background(KColorScheme::NormalBackground).color()); - setHighlightColor(selectionScheme.background(KColorScheme::NormalBackground).color()); + setBackgroundColor(colors.scheme.background(KColorScheme::NormalBackground).color()); + setHighlightColor(colors.selectionScheme.background(KColorScheme::NormalBackground).color()); //decoration - setHoverColor(scheme.decoration(KColorScheme::HoverColor).color()); - setFocusColor(scheme.decoration(KColorScheme::FocusColor).color()); - - QPalette pal = palette(); - static const QPalette::ColorGroup states[3] = { QPalette::Active, QPalette::Inactive, QPalette::Disabled }; - for (int i = 0; i < 3; i++) { - QPalette::ColorGroup state = states[i]; - pal.setBrush(state, QPalette::WindowText, scheme.foreground()); - pal.setBrush(state, QPalette::Window, scheme.background()); - pal.setBrush(state, QPalette::Base, scheme.background()); - pal.setBrush(state, QPalette::Text, scheme.foreground()); - pal.setBrush(state, QPalette::Button, scheme.background()); - pal.setBrush(state, QPalette::ButtonText, scheme.foreground()); - pal.setBrush(state, QPalette::Highlight, selectionScheme.background()); - pal.setBrush(state, QPalette::HighlightedText, selectionScheme.foreground()); - pal.setBrush(state, QPalette::ToolTipBase, scheme.background()); - pal.setBrush(state, QPalette::ToolTipText, scheme.foreground()); - - pal.setColor(state, QPalette::Light, scheme.shade(KColorScheme::LightShade)); - pal.setColor(state, QPalette::Midlight, scheme.shade(KColorScheme::MidlightShade)); - pal.setColor(state, QPalette::Mid, scheme.shade(KColorScheme::MidShade)); - pal.setColor(state, QPalette::Dark, scheme.shade(KColorScheme::DarkShade)); - pal.setColor(state, QPalette::Shadow, scheme.shade(KColorScheme::ShadowShade)); - - pal.setBrush(state, QPalette::AlternateBase, scheme.background(KColorScheme::AlternateBackground)); - pal.setBrush(state, QPalette::Link, scheme.foreground(KColorScheme::LinkText)); - pal.setBrush(state, QPalette::LinkVisited, scheme.foreground(KColorScheme::VisitedText)); - } - setPalette(pal); - + setHoverColor(colors.scheme.decoration(KColorScheme::HoverColor).color()); + setFocusColor(colors.scheme.decoration(KColorScheme::FocusColor).color()); //legacy stuff - const KColorScheme buttonScheme(QPalette::Active, KColorScheme::ColorSet::Button); - m_buttonTextColor = buttonScheme.foreground(KColorScheme::NormalText).color(); - m_buttonBackgroundColor = buttonScheme.background(KColorScheme::NormalBackground).color(); - m_buttonHoverColor = buttonScheme.decoration(KColorScheme::HoverColor).color(); - m_buttonFocusColor = buttonScheme.decoration(KColorScheme::FocusColor).color(); - - const KColorScheme viewScheme(QPalette::Active, KColorScheme::ColorSet::View); - m_viewTextColor = viewScheme.foreground(KColorScheme::NormalText).color(); - m_viewBackgroundColor = viewScheme.background(KColorScheme::NormalBackground).color(); - m_viewHoverColor = viewScheme.decoration(KColorScheme::HoverColor).color(); - m_viewFocusColor = viewScheme.decoration(KColorScheme::FocusColor).color(); + m_buttonTextColor = (*s_style)->buttonScheme.foreground(KColorScheme::NormalText).color(); + m_buttonBackgroundColor = (*s_style)->buttonScheme.background(KColorScheme::NormalBackground).color(); + m_buttonHoverColor = (*s_style)->buttonScheme.decoration(KColorScheme::HoverColor).color(); + m_buttonFocusColor = (*s_style)->buttonScheme.decoration(KColorScheme::FocusColor).color(); + + m_viewTextColor = (*s_style)->viewScheme.foreground(KColorScheme::NormalText).color(); + m_viewBackgroundColor = (*s_style)->viewScheme.background(KColorScheme::NormalBackground).color(); + m_viewHoverColor = (*s_style)->viewScheme.decoration(KColorScheme::HoverColor).color(); + m_viewFocusColor = (*s_style)->viewScheme.decoration(KColorScheme::FocusColor).color(); emit colorsChanged(); } @@ -253,4 +305,4 @@ return m_viewFocusColor; } -#include "moc_plasmadesktoptheme.cpp" +#include "plasmadesktoptheme.moc"