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}};