diff --git a/src/kcolorscheme.h b/src/kcolorscheme.h --- a/src/kcolorscheme.h +++ b/src/kcolorscheme.h @@ -351,6 +351,15 @@ */ explicit KColorScheme(QPalette::ColorGroup = QPalette::Normal, ColorSet = View, KSharedConfigPtr = KSharedConfigPtr()); + /** + * Drop the accent colors overriding the colorscheme's colors, revealing the + * true colorscheme. + * + * @note You should pass the same parameters as you did to the constructor of the KColorScheme + * to this function. + */ + void dropAccentColors(QPalette::ColorGroup = QPalette::Normal, ColorSet = View, KSharedConfigPtr = KSharedConfigPtr()); + /** * Retrieve the requested background brush. */ diff --git a/src/kcolorscheme.cpp b/src/kcolorscheme.cpp --- a/src/kcolorscheme.cpp +++ b/src/kcolorscheme.cpp @@ -280,6 +280,9 @@ explicit KColorSchemePrivate(const KSharedConfigPtr &, QPalette::ColorGroup, const char *, const SetDefaultColors &, const QBrush &); ~KColorSchemePrivate() {} + void loadAccentIntoBackground(const KSharedConfigPtr &, const char *, const SetDefaultColors &); + void dropAccentColors(const KSharedConfigPtr &, const char *, const SetDefaultColors &); + QBrush background(KColorScheme::BackgroundRole) const; QBrush foreground(KColorScheme::ForegroundRole) const; QBrush decoration(KColorScheme::DecorationRole) const; @@ -338,25 +341,53 @@ init(config, state, group, defaults); } +void KColorSchemePrivate::loadAccentIntoBackground(const KSharedConfigPtr &config, + const char *group, + const SetDefaultColors &defaults) +{ + KConfigGroup cfg(config, group); + KConfigGroup accent(KSharedConfig::openConfig(), "Accent"); + + _brushes.bg[KColorScheme::NormalBackground] = accent.readEntry("Background", cfg.readEntry("BackgroundNormal", SET_DEFAULT(NormalBackground))); + _brushes.bg[KColorScheme::AlternateBackground] = accent.readEntry("Background", cfg.readEntry("BackgroundAlternate", SET_DEFAULT(AlternateBackground))); +} + +void KColorSchemePrivate::dropAccentColors(const KSharedConfigPtr &config, + const char *group, + const SetDefaultColors &defaults) +{ + KConfigGroup cfg(config, group); + + _brushes.fg[KColorScheme::ActiveText] = cfg.readEntry("ForegroundActive", SET_DEFAULT(ActiveText)); + _brushes.fg[KColorScheme::LinkText] = cfg.readEntry("ForegroundLink", SET_DEFAULT(LinkText)); + + _brushes.deco[KColorScheme::FocusColor] = cfg.readEntry("DecorationFocus", DECO_DEFAULT(Focus)); + _brushes.deco[KColorScheme::HoverColor] = cfg.readEntry("DecorationHover", DECO_DEFAULT(Hover)); + + _brushes.bg[KColorScheme::NormalBackground] = cfg.readEntry("BackgroundNormal", SET_DEFAULT(NormalBackground)); + _brushes.bg[KColorScheme::AlternateBackground] = cfg.readEntry("BackgroundAlternate", SET_DEFAULT(AlternateBackground)); +} + void KColorSchemePrivate::init(const KSharedConfigPtr &config, QPalette::ColorGroup state, const char *group, const SetDefaultColors &defaults) { KConfigGroup cfg(config, group); + KConfigGroup accent(KSharedConfig::openConfig(), "Accent"); // loaded-from-config colors _brushes.fg[KColorScheme::NormalText] = cfg.readEntry("ForegroundNormal", SET_DEFAULT(NormalText)); _brushes.fg[KColorScheme::InactiveText] = cfg.readEntry("ForegroundInactive", SET_DEFAULT(InactiveText)); - _brushes.fg[KColorScheme::ActiveText] = cfg.readEntry("ForegroundActive", SET_DEFAULT(ActiveText)); - _brushes.fg[KColorScheme::LinkText] = cfg.readEntry("ForegroundLink", SET_DEFAULT(LinkText)); + _brushes.fg[KColorScheme::ActiveText] = accent.readEntry("Foreground", cfg.readEntry("ForegroundActive", SET_DEFAULT(ActiveText))); + _brushes.fg[KColorScheme::LinkText] = accent.readEntry("Foreground", cfg.readEntry("ForegroundLink", SET_DEFAULT(LinkText))); _brushes.fg[KColorScheme::VisitedText] = cfg.readEntry("ForegroundVisited", SET_DEFAULT(VisitedText)); _brushes.fg[KColorScheme::NegativeText] = cfg.readEntry("ForegroundNegative", SET_DEFAULT(NegativeText)); _brushes.fg[KColorScheme::NeutralText] = cfg.readEntry("ForegroundNeutral", SET_DEFAULT(NeutralText)); _brushes.fg[KColorScheme::PositiveText] = cfg.readEntry("ForegroundPositive", SET_DEFAULT(PositiveText)); - _brushes.deco[KColorScheme::FocusColor] = cfg.readEntry("DecorationFocus", DECO_DEFAULT(Focus)); - _brushes.deco[KColorScheme::HoverColor] = cfg.readEntry("DecorationHover", DECO_DEFAULT(Hover)); + _brushes.deco[KColorScheme::FocusColor] = accent.readEntry("Foreground", cfg.readEntry("DecorationFocus", DECO_DEFAULT(Focus))); + _brushes.deco[KColorScheme::HoverColor] = accent.readEntry("AccForegroundent", cfg.readEntry("DecorationHover", DECO_DEFAULT(Hover))); // apply state adjustments if (state != QPalette::Active) { @@ -461,11 +492,14 @@ // ...except tinted with the Selection:NormalBackground color so it looks more like selection if (state == QPalette::Active || (state == QPalette::Inactive && !inactiveSelectionEffect)) { d = new KColorSchemePrivate(config, state, "Colors:Selection", defaultSelectionColors); - } else if (state == QPalette::Inactive) + d.data()->loadAccentIntoBackground(config, "Colors:Selection", defaultSelectionColors); + } else if (state == QPalette::Inactive) { d = new KColorSchemePrivate(config, state, "Colors:Window", defaultWindowColors, KColorScheme(QPalette::Active, Selection, config).background()); - else { // disabled (...and still want this branch when inactive+disabled exists) + d.data()->loadAccentIntoBackground(config, "Colors:Window", defaultWindowColors); + } else { // disabled (...and still want this branch when inactive+disabled exists) d = new KColorSchemePrivate(config, state, "Colors:Window", defaultWindowColors); + d.data()->loadAccentIntoBackground(config, "Colors:Window", defaultWindowColors); } } break; case Tooltip: @@ -479,6 +513,42 @@ } } +void KColorScheme::dropAccentColors(QPalette::ColorGroup state, ColorSet set, KSharedConfigPtr config) +{ + if (!config) { + config = defaultConfig(); + } + + switch (set) { + case Window: + d.data()->dropAccentColors(config, "Colors:Window", defaultWindowColors); + break; + case Button: + d.data()->dropAccentColors(config, "Colors:Button", defaultWindowColors); + break; + case Selection: { + KConfigGroup group(config, "ColorEffects:Inactive"); + bool inactiveSelectionEffect = group.readEntry("ChangeSelectionColor", group.readEntry("Enable", true)); + + if (state == QPalette::Active || (state == QPalette::Inactive && !inactiveSelectionEffect)) { + d.data()->dropAccentColors(config, "Colors:Window", defaultWindowColors); + } else if (state == QPalette::Inactive) { + d.data()->dropAccentColors(config, "Colors:Window", defaultWindowColors); + } else { + d.data()->dropAccentColors(config, "Colors:Window", defaultWindowColors); + } + } break; + case Tooltip: + d.data()->dropAccentColors(config, "Colors:Tooltip", defaultTooltipColors); + break; + case Complementary: + d.data()->dropAccentColors(config, "Colors:Complementary", defaultComplementaryColors); + break; + default: + d.data()->dropAccentColors(config, "Colors:View", defaultViewColors); + } +} + // static int KColorScheme::contrast() {