File indexing completed on 2024-05-12 05:07:54

0001 /*
0002     SPDX-FileCopyrightText: 2021 Thomas Baumgart <tbaumgart@kde.org>
0003     SPDX-License-Identifier: GPL-2.0-or-later
0004 */
0005 
0006 #include "creditdebitedit.h"
0007 
0008 // ----------------------------------------------------------------------------
0009 // QT Includes
0010 
0011 #include <QDebug>
0012 #include <QPointer>
0013 
0014 // ----------------------------------------------------------------------------
0015 // KDE Includes
0016 
0017 // ----------------------------------------------------------------------------
0018 // Project Includes
0019 
0020 #include "amountedit.h"
0021 #include "mymoneysecurity.h"
0022 #include "ui_creditdebitedit.h"
0023 
0024 class CreditDebitEditPrivate
0025 {
0026     Q_DISABLE_COPY(CreditDebitEditPrivate)
0027     Q_DECLARE_PUBLIC(CreditDebitEdit)
0028 
0029 public:
0030     explicit CreditDebitEditPrivate(CreditDebitEdit* qq)
0031         : q_ptr(qq)
0032         , ui(new Ui::CreditDebitEdit)
0033     {
0034         ui->setupUi(qq);
0035     }
0036 
0037     void widgetChanged(AmountEdit* src, AmountEdit* dst)
0038     {
0039         // make sure the objects exist
0040         if (!src || !dst) {
0041             return;
0042         }
0043 
0044         // in case both are filled with text, the src wins
0045         if (!src->text().isEmpty() && !dst->text().isEmpty()) {
0046             dst->clear();
0047         }
0048 
0049         // in case the source is negative, we negate the value
0050         // and load it into destination.
0051         if (src->value().isNegative()) {
0052             dst->setValue(-(src->value()));
0053             dst->setShares(-(src->shares()));
0054             src->clear();
0055         }
0056         Q_Q(CreditDebitEdit);
0057         Q_EMIT q->amountChanged();
0058     }
0059 
0060     CreditDebitEdit* q_ptr;
0061     Ui::CreditDebitEdit* ui;
0062 };
0063 
0064 CreditDebitEdit::CreditDebitEdit(QWidget* parent)
0065     : QWidget(parent)
0066     , d_ptr(new CreditDebitEditPrivate(this))
0067 {
0068     Q_D(CreditDebitEdit);
0069     connect(d->ui->creditAmount, &AmountEdit::amountChanged, this, &CreditDebitEdit::creditChanged);
0070     connect(d->ui->debitAmount, &AmountEdit::amountChanged, this, &CreditDebitEdit::debitChanged);
0071 
0072     // propagate display state changes
0073     connect(d->ui->creditAmount, &AmountEdit::displayStateChanged, d->ui->debitAmount, &AmountEdit::setDisplayState);
0074     connect(d->ui->debitAmount, &AmountEdit::displayStateChanged, d->ui->creditAmount, &AmountEdit::setDisplayState);
0075 
0076     setFocusPolicy(Qt::StrongFocus);
0077     setFocusProxy(d->ui->creditAmount);
0078 }
0079 
0080 CreditDebitEdit::~CreditDebitEdit()
0081 {
0082     Q_D(CreditDebitEdit);
0083     delete d;
0084 }
0085 
0086 void CreditDebitEdit::creditChanged()
0087 {
0088     Q_D(CreditDebitEdit);
0089     d->widgetChanged(d->ui->creditAmount, d->ui->debitAmount);
0090 }
0091 
0092 void CreditDebitEdit::debitChanged()
0093 {
0094     Q_D(CreditDebitEdit);
0095     d->widgetChanged(d->ui->debitAmount, d->ui->creditAmount);
0096 }
0097 
0098 bool CreditDebitEdit::haveValue() const
0099 {
0100     Q_D(const CreditDebitEdit);
0101     return (!d->ui->creditAmount->text().isEmpty()) || (!d->ui->debitAmount->text().isEmpty());
0102 }
0103 
0104 MyMoneyMoney CreditDebitEdit::value() const
0105 {
0106     Q_D(const CreditDebitEdit);
0107     MyMoneyMoney value;
0108 
0109     if (!d->ui->creditAmount->text().isEmpty()) {
0110         value = -d->ui->creditAmount->value();
0111     } else {
0112         value = d->ui->debitAmount->value();
0113     }
0114     return value;
0115 }
0116 
0117 void CreditDebitEdit::setValue(const MyMoneyMoney& amount)
0118 {
0119     Q_D(CreditDebitEdit);
0120 
0121     if (amount.isNegative()) {
0122         d->ui->creditAmount->setValue(-amount);
0123         d->ui->debitAmount->clear();
0124     } else {
0125         d->ui->debitAmount->setValue(amount);
0126         d->ui->creditAmount->clear();
0127     }
0128 }
0129 
0130 MyMoneyMoney CreditDebitEdit::shares() const
0131 {
0132     Q_D(const CreditDebitEdit);
0133     MyMoneyMoney value;
0134 
0135     if (!d->ui->creditAmount->text().isEmpty()) {
0136         value = -d->ui->creditAmount->shares();
0137     } else {
0138         value = d->ui->debitAmount->shares();
0139     }
0140     return value;
0141 }
0142 
0143 void CreditDebitEdit::setShares(const MyMoneyMoney& amount)
0144 {
0145     Q_D(CreditDebitEdit);
0146 
0147     if (amount.isNegative()) {
0148         d->ui->creditAmount->setShares(-amount);
0149         d->ui->debitAmount->clear();
0150     } else {
0151         d->ui->debitAmount->setShares(amount);
0152         d->ui->creditAmount->clear();
0153     }
0154 }
0155 
0156 void CreditDebitEdit::setCurrencySymbol(const QString& symbol, const QString& name)
0157 {
0158     Q_D(CreditDebitEdit);
0159     d->ui->creditAmount->setCurrencySymbol(symbol, name);
0160     d->ui->debitAmount->setCurrencySymbol(symbol, name);
0161 }
0162 
0163 void CreditDebitEdit::setValueCommodity(const MyMoneySecurity& commodity)
0164 {
0165     Q_D(CreditDebitEdit);
0166 
0167     d->ui->creditAmount->setValueCommodity(commodity);
0168     d->ui->debitAmount->setValueCommodity(commodity);
0169 }
0170 
0171 void CreditDebitEdit::setSharesCommodity(const MyMoneySecurity& commodity)
0172 {
0173     Q_D(CreditDebitEdit);
0174 
0175     d->ui->creditAmount->setSharesCommodity(commodity);
0176     d->ui->debitAmount->setSharesCommodity(commodity);
0177 }
0178 
0179 MyMoneySecurity CreditDebitEdit::valueCommodity() const
0180 {
0181     Q_D(const CreditDebitEdit);
0182     return d->ui->creditAmount->valueCommodity();
0183 }
0184 
0185 MyMoneySecurity CreditDebitEdit::sharesCommodity() const
0186 {
0187     Q_D(const CreditDebitEdit);
0188     return d->ui->creditAmount->sharesCommodity();
0189 }
0190 
0191 void CreditDebitEdit::setCommodity(const MyMoneySecurity& commodity)
0192 {
0193     setValueCommodity(commodity);
0194     setSharesCommodity(commodity);
0195 }
0196 
0197 void CreditDebitEdit::setInitialExchangeRate(const MyMoneyMoney& price)
0198 {
0199     Q_D(CreditDebitEdit);
0200     d->ui->creditAmount->setInitialExchangeRate(price);
0201     d->ui->debitAmount->setInitialExchangeRate(price);
0202 }
0203 
0204 MyMoneyMoney CreditDebitEdit::initialExchangeRate() const
0205 {
0206     Q_D(const CreditDebitEdit);
0207     // we only need to return the exchange rate of one widget
0208     return d->ui->creditAmount->initialExchangeRate();
0209 }
0210 
0211 void CreditDebitEdit::swapCreditDebit()
0212 {
0213     Q_D(CreditDebitEdit);
0214     disconnect(d->ui->creditAmount, &AmountEdit::amountChanged, this, &CreditDebitEdit::creditChanged);
0215     disconnect(d->ui->debitAmount, &AmountEdit::amountChanged, this, &CreditDebitEdit::debitChanged);
0216 
0217     std::swap(d->ui->creditAmount, d->ui->debitAmount);
0218 
0219     connect(d->ui->creditAmount, &AmountEdit::amountChanged, this, &CreditDebitEdit::creditChanged);
0220     connect(d->ui->debitAmount, &AmountEdit::amountChanged, this, &CreditDebitEdit::debitChanged);
0221 }
0222 
0223 void CreditDebitEdit::setAllowEmpty(bool allowed)
0224 {
0225     Q_D(CreditDebitEdit);
0226     d->ui->creditAmount->setAllowEmpty(allowed);
0227     d->ui->debitAmount->setAllowEmpty(allowed);
0228 }
0229 
0230 void CreditDebitEdit::setPlaceholderText(const QString& creditText, const QString& debitText)
0231 {
0232     Q_D(CreditDebitEdit);
0233     d->ui->creditAmount->setPlaceholderText(creditText);
0234     d->ui->debitAmount->setPlaceholderText(debitText);
0235 }
0236 
0237 QWidget* CreditDebitEdit::widget()
0238 {
0239     return this;
0240 }
0241 
0242 MultiCurrencyEdit::DisplayState CreditDebitEdit::displayState() const
0243 {
0244     Q_D(const CreditDebitEdit);
0245     return d->ui->creditAmount->displayState();
0246 }
0247 
0248 bool CreditDebitEdit::hasMultipleCurrencies() const
0249 {
0250     Q_D(const CreditDebitEdit);
0251     return d->ui->creditAmount->hasMultipleCurrencies();
0252 }
0253 
0254 int CreditDebitEdit::precision(MultiCurrencyEdit::DisplayState state) const
0255 {
0256     Q_D(const CreditDebitEdit);
0257     return d->ui->creditAmount->precision(state);
0258 }
0259 
0260 void CreditDebitEdit::setDisplayState(MultiCurrencyEdit::DisplayState state)
0261 {
0262     Q_D(CreditDebitEdit);
0263     d->ui->creditAmount->setDisplayState(state);
0264     d->ui->debitAmount->setDisplayState(state);
0265 }