File indexing completed on 2024-05-12 16:42:04

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 public:
0027     KCurrencyEditorDlgPrivate()
0028         : ui(new Ui::KCurrencyEditorDlg)
0029     {
0030     }
0031 
0032     ~KCurrencyEditorDlgPrivate()
0033     {
0034         delete ui;
0035     }
0036 
0037     void validateValues()
0038     {
0039         // enable the OK button only, if all values are valid
0040         ui->buttonBox->button(QDialogButtonBox::Ok)->setEnabled(true);
0041 
0042         if (ui->leIsoCode->text().isEmpty()
0043                 || ui->leName->text().isEmpty()
0044                 || ui->leSymbol->text().isEmpty()
0045                 || MyMoneyMoney(ui->leCashFraction->text()).isZero()
0046                 || MyMoneyMoney(ui->leCashFraction->text()).isNegative()
0047                 || MyMoneyMoney(ui->leAccountFraction->text()).isZero()
0048                 || MyMoneyMoney(ui->leAccountFraction->text()).isNegative()) {
0049             ui->buttonBox->button(QDialogButtonBox::Ok)->setEnabled(false);
0050         }
0051     }
0052 
0053     MyMoneySecurity currency;
0054     Ui::KCurrencyEditorDlg* ui;
0055 };
0056 
0057 KCurrencyEditorDlg::KCurrencyEditorDlg(const MyMoneySecurity& currency, QWidget *parent)
0058     : d_ptr(new KCurrencyEditorDlgPrivate)
0059 {
0060     Q_UNUSED(parent);
0061     Q_D(KCurrencyEditorDlg);
0062     d->currency = currency;
0063     d->ui->setupUi(this);
0064 
0065     connect(d->ui->leIsoCode, &QLineEdit::textChanged, this, [&]() {
0066         Q_D(KCurrencyEditorDlg);
0067         d->validateValues();
0068     });
0069     connect(d->ui->leName, &QLineEdit::textChanged, this, [&]() {
0070         Q_D(KCurrencyEditorDlg);
0071         d->validateValues();
0072     });
0073     connect(d->ui->leSymbol, &QLineEdit::textChanged, this, [&]() {
0074         Q_D(KCurrencyEditorDlg);
0075         d->validateValues();
0076     });
0077     connect(d->ui->leCashFraction, &QLineEdit::textChanged, this, [&]() {
0078         Q_D(KCurrencyEditorDlg);
0079         d->validateValues();
0080     });
0081     connect(d->ui->leAccountFraction, &QLineEdit::textChanged, this, [&]() {
0082         Q_D(KCurrencyEditorDlg);
0083         d->validateValues();
0084     });
0085 
0086     // fill the fields
0087     d->ui->leIsoCode->setText(currency.id());
0088 
0089     d->ui->leName->setText(currency.name());
0090     d->ui->leSymbol->setText(currency.tradingSymbol());
0091 
0092     int precision = MyMoneyMoney::denomToPrec(currency.smallestCashFraction());
0093     MyMoneyMoney smallestFraction = MyMoneyMoney::ONE / MyMoneyMoney(currency.smallestCashFraction());
0094     d->ui->leCashFraction->setText(smallestFraction.formatMoney(QString(), precision));
0095 
0096     precision = MyMoneyMoney::denomToPrec(currency.smallestAccountFraction());
0097     smallestFraction = MyMoneyMoney::ONE / MyMoneyMoney(currency.smallestAccountFraction());
0098     d->ui->leAccountFraction->setText(smallestFraction.formatMoney(QString(), precision));
0099 
0100     d->ui->comboRoundingMethod->setCurrentIndex(currency.roundingMethod());
0101     d->ui->spbPricePrecision->setValue(currency.pricePrecision());
0102 
0103 
0104     // make those widgets readonly that are not allowed to change
0105     if (!currency.id().isEmpty()) {
0106         d->ui->leIsoCode->setReadOnly(true);
0107         d->ui->leCashFraction->setReadOnly(true);
0108         d->ui->leAccountFraction->setReadOnly(true);
0109     }
0110 
0111     d->validateValues();
0112 }
0113 
0114 KCurrencyEditorDlg::~KCurrencyEditorDlg()
0115 {
0116     Q_D(KCurrencyEditorDlg);
0117     delete d;
0118 }
0119 
0120 MyMoneySecurity KCurrencyEditorDlg::currency() const
0121 {
0122     Q_D(const KCurrencyEditorDlg);
0123     MyMoneySecurity newCurrency = d->currency;
0124 
0125     // if we are creating a new currency, we need to assing the ID
0126     if (d->currency.id().isEmpty()) {
0127         newCurrency = MyMoneySecurity(d->ui->leIsoCode->text(), newCurrency);
0128     }
0129 
0130     newCurrency.setName(d->ui->leName->text());
0131     newCurrency.setTradingSymbol(d->ui->leSymbol->text());
0132 
0133     MyMoneyMoney value(d->ui->leCashFraction->text());
0134     int fraction = static_cast<int>((MyMoneyMoney::ONE / value).toDouble());
0135     newCurrency.setSmallestCashFraction(fraction);
0136 
0137     value = MyMoneyMoney(d->ui->leAccountFraction->text());
0138     fraction = static_cast<int>((MyMoneyMoney::ONE / value).toDouble());
0139     newCurrency.setSmallestAccountFraction(fraction);
0140 
0141     newCurrency.setRoundingMethod(static_cast<AlkValue::RoundingMethod>(d->ui->comboRoundingMethod->currentIndex()));
0142     newCurrency.setPricePrecision(d->ui->spbPricePrecision->value());
0143     return newCurrency;
0144 }
0145