File indexing completed on 2024-05-19 05:06:50

0001 /*
0002     SPDX-FileCopyrightText: 2017 Łukasz Wojniłowicz <lukasz.wojnilowicz@gmail.com>
0003     SPDX-FileCopyrightText: 2020 Thomas Baumgart <tbaumgart@kde.org>
0004     SPDX-License-Identifier: GPL-2.0-or-later
0005 */
0006 
0007 #include "kcurrencyeditordlg.h"
0008 
0009 // ----------------------------------------------------------------------------
0010 // QT Includes
0011 
0012 #include <QPushButton>
0013 
0014 // ----------------------------------------------------------------------------
0015 // KDE Includes
0016 
0017 // ----------------------------------------------------------------------------
0018 // Project Includes
0019 
0020 #include <ui_kcurrencyeditordlg.h>
0021 #include "mymoneymoney.h"
0022 #include "mymoneysecurity.h"
0023 
0024 class KCurrencyEditorDlgPrivate
0025 {
0026     Q_DISABLE_COPY_MOVE(KCurrencyEditorDlgPrivate)
0027 
0028 public:
0029     KCurrencyEditorDlgPrivate()
0030         : ui(new Ui::KCurrencyEditorDlg)
0031     {
0032     }
0033 
0034     ~KCurrencyEditorDlgPrivate()
0035     {
0036         delete ui;
0037     }
0038 
0039     void validateValues()
0040     {
0041         // enable the OK button only, if all values are valid
0042         ui->buttonBox->button(QDialogButtonBox::Ok)->setEnabled(true);
0043 
0044         if (ui->leIsoCode->text().isEmpty()
0045                 || ui->leName->text().isEmpty()
0046                 || ui->leSymbol->text().isEmpty()
0047                 || MyMoneyMoney(ui->leCashFraction->text()).isZero()
0048                 || MyMoneyMoney(ui->leCashFraction->text()).isNegative()
0049                 || MyMoneyMoney(ui->leAccountFraction->text()).isZero()
0050                 || MyMoneyMoney(ui->leAccountFraction->text()).isNegative()) {
0051             ui->buttonBox->button(QDialogButtonBox::Ok)->setEnabled(false);
0052         }
0053     }
0054 
0055     MyMoneySecurity currency;
0056     Ui::KCurrencyEditorDlg* ui;
0057 };
0058 
0059 KCurrencyEditorDlg::KCurrencyEditorDlg(const MyMoneySecurity& currency, QWidget *parent)
0060     : d_ptr(new KCurrencyEditorDlgPrivate)
0061 {
0062     Q_UNUSED(parent);
0063     Q_D(KCurrencyEditorDlg);
0064     d->currency = currency;
0065     d->ui->setupUi(this);
0066 
0067     connect(d->ui->leIsoCode, &QLineEdit::textChanged, this, [&]() {
0068         Q_D(KCurrencyEditorDlg);
0069         d->validateValues();
0070     });
0071     connect(d->ui->leName, &QLineEdit::textChanged, this, [&]() {
0072         Q_D(KCurrencyEditorDlg);
0073         d->validateValues();
0074     });
0075     connect(d->ui->leSymbol, &QLineEdit::textChanged, this, [&]() {
0076         Q_D(KCurrencyEditorDlg);
0077         d->validateValues();
0078     });
0079     connect(d->ui->leCashFraction, &QLineEdit::textChanged, this, [&]() {
0080         Q_D(KCurrencyEditorDlg);
0081         d->validateValues();
0082     });
0083     connect(d->ui->leAccountFraction, &QLineEdit::textChanged, this, [&]() {
0084         Q_D(KCurrencyEditorDlg);
0085         d->validateValues();
0086     });
0087 
0088     // fill the fields
0089     d->ui->leIsoCode->setText(currency.id());
0090 
0091     d->ui->leName->setText(currency.name());
0092     d->ui->leSymbol->setText(currency.tradingSymbol());
0093 
0094     int precision = MyMoneyMoney::denomToPrec(currency.smallestCashFraction());
0095     MyMoneyMoney smallestFraction = MyMoneyMoney::ONE / MyMoneyMoney(currency.smallestCashFraction());
0096     d->ui->leCashFraction->setText(smallestFraction.formatMoney(QString(), precision));
0097 
0098     precision = MyMoneyMoney::denomToPrec(currency.smallestAccountFraction());
0099     smallestFraction = MyMoneyMoney::ONE / MyMoneyMoney(currency.smallestAccountFraction());
0100     d->ui->leAccountFraction->setText(smallestFraction.formatMoney(QString(), precision));
0101 
0102     d->ui->comboRoundingMethod->setCurrentIndex(currency.roundingMethod());
0103     d->ui->spbPricePrecision->setValue(currency.pricePrecision());
0104 
0105 
0106     // make those widgets readonly that are not allowed to change
0107     if (!currency.id().isEmpty()) {
0108         d->ui->leIsoCode->setReadOnly(true);
0109         d->ui->leCashFraction->setReadOnly(true);
0110         d->ui->leAccountFraction->setReadOnly(true);
0111     }
0112 
0113     d->validateValues();
0114 }
0115 
0116 KCurrencyEditorDlg::~KCurrencyEditorDlg()
0117 {
0118     Q_D(KCurrencyEditorDlg);
0119     delete d;
0120 }
0121 
0122 MyMoneySecurity KCurrencyEditorDlg::currency() const
0123 {
0124     // MyMoneySecurity handles the maximum fraction as
0125     // int. mpz_class only supports conversion with 32bit
0126     // ints so we limit the maximum fraction to a value
0127     // representable by such a variable. Modifying the
0128     // handling of fraction to mpz_class based integers
0129     // could solve the problem.
0130     auto maxFraction = [&](unsigned int f) {
0131         if ((f == 0) || (f > 2147483647)) {
0132             f = 1000000000;
0133         }
0134         return f;
0135     };
0136 
0137     Q_D(const KCurrencyEditorDlg);
0138     MyMoneySecurity newCurrency = d->currency;
0139 
0140     // if we are creating a new currency, we need to assign the ID
0141     if (d->currency.id().isEmpty()) {
0142         newCurrency = MyMoneySecurity(d->ui->leIsoCode->text(), newCurrency);
0143     }
0144 
0145     newCurrency.setName(d->ui->leName->text());
0146     newCurrency.setTradingSymbol(d->ui->leSymbol->text());
0147 
0148     MyMoneyMoney value(d->ui->leCashFraction->text());
0149     int fraction = maxFraction(static_cast<unsigned int>((MyMoneyMoney::ONE / value.abs()).toDouble()));
0150     newCurrency.setSmallestCashFraction(fraction);
0151 
0152     value = MyMoneyMoney(d->ui->leAccountFraction->text());
0153     fraction = maxFraction(static_cast<unsigned int>((MyMoneyMoney::ONE / value.abs()).toDouble()));
0154     newCurrency.setSmallestAccountFraction(fraction);
0155 
0156     newCurrency.setRoundingMethod(static_cast<AlkValue::RoundingMethod>(d->ui->comboRoundingMethod->currentIndex()));
0157     newCurrency.setPricePrecision(d->ui->spbPricePrecision->value());
0158     return newCurrency;
0159 }
0160