File indexing completed on 2024-04-21 03:41:37

0001 /*
0002     SPDX-FileCopyrightText: 2005, 2006 Pino Toscano <toscano.pino@tiscali.it>
0003     SPDX-FileCopyrightText: 2007 Carste Niehaus <cniehaus@kde.org>
0004     SPDX-FileCopyrightText: 2010 Etienne Rebetez <etienne.rebetez@oberwallis.ch>
0005 
0006     SPDX-License-Identifier: GPL-2.0-or-later
0007 */
0008 
0009 #include "psetables.h"
0010 
0011 #include "kalzium_libscience_debug.h"
0012 
0013 #include <KLocalizedString>
0014 
0015 pseTables::pseTables()
0016 {
0017     m_tables << pseRegularTable::init();
0018     m_tables << pseShortTable::init();
0019     m_tables << pseLongTable::init();
0020     m_tables << pseDTable::init();
0021     m_tables << pseDZTable::init();
0022 }
0023 
0024 pseTables::~pseTables() = default;
0025 
0026 pseTables *pseTables::instance()
0027 {
0028     static pseTables tables;
0029     return &tables;
0030 }
0031 
0032 QStringList pseTables::tables() const
0033 {
0034     QStringList l;
0035     const auto nbTable{m_tables.count()};
0036     l.reserve(nbTable);
0037     for (auto i = 0; i < nbTable; ++i) {
0038         l << m_tables.at(i)->description();
0039     }
0040     return l;
0041 }
0042 
0043 pseTable *pseTables::getTabletype(const int tableType)
0044 {
0045     if ((tableType < 0) || (tableType >= m_tables.count())) {
0046         return nullptr;
0047     }
0048 
0049     return m_tables.at(tableType);
0050 }
0051 
0052 pseTable *pseTables::getTabletype(const QString &tableName)
0053 {
0054     for (int i = 0; m_tables.count(); ++i) {
0055         if (tableName == m_tables.at(i)->name()) {
0056             return m_tables.at(i);
0057         }
0058     }
0059     return nullptr;
0060 }
0061 
0062 pseTable::pseTable() = default;
0063 
0064 pseTable::~pseTable() = default;
0065 
0066 pseTable *pseTable::init()
0067 {
0068     return nullptr;
0069 }
0070 
0071 QString pseTable::name() const
0072 {
0073     return m_name;
0074 }
0075 
0076 QString pseTable::description() const
0077 {
0078     return m_description;
0079 }
0080 
0081 QList<int> pseTable::elements() const
0082 {
0083     return m_elementList;
0084 }
0085 
0086 int pseTable::previousOf(int element) const
0087 {
0088     int index = m_elementList.indexOf(element);
0089     return index > 0 ? m_elementList.at(index - 1) : -1;
0090 }
0091 
0092 int pseTable::nextOf(int element) const
0093 {
0094     int index = m_elementList.indexOf(element);
0095     return index != -1 && (index < m_elementList.count() - 1) ? m_elementList.at(index + 1) : -1;
0096 }
0097 
0098 int pseTable::firstElement() const
0099 {
0100     return m_elementList.first();
0101 }
0102 
0103 int pseTable::lastElement() const
0104 {
0105     return m_elementList.last();
0106 }
0107 
0108 QPoint pseTable::elementCoords(const int element) const
0109 {
0110     int x = -1, y = -1;
0111     int elementIndex = m_elementList.indexOf(element);
0112 
0113     if (elementIndex >= 0 && elementIndex < m_elementList.count()) {
0114         // The positions lists are defined with the base of 1.
0115         // But coordinates start mostly with 0.
0116         x = m_posX.at(elementIndex) - 1;
0117         y = m_posY.at(elementIndex) - 1;
0118     }
0119     return {x, y};
0120 }
0121 
0122 QPoint pseTable::tableSize() const
0123 {
0124     int x = 0, y = 0, i;
0125 
0126     for (i = 0; i < m_posX.count(); ++i) {
0127         if (m_posX.at(i) > x) {
0128             x = m_posX.at(i);
0129         }
0130 
0131         if (m_posY.at(i) > y) {
0132             y = m_posY.at(i);
0133         }
0134     }
0135     return {x, y};
0136 }
0137 
0138 int pseTable::numerationAtPos(int xPos) const
0139 {
0140     if (xPos >= 0 && xPos < m_xCoordsNumeration.count()) {
0141         return m_xCoordsNumeration.at(xPos) - 1;
0142     }
0143     return -1;
0144 }
0145 
0146 /// Regular Table Data
0147 pseRegularTable::pseRegularTable()
0148     : pseTable()
0149 {
0150     m_name = QStringLiteral("Classic");
0151 
0152     m_description = i18n("Classic Periodic Table");
0153 
0154     m_xCoordsNumeration << 1 << 2 << 3 << 4 << 5 << 6 << 7 << 8 << 9 << 10 << 11 << 12 << 13 << 14 << 15 << 16 << 17 << 18;
0155 
0156     m_posX << 1 << 18 << 1 << 2 << 13 << 14 << 15 << 16 << 17 << 18 << 1 << 2 << 13 << 14 << 15 << 16 << 17 << 18 << 1 << 2 << 3 << 4 << 5 << 6 << 7 << 8 << 9
0157            << 10 << 11 << 12 << 13 << 14 << 15 << 16 << 17 << 18 << 1 << 2 << 3 << 4 << 5 << 6 << 7 << 8 << 9 << 10 << 11 << 12 << 13 << 14 << 15 << 16 << 17
0158            << 18 << // Element 54 (Xe)
0159         1 << 2 << 3 << 4 << 5 << 6 << 7 << 8 << 9 << 10 << 11 << 12 << 13 << 14 << 15 << 16 << 17 << // Element 58 (Ce) 71 (Lu)
0160         4 << 5 << 6 << 7 << 8 << 9 << 10 << 11 << 12 << 13 << 14 << 15 << 16 << 17 << 18 << 1 << 2 << 3 << 4 << 5 << 6 << 7 << 8 << 9 << 10 << 11 << 12 << 13
0161            << 14 << 15 << 16 << 17 << // Element 71 (Lr)
0162         4 << 5 << 6 << 7 << 8 << 9 << 10 << 11 << 12 << 13 << 14 << 15 << 16 << 17 << 18;
0163 
0164     m_posY << 1 << 1 << 2 << 2 << 2 << 2 << 2 << 2 << 2 << 2 << 3 << 3 << 3 << 3 << 3 << 3 << 3 << 3 << 4 << 4 << 4 << 4 << 4 << 4 << 4 << 4 << 4 << 4 << 4 << 4
0165            << 4 << 4 << 4 << 4 << 4 << 4 << 5 << 5 << 5 << 5 << 5 << 5 << 5 << 5 << 5 << 5 << 5 << 5 << 5 << 5 << 5 << 5 << 5 << 5 << // Element 54 (Xe)
0166         6 << 6 << 6 << 9 << 9 << 9 << 9 << 9 << 9 << 9 << 9 << 9 << 9 << 9 << 9 << 9 << 9 << // Element 71 (Lr)
0167         6 << 6 << 6 << 6 << 6 << 6 << 6 << 6 << 6 << 6 << 6 << 6 << 6 << 6 << 6 << 7 << 7 << 7 << 10 << 10 << 10 << 10 << 10 << 10 << 10 << 10 << 10 << 10 << 10
0168            << 10 << 10 << 10 << 7 << 7 << 7 << 7 << 7 << 7 << 7 << 7 << 7 << 7 << 7 << 7 << 7 << 7 << 7;
0169 
0170     // The classic PS has all Elements
0171     if (m_posX.count() == m_posY.count()) {
0172         for (int i = 1; i <= m_posX.count(); ++i) {
0173             m_elementList.append(i);
0174         }
0175     }
0176 }
0177 
0178 pseRegularTable *pseRegularTable::init()
0179 {
0180     static pseRegularTable thisTable;
0181     return &thisTable;
0182 }
0183 
0184 /// Long Table Data
0185 pseLongTable::pseLongTable()
0186     : pseTable()
0187 {
0188     m_name = QStringLiteral("Long");
0189 
0190     m_description = i18n("Long Periodic Table");
0191 
0192     m_xCoordsNumeration << 1 << 2 << 0 << 0 << 0 << 0 << 0 << 0 << 0 << 0 << 0 << 0 << 0 << 0 << 0 << 0 << 3 << 4 << 5 << 6 << 7 << 8 << 9 << 10 << 11 << 12
0193                         << 13 << 14 << 15 << 16 << 17 << 18;
0194 
0195     m_posX << 1 << 32 << 1 << 2 << 27 << 28 << 29 << 30 << 31 << 32 << 1 << 2 << 27 << 28 << 29 << 30 << 31 << 32 << 1 << 2 << 17 << 18 << 19 << 20 << 21 << 22
0196            << 23 << 24 << 25 << 26 << 27 << 28 << 29 << 30 << 31 << 32 << 1 << 2 << 17 << 18 << 19 << 20 << 21 << 22 << 23 << 24 << 25 << 26 << 27 << 28 << 29
0197            << 30 << 31 << 32 << 1 << 2 << 3 << 4 << 5 << 6 << 7 << 8 << 9 << 10 << 11 << 12 << 13 << 14 << 15 << 16 << 17 << 18 << 19 << 20 << 21 << 22 << 23
0198            << 24 << 25 << 26 << 27 << 28 << 29 << 30 << 31 << 32 << 1 << 2 << 3 << 4 << 5 << 6 << 7 << 8 << 9 << 10 << 11 << 12 << 13 << 14 << 15 << 16 << 17
0199            << 18 << 19 << 20 << 21 << 22 << 23 << 24 << 25 << 26 << 27 << 28 << 29 << 30 << 31 << 32;
0200 
0201     m_posY << 1 << 1 << 2 << 2 << 2 << 2 << 2 << 2 << 2 << 2 << 3 << 3 << 3 << 3 << 3 << 3 << 3 << 3 << 4 << 4 << 4 << 4 << 4 << 4 << 4 << 4 << 4 << 4 << 4 << 4
0202            << 4 << 4 << 4 << 4 << 4 << 4 << 5 << 5 << 5 << 5 << 5 << 5 << 5 << 5 << 5 << 5 << 5 << 5 << 5 << 5 << 5 << 5 << 5 << 5 << 6 << 6 << 6 << 6 << 6 << 6
0203            << 6 << 6 << 6 << 6 << 6 << 6 << 6 << 6 << 6 << 6 << 6 << 6 << 6 << 6 << 6 << 6 << 6 << 6 << 6 << 6 << 6 << 6 << 6 << 6 << 6 << 6 << 7 << 7 << 7 << 7
0204            << 7 << 7 << 7 << 7 << 7 << 7 << 7 << 7 << 7 << 7 << 7 << 7 << 7 << 7 << 7 << 7 << 7 << 7 << 7 << 7 << 7 << 7 << 7 << 7 << 7 << 7 << 7 << 7;
0205 
0206     // The long PS has all Elements
0207     if (m_posX.count() == m_posY.count()) {
0208         for (int i = 1; i <= m_posX.count(); ++i) {
0209             m_elementList.append(i);
0210         }
0211     }
0212 }
0213 
0214 pseLongTable *pseLongTable::init()
0215 {
0216     static pseLongTable thisTable;
0217     return &thisTable;
0218 }
0219 
0220 /// Short Table Data
0221 pseShortTable::pseShortTable()
0222     : pseTable()
0223 {
0224     m_name = QStringLiteral("Short");
0225 
0226     m_description = i18n("Short Periodic Table");
0227 
0228     m_xCoordsNumeration << 1 << 2 << 13 << 14 << 15 << 16 << 17 << 18;
0229 
0230     m_posX << 1 << 8 << // He
0231         1 << 2 << 3 << 4 << 5 << 6 << 7 << 8 << // Ne
0232         1 << 2 << 3 << 4 << 5 << 6 << 7 << 8 << // Ar
0233         1 << 2 << 3 << 4 << 5 << 6 << 7 << 8 << // Kr
0234         1 << 2 << 3 << 4 << 5 << 6 << 7 << 8 << // Xe
0235         1 << 2 << 3 << 4 << 5 << 6 << 7 << 8 << // Rn
0236         1 << 2 // Fr and Ra
0237         ;
0238 
0239     m_posY << 1 << 1 << // He
0240         2 << 2 << 2 << 2 << 2 << 2 << 2 << 2 << // Ne
0241         3 << 3 << 3 << 3 << 3 << 3 << 3 << 3 << // Ar
0242         4 << 4 << 4 << 4 << 4 << 4 << 4 << 4 << // Kr
0243         5 << 5 << 5 << 5 << 5 << 5 << 5 << 5 << // Xe
0244         6 << 6 << 6 << 6 << 6 << 6 << 6 << 6 << // Rn
0245         7 << 7 // Fr and Ra
0246         ;
0247 
0248     m_elementList << 1 << 2 << // He
0249         3 << 4 << 5 << 6 << 7 << 8 << 9 << 10 << // Ne
0250         11 << 12 << 13 << 14 << 15 << 16 << 17 << 18 << // Ar
0251         19 << 20 << 31 << 32 << 33 << 34 << 35 << 36 << // Kr
0252         37 << 38 << 49 << 50 << 51 << 52 << 53 << 54 << // Xe
0253         55 << 56 << 81 << 82 << 83 << 84 << 85 << 86 << // Rn
0254         87 << 88 // Fr and Ra
0255         ;
0256 }
0257 
0258 pseShortTable *pseShortTable::init()
0259 {
0260     static pseShortTable thisTable;
0261     return &thisTable;
0262 }
0263 
0264 /// D-Group Table Data
0265 pseDTable::pseDTable()
0266     : pseTable()
0267 {
0268     m_name = 'D';
0269 
0270     m_description = i18n("Transition Elements");
0271 
0272     m_xCoordsNumeration << 3 << 4 << 5 << 6 << 7 << 8 << 9 << 10 << 11 << 12;
0273 
0274     m_posX << 1 << 2 << 3 << 4 << 5 << 6 << 7 << 8 << 9 << 10 << 1 << 2 << 3 << 4 << 5 << 6 << 7 << 8 << 9 << 10 << 1 << 2 << 3 << 4 << 5 << 6 << 7 << 8 << 9
0275            << 10 << 1 << 2 << 3 << 4 << 5 << 6 << 7 << 8 << 9 << 10;
0276 
0277     m_posY << 1 << 1 << 1 << 1 << 1 << 1 << 1 << 1 << 1 << 1 << 2 << 2 << 2 << 2 << 2 << 2 << 2 << 2 << 2 << 2 << 3 << 3 << 3 << 3 << 3 << 3 << 3 << 3 << 3 << 3
0278            << 4 << 4 << 4 << 4 << 4 << 4 << 4 << 4 << 4 << 4;
0279 
0280     m_elementList << 21 << 22 << 23 << 24 << 25 << 26 << 27 << 28 << 29 << 30 << 39 << 40 << 41 << 42 << 43 << 44 << 45 << 46 << 47 << 48 << 57 << 72 << 73
0281                   << 74 << 75 << 76 << 77 << 78 << 79 << 80 << 89 << 104 << 105 << 106 << 107 << 108 << 109 << 110 << 111 << 112;
0282 }
0283 
0284 pseDTable *pseDTable::init()
0285 {
0286     static pseDTable thisTable;
0287     return &thisTable;
0288 }
0289 
0290 /// DZ Table Data
0291 pseDZTable::pseDZTable()
0292     : pseTable()
0293 {
0294     m_name = QStringLiteral("DZ");
0295 
0296     m_description = i18n("DZ Periodic Table");
0297 
0298     m_xCoordsNumeration << 1 << 2 << 13 << 14 << 15 << 16 << 17 << 18 << 3 << 4 << 5 << 6 << 7 << 8 << 9 << 10 << 11 << 12;
0299 
0300     m_posX << 1 << 2 << 1 << 2 << 3 << 4 << 5 << 6 << 7 << 8 << 1 << 2 << 3 << 4 << 5 << 6 << 7 << 8 << 1 << 2 << 9 << 10 << 11 << 12 << 13 << 14 << 15 << 16
0301            << 17 << 18 << 3 << 4 << 5 << 6 << 7 << 8 << 1 << 2 << 9 << 10 << 11 << 12 << 13 << 14 << 15 << 16 << 17 << 18 << 3 << 4 << 5 << 6 << 7 << 8 << 1
0302            << 2 << 19 << 20 << 21 << 22 << 23 << 24 << 25 << 26 << 27 << 28 << 29 << 30 << 31 << 32 << 9 << 10 << 11 << 12 << 13 << 14 << 15 << 16 << 17 << 18
0303            << 3 << 4 << 5 << 6 << 7 << 8 << 1 << 2 << 19 << 20 << 21 << 22 << 23 << 24 << 25 << 26 << 27 << 28 << 29 << 30 << 31 << 32 << 9 << 10 << 11 << 12
0304            << 13 << 14 << 15 << 16 << 17 << 18 << 3 << 4 << 5 << 6 << 7 << 8;
0305 
0306     m_posY << 1 << 1 << 2 << 2 << 3 << 3 << 3 << 3 << 3 << 3 << 4 << 4 << 5 << 5 << 5 << 5 << 5 << 5 << 6 << 6 << 7 << 7 << 7 << 7 << 7 << 7 << 7 << 7 << 7 << 7
0307            << 8 << 8 << 8 << 8 << 8 << 8 << 9 << 9 << 10 << 10 << 10 << 10 << 10 << 10 << 10 << 10 << 10 << 10 << 11 << 11 << 11 << 11 << 11 << 11 << 12 << 12
0308            <<
0309 
0310         13 << 13 << 13 << 13 << 13 << 13 << 13 << 13 << 13 << 13 << 13 << 13 << 13 << 13 << 14 << 14 << 14 << 14 << 14 << 14 << 14 << 14 << 14 << 14 << 15 << 15
0311            << 15 << 15 << 15 << 15 << 16 << 16 << 17 << 17 << 17 << 17 << 17 << 17 << 17 << 17 << 17 << 17 << 17 << 17 << 17 << 17 << 18 << 18 << 18 << 18 << 18
0312            << 18 << 18 << 18 << 18 << 18 << 19 << 19 << 19 << 19 << 19 << 19;
0313 
0314     // The DZ PS has all Elements
0315     if (m_posX.count() == m_posY.count()) {
0316         for (int i = 1; i <= m_posX.count(); ++i) {
0317             m_elementList.append(i);
0318         }
0319     }
0320 }
0321 
0322 pseDZTable *pseDZTable::init()
0323 {
0324     static pseDZTable thisTable;
0325     return &thisTable;
0326 }