Warning, file /rolisteam/rolisteam/src/libraries/rwidgets/gmtoolbox/UnitConvertor/convertor.cpp was not indexed or was modified since last indexation (in which case cross-reference links may be missing, inaccurate or erroneous).

0001 #include "convertor.h"
0002 #include "ui_convertor.h"
0003 #include <QDebug>
0004 #include <QMetaType>
0005 
0006 namespace GMTOOL
0007 {
0008 Convertor::Convertor(QWidget* parent) : QWidget(parent), ui(new Ui::Convertor), m_customRulesModel(new CustomRuleModel)
0009 {
0010     qRegisterMetaType<Unit>();
0011     // qRegisterMetaType<Unit*>();
0012     ui->setupUi(this);
0013     connect(ui->m_categoryCombo, SIGNAL(currentIndexChanged(int)), this, SLOT(categoryHasChanged(int)));
0014     connect(ui->m_categoryCombo2, SIGNAL(currentIndexChanged(int)), this, SLOT(categoryHasChangedOnSecondPanel(int)));
0015     connect(ui->m_reverseAct, &QAction::triggered, this, [=]() {
0016         auto from= ui->m_fromCombo->currentIndex();
0017         ui->m_fromCombo->setCurrentIndex(ui->m_toCombo->currentIndex());
0018         ui->m_toCombo->setCurrentIndex(from);
0019     });
0020 
0021     ui->m_addBtn->setDefaultAction(ui->m_addUnitAction);
0022     ui->m_removeBtn->setDefaultAction(ui->m_removeUnit);
0023     ui->m_reverse->setDefaultAction(ui->m_reverseAct);
0024     ui->m_customValue->setDefaultAction(ui->m_customRuleAct);
0025     ui->m_backBtn->setDefaultAction(ui->m_back);
0026 
0027     connect(ui->m_customRuleAct, &QAction::triggered, this, [=]() { ui->stackedWidget->setCurrentIndex(1); });
0028 
0029     connect(ui->m_back, &QAction::triggered, this, [=]() {
0030         ui->stackedWidget->setCurrentIndex(0);
0031         categoryHasChanged(ui->m_categoryCombo->currentIndex());
0032     });
0033     ui->stackedWidget->setCurrentIndex(0);
0034 
0035     connect(ui->m_addUnitAction, &QAction::triggered, m_customRulesModel.get(), &CustomRuleModel::insertUnit);
0036 
0037     m_model.reset(new UnitModel());
0038     connect(m_model.get(), &UnitModel::modelChanged, this, &Convertor::writeSettings);
0039     m_catModel.reset(new CategoryModel());
0040     m_toModel.reset(new CategoryModel());
0041     // auto editCatModel = new CategoryModel(this);
0042 
0043     readSettings();
0044 
0045     if(m_model->rowCount(QModelIndex()) == 0)
0046     {
0047         Unit* meter= m_model->insertData(new Unit(QStringLiteral("meter"), QStringLiteral("m"), Unit::DISTANCE));
0048         Unit* km= m_model->insertData(new Unit(QStringLiteral("kilometer"), QStringLiteral("km"), Unit::DISTANCE));
0049         Unit* dam= m_model->insertData(new Unit(QStringLiteral("decameter"), QStringLiteral("dam"), Unit::DISTANCE));
0050         Unit* dm= m_model->insertData(new Unit(QStringLiteral("decimeter"), QStringLiteral("dm"), Unit::DISTANCE));
0051         Unit* hm= m_model->insertData(new Unit(QStringLiteral("hectometer"), QStringLiteral("hm"), Unit::DISTANCE));
0052         Unit* cm= m_model->insertData(new Unit(QStringLiteral("centimeter"), QStringLiteral("cm"), Unit::DISTANCE));
0053         Unit* mm= m_model->insertData(new Unit(QStringLiteral("millitimeter"), QStringLiteral("mm"), Unit::DISTANCE));
0054         Unit* po= m_model->insertData(new Unit(QStringLiteral("Inch"), QStringLiteral("″"), Unit::DISTANCE));
0055         Unit* ft= m_model->insertData(new Unit(QStringLiteral("Foot"), QStringLiteral("′"), Unit::DISTANCE));
0056         Unit* yd= m_model->insertData(new Unit(QStringLiteral("Yard"), QStringLiteral("yd"), Unit::DISTANCE));
0057         Unit* mile= m_model->insertData(new Unit(QStringLiteral("Mile"), QStringLiteral("mi"), Unit::DISTANCE));
0058 
0059         // kilometer to *
0060         m_convertorTable.insert(QPair<const Unit*, const Unit*>(km, meter), new ConvertorOperator(1000));
0061         m_convertorTable.insert(QPair<const Unit*, const Unit*>(km, dam), new ConvertorOperator(100));
0062         m_convertorTable.insert(QPair<const Unit*, const Unit*>(km, dm), new ConvertorOperator(10000));
0063         m_convertorTable.insert(QPair<const Unit*, const Unit*>(km, hm), new ConvertorOperator(10));
0064         m_convertorTable.insert(QPair<const Unit*, const Unit*>(km, cm), new ConvertorOperator(100000));
0065         m_convertorTable.insert(QPair<const Unit*, const Unit*>(km, mm), new ConvertorOperator(1000000));
0066         m_convertorTable.insert(QPair<const Unit*, const Unit*>(km, po), new ConvertorOperator(39370.1));
0067         m_convertorTable.insert(QPair<const Unit*, const Unit*>(km, ft), new ConvertorOperator(3280.84));
0068         m_convertorTable.insert(QPair<const Unit*, const Unit*>(km, yd), new ConvertorOperator(1093.61));
0069         m_convertorTable.insert(QPair<const Unit*, const Unit*>(km, mile), new ConvertorOperator(0.621371));
0070 
0071         // hectometer to *
0072         m_convertorTable.insert(QPair<const Unit*, const Unit*>(hm, meter), new ConvertorOperator(100));
0073         m_convertorTable.insert(QPair<const Unit*, const Unit*>(hm, dam), new ConvertorOperator(10));
0074         m_convertorTable.insert(QPair<const Unit*, const Unit*>(hm, dm), new ConvertorOperator(1000));
0075         m_convertorTable.insert(QPair<const Unit*, const Unit*>(hm, km), new ConvertorOperator(0.1));
0076         m_convertorTable.insert(QPair<const Unit*, const Unit*>(hm, cm), new ConvertorOperator(10000));
0077         m_convertorTable.insert(QPair<const Unit*, const Unit*>(hm, mm), new ConvertorOperator(100000));
0078         m_convertorTable.insert(QPair<const Unit*, const Unit*>(hm, po), new ConvertorOperator(3937.01));
0079         m_convertorTable.insert(QPair<const Unit*, const Unit*>(hm, ft), new ConvertorOperator(328.084));
0080         m_convertorTable.insert(QPair<const Unit*, const Unit*>(hm, yd), new ConvertorOperator(109.361));
0081         m_convertorTable.insert(QPair<const Unit*, const Unit*>(hm, mile), new ConvertorOperator(0.0621371));
0082 
0083         // decameter to *
0084         m_convertorTable.insert(QPair<const Unit*, const Unit*>(dam, meter), new ConvertorOperator(10));
0085         m_convertorTable.insert(QPair<const Unit*, const Unit*>(dam, hm), new ConvertorOperator(0.1));
0086         m_convertorTable.insert(QPair<const Unit*, const Unit*>(dam, dm), new ConvertorOperator(100));
0087         m_convertorTable.insert(QPair<const Unit*, const Unit*>(dam, km), new ConvertorOperator(0.01));
0088         m_convertorTable.insert(QPair<const Unit*, const Unit*>(dam, cm), new ConvertorOperator(1000));
0089         m_convertorTable.insert(QPair<const Unit*, const Unit*>(dam, mm), new ConvertorOperator(10000));
0090         m_convertorTable.insert(QPair<const Unit*, const Unit*>(dam, po), new ConvertorOperator(393.701));
0091         m_convertorTable.insert(QPair<const Unit*, const Unit*>(dam, ft), new ConvertorOperator(32.8084));
0092         m_convertorTable.insert(QPair<const Unit*, const Unit*>(dam, yd), new ConvertorOperator(10.9361));
0093         m_convertorTable.insert(QPair<const Unit*, const Unit*>(dam, mile), new ConvertorOperator(0.00621371));
0094 
0095         // meter to *
0096         m_convertorTable.insert(QPair<const Unit*, const Unit*>(meter, km), new ConvertorOperator(0.001));
0097         m_convertorTable.insert(QPair<const Unit*, const Unit*>(meter, dam), new ConvertorOperator(0.1));
0098         m_convertorTable.insert(QPair<const Unit*, const Unit*>(meter, dm), new ConvertorOperator(10));
0099         m_convertorTable.insert(QPair<const Unit*, const Unit*>(meter, hm), new ConvertorOperator(0.01));
0100         m_convertorTable.insert(QPair<const Unit*, const Unit*>(meter, cm), new ConvertorOperator(100));
0101         m_convertorTable.insert(QPair<const Unit*, const Unit*>(meter, mm), new ConvertorOperator(1000));
0102         m_convertorTable.insert(QPair<const Unit*, const Unit*>(meter, po), new ConvertorOperator(39.3701));
0103         m_convertorTable.insert(QPair<const Unit*, const Unit*>(meter, ft), new ConvertorOperator(3.28084));
0104         m_convertorTable.insert(QPair<const Unit*, const Unit*>(meter, yd), new ConvertorOperator(1.09361));
0105         m_convertorTable.insert(QPair<const Unit*, const Unit*>(meter, mile), new ConvertorOperator(0.000621371));
0106 
0107         // decimeter to *
0108         m_convertorTable.insert(QPair<const Unit*, const Unit*>(dm, meter), new ConvertorOperator(0.1));
0109         m_convertorTable.insert(QPair<const Unit*, const Unit*>(dm, dam), new ConvertorOperator(0.01));
0110         m_convertorTable.insert(QPair<const Unit*, const Unit*>(dm, hm), new ConvertorOperator(0.001));
0111         m_convertorTable.insert(QPair<const Unit*, const Unit*>(dm, km), new ConvertorOperator(0.0001));
0112         m_convertorTable.insert(QPair<const Unit*, const Unit*>(dm, cm), new ConvertorOperator(10));
0113         m_convertorTable.insert(QPair<const Unit*, const Unit*>(dm, mm), new ConvertorOperator(100));
0114         m_convertorTable.insert(QPair<const Unit*, const Unit*>(dm, po), new ConvertorOperator(3.93701));
0115         m_convertorTable.insert(QPair<const Unit*, const Unit*>(dm, ft), new ConvertorOperator(0.328084));
0116         m_convertorTable.insert(QPair<const Unit*, const Unit*>(dm, yd), new ConvertorOperator(0.109361));
0117         m_convertorTable.insert(QPair<const Unit*, const Unit*>(dm, mile), new ConvertorOperator(0.00000621371));
0118 
0119         // centimeter to *
0120         m_convertorTable.insert(QPair<const Unit*, const Unit*>(cm, meter), new ConvertorOperator(0.01));
0121         m_convertorTable.insert(QPair<const Unit*, const Unit*>(cm, hm), new ConvertorOperator(0.0001));
0122         m_convertorTable.insert(QPair<const Unit*, const Unit*>(cm, dm), new ConvertorOperator(0.1));
0123         m_convertorTable.insert(QPair<const Unit*, const Unit*>(cm, km), new ConvertorOperator(0.000001));
0124         m_convertorTable.insert(QPair<const Unit*, const Unit*>(cm, dam), new ConvertorOperator(0.001));
0125         m_convertorTable.insert(QPair<const Unit*, const Unit*>(cm, mm), new ConvertorOperator(10));
0126         m_convertorTable.insert(QPair<const Unit*, const Unit*>(cm, po), new ConvertorOperator(0.393701));
0127         m_convertorTable.insert(QPair<const Unit*, const Unit*>(cm, ft), new ConvertorOperator(0.0328084));
0128         m_convertorTable.insert(QPair<const Unit*, const Unit*>(cm, yd), new ConvertorOperator(0.0109361));
0129         m_convertorTable.insert(QPair<const Unit*, const Unit*>(cm, mile), new ConvertorOperator(0.000000621371));
0130 
0131         // milimeter to *
0132         m_convertorTable.insert(QPair<const Unit*, const Unit*>(mm, meter), new ConvertorOperator(0.001));
0133         m_convertorTable.insert(QPair<const Unit*, const Unit*>(mm, hm), new ConvertorOperator(0.00001));
0134         m_convertorTable.insert(QPair<const Unit*, const Unit*>(mm, dm), new ConvertorOperator(0.01));
0135         m_convertorTable.insert(QPair<const Unit*, const Unit*>(mm, km), new ConvertorOperator(0.0000001));
0136         m_convertorTable.insert(QPair<const Unit*, const Unit*>(mm, dam), new ConvertorOperator(0.0001));
0137         m_convertorTable.insert(QPair<const Unit*, const Unit*>(mm, cm), new ConvertorOperator(0.1));
0138         m_convertorTable.insert(QPair<const Unit*, const Unit*>(mm, po), new ConvertorOperator(0.0393701));
0139         m_convertorTable.insert(QPair<const Unit*, const Unit*>(mm, ft), new ConvertorOperator(0.00328084));
0140         m_convertorTable.insert(QPair<const Unit*, const Unit*>(mm, yd), new ConvertorOperator(0.00109361));
0141         m_convertorTable.insert(QPair<const Unit*, const Unit*>(mm, mile), new ConvertorOperator(0.0000000621371));
0142 
0143         // mile to *
0144         m_convertorTable.insert(QPair<const Unit*, const Unit*>(mile, meter), new ConvertorOperator(1609.34));
0145         m_convertorTable.insert(QPair<const Unit*, const Unit*>(mile, hm), new ConvertorOperator(16.0934));
0146         m_convertorTable.insert(QPair<const Unit*, const Unit*>(mile, dm), new ConvertorOperator(1609340));
0147         m_convertorTable.insert(QPair<const Unit*, const Unit*>(mile, km), new ConvertorOperator(1.60934));
0148         m_convertorTable.insert(QPair<const Unit*, const Unit*>(mile, dam), new ConvertorOperator(160.934));
0149         m_convertorTable.insert(QPair<const Unit*, const Unit*>(mile, cm), new ConvertorOperator(16093400));
0150         m_convertorTable.insert(QPair<const Unit*, const Unit*>(mile, po), new ConvertorOperator(63360));
0151         m_convertorTable.insert(QPair<const Unit*, const Unit*>(mile, ft), new ConvertorOperator(5280));
0152         m_convertorTable.insert(QPair<const Unit*, const Unit*>(mile, yd), new ConvertorOperator(1760));
0153         m_convertorTable.insert(QPair<const Unit*, const Unit*>(mile, mm), new ConvertorOperator(1.609e+6));
0154 
0155         // yard to *
0156         m_convertorTable.insert(QPair<const Unit*, const Unit*>(yd, meter), new ConvertorOperator(0.9144));
0157         m_convertorTable.insert(QPair<const Unit*, const Unit*>(yd, hm), new ConvertorOperator(0.009144));
0158         m_convertorTable.insert(QPair<const Unit*, const Unit*>(yd, dm), new ConvertorOperator(9.144));
0159         m_convertorTable.insert(QPair<const Unit*, const Unit*>(yd, km), new ConvertorOperator(0.0009144));
0160         m_convertorTable.insert(QPair<const Unit*, const Unit*>(yd, dam), new ConvertorOperator(0.09144));
0161         m_convertorTable.insert(QPair<const Unit*, const Unit*>(yd, cm), new ConvertorOperator(91.44));
0162         m_convertorTable.insert(QPair<const Unit*, const Unit*>(yd, po), new ConvertorOperator(36));
0163         m_convertorTable.insert(QPair<const Unit*, const Unit*>(yd, ft), new ConvertorOperator(3));
0164         m_convertorTable.insert(QPair<const Unit*, const Unit*>(yd, mile), new ConvertorOperator(0.000568182));
0165         m_convertorTable.insert(QPair<const Unit*, const Unit*>(yd, mm), new ConvertorOperator(914.4));
0166 
0167         // ft to *
0168         m_convertorTable.insert(QPair<const Unit*, const Unit*>(ft, meter), new ConvertorOperator(0.3048));
0169         m_convertorTable.insert(QPair<const Unit*, const Unit*>(ft, hm), new ConvertorOperator(0.003048));
0170         m_convertorTable.insert(QPair<const Unit*, const Unit*>(ft, dm), new ConvertorOperator(3.048));
0171         m_convertorTable.insert(QPair<const Unit*, const Unit*>(ft, km), new ConvertorOperator(0.0003048));
0172         m_convertorTable.insert(QPair<const Unit*, const Unit*>(ft, dam), new ConvertorOperator(0.03048));
0173         m_convertorTable.insert(QPair<const Unit*, const Unit*>(ft, cm), new ConvertorOperator(30.48));
0174         m_convertorTable.insert(QPair<const Unit*, const Unit*>(ft, po), new ConvertorOperator(12));
0175         m_convertorTable.insert(QPair<const Unit*, const Unit*>(ft, yd), new ConvertorOperator(0.333333));
0176         m_convertorTable.insert(QPair<const Unit*, const Unit*>(ft, mile), new ConvertorOperator(0.000189394));
0177         m_convertorTable.insert(QPair<const Unit*, const Unit*>(ft, mm), new ConvertorOperator(304.8));
0178 
0179         // inch to *
0180         m_convertorTable.insert(QPair<const Unit*, const Unit*>(po, meter), new ConvertorOperator(0.0254));
0181         m_convertorTable.insert(QPair<const Unit*, const Unit*>(po, hm), new ConvertorOperator(0.000254));
0182         m_convertorTable.insert(QPair<const Unit*, const Unit*>(po, dm), new ConvertorOperator(0.254));
0183         m_convertorTable.insert(QPair<const Unit*, const Unit*>(po, km), new ConvertorOperator(2.54e-5));
0184         m_convertorTable.insert(QPair<const Unit*, const Unit*>(po, dam), new ConvertorOperator(0.00254));
0185         m_convertorTable.insert(QPair<const Unit*, const Unit*>(po, cm), new ConvertorOperator(2.54));
0186         m_convertorTable.insert(QPair<const Unit*, const Unit*>(po, ft), new ConvertorOperator(0.0833333));
0187         m_convertorTable.insert(QPair<const Unit*, const Unit*>(po, yd), new ConvertorOperator(0.0277778));
0188         m_convertorTable.insert(QPair<const Unit*, const Unit*>(po, mile), new ConvertorOperator(1.5783e-5));
0189         m_convertorTable.insert(QPair<const Unit*, const Unit*>(po, mm), new ConvertorOperator(25.4));
0190 
0191         //////////////////////////
0192         // TEMPERATURE
0193         /////////////////////////
0194 
0195         Unit* celsius
0196             = m_model->insertData(new Unit(QStringLiteral("celsius"), QStringLiteral("°C"), Unit::TEMPERATURE));
0197         Unit* kelvin= m_model->insertData(new Unit(QStringLiteral("kelvin"), QStringLiteral("K"), Unit::TEMPERATURE));
0198         Unit* fahrenheit
0199             = m_model->insertData(new Unit(QStringLiteral("fahrenheit"), QStringLiteral("°F"), Unit::TEMPERATURE));
0200 
0201         m_convertorTable.insert(QPair<const Unit*, const Unit*>(celsius, kelvin), new ConvertorOperator(1, -273.15));
0202         m_convertorTable.insert(QPair<const Unit*, const Unit*>(celsius, fahrenheit), new ConvertorOperator(1.8, 32));
0203         m_convertorTable.insert(QPair<const Unit*, const Unit*>(kelvin, celsius), new ConvertorOperator(1, 273.15));
0204         m_convertorTable.insert(QPair<const Unit*, const Unit*>(fahrenheit, celsius),
0205                                 new ConvertorOperator(1.8, -32, true));
0206 
0207         m_convertorTable.insert(QPair<const Unit*, const Unit*>(fahrenheit, kelvin),
0208                                 new ConvertorOperator(9.0 / 5.0, 459.67, true));
0209         m_convertorTable.insert(QPair<const Unit*, const Unit*>(kelvin, fahrenheit),
0210                                 new ConvertorOperator(9.0 / 5.0, -459.67));
0211 
0212         //////////////////////////
0213         // Currency
0214         /////////////////////////
0215         Unit* koku= m_model->insertData(new Unit(QStringLiteral("koku"), QStringLiteral("koku"), Unit::CURRENCY));
0216         Unit* bu= m_model->insertData(new Unit(QStringLiteral("bu"), QStringLiteral("bu"), Unit::CURRENCY));
0217         Unit* zeni= m_model->insertData(new Unit(QStringLiteral("zeni"), QStringLiteral("zeni"), Unit::CURRENCY));
0218 
0219         m_convertorTable.insert(QPair<const Unit*, const Unit*>(koku, bu), new ConvertorOperator(5));
0220         m_convertorTable.insert(QPair<const Unit*, const Unit*>(koku, zeni), new ConvertorOperator(50));
0221 
0222         m_convertorTable.insert(QPair<const Unit*, const Unit*>(bu, koku), new ConvertorOperator(0.2));
0223         m_convertorTable.insert(QPair<const Unit*, const Unit*>(bu, zeni), new ConvertorOperator(10));
0224 
0225         m_convertorTable.insert(QPair<const Unit*, const Unit*>(zeni, koku), new ConvertorOperator(0.02));
0226         m_convertorTable.insert(QPair<const Unit*, const Unit*>(zeni, bu), new ConvertorOperator(0.1));
0227 
0228         //////////////////////////
0229         // MASS
0230         /////////////////////////
0231         Unit* gram= m_model->insertData(new Unit(QStringLiteral("gram"), QStringLiteral("g"), Unit::MASS));
0232         Unit* kilo= m_model->insertData(new Unit(QStringLiteral("kilogram"), QStringLiteral("Kg"), Unit::MASS));
0233         Unit* once= m_model->insertData(new Unit(QStringLiteral("Once"), QStringLiteral("oz"), Unit::MASS));
0234         Unit* pound= m_model->insertData(new Unit(QStringLiteral("Pound"), QStringLiteral("lb"), Unit::MASS));
0235 
0236         m_convertorTable.insert(QPair<const Unit*, const Unit*>(gram, kilo), new ConvertorOperator(0.001));
0237         m_convertorTable.insert(QPair<const Unit*, const Unit*>(gram, once), new ConvertorOperator(1.0 / 28.349));
0238         m_convertorTable.insert(QPair<const Unit*, const Unit*>(gram, pound), new ConvertorOperator(1.0 / 453.59237));
0239 
0240         m_convertorTable.insert(QPair<const Unit*, const Unit*>(kilo, gram), new ConvertorOperator(1000));
0241         m_convertorTable.insert(QPair<const Unit*, const Unit*>(kilo, once), new ConvertorOperator(1.0 / 0.028349));
0242         m_convertorTable.insert(QPair<const Unit*, const Unit*>(kilo, pound), new ConvertorOperator(1.0 / 0.45359237));
0243 
0244         m_convertorTable.insert(QPair<const Unit*, const Unit*>(once, gram), new ConvertorOperator(28.349));
0245         m_convertorTable.insert(QPair<const Unit*, const Unit*>(once, kilo), new ConvertorOperator(0.028349));
0246         m_convertorTable.insert(QPair<const Unit*, const Unit*>(once, pound), new ConvertorOperator(1.0 / 16.0));
0247 
0248         m_convertorTable.insert(QPair<const Unit*, const Unit*>(pound, gram), new ConvertorOperator(453.59237));
0249         m_convertorTable.insert(QPair<const Unit*, const Unit*>(pound, kilo), new ConvertorOperator(0.45359237));
0250         m_convertorTable.insert(QPair<const Unit*, const Unit*>(pound, once), new ConvertorOperator(16.0));
0251 
0252         ////////////////////////////
0253         // Volume
0254         ////////////////////////////
0255         Unit* cubicMeter
0256             = m_model->insertData(new Unit(QStringLiteral("Cubic Meter"), QStringLiteral("m³"), Unit::VOLUME));
0257         Unit* cubicFeet
0258             = m_model->insertData(new Unit(QStringLiteral("Cubic Feet"), QStringLiteral("ft³"), Unit::VOLUME));
0259 
0260         m_convertorTable.insert(QPair<const Unit*, const Unit*>(cubicMeter, cubicFeet), new ConvertorOperator(35.3147));
0261         m_convertorTable.insert(QPair<const Unit*, const Unit*>(cubicFeet, cubicMeter),
0262                                 new ConvertorOperator(0.0283168));
0263     }
0264 
0265     m_catModel->setSourceModel(m_model.get());
0266     m_toModel->setSourceModel(m_model.get());
0267     // editCatModel->setSourceModel(m_model);
0268 
0269     m_customRulesModel->setSourceModel(m_model.get());
0270     categoryHasChangedOnSecondPanel(0);
0271     m_customRulesModel->setConvertionRules(&m_convertorTable);
0272 
0273     ui->m_tableView->setModel(m_customRulesModel.get());
0274 
0275     ui->m_fromCombo->setModel(m_catModel.get());
0276     ui->m_toCombo->setModel(m_toModel.get());
0277     connect(ui->m_fromLine, SIGNAL(textChanged(QString)), this, SLOT(convert()));
0278     connect(ui->m_convert, SIGNAL(clicked(bool)), this, SLOT(convert()));
0279     connect(ui->m_fromCombo, SIGNAL(currentIndexChanged(int)), this, SLOT(convert()));
0280     connect(ui->m_toCombo, SIGNAL(currentIndexChanged(int)), this, SLOT(convert()));
0281 
0282     categoryHasChanged(0);
0283 }
0284 
0285 Convertor::~Convertor()
0286 {
0287     qDeleteAll(m_convertorTable);
0288     delete ui;
0289 }
0290 
0291 void Convertor::readSettings()
0292 {
0293     QSettings setting(QStringLiteral("rolisteam"), QStringLiteral("rolisteam"));
0294     setting.beginGroup("UnitModel");
0295 
0296     auto size= setting.beginReadArray("units");
0297     for(int i= 0; i < size; ++i)
0298     {
0299         setting.setArrayIndex(i);
0300         auto name= setting.value("name").toString();
0301         auto symbol= setting.value("symbol").toString();
0302         auto cat= setting.value("category").toInt();
0303         auto readonly= setting.value("readonly").toBool();
0304         auto unit= new Unit(name, symbol, static_cast<GMTOOL::Unit::Category>(cat));
0305         unit->setReadOnly(readonly);
0306         m_model->insertData(unit);
0307     }
0308     setting.endArray();
0309     setting.endGroup();
0310 
0311     setting.beginGroup("UnitModel");
0312 
0313     int nodeSize= setting.beginReadArray(QStringLiteral("convertor"));
0314     for(int i= 0; i < nodeSize; ++i)
0315     {
0316         setting.setArrayIndex(i);
0317         auto fromUnitId= setting.value(QStringLiteral("fromUnit")).toInt();
0318         auto toUnitId= setting.value(QStringLiteral("toUnit")).toInt();
0319 
0320         auto readOnly= setting.value(QStringLiteral("readOnly")).toBool();
0321         auto fraction= setting.value(QStringLiteral("fraction")).toBool();
0322         auto a= setting.value(QStringLiteral("a")).toDouble();
0323         auto b= setting.value(QStringLiteral("b")).toDouble();
0324 
0325         auto convertor= new ConvertorOperator(a, b, fraction, readOnly);
0326 
0327         auto unitFrom= m_model->getUnitByIndex(fromUnitId);
0328         auto unitTo= m_model->getUnitByIndex(toUnitId);
0329         m_convertorTable.insert(QPair<const Unit*, const Unit*>(unitFrom, unitTo), convertor);
0330     }
0331     setting.endArray();
0332     setting.endGroup();
0333 }
0334 
0335 void Convertor::writeSettings()
0336 {
0337     QSettings setting("rolisteam", "rolisteam");
0338     setting.beginGroup("UnitModel");
0339 
0340     setting.beginWriteArray("units");
0341     for(int i= 0; i < m_model->rowCount(); ++i)
0342     {
0343         auto unit= m_model->getUnitByIndex(i);
0344         setting.setArrayIndex(i);
0345         setting.setValue("name", unit->name());
0346         setting.setValue("symbol", unit->symbol());
0347         setting.setValue("category", unit->currentCat());
0348         setting.setValue("readonly", unit->readOnly());
0349     }
0350     setting.endArray();
0351     setting.endGroup();
0352 
0353     setting.beginGroup("UnitModel");
0354     setting.beginWriteArray(QStringLiteral("convertor"), m_convertorTable.size());
0355 
0356     int i= 0;
0357     auto const& keys= m_convertorTable.keys();
0358     for(auto& pair : keys)
0359     {
0360         auto convertor= m_convertorTable[pair];
0361 
0362         if(nullptr != convertor)
0363         {
0364             setting.setArrayIndex(i);
0365             auto a= m_model->getIndex(const_cast<Unit*>(pair.first));
0366             auto b= m_model->getIndex(const_cast<Unit*>(pair.second));
0367 
0368             setting.setValue(QStringLiteral("fromUnit"), a);
0369             setting.setValue(QStringLiteral("toUnit"), b);
0370 
0371             setting.setValue(QStringLiteral("readOnly"), convertor->isReadOnly());
0372             setting.setValue(QStringLiteral("fraction"), convertor->fraction());
0373             setting.setValue(QStringLiteral("a"), convertor->a());
0374             setting.setValue(QStringLiteral("b"), convertor->b());
0375             ++i;
0376         }
0377     }
0378     setting.endArray();
0379     setting.endGroup();
0380 }
0381 
0382 void Convertor::categoryHasChanged(int i)
0383 {
0384     ui->m_toLine->clear();
0385     m_catModel->setCurrentCategory(m_model->getCatNameFromId(static_cast<Unit::Category>(i)));
0386     m_toModel->setCurrentCategory(m_model->getCatNameFromId(static_cast<Unit::Category>(i)));
0387 }
0388 
0389 void Convertor::categoryHasChangedOnSecondPanel(int i)
0390 {
0391     m_customRulesModel->setCurrentCategoryId(m_model->getCatNameFromId(static_cast<Unit::Category>(i)), i);
0392 }
0393 
0394 void Convertor::convert()
0395 {
0396     QModelIndex source= m_catModel->index(ui->m_fromCombo->currentIndex(), 0);
0397     QModelIndex to= m_toModel->index(ui->m_toCombo->currentIndex(), 0);
0398 
0399     if(!source.isValid() || !to.isValid())
0400         return;
0401 
0402     Unit* from= m_model->getUnitFromIndex(source, ui->m_categoryCombo->currentIndex());
0403     Unit* dest= m_model->getUnitFromIndex(to, ui->m_categoryCombo->currentIndex());
0404 
0405     ConvertorOperator* convert= m_convertorTable.value(QPair<const Unit*, const Unit*>(from, dest));
0406     if(nullptr != convert)
0407     {
0408         double d= convert->convert(ui->m_fromLine->text().toDouble());
0409         ui->m_toLine->setText(QStringLiteral("%1").arg(d));
0410     }
0411 }
0412 } // namespace GMTOOL