File indexing completed on 2024-04-21 03:41:43
0001 /* 0002 SPDX-FileCopyrightText: 2010 Etienne Rebetez <etienne.rebetez@oberwallis.ch> 0003 0004 SPDX-License-Identifier: GPL-2.0-or-later 0005 */ 0006 0007 #include "kalziumelementproperty.h" 0008 0009 #include "kalziumdataobject.h" 0010 #include "search.h" 0011 #include "colorutils.h" 0012 0013 #include <KLocalizedString> 0014 #include <QGuiApplication> 0015 #include <QPalette> 0016 0017 #include <prefs.h> 0018 0019 KalziumElementProperty *KalziumElementProperty::instance() 0020 { 0021 static KalziumElementProperty elementProperty; 0022 return &elementProperty; 0023 } 0024 0025 KalziumElementProperty::KalziumElementProperty() 0026 : m_mode(0) 0027 { 0028 m_currentScheme = Prefs::colorschemebox(); 0029 0030 if (schemeList().count() <= m_currentScheme) 0031 m_currentScheme = 0; 0032 0033 m_currentGradient = Prefs::colorgradientbox(); 0034 0035 if (isGradient()) 0036 m_mode = GRADIENTVALUE; 0037 } 0038 0039 KalziumElementProperty::~KalziumElementProperty() = default; 0040 0041 bool KalziumElementProperty::isGradient() 0042 { 0043 return m_currentGradient > 1; 0044 } 0045 0046 void KalziumElementProperty::setScheme(int newScheme) 0047 { 0048 m_currentScheme = newScheme; 0049 Prefs::setColorschemebox(newScheme); 0050 Prefs::self()->save(); 0051 propertyChanged(); 0052 } 0053 0054 void KalziumElementProperty::setGradient(int newGradient) 0055 { 0056 m_currentGradient = newGradient; 0057 Prefs::setColorgradientbox(newGradient); 0058 Prefs::self()->save(); 0059 0060 if (isGradient()) { 0061 m_mode = GRADIENTVALUE; 0062 } else { 0063 m_mode = NORMAL; 0064 } 0065 0066 propertyChanged(); 0067 } 0068 0069 QStringList KalziumElementProperty::schemeList() const 0070 { 0071 return KalziumSchemeTypeFactory::instance()->schemes(); 0072 } 0073 0074 QStringList KalziumElementProperty::gradientList() const 0075 { 0076 QStringList customList; 0077 customList << i18nc("No Gradient", "None"); 0078 customList << KalziumGradientTypeFactory::instance()->gradients(); 0079 return customList; 0080 } 0081 0082 KalziumSchemeType *KalziumElementProperty::scheme() const 0083 { 0084 return KalziumSchemeTypeFactory::instance()->build(m_currentScheme); 0085 } 0086 0087 KalziumGradientType *KalziumElementProperty::gradient() const 0088 { 0089 if (m_currentGradient == NOGRADIENT) { 0090 return KalziumGradientTypeFactory::instance()->build(NOGRADIENT); 0091 } 0092 return KalziumGradientTypeFactory::instance()->build(m_currentGradient - 1); 0093 } 0094 0095 int KalziumElementProperty::gradientId() const 0096 { 0097 return m_currentGradient; 0098 } 0099 0100 int KalziumElementProperty::schemeId() const 0101 { 0102 return m_currentScheme; 0103 } 0104 0105 void KalziumElementProperty::setSliderValue(double slide) 0106 { 0107 m_slider = slide; 0108 propertyChanged(); 0109 } 0110 0111 double KalziumElementProperty::getValue(int el) const 0112 { 0113 if (m_currentGradient != NOGRADIENT) 0114 return gradient()->value(el); 0115 0116 return 0; 0117 } 0118 0119 QColor KalziumElementProperty::getElementColor(int el) 0120 { 0121 if (m_currentGradient == NOGRADIENT) 0122 return scheme()->elementBrush(el).color(); 0123 0124 return gradientBrushLogic(el); 0125 } 0126 0127 QBrush KalziumElementProperty::getElementBrush(int el) 0128 { 0129 QBrush elementBrush; 0130 elementBrush.setStyle(Qt::SolidPattern); 0131 elementBrush.setColor(Qt::transparent); 0132 0133 // Hide filtered elements from search 0134 if (!KalziumDataObject::instance()->search()->matches(el) && KalziumDataObject::instance()->search()->isActive()) { 0135 return {Qt::darkGray, Qt::Dense7Pattern}; 0136 } 0137 0138 // The iconic view is the 3rd view (0,1,2,...). Pixmaps don't make nice gradients. 0139 if (m_currentScheme == 2) { 0140 elementBrush = scheme()->elementBrush(el); 0141 } else { 0142 return ColorUtils::tintWithAlpha(qGuiApp->palette().color(QPalette::Normal, QPalette::Window), getElementColor(el), 0.2); 0143 } 0144 0145 return elementBrush; 0146 } 0147 0148 QColor KalziumElementProperty::getTextColor(int el) const 0149 { 0150 return ColorUtils::contrastColor(scheme()->elementBrush(el).color()); 0151 } 0152 0153 QColor KalziumElementProperty::getBorderColor(int el) const 0154 { 0155 // Show scheme color as border when gradients are selected. 0156 if (m_currentGradient != NOGRADIENT) { 0157 return ColorUtils::contrastColor(scheme()->elementBrush(el).color()); 0158 } 0159 0160 // Transparent Borders don't make sens. 0161 if (getTextColor(el) == QColor(Qt::transparent)) { 0162 return ColorUtils::contrastColor({Qt::black}); 0163 } 0164 0165 return getTextColor(el); 0166 } 0167 0168 int KalziumElementProperty::getMode() const 0169 { 0170 return m_mode; 0171 } 0172 0173 QColor KalziumElementProperty::gradientBrushLogic(int el) const 0174 { 0175 QColor gradientColor; 0176 bool isActiv = true; 0177 const double gradientValue = gradient()->value(el); 0178 const double melting = KalziumDataObject::instance()->element(el)->dataAsVariant(ChemicalDataObject::meltingpoint).toDouble(); 0179 const double boiling = KalziumDataObject::instance()->element(el)->dataAsVariant(ChemicalDataObject::boilingpoint).toDouble(); 0180 0181 switch (m_currentGradient) { 0182 case SOMGradientType: 0183 if (m_slider < melting) { 0184 // the element is solid 0185 gradientColor = Prefs::color_solid(); 0186 } else if ((m_slider > melting) && (m_slider < boiling)) { 0187 // the element is liquid 0188 gradientColor = Prefs::color_liquid(); 0189 } else if ((m_slider >= boiling) && (boiling > 0.0)) { 0190 // the element is vaporous 0191 gradientColor = Prefs::color_vapor(); 0192 } else { 0193 gradientColor = Qt::lightGray; 0194 } 0195 return gradientColor; 0196 0197 case DISCOVERYDATE: 0198 if (gradientValue > m_slider) { 0199 isActiv = false; 0200 } 0201 break; 0202 0203 default: // All other gradients 0204 if (gradientValue < m_slider) { 0205 isActiv = false; 0206 } 0207 break; 0208 } 0209 0210 if (!isActiv && gradientValue != -1) { // FIXME No magic number... Defined in KalziumGradientFactory 0211 gradientColor = Qt::transparent; 0212 } else { 0213 const double coeff = gradient()->elementCoeff(el); 0214 gradientColor = gradient()->calculateColor(coeff); 0215 } 0216 return gradientColor; 0217 } 0218 0219 #include "moc_kalziumelementproperty.cpp"