File indexing completed on 2025-03-09 03:40:23
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 }