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 }