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

0001 /*
0002     SPDX-FileCopyrightText: 2020 Thomas Baumgart <tbaumgart@kde.org>
0003     SPDX-License-Identifier: GPL-2.0-or-later
0004 */
0005 
0006 #include "amounteditcurrencyhelper.h"
0007 
0008 // ----------------------------------------------------------------------------
0009 // QT Includes
0010 
0011 #include <QDebug>
0012 
0013 // ----------------------------------------------------------------------------
0014 // KDE Includes
0015 
0016 // ----------------------------------------------------------------------------
0017 // Project Includes
0018 
0019 #include "accountsmodel.h"
0020 #include "amountedit.h"
0021 #include "kmymoneyaccountcombo.h"
0022 #include "multicurrencyedit.h"
0023 #include "mymoneyexception.h"
0024 #include "mymoneyfile.h"
0025 #include "securitiesmodel.h"
0026 
0027 class AmountEditCurrencyHelperPrivate
0028 {
0029     Q_DECLARE_PUBLIC(AmountEditCurrencyHelper)
0030 
0031 public:
0032     AmountEditCurrencyHelperPrivate(AmountEditCurrencyHelper* qq, MultiCurrencyEdit* aamount)
0033         : q_ptr(qq)
0034         , amount(aamount)
0035     {
0036     }
0037 
0038     AmountEditCurrencyHelper* q_ptr;
0039     MultiCurrencyEdit* amount;
0040     QString commodityId;
0041 
0042     void init(KMyMoneyAccountCombo* category, const QString& _commodityId)
0043     {
0044         Q_Q(AmountEditCurrencyHelper);
0045         commodityId = _commodityId;
0046 
0047         q->connect(category, &KMyMoneyAccountCombo::accountSelected, q, &AmountEditCurrencyHelper::categoryChanged);
0048 
0049         q->categoryChanged(category->getSelected());
0050     }
0051 };
0052 
0053 AmountEditCurrencyHelper::AmountEditCurrencyHelper(KMyMoneyAccountCombo* category, MultiCurrencyEdit* amount, const QString& commodityId)
0054     : QObject(category)
0055     , d_ptr(new AmountEditCurrencyHelperPrivate(this, amount))
0056 {
0057     Q_D(AmountEditCurrencyHelper);
0058     connect(amount->widget(), &QObject::destroyed, this, &QObject::deleteLater);
0059     connect(this, &AmountEditCurrencyHelper::commodityChanged, this, [&](const MyMoneySecurity& commodity) {
0060         Q_D(AmountEditCurrencyHelper);
0061         d->amount->setSharesCommodity(commodity);
0062     });
0063     d->init(category, commodityId);
0064 }
0065 
0066 AmountEditCurrencyHelper::~AmountEditCurrencyHelper()
0067 {
0068     Q_D(AmountEditCurrencyHelper);
0069     delete d;
0070 }
0071 
0072 void AmountEditCurrencyHelper::setCommodity(const QString& commodityId)
0073 {
0074     Q_D(AmountEditCurrencyHelper);
0075     d->commodityId = commodityId;
0076     // update the widget
0077     if (!commodityId.isEmpty()) {
0078         const auto category = qobject_cast<KMyMoneyAccountCombo*>(parent());
0079         if (category) {
0080             categoryChanged(category->getSelected());
0081         }
0082     }
0083 }
0084 
0085 void AmountEditCurrencyHelper::categoryChanged(const QString& id)
0086 {
0087     Q_D(AmountEditCurrencyHelper);
0088 
0089     if (!id.isEmpty()) {
0090         try {
0091             const auto category = MyMoneyFile::instance()->account(id);
0092             const auto security = MyMoneyFile::instance()->security(category.currencyId());
0093             if (security.id() != d->commodityId) {
0094                 if (category.isIncomeExpense()) {
0095                     Q_EMIT commodityChanged(security);
0096                 } else {
0097                     Q_EMIT commodityChanged(MyMoneyFile::instance()->security(d->commodityId));
0098                 }
0099             }
0100         } catch (MyMoneyException&) {
0101         }
0102     }
0103 }