File indexing completed on 2024-05-12 17:21:07

0001 /*
0002  * SPDX-FileCopyrightText: 2020-2021 Han Young <hanyoung@protonmail.com>
0003  *
0004  * SPDX-License-Identifier: GPL-3.0-or-later
0005  */
0006 #include "unitmodel.h"
0007 #include <KLocalizedContext>
0008 #include <KLocalizedString>
0009 #include <QDebug>
0010 UnitModel::UnitModel()
0011 {
0012     connect(this, &UnitModel::unitIndexChanged, this, &UnitModel::calculateResult);
0013     connect(this, &UnitModel::valueChanged, this, &UnitModel::calculateResult);
0014 
0015     const auto units = KUnitConversion::Converter().category(std::get<1>(categoryAndEnum.at(m_currentIndex))).units();
0016 
0017     m_unitIDs.resize(units.size());
0018     std::transform(units.begin(), units.end(), m_unitIDs.begin(),
0019         [](const KUnitConversion::Unit &unit){ return unit.id(); });
0020 
0021     m_units.reserve(units.size());
0022     for(const auto &unit : units)
0023     {
0024         m_units.push_back(unit.symbol());
0025     }
0026 }
0027 QVariant UnitModel::data(const QModelIndex &index, int role) const
0028 {
0029     Q_UNUSED(role)
0030     if (index.row() >= 0 && index.row() < static_cast<int>(categoryAndEnum.size()))
0031         return std::get<0>(categoryAndEnum.at(index.row()));
0032     else
0033         return QVariant();
0034 }
0035 
0036 int UnitModel::rowCount(const QModelIndex &parent) const
0037 {
0038     Q_UNUSED(parent)
0039     return static_cast<int>(categoryAndEnum.size());
0040 }
0041 QHash<int, QByteArray> UnitModel::roleNames() const
0042 {
0043     return {{Qt::DisplayRole, "name"}};
0044 }
0045 void UnitModel::setValue(QString value)
0046 {
0047     m_value = std::move(value);
0048     Q_EMIT valueChanged();
0049 }
0050 void UnitModel::setCurrentIndex(int i)
0051 {
0052     if(i < 0 || i > static_cast<int>(categoryAndEnum.size()))
0053         return;
0054     if(m_currentIndex != i)
0055     {
0056         m_units.clear();
0057         m_currentIndex = i;
0058         m_value.clear();
0059         m_fromUnitIndex = 0;
0060         m_toUnitIndex = 1;
0061 
0062         const auto units = KUnitConversion::Converter().category(std::get<1>(categoryAndEnum.at(m_currentIndex))).units();
0063 
0064         m_unitIDs.resize(units.size());
0065         std::transform(units.begin(), units.end(), m_unitIDs.begin(),
0066             [](const KUnitConversion::Unit &unit){ return unit.id(); });
0067 
0068         m_units.reserve(units.size());
0069         for(const auto &unit : units)
0070         {
0071             m_units.push_back(unit.symbol());
0072         }
0073 
0074         calculateResult();
0075         Q_EMIT currentIndexChanged();
0076         Q_EMIT unitIndexChanged();
0077         Q_EMIT typeListChanged();
0078         Q_EMIT valueChanged();
0079     }
0080 }
0081 void UnitModel::setFromUnitIndex(int i)
0082 {
0083     m_fromUnitIndex = i;
0084     calculateResult();
0085 }
0086 void UnitModel::setToUnitIndex(int i)
0087 {
0088     m_toUnitIndex = i;
0089     calculateResult();
0090 }
0091 void UnitModel::calculateResult()
0092 {
0093     if(m_value.size())
0094     {
0095         auto units = KUnitConversion::Converter().category(std::get<1>(categoryAndEnum.at(m_currentIndex))).units();
0096 
0097         if(m_fromUnitIndex < 0 || m_toUnitIndex < 0 || m_fromUnitIndex > units.size() || m_toUnitIndex > units.size())
0098             return;
0099 
0100         auto from = KUnitConversion::Value(m_value.toDouble(), units.at(m_fromUnitIndex));
0101         m_result = KUnitConversion::Converter().convert(from,units.at(m_toUnitIndex)).toString();
0102         qDebug() << m_result;
0103     } else
0104     {
0105         m_result.clear();
0106     }
0107     Q_EMIT resultChanged();
0108 }
0109 const std::vector<std::tuple<QString, KUnitConversion::CategoryId>> UnitModel::categoryAndEnum =
0110 {{QStringLiteral("Acceleration"), KUnitConversion::AccelerationCategory},
0111  {QStringLiteral("Angle"), KUnitConversion::AngleCategory},
0112  {QStringLiteral("Area"), KUnitConversion::AreaCategory},
0113  {QStringLiteral("Binary Data"), KUnitConversion::BinaryDataCategory},
0114  {QStringLiteral("Currency"), KUnitConversion::CurrencyCategory},
0115  {QStringLiteral("Density"), KUnitConversion::DensityCategory},
0116  {QStringLiteral("Electrical Current"), KUnitConversion::ElectricalCurrentCategory},
0117  {QStringLiteral("Electrical Resistance"), KUnitConversion::ElectricalResistanceCategory},
0118  {QStringLiteral("Energy"), KUnitConversion::EnergyCategory},
0119  {QStringLiteral("Force"), KUnitConversion::ForceCategory},
0120  {QStringLiteral("Frequency"), KUnitConversion::FrequencyCategory},
0121  {QStringLiteral("Fuel Efficiency"), KUnitConversion::FuelEfficiencyCategory},
0122  {QStringLiteral("Length"), KUnitConversion::LengthCategory},
0123  {QStringLiteral("Mass"), KUnitConversion::MassCategory},
0124  {QStringLiteral("Permeability"), KUnitConversion::PermeabilityCategory},
0125  {QStringLiteral("Power"), KUnitConversion::PowerCategory},
0126  {QStringLiteral("Pressure"), KUnitConversion::PressureCategory},
0127  {QStringLiteral("Temperature"), KUnitConversion::TemperatureCategory},
0128  {QStringLiteral("Thermal Conductivity"), KUnitConversion::ThermalConductivityCategory},
0129  {QStringLiteral("Thermal Flux"), KUnitConversion::ThermalFluxCategory},
0130  {QStringLiteral("Thermal Generation"), KUnitConversion::ThermalGenerationCategory},
0131  {QStringLiteral("Time"), KUnitConversion::TimeCategory},
0132  {QStringLiteral("Velocity"), KUnitConversion::VelocityCategory},
0133  {QStringLiteral("Volume"), KUnitConversion::VolumeCategory},
0134  {QStringLiteral("Voltage"), KUnitConversion::VoltageCategory}};