File indexing completed on 2024-12-01 06:32:58

0001 /*
0002     SPDX-FileCopyrightText: 2005, 2006 Pino Toscano <toscano.pino@tiscali.it>
0003 
0004     SPDX-License-Identifier: GPL-2.0-or-later
0005 */
0006 
0007 #include "kalziumschemetype.h"
0008 
0009 #include "kalziumdataobject.h"
0010 #include "prefs.h"
0011 
0012 #ifdef HAVE_OPENBABEL2
0013 #include <openbabel/mol.h>
0014 #endif
0015 #ifdef HAVE_OPENBABEL3
0016 #include <openbabel/elements.h>
0017 #endif
0018 
0019 #include "kalzium_debug.h"
0020 #include <QStandardPaths>
0021 
0022 #include <KLocalizedString>
0023 
0024 KalziumSchemeTypeFactory::KalziumSchemeTypeFactory()
0025 {
0026     m_schemes << KalziumMonoColorSchemeType::instance();
0027     m_schemes << KalziumBlocksSchemeType::instance();
0028     m_schemes << KalziumIconicSchemeType::instance();
0029     m_schemes << KalziumFamilySchemeType::instance();
0030     m_schemes << KalziumGroupsSchemeType::instance();
0031 #ifdef HAVE_OPENBABEL
0032     m_schemes << KalziumColorSchemeType::instance();
0033 #endif
0034 }
0035 
0036 KalziumSchemeTypeFactory *KalziumSchemeTypeFactory::instance()
0037 {
0038     static KalziumSchemeTypeFactory kstf;
0039     return &kstf;
0040 }
0041 
0042 KalziumSchemeType *KalziumSchemeTypeFactory::build(int id) const
0043 {
0044     if ((id < 0) || (id >= m_schemes.count())) {
0045         return nullptr;
0046     }
0047 
0048     return m_schemes.at(id);
0049 }
0050 
0051 KalziumSchemeType *KalziumSchemeTypeFactory::build(const QByteArray &id) const
0052 {
0053     for (int i = 0; i < m_schemes.count(); ++i) {
0054         if (m_schemes.at(i)->name() == id) {
0055             return m_schemes.at(i);
0056         }
0057     }
0058 
0059     return nullptr;
0060 }
0061 
0062 QStringList KalziumSchemeTypeFactory::schemes() const
0063 {
0064     QStringList l;
0065     for (int i = 0; i < m_schemes.count(); ++i) {
0066         l << m_schemes.at(i)->description();
0067     }
0068     return l;
0069 }
0070 
0071 KalziumSchemeType *KalziumSchemeType::instance()
0072 {
0073     return nullptr;
0074 }
0075 
0076 KalziumSchemeType::KalziumSchemeType() = default;
0077 
0078 KalziumSchemeType::~KalziumSchemeType() = default;
0079 
0080 KalziumMonoColorSchemeType::KalziumMonoColorSchemeType()
0081     : KalziumSchemeType()
0082 {
0083 }
0084 
0085 KalziumMonoColorSchemeType *KalziumMonoColorSchemeType::instance()
0086 {
0087     static KalziumMonoColorSchemeType kmcst;
0088     return &kmcst;
0089 }
0090 
0091 QByteArray KalziumMonoColorSchemeType::name() const
0092 {
0093     return "MonoColor";
0094 }
0095 
0096 QString KalziumMonoColorSchemeType::description() const
0097 {
0098     return i18n("Monochrome");
0099 }
0100 
0101 QBrush KalziumMonoColorSchemeType::elementBrush(int el) const
0102 {
0103     Q_UNUSED(el);
0104     return QBrush(Prefs::noscheme());
0105 }
0106 
0107 QColor KalziumMonoColorSchemeType::textColor(int el) const
0108 {
0109     Q_UNUSED(el);
0110     return Qt::black;
0111 }
0112 
0113 QList<legendPair> KalziumMonoColorSchemeType::legendItems() const
0114 {
0115     QList<legendPair> ll;
0116     ll << qMakePair(i18n("All the Elements"), QColor(Prefs::noscheme()));
0117     return ll;
0118 }
0119 
0120 KalziumBlocksSchemeType::KalziumBlocksSchemeType()
0121     : KalziumSchemeType()
0122 {
0123 }
0124 
0125 KalziumBlocksSchemeType *KalziumBlocksSchemeType::instance()
0126 {
0127     static KalziumBlocksSchemeType kbst;
0128     return &kbst;
0129 }
0130 
0131 QByteArray KalziumBlocksSchemeType::name() const
0132 {
0133     return "Blocks";
0134 }
0135 
0136 QString KalziumBlocksSchemeType::description() const
0137 {
0138     return i18n("Blocks");
0139 }
0140 
0141 QBrush KalziumBlocksSchemeType::elementBrush(int el) const
0142 {
0143     QString block = KalziumDataObject::instance()->element(el)->dataAsString(ChemicalDataObject::periodTableBlock);
0144 
0145     QColor c;
0146     if (block == QLatin1String("s")) {
0147         c = Prefs::block_s();
0148     } else if (block == QLatin1String("p")) {
0149         c = Prefs::block_p();
0150     } else if (block == QLatin1String("d")) {
0151         c = Prefs::block_d();
0152     } else if (block == QLatin1String("f")) {
0153         c = Prefs::block_f();
0154     } else {
0155         c = Qt::lightGray;
0156     }
0157 
0158     return QBrush(c);
0159 }
0160 
0161 QColor KalziumBlocksSchemeType::textColor(int el) const
0162 {
0163     Q_UNUSED(el);
0164     return Qt::black;
0165 }
0166 
0167 QList<legendPair> KalziumBlocksSchemeType::legendItems() const
0168 {
0169     QList<legendPair> ll;
0170     ll << qMakePair(i18n("s-Block"), QColor(Prefs::block_s()));
0171     ll << qMakePair(i18n("p-Block"), QColor(Prefs::block_p()));
0172     ll << qMakePair(i18n("d-Block"), QColor(Prefs::block_d()));
0173     ll << qMakePair(i18n("f-Block"), QColor(Prefs::block_f()));
0174     return ll;
0175 }
0176 
0177 /// ICONIC SCHEME///
0178 
0179 KalziumIconicSchemeType::KalziumIconicSchemeType()
0180     : KalziumSchemeType()
0181 {
0182 }
0183 
0184 KalziumIconicSchemeType *KalziumIconicSchemeType::instance()
0185 {
0186     static KalziumIconicSchemeType kist;
0187     return &kist;
0188 }
0189 
0190 QByteArray KalziumIconicSchemeType::name() const
0191 {
0192     return "Iconic";
0193 }
0194 
0195 QString KalziumIconicSchemeType::description() const
0196 {
0197     return i18n("Iconic");
0198 }
0199 
0200 QBrush KalziumIconicSchemeType::elementBrush(int el) const
0201 {
0202     QPixmap pixmap = KalziumDataObject::instance()->pixmap(el);
0203     return QBrush(pixmap);
0204 }
0205 
0206 QColor KalziumIconicSchemeType::textColor(int) const
0207 {
0208     return Qt::transparent;
0209 }
0210 
0211 QList<legendPair> KalziumIconicSchemeType::legendItems() const
0212 {
0213     QList<legendPair> ll;
0214     ll << qMakePair(i18n("Each element is represented by an icon which represents its use."), QColor());
0215     return ll;
0216 }
0217 
0218 /// Family///
0219 KalziumFamilySchemeType::KalziumFamilySchemeType()
0220     : KalziumSchemeType()
0221 {
0222 }
0223 
0224 KalziumFamilySchemeType *KalziumFamilySchemeType::instance()
0225 {
0226     static KalziumFamilySchemeType kbst;
0227     return &kbst;
0228 }
0229 
0230 QByteArray KalziumFamilySchemeType::name() const
0231 {
0232     return "Family";
0233 }
0234 
0235 QString KalziumFamilySchemeType::description() const
0236 {
0237     return i18n("Family");
0238 }
0239 
0240 QBrush KalziumFamilySchemeType::elementBrush(int el) const
0241 {
0242     QString family = KalziumDataObject::instance()->element(el)->dataAsString(ChemicalDataObject::family);
0243 
0244     QColor c;
0245 
0246     if (family == QLatin1String("Noblegas")) {
0247         c = Prefs::noble_gas();
0248     } else if (family == QLatin1String("Non-Metal")) {
0249         c = Prefs::nonmetal();
0250     } else if (family == QLatin1String("Rare_Earth")) {
0251         c = Prefs::rare();
0252     } else if (family == QLatin1String("Alkaline_Earth")) {
0253         c = Prefs::alkaline();
0254     } else if (family == QLatin1String("Alkali_Earth")) {
0255         c = Prefs::alkalie();
0256     } else if (family == QLatin1String("Transition")) {
0257         c = Prefs::transition();
0258     } else if (family == QLatin1String("Other_Metal")) {
0259         c = Prefs::other_metal();
0260     } else if (family == QLatin1String("Metalloids")) {
0261         c = Prefs::metalloid();
0262     } else if (family == QLatin1String("Halogen")) {
0263         c = Prefs::halogene();
0264     } else {
0265         c = Qt::lightGray;
0266     }
0267 
0268     return QBrush(c);
0269 }
0270 
0271 QColor KalziumFamilySchemeType::textColor(int) const
0272 {
0273     return Qt::black;
0274 }
0275 
0276 QList<legendPair> KalziumFamilySchemeType::legendItems() const
0277 {
0278     QList<legendPair> ll;
0279     ll << qMakePair(i18n("Alkaline"), QColor(Prefs::alkalie()));
0280     ll << qMakePair(i18n("Rare Earth"), QColor(Prefs::rare()));
0281     ll << qMakePair(i18n("Non-Metals"), QColor(Prefs::nonmetal()));
0282     ll << qMakePair(i18n("Alkalie Metal"), QColor(Prefs::alkaline()));
0283     ll << qMakePair(i18n("Other Metal"), QColor(Prefs::other_metal()));
0284     ll << qMakePair(i18n("Halogen"), QColor(Prefs::halogene()));
0285     ll << qMakePair(i18n("Transition Metal"), QColor(Prefs::transition()));
0286     ll << qMakePair(i18n("Noble Gas"), QColor(Prefs::noble_gas()));
0287     ll << qMakePair(i18n("Metalloid"), QColor(Prefs::metalloid()));
0288 
0289     return ll;
0290 }
0291 
0292 /// GROUPS///
0293 KalziumGroupsSchemeType::KalziumGroupsSchemeType()
0294     : KalziumSchemeType()
0295 {
0296 }
0297 
0298 KalziumGroupsSchemeType *KalziumGroupsSchemeType::instance()
0299 {
0300     static KalziumGroupsSchemeType kbst;
0301     return &kbst;
0302 }
0303 
0304 QByteArray KalziumGroupsSchemeType::name() const
0305 {
0306     return "Groups";
0307 }
0308 
0309 QString KalziumGroupsSchemeType::description() const
0310 {
0311     return i18n("Groups");
0312 }
0313 
0314 QBrush KalziumGroupsSchemeType::elementBrush(int el) const
0315 {
0316     QString group = KalziumDataObject::instance()->element(el)->dataAsString(ChemicalDataObject::group);
0317 
0318     QColor c;
0319 
0320     if (group == QLatin1String("1")) {
0321         c = Prefs::group_1();
0322     } else if (group == QLatin1String("2")) {
0323         c = Prefs::group_2();
0324     } else if (group == QLatin1String("3")) {
0325         c = Prefs::group_3();
0326     } else if (group == QLatin1String("4")) {
0327         c = Prefs::group_4();
0328     } else if (group == QLatin1String("5")) {
0329         c = Prefs::group_5();
0330     } else if (group == QLatin1String("6")) {
0331         c = Prefs::group_6();
0332     } else if (group == QLatin1String("7")) {
0333         c = Prefs::group_7();
0334     } else if (group == QLatin1String("8")) {
0335         c = Prefs::group_8();
0336     } else {
0337         c = Qt::lightGray;
0338     }
0339 
0340     return QBrush(c);
0341 }
0342 
0343 QColor KalziumGroupsSchemeType::textColor(int) const
0344 {
0345     return Qt::black;
0346 }
0347 
0348 QList<legendPair> KalziumGroupsSchemeType::legendItems() const
0349 {
0350     QList<legendPair> ll;
0351     ll << qMakePair(i18n("Group 1"), QColor(Prefs::group_1()));
0352     ll << qMakePair(i18n("Group 2"), QColor(Prefs::group_2()));
0353     ll << qMakePair(i18n("Group 3"), QColor(Prefs::group_3()));
0354     ll << qMakePair(i18n("Group 4"), QColor(Prefs::group_4()));
0355     ll << qMakePair(i18n("Group 5"), QColor(Prefs::group_5()));
0356     ll << qMakePair(i18n("Group 6"), QColor(Prefs::group_6()));
0357     ll << qMakePair(i18n("Group 7"), QColor(Prefs::group_7()));
0358     ll << qMakePair(i18n("Group 8"), QColor(Prefs::group_8()));
0359 
0360     return ll;
0361 }
0362 
0363 #ifdef HAVE_OPENBABEL
0364 /// OpenBabel Color///
0365 KalziumColorSchemeType::KalziumColorSchemeType()
0366     : KalziumSchemeType()
0367 {
0368 }
0369 
0370 KalziumColorSchemeType *KalziumColorSchemeType::instance()
0371 {
0372     static KalziumColorSchemeType kbst;
0373     return &kbst;
0374 }
0375 
0376 QByteArray KalziumColorSchemeType::name() const
0377 {
0378     return "Color";
0379 }
0380 
0381 QString KalziumColorSchemeType::description() const
0382 {
0383     return i18n("Colors");
0384 }
0385 
0386 QBrush KalziumColorSchemeType::elementBrush(int el) const
0387 {
0388     QColor c;
0389 
0390 #ifdef HAVE_OPENBABEL2
0391     std::vector<double> color = OpenBabel::etab.GetRGB(el);
0392     c.setRgbF(color[0], color[1], color[2]);
0393 #endif
0394 #ifdef HAVE_OPENBABEL3
0395     double red, green, blue;
0396     OpenBabel::OBElements::GetRGB(el, &red, &green, &blue);
0397     c.setRgbF(red, green, blue);
0398 #endif
0399 
0400     return QBrush(c);
0401 }
0402 
0403 QColor KalziumColorSchemeType::textColor(int) const
0404 {
0405     return Qt::black;
0406 }
0407 
0408 QList<legendPair> KalziumColorSchemeType::legendItems() const
0409 {
0410     QList<legendPair> ll;
0411     ll << qMakePair(i18n("Nice colors without meaning. (From the Open Babel project)"), QColor());
0412     return ll;
0413 }
0414 #endif
0415 
0416 /// CRYSTAL///
0417 // X KalziumCrystalSchemeType::KalziumCrystalSchemeType()
0418 // X   : KalziumSchemeType()
0419 // X {
0420 // X }
0421 // X
0422 // X KalziumCrystalSchemeType* KalziumCrystalSchemeType::instance()
0423 // X {
0424 // X     static KalziumCrystalSchemeType kbst;
0425 // X     return &kbst;
0426 // X }
0427 // X
0428 // X QByteArray KalziumCrystalSchemeType::name() const
0429 // X {
0430 // X     return "Crystal";
0431 // X }
0432 // X
0433 // X QString KalziumCrystalSchemeType::description() const
0434 // X {
0435 // X     return i18n("Crystal Structures");
0436 // X }
0437 // X
0438 // X QBrush KalziumCrystalSchemeType::elementBrush(int el, const QRect& elrect) const
0439 // X {
0440 // X     QString crystal = KalziumDataObject::instance()->element(el)->dataAsString(ChemicalDataObject::crystalstructure);
0441 // X
0442 // X     qCDebug(KALZIUM_LOG) << "crystal is " << crystal;
0443 // X
0444 // X     static QString resourcepath;
0445 // X     if (resourcepath.isEmpty()) {
0446 // X         resourcepath = QStandardPaths::locate(QStandardPaths::AppLocalDataLocation, "data/latticeicons/");
0447 // X     }
0448 // X
0449 // X     QString filename;
0450 // X     if (crystal == "bcc") {
0451 // X         filename = "ci.png";
0452 // X     } else if (crystal == "ccp") {
0453 // X         filename = "cp.png";
0454 // X     } else if (crystal ==  "fcc") {
0455 // X         filename = "cf.png";
0456 // X     } else if (crystal ==  "hcp") {
0457 // X         filename = "hp.png";
0458 // X     } else if (crystal ==  "rh") {
0459 // X         filename = "hr.png";//Rhombohedral primitive
0460 // X     } else if (crystal ==  "or") {
0461 // X         filename = "op.png";//Orthorhombic primitive
0462 // X     } else if (crystal ==  "mono") {
0463 // X         filename = "ms.png";//Monoclinic primitive
0464 // X     } else if (crystal ==  "tri") {
0465 // X         filename = "ap.png";//Triclinic
0466 // X     } else if (crystal ==  "tp") {
0467 // X         filename = "tp.png";//Tetragonal primitive
0468 // X     }
0469 // X
0470 // X         filename.prepend(resourcepath);
0471 // X
0472 // X     QBrush ret;
0473 // X     if (!filename.isEmpty()) {
0474 // X         qCDebug(KALZIUM_LOG) << el << ": FILENAME is not EMPTY... " << filename;
0475 // X         QPixmap pixmap(resourcepath + filename);
0476 // X         ret = QBrush(pixmap.scaled(elrect.size(), Qt::KeepAspectRatio));
0477 // X     } else {
0478 // X             qCDebug(KALZIUM_LOG) << el << ": FILENAME EMPTY... " << filename;
0479 // X         ret.setColor(Qt::gray);
0480 // X     }
0481 // X
0482 // X     return ret;
0483 // X }
0484 // X
0485 // X QColor KalziumCrystalSchemeType::textColor(int) const
0486 // X {
0487 // X     return Qt::black;
0488 // X }
0489 // X
0490 // X QList<legendPair> KalziumCrystalSchemeType::legendItems() const
0491 // X {
0492 // X     static QString resourcepath;
0493 // X     if (resourcepath.isEmpty())
0494 // X     {
0495 // X         resourcepath = QStandardPaths::locate(QStandardPaths::AppLocalDataLocation, "data/latticeicons/");
0496 // X     }
0497 // X
0498 // X     QList<legendPair> ll;
0499 // X     ll << qMakePair(i18n("bcc, body centered cubic"), QColor(QPixmap(resourcepath + "ci.png")));
0500 // X     ll << qMakePair(i18n("ccp, cubic close packed"), QColor(QPixmap(resourcepath + "cp.png")));
0501 // X     ll << qMakePair(i18n("fcc, face centered cubic"), QColor(QPixmap(resourcepath + "cf.png")));
0502 // X     ll << qMakePair(i18n("hcp, hexagonal close packed"), QColor(QPixmap(resourcepath + "hp.png")));
0503 // X     ll << qMakePair(i18n("rh, rhombohedral"), QColor(QPixmap(resourcepath + "hr.png")));
0504 // X     ll << qMakePair(i18n("or, orthorhombic primitive"), QColor(QPixmap(resourcepath + "op.png")));
0505 // X     ll << qMakePair(i18n("ms, monoclinic"), QColor(QPixmap(resourcepath + "ms.png")));
0506 // X     ll << qMakePair(i18n("ap, triclinic"), QColor(QPixmap(resourcepath + "ap.png")));
0507 // X     ll << qMakePair(i18n("tp, tetragonal primitive"), QColor(QPixmap(resourcepath + "tp.png")));
0508 // X
0509 // X     return ll;
0510 // X }
0511 
0512 ////
0513 // X KalziumDiscoverymapSchemeType::KalziumDiscoverymapSchemeType()
0514 // X   : KalziumSchemeType()
0515 // X {
0516 // X }
0517 // X
0518 // X KalziumDiscoverymapSchemeType* KalziumDiscoverymapSchemeType::instance()
0519 // X {
0520 // X     static KalziumDiscoverymapSchemeType kbst;
0521 // X     return &kbst;
0522 // X }
0523 // X
0524 // X QByteArray KalziumDiscoverymapSchemeType::name() const
0525 // X {
0526 // X     return "Crystal";
0527 // X }
0528 // X
0529 // X QString KalziumDiscoverymapSchemeType::description() const
0530 // X {
0531 // X     return i18n("Discovery Country");
0532 // X }
0533 // X
0534 // X QBrush KalziumDiscoverymapSchemeType::elementBrush(int el, const QRect& elrect) const
0535 // X {
0536 // X     QString map = KalziumDataObject::instance()->element(el)->dataAsString(ChemicalDataObject::discoveryCountry);
0537 // X
0538 // X     static QString resourcepath;
0539 // X     if (resourcepath.isEmpty()) {
0540 // X         resourcepath = QStandardPaths::locate(QStandardPaths::AppLocalDataLocation, "data/maps/");
0541 // X     }
0542 // X
0543 // X     QString filename;
0544 // X     if (map == "se") {
0545 // X         filename = "se.png";
0546 // X     } else if (map == "uk") {
0547 // X         filename = "uk.png";
0548 // X     } else if (map == "us") {
0549 // X         filename = "us.png";
0550 // X     } else if (map == "ru") {
0551 // X         filename = "ru.png";
0552 // X     } else if (map == "it") {
0553 // X         filename = "it.png";
0554 // X     } else if (map == "de") {
0555 // X         filename = "de.png";
0556 // X     } else if (map == "dk") {
0557 // X         filename = "dk.png";
0558 // X     } else if (map == "fr") {
0559 // X         filename = "fr.png";
0560 // X     } else if (map == "fi") {
0561 // X         filename = "fi.png";
0562 // X     } else if (map == "es") {
0563 // X         filename = "es.png";
0564 // X     } else if (map == "ancient") {
0565 // X         return QBrush(Qt::lightGray);
0566 // X     } else if (map == "uk,fr") {
0567 // X         filename = "ukfr.png";
0568 // X     } else if (map == "se,uk") {
0569 // X         filename = "ukse.png";
0570 // X     } else if (map == "ru,us") {
0571 // X         filename = "ruus.png";
0572 // X     } else {
0573 // X       return QBrush(Qt::blue);
0574 // X     }
0575 // X
0576 // X     QBrush ret;
0577 // X     if (!filename.isEmpty()) {
0578 // X         QPixmap pixmap(resourcepath + filename);
0579 // X         ret = QBrush(pixmap.scaled(elrect.size(), Qt::KeepAspectRatio));
0580 // X     } else {
0581 // X         ret.setColor(Qt::gray);
0582 // X     }
0583 // X
0584 // X     return ret;
0585 // X }
0586 // X
0587 // X QColor KalziumDiscoverymapSchemeType::textColor(int) const
0588 // X {
0589 // X     return Qt::black;
0590 // X }
0591 // X
0592 // X QList<legendPair> KalziumDiscoverymapSchemeType::legendItems() const
0593 // X {
0594 // X     static QString resourcepath;
0595 // X     if (resourcepath.isEmpty()) {
0596 // X         resourcepath = QStandardPaths::locate(QStandardPaths::AppLocalDataLocation, "data/maps/");
0597 // X     }
0598 // X
0599 // X     QList<legendPair> ll;
0600 // X     ll << qMakePair(i18n("Germany"), QColor(QPixmap(resourcepath + "de.png")));
0601 // X     ll << qMakePair(i18n("United Kindom"), QColor(QPixmap(resourcepath + "uk.png")));
0602 // X     ll << qMakePair(i18n("Sweden"), QColor(QPixmap(resourcepath + "se.png")));
0603 // X     ll << qMakePair(i18n("USA"), QColor(QPixmap(resourcepath + "us.png")));
0604 // X     ll << qMakePair(i18n("Russia"), QColor(QPixmap(resourcepath + "ru.png")));
0605 // X     ll << qMakePair(i18n("Italy"), QColor(QPixmap(resourcepath + "it.png")));
0606 // X     ll << qMakePair(i18n("Denmark"), QColor(QPixmap(resourcepath + "dk.png")));
0607 // X     ll << qMakePair(i18n("France"), QColor(QPixmap(resourcepath + "fr.png")));
0608 // X     ll << qMakePair(i18n("Finland"), QColor(QPixmap(resourcepath + "fi.png")));
0609 // X     ll << qMakePair(i18n("Spain"), QColor(QPixmap(resourcepath + "es.png")));
0610 // X
0611 // X     return ll;
0612 // X }