File indexing completed on 2024-03-24 03:57:20

0001 /* vi: ts=8 sts=4 sw=4
0002 
0003     This file is part of the KDE project, module kdecore.
0004     SPDX-FileCopyrightText: 2000 Geert Jansen <jansen@kde.org>
0005     SPDX-FileCopyrightText: 2000 Antonio Larrosa <larrosa@kde.org>
0006 
0007     SPDX-License-Identifier: LGPL-2.0-only
0008 */
0009 
0010 #include "kiconcolors.h"
0011 #include <KColorScheme>
0012 
0013 static QString STYLESHEET_TEMPLATE()
0014 {
0015     /* clang-format off */
0016     return QStringLiteral(".ColorScheme-Text { color:%1; }\
0017 .ColorScheme-Background{ color:%2; }\
0018 .ColorScheme-Highlight{ color:%3; }\
0019 .ColorScheme-HighlightedText{ color:%4; }\
0020 .ColorScheme-PositiveText{ color:%5; }\
0021 .ColorScheme-NeutralText{ color:%6; }\
0022 .ColorScheme-NegativeText{ color:%7; }\
0023 .ColorScheme-ActiveText{ color:%8; }\
0024 .ColorScheme-Complement{ color:%9; }\
0025 .ColorScheme-Contrast{ color:%10; }\
0026 .ColorScheme-Accent{ color:%11; }\
0027 ");
0028     /* clang-format on */
0029 }
0030 
0031 class KIconColorsPrivate : public QSharedData
0032 {
0033 public:
0034     KIconColorsPrivate()
0035     {
0036     }
0037     KIconColorsPrivate(const KIconColorsPrivate &other)
0038         : QSharedData(other)
0039         , text(other.text)
0040         , background(other.background)
0041         , highlight(other.highlight)
0042         , highlightedText(other.highlightedText)
0043         , accent(other.accent)
0044         , positiveText(other.positiveText)
0045         , neutralText(other.neutralText)
0046         , negativeText(other.negativeText)
0047     {
0048     }
0049     ~KIconColorsPrivate()
0050     {
0051     }
0052 
0053     QColor text;
0054     QColor background;
0055     QColor highlight;
0056     QColor highlightedText;
0057     QColor accent;
0058     QColor positiveText;
0059     QColor neutralText;
0060     QColor negativeText;
0061     QColor activeText;
0062     static std::optional<QPalette> lastPalette;
0063     static std::optional<KColorScheme> lastColorScheme;
0064 };
0065 
0066 std::optional<QPalette> KIconColorsPrivate::lastPalette;
0067 std::optional<KColorScheme> KIconColorsPrivate::lastColorScheme;
0068 
0069 KIconColors::KIconColors()
0070     : KIconColors(QPalette())
0071 {
0072 }
0073 
0074 KIconColors::KIconColors(const KIconColors &other)
0075     : d_ptr(other.d_ptr)
0076 {
0077 }
0078 
0079 KIconColors KIconColors::operator=(const KIconColors &other)
0080 {
0081     if (d_ptr != other.d_ptr) {
0082         d_ptr = other.d_ptr;
0083     }
0084     return *this;
0085 }
0086 
0087 KIconColors::KIconColors(const QColor &colors)
0088     : d_ptr(new KIconColorsPrivate)
0089 {
0090     Q_D(KIconColors);
0091     d->text = colors;
0092     d->background = colors;
0093     d->highlight = colors;
0094     d->highlightedText = colors;
0095     d->positiveText = colors;
0096     d->neutralText = colors;
0097     d->negativeText = colors;
0098     d->accent = colors;
0099 }
0100 
0101 KIconColors::KIconColors(const QPalette &palette)
0102     : d_ptr(new KIconColorsPrivate)
0103 {
0104     Q_D(KIconColors);
0105     d->text = palette.windowText().color();
0106     d->background = palette.window().color();
0107     d->highlight = palette.highlight().color();
0108     d->highlightedText = palette.highlightedText().color();
0109 #if QT_VERSION >= QT_VERSION_CHECK(6, 6, 0)
0110     d->accent = palette.accent().color();
0111 #else
0112     d->accent = palette.highlight().color();
0113 #endif
0114 
0115     if (!d->lastColorScheme || !d->lastPalette || palette != d->lastPalette) {
0116         d->lastPalette = palette;
0117         d->lastColorScheme = KColorScheme(QPalette::Active, KColorScheme::Window);
0118     }
0119 
0120     d->positiveText = d->lastColorScheme->foreground(KColorScheme::PositiveText).color().name();
0121     d->neutralText = d->lastColorScheme->foreground(KColorScheme::NeutralText).color().name();
0122     d->negativeText = d->lastColorScheme->foreground(KColorScheme::NegativeText).color().name();
0123     d->activeText = d->lastColorScheme->foreground(KColorScheme::ActiveText).color().name();
0124 }
0125 
0126 KIconColors::~KIconColors()
0127 {
0128 }
0129 
0130 qreal luma(const QColor &color) {
0131     return (0.299 * color.red() + 0.587 * color.green() + 0.114 * color.blue()) / 255;
0132 }
0133 
0134 QString KIconColors::stylesheet(KIconLoader::States state) const
0135 {
0136     Q_D(const KIconColors);
0137 
0138     const QColor complement =
0139         luma(d->background) > 0.5 ? Qt::white : Qt::black;
0140 
0141     const QColor contrast =
0142         luma(d->background) > 0.5 ? Qt::black : Qt::white;
0143 
0144     return STYLESHEET_TEMPLATE()
0145         .arg(state == KIconLoader::SelectedState ? d->highlightedText.name() : d->text.name())
0146         .arg(state == KIconLoader::SelectedState ? d->highlight.name() : d->background.name())
0147         .arg(state == KIconLoader::SelectedState ? d->highlightedText.name() : d->highlight.name())
0148         .arg(state == KIconLoader::SelectedState ? d->highlight.name() : d->highlightedText.name())
0149         .arg(state == KIconLoader::SelectedState ? d->highlightedText.name() : d->positiveText.name())
0150         .arg(state == KIconLoader::SelectedState ? d->highlightedText.name() : d->neutralText.name())
0151         .arg(state == KIconLoader::SelectedState ? d->highlightedText.name() : d->negativeText.name())
0152         .arg(state == KIconLoader::SelectedState ? d->highlightedText.name() : d->activeText.name())
0153         .arg(complement.name())
0154         .arg(contrast.name())
0155         .arg(state == KIconLoader::SelectedState ? d->accent.name() : d->highlightedText.name());
0156 }
0157 
0158 QColor KIconColors::highlight() const
0159 {
0160     Q_D(const KIconColors);
0161     return d->highlight;
0162 }
0163 
0164 QColor KIconColors::highlightedText() const
0165 {
0166     Q_D(const KIconColors);
0167     return d->highlightedText;
0168 }
0169 
0170 QColor KIconColors::accent() const
0171 {
0172     Q_D(const KIconColors);
0173     return d->accent;
0174 }
0175 
0176 QColor KIconColors::background() const
0177 {
0178     Q_D(const KIconColors);
0179     return d->background;
0180 }
0181 
0182 QColor KIconColors::text() const
0183 {
0184     Q_D(const KIconColors);
0185     return d->text;
0186 }
0187 
0188 QColor KIconColors::negativeText() const
0189 {
0190     Q_D(const KIconColors);
0191     return d->negativeText;
0192 }
0193 
0194 QColor KIconColors::positiveText() const
0195 {
0196     Q_D(const KIconColors);
0197     return d->positiveText;
0198 }
0199 
0200 QColor KIconColors::neutralText() const
0201 {
0202     Q_D(const KIconColors);
0203     return d->neutralText;
0204 }
0205 
0206 QColor KIconColors::activeText() const
0207 {
0208     Q_D(const KIconColors);
0209     return d->activeText;
0210 }
0211 
0212 void KIconColors::setText(const QColor &color)
0213 {
0214     Q_D(KIconColors);
0215     d->text = color;
0216 }
0217 
0218 void KIconColors::setBackground(const QColor &color)
0219 {
0220     Q_D(KIconColors);
0221     d->background = color;
0222 }
0223 
0224 void KIconColors::setHighlight(const QColor &color)
0225 {
0226     Q_D(KIconColors);
0227     d->highlight = color;
0228 }
0229 
0230 void KIconColors::setHighlightedText(const QColor &color)
0231 {
0232     Q_D(KIconColors);
0233     d->highlightedText = color;
0234 }
0235 
0236 void KIconColors::setAccent(const QColor &color)
0237 {
0238     Q_D(KIconColors);
0239     d->accent = color;
0240 }
0241 
0242 void KIconColors::setNegativeText(const QColor &color)
0243 {
0244     Q_D(KIconColors);
0245     d->negativeText = color;
0246 }
0247 
0248 void KIconColors::setNeutralText(const QColor &color)
0249 {
0250     Q_D(KIconColors);
0251     d->neutralText = color;
0252 }
0253 
0254 void KIconColors::setPositiveText(const QColor &color)
0255 {
0256     Q_D(KIconColors);
0257     d->positiveText = color;
0258 }
0259 
0260 void KIconColors::setActiveText(const QColor &color)
0261 {
0262     Q_D(KIconColors);
0263     d->activeText = color;
0264 }