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"