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