diff --git a/kmymoney/converter/mymoneystatementreader.cpp b/kmymoney/converter/mymoneystatementreader.cpp
--- a/kmymoney/converter/mymoneystatementreader.cpp
+++ b/kmymoney/converter/mymoneystatementreader.cpp
@@ -55,6 +55,7 @@
#include "mymoneystatement.h"
#include "kmymoneyglobalsettings.h"
#include "transactioneditor.h"
+#include "stdtransactioneditor.h"
#include "kmymoneyedit.h"
#include "kaccountselectdlg.h"
#include "transactionmatcher.h"
@@ -65,6 +66,7 @@
#include "models.h"
#include "existingtransactionmatchfinder.h"
#include "scheduledtransactionmatchfinder.h"
+#include "dialogenums.h"
using namespace eMyMoney;
@@ -1343,17 +1345,17 @@
"create a new account by pressing the Create button.");
}
- KMyMoneyUtils::categoryTypeE type;
+ eDialogs::Category type;
if (account.accountType() == Account::Checkings) {
- type = static_cast(KMyMoneyUtils::checking);
+ type = eDialogs::Category::checking;
} else if (account.accountType() == Account::Savings) {
- type = static_cast(KMyMoneyUtils::savings);
+ type = eDialogs::Category::savings;
} else if (account.accountType() == Account::Investment) {
- type = static_cast(KMyMoneyUtils::investment);
+ type = eDialogs::Category::investment;
} else if (account.accountType() == Account::CreditCard) {
- type = static_cast(KMyMoneyUtils::creditCard);
+ type = eDialogs::Category::creditCard;
} else {
- type = static_cast(KMyMoneyUtils::asset | KMyMoneyUtils::liability);
+ type = static_cast(eDialogs::Category::asset | eDialogs::Category::liability);
}
QPointer accountSelect = new KAccountSelectDlg(type, "StatementImport", kmymoney);
@@ -1362,7 +1364,7 @@
accountSelect->setAccount(account, accountId);
accountSelect->setMode(false);
accountSelect->showAbortButton(true);
- accountSelect->m_qifEntry->hide();
+ accountSelect->hideQifEntry();
QString accname;
bool done = false;
while (!done) {
@@ -1456,7 +1458,7 @@
// for now this only works with regular transactions and not
// for investment transactions. As of this, we don't have
// scheduled investment transactions anyway.
- StdTransactionEditor* se = dynamic_cast(editor.data());
+ auto se = dynamic_cast(editor.data());
if (se) {
// the following call will update the amount field in the
// editor and also adjust a possible VAT assignment. Make
diff --git a/kmymoney/dialogs/CMakeLists.txt b/kmymoney/dialogs/CMakeLists.txt
--- a/kmymoney/dialogs/CMakeLists.txt
+++ b/kmymoney/dialogs/CMakeLists.txt
@@ -46,36 +46,37 @@
ktemplateexportdlg.cpp
kupdatestockpricedlg.cpp
transactioneditor.cpp
+ stdtransactioneditor.cpp
transactionmatcher.cpp
konlinetransferform.cpp
)
set(dialogs_HEADERS
splitadjustdialog.h
- investtransactioneditor.h kcurrencycalculator.h transactioneditor.h
+ investtransactioneditor.h kcurrencycalculator.h transactioneditor.h stdtransactioneditor.h
)
set(dialogs_UI
splitadjustdialog.ui
- kaccountselectdlgdecl.ui kbackupdlgdecl.ui
- kcategoryreassigndlgdecl.ui kchooseimportexportdlgdecl.ui
- kconfirmmanualenterdlgdecl.ui
- kcurrencycalculatordecl.ui kcurrencyeditdlg.ui kavailablecurrencydlg.ui kcurrencyeditordlg.ui
- keditscheduledlgdecl.ui
- kenterscheduledlgdecl.ui
- kequitypriceupdatedlgdecl.ui kequitypriceupdateconfdlg.ui
- kfindtransactiondlgdecl.ui kgeneratesqldlgdecl.ui kgncimportoptionsdlgdecl.ui
- kgncpricesourcedlgdecl.ui kloadtemplatedlgdecl.ui
- kmymoneyfileinfodlgdecl.ui kmymoneypricedlgdecl.ui
- knewaccountdlg.ui knewbankdlgdecl.ui knewbudgetdlgdecl.ui
- knewequityentrydecl.ui editpersonaldatadlgdecl.ui kpayeereassigndlgdecl.ui
- ktagreassigndlgdecl.ui
- kselectdatabasedlg.ui kselecttransactionsdlgdecl.ui
- ksortoptiondlg.ui ksplitcorrectiondlg.ui ksplittransactiondlgdecl.ui
+ kaccountselectdlg.ui kbackupdlg.ui
+ kcategoryreassigndlg.ui kchooseimportexportdlg.ui
+ kconfirmmanualenterdlg.ui
+ kcurrencycalculator.ui kcurrencyeditdlg.ui kavailablecurrencydlg.ui kcurrencyeditordlg.ui
+ keditscheduledlg.ui
+ kenterscheduledlg.ui
+ kequitypriceupdatedlg.ui kequitypriceupdateconfdlg.ui
+ kfindtransactiondlg.ui kgeneratesqldlg.ui kgncimportoptionsdlg.ui
+ kgncpricesourcedlg.ui kloadtemplatedlg.ui
+ kmymoneyfileinfodlg.ui kmymoneypricedlg.ui
+ knewaccountdlg.ui knewbankdlg.ui knewbudgetdlg.ui
+ knewequityentrydlg.ui editpersonaldatadlg.ui kpayeereassigndlg.ui
+ ktagreassigndlg.ui
+ kselectdatabasedlg.ui kselecttransactionsdlg.ui
+ ksortoptiondlg.ui ksplitcorrectiondlg.ui ksplittransactiondlg.ui
ktemplateexportdlg.ui
- kupdatestockpricedlgdecl.ui
+ kupdatestockpricedlg.ui
../widgets/kaccounttemplateselectordecl.ui ../widgets/transactionsortoptiondecl.ui
- konlinetransferformdecl.ui
+ konlinetransferform.ui
)
ki18n_wrap_ui(libdialogs_a_SOURCES ${dialogs_UI} )
diff --git a/kmymoney/dialogs/dialogenums.h b/kmymoney/dialogs/dialogenums.h
new file mode 100644
--- /dev/null
+++ b/kmymoney/dialogs/dialogenums.h
@@ -0,0 +1,65 @@
+/***************************************************************************
+ dialogenums.h
+ -------------------
+ copyright : (C) 2017 by Łukasz Wojniłowicz
+
+***************************************************************************/
+
+/***************************************************************************
+ * *
+ * This program is free software; you can redistribute it and/or modify *
+ * it under the terms of the GNU General Public License as published by *
+ * the Free Software Foundation; either version 2 of the License, or *
+ * (at your option) any later version. *
+ * *
+ ***************************************************************************/
+
+#ifndef DIALOGENUMS_H
+#define DIALOGENUMS_H
+
+namespace eDialogs {
+ /**
+ * This enum is used to describe the bits of an account type filter mask.
+ * Each bit is used to define a specific account class. Multiple classes
+ * can be specified by OR'ing multiple entries. The special entry @p last
+ * marks the left most bit in the mask and is used by scanners of this
+ * bitmask to determine the end of processing.
+ */
+ enum Category : int {
+ none = 0x000, ///< no account class selected
+ liability = 0x001, ///< liability accounts selected
+ asset = 0x002, ///< asset accounts selected
+ expense = 0x004, ///< expense accounts selected
+ income = 0x008, ///< income accounts selected
+ equity = 0x010, ///< equity accounts selected
+ checking = 0x020, ///< checking accounts selected
+ savings = 0x040, ///< savings accounts selected
+ investment = 0x080, ///< investment accounts selected
+ creditCard = 0x100, ///< credit card accounts selected
+ last = 0x200 ///< the leftmost bit in the mask
+ };
+
+ enum class UpdatePrice {
+ All = 0,
+ Missing,
+ Downloaded,
+ SameSource,
+ Ask
+ };
+
+ enum class PriceMode {
+ Price = 0,
+ PricePerShare,
+ PricePerTransaction
+ };
+
+ enum class ScheduleResultCode {
+ Cancel = 0, // cancel the operation
+ Enter, // enter the schedule
+ Skip, // skip the schedule
+ Ignore // ignore the schedule
+ };
+
+}
+
+#endif
diff --git a/kmymoney/dialogs/editpersonaldatadlg.h b/kmymoney/dialogs/editpersonaldatadlg.h
--- a/kmymoney/dialogs/editpersonaldatadlg.h
+++ b/kmymoney/dialogs/editpersonaldatadlg.h
@@ -3,6 +3,7 @@
-------------------
copyright : (C) 2000 by Michael Edwardes
email : mte@users.sourceforge.net
+ (C) 2017 by Łukasz Wojniłowicz
***************************************************************************/
/***************************************************************************
@@ -14,8 +15,8 @@
* *
***************************************************************************/
-#ifndef KNEWFILEDLG_H
-#define KNEWFILEDLG_H
+#ifndef EDITPERSONALDATADLG_H
+#define EDITPERSONALDATADLG_H
// ----------------------------------------------------------------------------
// QT Includes
@@ -32,28 +33,32 @@
// This dialog lets the user create/edit a file.
// Use the second constructor to edit a file.
+class EditPersonalDataDlgPrivate;
class EditPersonalDataDlg : public QDialog
{
Q_OBJECT
-public:
- explicit EditPersonalDataDlg(QWidget *parent = 0, const QString& title = QString());
- explicit EditPersonalDataDlg(QString userName, QString userStreet,
- QString userTown, QString userCounty, QString userPostcode, QString userTelephone,
- QString userEmail, QWidget *parent = 0, const QString& title = QString());
- ~EditPersonalDataDlg();
+ Q_DISABLE_COPY(EditPersonalDataDlg)
public:
- QString userNameText;
- QString userStreetText;
- QString userTownText;
- QString userCountyText;
- QString userPostcodeText;
- QString userTelephoneText;
- QString userEmailText;
+ explicit EditPersonalDataDlg(QWidget *parent, const QString& title);
+ explicit EditPersonalDataDlg(QString userName,
+ QString userStreet,
+ QString userTown,
+ QString userCounty,
+ QString userPostcode,
+ QString userTelephone,
+ QString userEmail,
+ QWidget *parent,
+ const QString& title);
+ ~EditPersonalDataDlg();
-protected:
- /// helper method for constructors
- void init(const QString& title);
+ QString userName() const;
+ QString userStreet() const;
+ QString userTown() const;
+ QString userCountry() const;
+ QString userPostcode() const;
+ QString userTelephone() const;
+ QString userEmail() const;
protected slots:
void okClicked();
@@ -62,10 +67,8 @@
void slotContactFetched(const ContactData &identity);
private:
- /// \internal d-pointer class.
- struct Private;
- /// \internal d-pointer instance.
- Private* const d;
+ EditPersonalDataDlgPrivate * const d_ptr;
+ Q_DECLARE_PRIVATE(EditPersonalDataDlg)
};
#endif
diff --git a/kmymoney/dialogs/editpersonaldatadlg.cpp b/kmymoney/dialogs/editpersonaldatadlg.cpp
--- a/kmymoney/dialogs/editpersonaldatadlg.cpp
+++ b/kmymoney/dialogs/editpersonaldatadlg.cpp
@@ -3,6 +3,7 @@
-------------------
copyright : (C) 2000 by Michael Edwardes
email : mte@users.sourceforge.net
+ (C) 2017 by Łukasz Wojniłowicz
***************************************************************************/
/***************************************************************************
@@ -30,96 +31,175 @@
// ----------------------------------------------------------------------------
// Project Includes
#include "mymoneycontact.h"
-#include "ui_editpersonaldatadlgdecl.h"
+#include "ui_editpersonaldatadlg.h"
-struct EditPersonalDataDlg::Private {
- Private() : m_contact(0) {}
- Ui::EditPersonalDataDlgDecl ui;
- MyMoneyContact *m_contact;
+class EditPersonalDataDlgPrivate
+{
+ Q_DISABLE_COPY(EditPersonalDataDlgPrivate)
+ Q_DECLARE_PUBLIC(EditPersonalDataDlg)
+
+public:
+ EditPersonalDataDlgPrivate(EditPersonalDataDlg *qq) :
+ q_ptr(qq),
+ ui(new Ui::EditPersonalDataDlg)
+ {
+ }
+
+ ~EditPersonalDataDlgPrivate()
+ {
+ delete m_contact;
+ delete ui;
+ }
+
+ void init(const QString& title)
+ {
+ Q_Q(EditPersonalDataDlg);
+ m_contact = new MyMoneyContact(q);
+ ui->setupUi(q);
+ q->setModal(true);
+
+ if (!title.isEmpty())
+ q->setWindowTitle(title);
+
+ ui->kabcBtn->setEnabled(m_contact->ownerExists());
+ ui->userNameEdit->setFocus();
+
+ q->connect(ui->buttonBox, &QDialogButtonBox::rejected, q, &QDialog::reject);
+ q->connect(ui->buttonBox, &QDialogButtonBox::accepted, q, &EditPersonalDataDlg::okClicked);
+ q->connect(ui->kabcBtn, &QAbstractButton::clicked, q, &EditPersonalDataDlg::loadFromAddressBook);
+ }
+
+ EditPersonalDataDlg *q_ptr;
+ Ui::EditPersonalDataDlg *ui;
+ MyMoneyContact *m_contact;
+ QString userNameText;
+ QString userStreetText;
+ QString userTownText;
+ QString userCountyText;
+ QString userPostcodeText;
+ QString userTelephoneText;
+ QString userEmailText;
};
-EditPersonalDataDlg::EditPersonalDataDlg(QWidget *parent, const QString& title)
- : QDialog(parent), d(new Private)
+
+EditPersonalDataDlg::EditPersonalDataDlg(QWidget *parent, const QString& title) :
+ QDialog(parent),
+ d_ptr(new EditPersonalDataDlgPrivate(this))
{
- d->m_contact = new MyMoneyContact(this);
- d->ui.setupUi(this);
- setModal(true);
- init(title);
+ Q_D(EditPersonalDataDlg);
+ d->init(title);
}
-EditPersonalDataDlg::EditPersonalDataDlg(QString userName, QString userStreet,
- QString userTown, QString userCounty, QString userPostcode, QString userTelephone,
- QString userEmail, QWidget *parent, const QString& title)
- : QDialog(parent), d(new Private)
+EditPersonalDataDlg::EditPersonalDataDlg(QString userName,
+ QString userStreet,
+ QString userTown,
+ QString userCounty,
+ QString userPostcode,
+ QString userTelephone,
+ QString userEmail,
+ QWidget *parent,
+ const QString& title) :
+ QDialog(parent),
+ d_ptr(new EditPersonalDataDlgPrivate(this))
{
- d->m_contact = new MyMoneyContact(this);
- d->ui.setupUi(this);
- setModal(true);
- d->ui.userNameEdit->setText(userName);
- d->ui.streetEdit->setText(userStreet);
- d->ui.townEdit->setText(userTown);
- d->ui.countyEdit->setText(userCounty);
- d->ui.postcodeEdit->setText(userPostcode);
- d->ui.telephoneEdit->setText(userTelephone);
- d->ui.emailEdit->setText(userEmail);
-
- init(title);
+ Q_D(EditPersonalDataDlg);
+ d->init(title);
+ d->ui->userNameEdit->setText(userName);
+ d->ui->streetEdit->setText(userStreet);
+ d->ui->townEdit->setText(userTown);
+ d->ui->countyEdit->setText(userCounty);
+ d->ui->postcodeEdit->setText(userPostcode);
+ d->ui->telephoneEdit->setText(userTelephone);
+ d->ui->emailEdit->setText(userEmail);
}
-void EditPersonalDataDlg::init(const QString& title)
+QString EditPersonalDataDlg::userName() const
{
- if (!title.isEmpty())
- setWindowTitle(title);
+ Q_D(const EditPersonalDataDlg);
+ return d->userNameText;
+}
- d->ui.kabcBtn->setEnabled(d->m_contact->ownerExists());
- d->ui.userNameEdit->setFocus();
+QString EditPersonalDataDlg::userStreet() const
+{
+ Q_D(const EditPersonalDataDlg);
+ return d->userStreetText;
+}
- connect(d->ui.buttonBox, SIGNAL(rejected()), this, SLOT(reject()));
- connect(d->ui.buttonBox, SIGNAL(accepted()), this, SLOT(okClicked()));
- connect(d->ui.kabcBtn, SIGNAL(clicked()), this, SLOT(loadFromAddressBook()));
+QString EditPersonalDataDlg::userTown() const
+{
+ Q_D(const EditPersonalDataDlg);
+ return d->userTownText;
+}
+
+QString EditPersonalDataDlg::userCountry() const
+{
+ Q_D(const EditPersonalDataDlg);
+ return d->userCountyText;
+}
+
+QString EditPersonalDataDlg::userPostcode() const
+{
+ Q_D(const EditPersonalDataDlg);
+ return d->userPostcodeText;
+}
+
+QString EditPersonalDataDlg::userTelephone() const
+{
+ Q_D(const EditPersonalDataDlg);
+ return d->userTelephoneText;
+}
+
+QString EditPersonalDataDlg::userEmail() const
+{
+ Q_D(const EditPersonalDataDlg);
+ return d->userEmailText;
}
EditPersonalDataDlg::~EditPersonalDataDlg()
{
+ Q_D(EditPersonalDataDlg);
delete d;
}
void EditPersonalDataDlg::okClicked()
{
- userNameText = d->ui.userNameEdit->text();
- userStreetText = d->ui.streetEdit->text();
- userTownText = d->ui.townEdit->text();
- userCountyText = d->ui.countyEdit->text();
- userPostcodeText = d->ui.postcodeEdit->text();
- userTelephoneText = d->ui.telephoneEdit->text();
- userEmailText = d->ui.emailEdit->text();
+ Q_D(EditPersonalDataDlg);
+ d->userNameText = d->ui->userNameEdit->text();
+ d->userStreetText = d->ui->streetEdit->text();
+ d->userTownText = d->ui->townEdit->text();
+ d->userCountyText = d->ui->countyEdit->text();
+ d->userPostcodeText = d->ui->postcodeEdit->text();
+ d->userTelephoneText = d->ui->telephoneEdit->text();
+ d->userEmailText = d->ui->emailEdit->text();
accept();
}
void EditPersonalDataDlg::loadFromAddressBook()
{
- d->ui.userNameEdit->setText(d->m_contact->ownerFullName());
- d->ui.emailEdit->setText(d->m_contact->ownerEmail());
- if (d->ui.emailEdit->text().isEmpty()) {
+ Q_D(EditPersonalDataDlg);
+ d->ui->userNameEdit->setText(d->m_contact->ownerFullName());
+ d->ui->emailEdit->setText(d->m_contact->ownerEmail());
+ if (d->ui->emailEdit->text().isEmpty()) {
KMessageBox::sorry(this, i18n("Unable to load data, because no contact has been associated with the owner of the standard address book."), i18n("Address book import"));
return;
}
- d->ui.kabcBtn->setEnabled(false);
- connect(d->m_contact, SIGNAL(contactFetched(ContactData)), this, SLOT(slotContactFetched(ContactData)));
- d->m_contact->fetchContact(d->ui.emailEdit->text());
+ d->ui->kabcBtn->setEnabled(false);
+ connect(d->m_contact, &MyMoneyContact::contactFetched, this, &EditPersonalDataDlg::slotContactFetched);
+ d->m_contact->fetchContact(d->ui->emailEdit->text());
}
void EditPersonalDataDlg::slotContactFetched(const ContactData &identity)
{
- d->ui.telephoneEdit->setText(identity.phoneNumber);
+ Q_D(EditPersonalDataDlg);
+ d->ui->telephoneEdit->setText(identity.phoneNumber);
QString sep;
if (!identity.country.isEmpty() && !identity.region.isEmpty())
sep = " / ";
- d->ui.countyEdit->setText(QString("%1%2%3").arg(identity.country, sep, identity.region));
- d->ui.postcodeEdit->setText(identity.postalCode);
- d->ui.townEdit->setText(identity.locality);
- d->ui.streetEdit->setText(identity.street);
- d->ui.kabcBtn->setEnabled(true);
+ d->ui->countyEdit->setText(QString("%1%2%3").arg(identity.country, sep, identity.region));
+ d->ui->postcodeEdit->setText(identity.postalCode);
+ d->ui->townEdit->setText(identity.locality);
+ d->ui->streetEdit->setText(identity.street);
+ d->ui->kabcBtn->setEnabled(true);
}
diff --git a/kmymoney/dialogs/editpersonaldatadlgdecl.ui b/kmymoney/dialogs/editpersonaldatadlg.ui
rename from kmymoney/dialogs/editpersonaldatadlgdecl.ui
rename to kmymoney/dialogs/editpersonaldatadlg.ui
--- a/kmymoney/dialogs/editpersonaldatadlgdecl.ui
+++ b/kmymoney/dialogs/editpersonaldatadlg.ui
@@ -1,13 +1,13 @@
- EditPersonalDataDlgDecl
-
+ EditPersonalDataDlg
+
0
0
546
- 448
+ 461
diff --git a/kmymoney/dialogs/hierarchyfilterproxymodel.h b/kmymoney/dialogs/hierarchyfilterproxymodel.h
--- a/kmymoney/dialogs/hierarchyfilterproxymodel.h
+++ b/kmymoney/dialogs/hierarchyfilterproxymodel.h
@@ -36,7 +36,7 @@
Q_OBJECT
public:
- HierarchyFilterProxyModel(QObject *parent = 0);
+ HierarchyFilterProxyModel(QObject *parent = nullptr);
Qt::ItemFlags flags(const QModelIndex &index) const override;
diff --git a/kmymoney/dialogs/investactivities.h b/kmymoney/dialogs/investactivities.h
--- a/kmymoney/dialogs/investactivities.h
+++ b/kmymoney/dialogs/investactivities.h
@@ -4,6 +4,7 @@
begin : Fri Dec 15 2006
copyright : (C) 2006 by Thomas Baumgart
email : Thomas Baumgart
+ (C) 2017 by Łukasz Wojniłowicz
***************************************************************************/
/***************************************************************************
@@ -21,7 +22,7 @@
// ----------------------------------------------------------------------------
// QT Includes
-#include
+#include
// ----------------------------------------------------------------------------
// KDE Includes
@@ -29,15 +30,33 @@
// ----------------------------------------------------------------------------
// Project Includes
-#include "investtransactioneditor.h"
+class QWidget;
+class QStringList;
class kMyMoneyEdit;
+class KMyMoneyCategory;
+
+class MyMoneyMoney;
+class MyMoneySplit;
+class MyMoneyTransaction;
+class MyMoneySecurity;
+
+class InvestTransactionEditor;
+
+namespace eMyMoney { namespace Split { enum class InvestmentTransactionType; } }
+namespace eDialogs { enum class PriceMode; }
+
+template class QList;
+template class QMap;
namespace Invest
{
+class ActivityPrivate;
class Activity
{
+ Q_DISABLE_COPY(Activity)
+
public:
virtual eMyMoney::Split::InvestmentTransactionType type() const = 0;
virtual void showWidgets() const = 0;
@@ -54,29 +73,20 @@
virtual bool createTransaction(MyMoneyTransaction& t, MyMoneySplit& s0, MyMoneySplit& assetAccountSplit, QList& feeSplits, QList& m_feeSplits, QList& interestSplits, QList& m_interestSplits, MyMoneySecurity& security, MyMoneySecurity& currency) = 0;
virtual void preloadAssetAccount();
- virtual ~Activity() {}
- bool m_memoChanged;
- QString m_memoText;
+ virtual ~Activity();
+
+ bool &memoChanged();
+ QString& memoText();
protected:
- Activity(InvestTransactionEditor* editor) : m_memoChanged(false) {
- m_parent = editor;
- }
- QWidget* haveWidget(const QString& name) const {
- return m_parent->haveWidget(name);
- }
+ explicit Activity(InvestTransactionEditor* editor);
+ QWidget* haveWidget(const QString& name) const;
bool haveAssetAccount() const;
- bool haveFees(bool optional = false) const {
- return haveCategoryAndAmount("fee-account", "fee-amount", optional);
- }
- bool haveInterest(bool optional = false) const {
- return haveCategoryAndAmount("interest-account", "interest-amount", optional);
- }
+ bool haveFees(bool optional = false) const;
+ bool haveInterest(bool optional = false) const;
bool haveShares() const;
bool havePrice() const;
- bool isMultiSelection() const {
- return m_parent->isMultiSelection();
- }
+ bool isMultiSelection() const;
QString priceLabel() const;
bool createCategorySplits(const MyMoneyTransaction& t, KMyMoneyCategory* cat, kMyMoneyEdit* amount, MyMoneyMoney factor, QList&splits, const QList& osplits) const;
void createAssetAccountSplit(MyMoneySplit& split, const MyMoneySplit& stockSplit) const;
@@ -84,122 +94,106 @@
bool haveCategoryAndAmount(const QString& category, const QString& amount, bool optional) const;
void setLabelText(const QString& idx, const QString& txt) const;
void setWidgetVisibility(const QStringList& widgetIds, bool visible) const;
- InvestTransactionEditor::priceModeE priceMode() const {
- return m_parent->priceMode();
- }
+ eDialogs::PriceMode priceMode() const;
protected:
- InvestTransactionEditor* m_parent;
- QMap m_priceInfo;
+ ActivityPrivate* d_ptr;
+ Q_DECLARE_PRIVATE(Activity)
};
class Buy : public Activity
{
public:
- Buy(InvestTransactionEditor* editor) : Activity(editor) {}
- virtual ~Buy() {}
- virtual eMyMoney::Split::InvestmentTransactionType type() const {
- return eMyMoney::Split::InvestmentTransactionType::BuyShares;
- }
- virtual void showWidgets() const;
- virtual bool isComplete(QString& reason) const;
- virtual bool createTransaction(MyMoneyTransaction& t, MyMoneySplit& s0, MyMoneySplit& assetAccountSplit, QList& feeSplits, QList& m_feeSplits, QList& interestSplits, QList& m_interestSplits, MyMoneySecurity& security, MyMoneySecurity& currency);
+ explicit Buy(InvestTransactionEditor* editor);
+ ~Buy() override;
+ eMyMoney::Split::InvestmentTransactionType type() const override;
+ void showWidgets() const override;
+ bool isComplete(QString& reason) const override;
+ bool createTransaction(MyMoneyTransaction& t, MyMoneySplit& s0, MyMoneySplit& assetAccountSplit, QList& feeSplits, QList& m_feeSplits, QList& interestSplits, QList& m_interestSplits, MyMoneySecurity& security, MyMoneySecurity& currency) override;
};
class Sell : public Activity
{
public:
- Sell(InvestTransactionEditor* editor) : Activity(editor) {}
- virtual ~Sell() {}
- virtual eMyMoney::Split::InvestmentTransactionType type() const {
- return eMyMoney::Split::InvestmentTransactionType::SellShares;
- }
- virtual void showWidgets() const;
- virtual bool isComplete(QString& reason) const;
- virtual bool createTransaction(MyMoneyTransaction& t, MyMoneySplit& s0, MyMoneySplit& assetAccountSplit, QList& feeSplits, QList& m_feeSplits, QList& interestSplits, QList& m_interestSplits, MyMoneySecurity& security, MyMoneySecurity& currency);
+ explicit Sell(InvestTransactionEditor* editor);
+ ~Sell() override;
+ eMyMoney::Split::InvestmentTransactionType type() const override;
+ void showWidgets() const override;
+ bool isComplete(QString& reason) const override;
+ bool createTransaction(MyMoneyTransaction& t, MyMoneySplit& s0, MyMoneySplit& assetAccountSplit, QList& feeSplits, QList& m_feeSplits, QList& interestSplits, QList& m_interestSplits, MyMoneySecurity& security, MyMoneySecurity& currency) override;
};
class Div : public Activity
{
public:
- Div(InvestTransactionEditor* editor) : Activity(editor) {}
- virtual ~Div() {}
- virtual eMyMoney::Split::InvestmentTransactionType type() const {
- return eMyMoney::Split::InvestmentTransactionType::Dividend;
- }
- virtual void showWidgets() const;
- virtual bool isComplete(QString& reason) const;
- virtual bool createTransaction(MyMoneyTransaction& t, MyMoneySplit& s0, MyMoneySplit& assetAccountSplit, QList& feeSplits, QList& m_feeSplits, QList& interestSplits, QList& m_interestSplits, MyMoneySecurity& security, MyMoneySecurity& currency);
+ explicit Div(InvestTransactionEditor* editor);
+ ~Div() override;
+ eMyMoney::Split::InvestmentTransactionType type() const override;
+ void showWidgets() const override;
+ bool isComplete(QString& reason) const override;
+ bool createTransaction(MyMoneyTransaction& t, MyMoneySplit& s0, MyMoneySplit& assetAccountSplit, QList& feeSplits, QList& m_feeSplits, QList& interestSplits, QList& m_interestSplits, MyMoneySecurity& security, MyMoneySecurity& currency) override;
};
class Reinvest : public Activity
{
public:
- Reinvest(InvestTransactionEditor* editor) : Activity(editor) {}
- virtual ~Reinvest() {}
- virtual eMyMoney::Split::InvestmentTransactionType type() const {
- return eMyMoney::Split::InvestmentTransactionType::ReinvestDividend;
- }
- virtual void showWidgets() const;
- virtual bool isComplete(QString& reason) const;
- virtual bool createTransaction(MyMoneyTransaction& t, MyMoneySplit& s0, MyMoneySplit& assetAccountSplit, QList& feeSplits, QList& m_feeSplits, QList& interestSplits, QList& m_interestSplits, MyMoneySecurity& security, MyMoneySecurity& currency);
+ explicit Reinvest(InvestTransactionEditor* editor);
+ ~Reinvest() override;
+ eMyMoney::Split::InvestmentTransactionType type() const override;
+ void showWidgets() const override;
+ bool isComplete(QString& reason) const override;
+ bool createTransaction(MyMoneyTransaction& t, MyMoneySplit& s0, MyMoneySplit& assetAccountSplit, QList& feeSplits, QList& m_feeSplits, QList& interestSplits, QList& m_interestSplits, MyMoneySecurity& security, MyMoneySecurity& currency) override;
};
class Add : public Activity
{
public:
- Add(InvestTransactionEditor* editor) : Activity(editor) {}
- virtual ~Add() {}
- virtual eMyMoney::Split::InvestmentTransactionType type() const {
- return eMyMoney::Split::InvestmentTransactionType::AddShares;
- }
- virtual void showWidgets() const;
- virtual bool isComplete(QString& reason) const;
- virtual bool createTransaction(MyMoneyTransaction& t, MyMoneySplit& s0, MyMoneySplit& assetAccountSplit, QList& feeSplits, QList& m_feeSplits, QList& interestSplits, QList& m_interestSplits, MyMoneySecurity& security, MyMoneySecurity& currency);
+ explicit Add(InvestTransactionEditor* editor);
+ ~Add() override;
+ eMyMoney::Split::InvestmentTransactionType type() const override;
+ void showWidgets() const override;
+ bool isComplete(QString& reason) const override;
+ bool createTransaction(MyMoneyTransaction& t, MyMoneySplit& s0, MyMoneySplit& assetAccountSplit, QList& feeSplits, QList& m_feeSplits, QList& interestSplits, QList& m_interestSplits, MyMoneySecurity& security, MyMoneySecurity& currency) override;
};
class Remove : public Activity
{
public:
- Remove(InvestTransactionEditor* editor) : Activity(editor) {}
- virtual ~Remove() {}
- virtual eMyMoney::Split::InvestmentTransactionType type() const {
- return eMyMoney::Split::InvestmentTransactionType::RemoveShares;
- }
- virtual void showWidgets() const;
- virtual bool isComplete(QString& reason) const;
- virtual bool createTransaction(MyMoneyTransaction& t, MyMoneySplit& s0, MyMoneySplit& assetAccountSplit, QList& feeSplits, QList& m_feeSplits, QList& interestSplits, QList& m_interestSplits, MyMoneySecurity& security, MyMoneySecurity& currency);
+ explicit Remove(InvestTransactionEditor* editor);
+ ~Remove() override;
+ eMyMoney::Split::InvestmentTransactionType type() const override;
+ void showWidgets() const override;
+ bool isComplete(QString& reason) const override;
+ bool createTransaction(MyMoneyTransaction& t, MyMoneySplit& s0, MyMoneySplit& assetAccountSplit, QList& feeSplits, QList& m_feeSplits, QList& interestSplits, QList& m_interestSplits, MyMoneySecurity& security, MyMoneySecurity& currency) override;
};
class Split : public Activity
{
public:
- Split(InvestTransactionEditor* editor) : Activity(editor) {}
- virtual ~Split() {}
- virtual eMyMoney::Split::InvestmentTransactionType type() const {
- return eMyMoney::Split::InvestmentTransactionType::SplitShares;
- }
- virtual void showWidgets() const;
- virtual bool isComplete(QString& reason) const;
- virtual bool createTransaction(MyMoneyTransaction& t, MyMoneySplit& s0, MyMoneySplit& assetAccountSplit, QList& feeSplits, QList& m_feeSplits, QList& interestSplits, QList& m_interestSplits, MyMoneySecurity& security, MyMoneySecurity& currency);
+ explicit Split(InvestTransactionEditor* editor);
+ ~Split() override;
+ eMyMoney::Split::InvestmentTransactionType type() const override;
+ void showWidgets() const override;
+ bool isComplete(QString& reason) const override;
+ bool createTransaction(MyMoneyTransaction& t, MyMoneySplit& s0, MyMoneySplit& assetAccountSplit, QList& feeSplits, QList& m_feeSplits, QList& interestSplits, QList& m_interestSplits, MyMoneySecurity& security, MyMoneySecurity& currency) override;
};
+//class IntIncPrivate;
class IntInc : public Activity
{
public:
- IntInc(InvestTransactionEditor* editor) : Activity(editor) {}
- virtual ~IntInc() {}
- virtual eMyMoney::Split::InvestmentTransactionType type() const {
- return eMyMoney::Split::InvestmentTransactionType::InterestIncome;
- }
- virtual void showWidgets() const;
- virtual bool isComplete(QString& reason) const;
- virtual bool createTransaction(MyMoneyTransaction& t, MyMoneySplit& s0, MyMoneySplit& assetAccountSplit, QList& feeSplits, QList& m_feeSplits, QList& interestSplits, QList& m_interestSplits, MyMoneySecurity& security, MyMoneySecurity& currency);
+ explicit IntInc(InvestTransactionEditor* editor);
+ ~IntInc() override;
+ eMyMoney::Split::InvestmentTransactionType type() const override;
+ void showWidgets() const override;
+ bool isComplete(QString& reason) const override;
+ bool createTransaction(MyMoneyTransaction& t, MyMoneySplit& s0, MyMoneySplit& assetAccountSplit, QList& feeSplits, QList& m_feeSplits, QList& interestSplits, QList& m_interestSplits, MyMoneySecurity& security, MyMoneySecurity& currency) override;
+
+//private:
+// Q_DECLARE_PRIVATE(IntInc)
};
} // namespace Invest
-
-
#endif // INVESTACTIVITIES_H
diff --git a/kmymoney/dialogs/investactivities.cpp b/kmymoney/dialogs/investactivities.cpp
--- a/kmymoney/dialogs/investactivities.cpp
+++ b/kmymoney/dialogs/investactivities.cpp
@@ -4,6 +4,7 @@
begin : Fri Dec 15 2006
copyright : (C) 2006 by Thomas Baumgart
email : Thomas Baumgart
+ (C) 2017 by Łukasz Wojniłowicz
***************************************************************************/
/***************************************************************************
@@ -31,33 +32,89 @@
// ----------------------------------------------------------------------------
// Project Includes
+#include "investtransactioneditor.h"
+#include "mymoneymoney.h"
#include "kmymoneycategory.h"
#include "kmymoneyedit.h"
#include "kmymoneyaccountselector.h"
#include "kmymoneycompletion.h"
#include
#include "mymoneyfile.h"
+#include "mymoneysplit.h"
+#include "mymoneyaccount.h"
+#include "mymoneysecurity.h"
+#include "dialogenums.h"
+#include "mymoneyenums.h"
using namespace Invest;
using namespace KMyMoneyRegister;
+class Invest::ActivityPrivate
+{
+ Q_DISABLE_COPY(ActivityPrivate)
+
+public:
+ ActivityPrivate()
+ {
+ }
+
+ InvestTransactionEditor *m_parent;
+ QMap m_priceInfo;
+ bool m_memoChanged;
+ QString m_memoText;
+};
+
+
+Activity::Activity(InvestTransactionEditor* editor) :
+ d_ptr(new ActivityPrivate)
+{
+ Q_D(Activity);
+ d->m_memoChanged = false;
+ d->m_parent = editor;
+}
+
+Activity::~Activity()
+{
+ Q_D(Activity);
+ delete d;
+}
+
+bool& Activity::memoChanged()
+{
+ Q_D(Activity);
+ return d->m_memoChanged;
+}
+
+QString& Activity::memoText()
+{
+ Q_D(Activity);
+ return d->m_memoText;
+}
+
bool Activity::isComplete(QString& reason) const
{
+ Q_D(const Activity);
Q_UNUSED(reason)
- bool rc = false;
- KMyMoneySecurity* security = dynamic_cast(haveWidget("security"));
+ auto rc = false;
+ auto security = dynamic_cast(haveWidget("security"));
if (!security->currentText().isEmpty()) {
- rc = (security->selector()->contains(security->currentText()) || (isMultiSelection() && m_memoChanged));
+ rc = (security->selector()->contains(security->currentText()) || (isMultiSelection() && d->m_memoChanged));
}
return rc;
}
+QWidget* Activity::haveWidget(const QString& name) const
+{
+ Q_D(const Activity);
+ return d->m_parent->haveWidget(name);
+}
+
bool Activity::haveAssetAccount() const
{
- KMyMoneyCategory* cat = dynamic_cast(haveWidget("asset-account"));
+ auto cat = dynamic_cast(haveWidget("asset-account"));
- bool rc = true;
+ auto rc = true;
if (!isMultiSelection())
rc = !cat->currentText().isEmpty();
@@ -69,9 +126,10 @@
bool Activity::haveCategoryAndAmount(const QString& category, const QString& amount, bool optional) const
{
- KMyMoneyCategory* cat = dynamic_cast(haveWidget(category));
+ Q_D(const Activity);
+ auto cat = dynamic_cast(haveWidget(category));
- bool rc = true;
+ auto rc = true;
if (!cat->currentText().isEmpty()) {
rc = cat->selector()->contains(cat->currentText()) || cat->isSplitTransaction();
@@ -81,11 +139,11 @@
QList::const_iterator splitEnd;
if (category == "fee-account") {
- split = m_parent->feeSplits().cbegin();
- splitEnd = m_parent->feeSplits().cend();
+ split = d->m_parent->feeSplits().cbegin();
+ splitEnd = d->m_parent->feeSplits().cend();
} else if (category == "interest-account") {
- split = m_parent->interestSplits().cbegin();
- splitEnd = m_parent->interestSplits().cend();
+ split = d->m_parent->interestSplits().cbegin();
+ splitEnd = d->m_parent->interestSplits().cend();
}
for (; split != splitEnd; ++split) {
@@ -103,6 +161,16 @@
return rc;
}
+bool Activity::haveFees(bool optional) const
+{
+ return haveCategoryAndAmount("fee-account", "fee-amount", optional);
+}
+
+bool Activity::haveInterest(bool optional) const
+{
+ return haveCategoryAndAmount("interest-account", "interest-amount", optional);
+}
+
bool Activity::haveShares() const
{
kMyMoneyEdit* amount = dynamic_cast(haveWidget("shares"));
@@ -121,9 +189,16 @@
return !amount->value().isZero();
}
+bool Activity::isMultiSelection() const
+{
+ Q_D(const Activity);
+ return d->m_parent->isMultiSelection();
+}
+
bool Activity::createCategorySplits(const MyMoneyTransaction& t, KMyMoneyCategory* cat, kMyMoneyEdit* amount, MyMoneyMoney factor, QList&splits, const QList& osplits) const
{
- bool rc = true;
+ Q_D(const Activity);
+ auto rc = true;
if (!isMultiSelection() || (isMultiSelection() && !cat->currentText().isEmpty())) {
if (!cat->isSplitTransaction()) {
splits.clear();
@@ -134,7 +209,7 @@
s1.setAccountId(categoryId);
s1.setValue(amount->value() * factor);
if (!s1.value().isZero()) {
- rc = m_parent->setupPrice(t, s1);
+ rc = d->m_parent->setupPrice(t, s1);
}
splits.append(s1);
}
@@ -147,7 +222,7 @@
void Activity::createAssetAccountSplit(MyMoneySplit& split, const MyMoneySplit& stockSplit) const
{
- KMyMoneyCategory* cat = dynamic_cast(haveWidget("asset-account"));
+ auto cat = dynamic_cast(haveWidget("asset-account"));
if (!isMultiSelection() || (isMultiSelection() && !cat->currentText().isEmpty())) {
QString categoryId;
categoryId = cat->selectedItem();
@@ -172,7 +247,7 @@
void Activity::setLabelText(const QString& idx, const QString& txt) const
{
- QLabel* w = dynamic_cast(haveWidget(idx));
+ auto w = dynamic_cast(haveWidget(idx));
if (w) {
w->setText(txt);
} else {
@@ -185,11 +260,12 @@
void Activity::preloadAssetAccount()
{
+ Q_D(Activity);
KMyMoneyCategory* cat;
cat = dynamic_cast(haveWidget("asset-account"));
if (cat->isVisible()) {
if (cat->currentText().isEmpty()) {
- MyMoneyAccount acc = MyMoneyFile::instance()->accountByName(i18n("%1 (Brokerage)", m_parent->account().name()));
+ MyMoneyAccount acc = MyMoneyFile::instance()->accountByName(i18n("%1 (Brokerage)", d->m_parent->account().name()));
if (!acc.id().isEmpty()) {
bool blocked = cat->signalsBlocked();
// block signals, so that the focus does not go crazy
@@ -205,7 +281,7 @@
void Activity::setWidgetVisibility(const QStringList& widgetIds, bool visible) const
{
for (QStringList::const_iterator it_w = widgetIds.constBegin(); it_w != widgetIds.constEnd(); ++it_w) {
- QWidget* w = haveWidget(*it_w);
+ auto w = haveWidget(*it_w);
if (w) {
if (visible) {
w->show();
@@ -216,19 +292,39 @@
}
}
+eDialogs::PriceMode Activity::priceMode() const
+{
+ Q_D(const Activity);
+ return d->m_parent->priceMode();
+}
+
QString Activity::priceLabel() const
{
QString label;
- if (priceMode() == InvestTransactionEditor::Price) {
+ if (priceMode() == eDialogs::PriceMode::Price) {
label = i18n("Price");
- } else if (priceMode() == InvestTransactionEditor::PricePerShare) {
+ } else if (priceMode() == eDialogs::PriceMode::PricePerShare) {
label = i18n("Price/share");
- } else if (priceMode() == InvestTransactionEditor::PricePerTransaction) {
+ } else if (priceMode() == eDialogs::PriceMode::PricePerTransaction) {
label = i18n("Transaction amount");
}
return label;
}
+Buy::Buy(InvestTransactionEditor* editor) :
+ Activity(editor)
+{
+}
+
+Buy::~Buy()
+{
+}
+
+eMyMoney::Split::InvestmentTransactionType Buy::type() const
+{
+ return eMyMoney::Split::InvestmentTransactionType::BuyShares;
+}
+
void Buy::showWidgets() const
{
static const QStringList visibleWidgetIds = QStringList() << "asset-account" << "shares" << "price" << "total" << "interest-account" << "fee-account";
@@ -246,7 +342,7 @@
bool Buy::isComplete(QString& reason) const
{
- bool rc = Activity::isComplete(reason);
+ auto rc = Activity::isComplete(reason);
rc &= haveAssetAccount();
rc &= haveFees(true);
rc &= haveShares();
@@ -257,6 +353,7 @@
bool Buy::createTransaction(MyMoneyTransaction& t, MyMoneySplit& s0, MyMoneySplit& assetAccountSplit, QList& feeSplits, QList& m_feeSplits, QList& interestSplits, QList& m_interestSplits, MyMoneySecurity& security, MyMoneySecurity& currency)
{
+ Q_D(Activity);
Q_UNUSED(m_interestSplits);
Q_UNUSED(security);
Q_UNUSED(currency);
@@ -265,8 +362,8 @@
if (!isComplete(reason))
return false;
- kMyMoneyEdit* sharesEdit = dynamic_cast(haveWidget("shares"));
- kMyMoneyEdit* priceEdit = dynamic_cast(haveWidget("price"));
+ auto sharesEdit = dynamic_cast(haveWidget("shares"));
+ auto priceEdit = dynamic_cast(haveWidget("price"));
s0.setAction(eMyMoney::Split::InvestmentTransactionType::BuyShares);
@@ -283,7 +380,7 @@
}
if (!isMultiSelection() || (isMultiSelection() && !priceEdit->value().isZero())) {
price = priceEdit->value().abs();
- if (priceMode() == InvestTransactionEditor::PricePerTransaction) {
+ if (priceMode() == eDialogs::PriceMode::PricePerTransaction) {
s0.setValue(price.reduce());
if (!s0.shares().isZero())
s0.setPrice((price / s0.shares()).reduce());
@@ -305,19 +402,34 @@
assetAccountSplit.setValue(-total);
- if (!m_parent->setupPrice(t, assetAccountSplit))
+ if (!d->m_parent->setupPrice(t, assetAccountSplit))
return false;
return true;
}
+Sell::Sell(InvestTransactionEditor* editor) :
+ Activity(editor)
+{
+}
+
+Sell::~Sell()
+{
+}
+
+eMyMoney::Split::InvestmentTransactionType Sell::type() const
+{
+ return eMyMoney::Split::InvestmentTransactionType::SellShares;
+}
+
void Sell::showWidgets() const
{
+ Q_D(const Activity);
static const QStringList visibleWidgetIds = QStringList() << "asset-account" << "interest-amount" << "shares" << "price" << "total" << "interest-account" << "fee-account";
setWidgetVisibility(visibleWidgetIds, true);
- kMyMoneyEdit* shareEdit = dynamic_cast(haveWidget("shares"));
- shareEdit->setPrecision(MyMoneyMoney::denomToPrec(m_parent->security().smallestAccountFraction()));
+ auto shareEdit = dynamic_cast(haveWidget("shares"));
+ shareEdit->setPrecision(MyMoneyMoney::denomToPrec(d->m_parent->security().smallestAccountFraction()));
setLabelText("interest-amount-label", i18n("Interest"));
setLabelText("interest-label", i18n("Interest"));
@@ -331,7 +443,7 @@
bool Sell::isComplete(QString& reason) const
{
- bool rc = Activity::isComplete(reason);
+ auto rc = Activity::isComplete(reason);
rc &= haveAssetAccount();
rc &= haveFees(true);
rc &= haveInterest(true);
@@ -342,6 +454,7 @@
bool Sell::createTransaction(MyMoneyTransaction& t, MyMoneySplit& s0, MyMoneySplit& assetAccountSplit, QList& feeSplits, QList& m_feeSplits, QList& interestSplits, QList& m_interestSplits, MyMoneySecurity& security, MyMoneySecurity& currency)
{
+ Q_D(Activity);
Q_UNUSED(m_interestSplits);
Q_UNUSED(security);
Q_UNUSED(currency);
@@ -350,8 +463,8 @@
if (!isComplete(reason))
return false;
- kMyMoneyEdit* sharesEdit = dynamic_cast(haveWidget("shares"));
- kMyMoneyEdit* priceEdit = dynamic_cast(haveWidget("price"));
+ auto sharesEdit = dynamic_cast(haveWidget("shares"));
+ auto priceEdit = dynamic_cast(haveWidget("price"));
s0.setAction(eMyMoney::Split::InvestmentTransactionType::BuyShares);
@@ -368,7 +481,7 @@
}
if (!isMultiSelection() || (isMultiSelection() && !priceEdit->value().isZero())) {
price = priceEdit->value().abs();
- if (priceMode() == InvestTransactionEditor::PricePerTransaction) {
+ if (priceMode() == eDialogs::PriceMode::PricePerTransaction) {
price = -price;
s0.setValue(price.reduce());
if (!s0.shares().isZero())
@@ -390,12 +503,26 @@
MyMoneyMoney total = sumSplits(s0, feeSplits, interestSplits);
assetAccountSplit.setValue(-total);
- if (!m_parent->setupPrice(t, assetAccountSplit))
+ if (!d->m_parent->setupPrice(t, assetAccountSplit))
return false;
return true;
}
+Div::Div(InvestTransactionEditor* editor) :
+ Activity(editor)
+{
+}
+
+Div::~Div()
+{
+}
+
+eMyMoney::Split::InvestmentTransactionType Div::type() const
+{
+ return eMyMoney::Split::InvestmentTransactionType::Dividend;
+}
+
void Div::showWidgets() const
{
static const QStringList visibleWidgetIds = QStringList() << "asset-account" << "interest-amount" << "total" << "interest-account" << "fee-account";
@@ -414,7 +541,7 @@
{
Q_UNUSED(reason)
- bool rc = Activity::isComplete(reason);
+ auto rc = Activity::isComplete(reason);
rc &= haveAssetAccount();
rc &= haveCategoryAndAmount("interest-account", QString(), false);
rc &= haveInterest(false);
@@ -423,6 +550,7 @@
bool Div::createTransaction(MyMoneyTransaction& t, MyMoneySplit& s0, MyMoneySplit& assetAccountSplit, QList& feeSplits, QList& m_feeSplits, QList& interestSplits, QList& m_interestSplits, MyMoneySecurity& security, MyMoneySecurity& currency)
{
+ Q_D(Activity);
Q_UNUSED(m_feeSplits);
Q_UNUSED(security);
Q_UNUSED(currency);
@@ -450,20 +578,35 @@
MyMoneyMoney total = sumSplits(s0, feeSplits, interestSplits);
assetAccountSplit.setValue(-total);
- if (!m_parent->setupPrice(t, assetAccountSplit))
+ if (!d->m_parent->setupPrice(t, assetAccountSplit))
return false;
return true;
}
+Reinvest::Reinvest(InvestTransactionEditor* editor) :
+ Activity(editor)
+{
+}
+
+Reinvest::~Reinvest()
+{
+}
+
+eMyMoney::Split::InvestmentTransactionType Reinvest::type() const
+{
+ return eMyMoney::Split::InvestmentTransactionType::ReinvestDividend;
+}
+
void Reinvest::showWidgets() const
{
+ Q_D(const Activity);
static const QStringList visibleWidgetIds = QStringList() << "price" << "interest-account";
setWidgetVisibility(visibleWidgetIds, true);
- kMyMoneyEdit* shareEdit = dynamic_cast(haveWidget("shares"));
+ auto shareEdit = dynamic_cast(haveWidget("shares"));
shareEdit->show();
- shareEdit->setPrecision(MyMoneyMoney::denomToPrec(m_parent->security().smallestAccountFraction()));
+ shareEdit->setPrecision(MyMoneyMoney::denomToPrec(d->m_parent->security().smallestAccountFraction()));
kMyMoneyEdit* intAmount = dynamic_cast(haveWidget("interest-amount"));
intAmount->hide();
@@ -479,7 +622,7 @@
bool Reinvest::isComplete(QString& reason) const
{
- bool rc = Activity::isComplete(reason);
+ auto rc = Activity::isComplete(reason);
rc &= haveCategoryAndAmount("interest-account", QString(), false);
rc &= haveShares();
rc &= havePrice();
@@ -488,6 +631,7 @@
bool Reinvest::createTransaction(MyMoneyTransaction& t, MyMoneySplit& s0, MyMoneySplit& assetAccountSplit, QList& feeSplits, QList& m_feeSplits, QList& interestSplits, QList& m_interestSplits, MyMoneySecurity& security, MyMoneySecurity& currency)
{
+ Q_D(Activity);
Q_UNUSED(assetAccountSplit);
Q_UNUSED(security);
Q_UNUSED(currency);
@@ -497,8 +641,8 @@
if (!isComplete(reason))
return false;
- kMyMoneyEdit* sharesEdit = dynamic_cast(haveWidget("shares"));
- kMyMoneyEdit* priceEdit = dynamic_cast(haveWidget("price"));
+ auto sharesEdit = dynamic_cast(haveWidget("shares"));
+ auto priceEdit = dynamic_cast(haveWidget("price"));
s0.setAction(eMyMoney::Split::InvestmentTransactionType::ReinvestDividend);
@@ -515,7 +659,7 @@
}
if (!isMultiSelection() || (isMultiSelection() && !priceEdit->value().isZero())) {
price = priceEdit->value().abs();
- if (priceMode() == InvestTransactionEditor::PricePerTransaction) {
+ if (priceMode() == eDialogs::PriceMode::PricePerTransaction) {
s0.setValue(price.reduce());
if (!s0.shares().isZero())
s0.setPrice((price / s0.shares()).reduce());
@@ -539,24 +683,39 @@
s1.setValue(-total);
- if (!m_parent->setupPrice(t, s1))
+ if (!d->m_parent->setupPrice(t, s1))
return false;
return true;
}
+Add::Add(InvestTransactionEditor* editor) :
+ Activity(editor)
+{
+}
+
+Add::~Add()
+{
+}
+
+eMyMoney::Split::InvestmentTransactionType Add::type() const
+{
+ return eMyMoney::Split::InvestmentTransactionType::AddShares;
+}
+
void Add::showWidgets() const
{
- kMyMoneyEdit* shareEdit = dynamic_cast(haveWidget("shares"));
+ Q_D(const Activity);
+ auto shareEdit = dynamic_cast(haveWidget("shares"));
shareEdit->show();
- shareEdit->setPrecision(MyMoneyMoney::denomToPrec(m_parent->security().smallestAccountFraction()));
+ shareEdit->setPrecision(MyMoneyMoney::denomToPrec(d->m_parent->security().smallestAccountFraction()));
setLabelText("shares-label", i18n("Shares"));
}
bool Add::isComplete(QString& reason) const
{
- bool rc = Activity::isComplete(reason);
+ auto rc = Activity::isComplete(reason);
rc &= haveShares();
return rc;
}
@@ -574,7 +733,7 @@
if (!isComplete(reason))
return false;
- kMyMoneyEdit* sharesEdit = dynamic_cast(haveWidget("shares"));
+ auto sharesEdit = dynamic_cast(haveWidget("shares"));
s0.setAction(eMyMoney::Split::InvestmentTransactionType::AddShares);
s0.setShares(sharesEdit->value().abs());
@@ -589,23 +748,39 @@
return true;
}
+Remove::Remove(InvestTransactionEditor* editor) :
+ Activity(editor)
+{
+}
+
+Remove::~Remove()
+{
+}
+
+eMyMoney::Split::InvestmentTransactionType Remove::type() const
+{
+ return eMyMoney::Split::InvestmentTransactionType::RemoveShares;
+}
+
void Remove::showWidgets() const
{
- kMyMoneyEdit* shareEdit = dynamic_cast(haveWidget("shares"));
+ Q_D(const Activity);
+ auto shareEdit = dynamic_cast(haveWidget("shares"));
shareEdit->show();
- shareEdit->setPrecision(MyMoneyMoney::denomToPrec(m_parent->security().smallestAccountFraction()));
+ shareEdit->setPrecision(MyMoneyMoney::denomToPrec(d->m_parent->security().smallestAccountFraction()));
setLabelText("shares-label", i18n("Shares"));
}
bool Remove::isComplete(QString& reason) const
{
- bool rc = Activity::isComplete(reason);
+ auto rc = Activity::isComplete(reason);
rc &= haveShares();
return rc;
}
bool Remove::createTransaction(MyMoneyTransaction& t, MyMoneySplit& s0, MyMoneySplit& assetAccountSplit, QList& feeSplits, QList& m_feeSplits, QList& interestSplits, QList& m_interestSplits, MyMoneySecurity& security, MyMoneySecurity& currency)
{
+ Q_D(Activity);
Q_UNUSED(t);
Q_UNUSED(assetAccountSplit);
Q_UNUSED(m_feeSplits);
@@ -617,7 +792,7 @@
if (!isComplete(reason))
return false;
- kMyMoneyEdit* sharesEdit = dynamic_cast(haveWidget("shares"));
+ auto sharesEdit = dynamic_cast(haveWidget("shares"));
s0.setAction(eMyMoney::Split::InvestmentTransactionType::AddShares);
s0.setShares(-(sharesEdit->value().abs()));
@@ -632,11 +807,25 @@
return true;
}
+Split::Split(InvestTransactionEditor* editor) :
+ Activity(editor)
+{
+}
+
+Split::~Split()
+{
+}
+
+eMyMoney::Split::InvestmentTransactionType Split::type() const
+{
+ return eMyMoney::Split::InvestmentTransactionType::SplitShares;
+}
+
void Split::showWidgets() const
{
// TODO do we need a special split ratio widget?
// TODO maybe yes, currently the precision is the one of the fraction and might differ from it
- kMyMoneyEdit* shareEdit = dynamic_cast(haveWidget("shares"));
+ auto shareEdit = dynamic_cast(haveWidget("shares"));
shareEdit->show();
shareEdit->setPrecision(-1);
setLabelText("shares-label", i18n("Ratio 1/"));
@@ -644,13 +833,14 @@
bool Split::isComplete(QString& reason) const
{
- bool rc = Activity::isComplete(reason);
+ auto rc = Activity::isComplete(reason);
rc &= haveShares();
return rc;
}
bool Split::createTransaction(MyMoneyTransaction& t, MyMoneySplit& s0, MyMoneySplit& assetAccountSplit, QList& feeSplits, QList& m_feeSplits, QList& interestSplits, QList& m_interestSplits, MyMoneySecurity& security, MyMoneySecurity& currency)
{
+ Q_D(Activity);
Q_UNUSED(t);
Q_UNUSED(assetAccountSplit);
Q_UNUSED(m_feeSplits);
@@ -658,7 +848,7 @@
Q_UNUSED(security);
Q_UNUSED(currency);
- kMyMoneyEdit* sharesEdit = dynamic_cast(haveWidget("shares"));
+ auto sharesEdit = dynamic_cast(haveWidget("shares"));
KMyMoneyCategory* cat;
cat = dynamic_cast(haveWidget("interest-account"));
@@ -677,6 +867,20 @@
return true;
}
+IntInc::IntInc(InvestTransactionEditor* editor) :
+ Activity(editor)
+{
+}
+
+IntInc::~IntInc()
+{
+}
+
+eMyMoney::Split::InvestmentTransactionType IntInc::type() const
+{
+ return eMyMoney::Split::InvestmentTransactionType::InterestIncome;
+}
+
void IntInc::showWidgets() const
{
static const QStringList visibleWidgetIds = QStringList() << "asset-account" << "interest-amount" << "total" << "interest-account" << "fee-account";
@@ -695,7 +899,7 @@
{
Q_UNUSED(reason)
- bool rc = Activity::isComplete(reason);
+ auto rc = Activity::isComplete(reason);
rc &= haveAssetAccount();
rc &= haveCategoryAndAmount("interest-account", QString(), false);
rc &= haveInterest(false);
@@ -704,6 +908,7 @@
bool IntInc::createTransaction(MyMoneyTransaction& t, MyMoneySplit& s0, MyMoneySplit& assetAccountSplit, QList& feeSplits, QList& m_feeSplits, QList& interestSplits, QList& m_interestSplits, MyMoneySecurity& security, MyMoneySecurity& currency)
{
+ Q_D(Activity);
Q_UNUSED(security);
Q_UNUSED(currency);
@@ -729,7 +934,7 @@
MyMoneyMoney total = sumSplits(s0, feeSplits, interestSplits);
assetAccountSplit.setValue(-total);
- if (!m_parent->setupPrice(t, assetAccountSplit))
+ if (!d->m_parent->setupPrice(t, assetAccountSplit))
return false;
return true;
diff --git a/kmymoney/dialogs/investtransactioneditor.h b/kmymoney/dialogs/investtransactioneditor.h
--- a/kmymoney/dialogs/investtransactioneditor.h
+++ b/kmymoney/dialogs/investtransactioneditor.h
@@ -4,6 +4,7 @@
begin : Fri Dec 15 2006
copyright : (C) 2006 by Thomas Baumgart
email : Thomas Baumgart
+ (C) 2017 by Łukasz Wojniłowicz
***************************************************************************/
/***************************************************************************
@@ -21,33 +22,37 @@
// ----------------------------------------------------------------------------
// QT Includes
-#include
-
// ----------------------------------------------------------------------------
// KDE Includes
-
// ----------------------------------------------------------------------------
// Project Includes
#include "transactioneditor.h"
+class MyMoneyMoney;
+class MyMoneySecurity;
+
+namespace eDialogs { enum class PriceMode; }
+
+namespace KMyMoneyRegister { class InvestTransaction; }
+
+namespace eMyMoney { namespace Split {
+ enum class InvestmentTransactionType; } }
+
+class InvestTransactionEditorPrivate;
class InvestTransactionEditor : public TransactionEditor
{
- friend class InvestTransactionEditorPrivate;
-
Q_OBJECT
+ Q_DISABLE_COPY(InvestTransactionEditor)
public:
- typedef enum {
- Price = 0,
- PricePerShare,
- PricePerTransaction
- } priceModeE;
-
InvestTransactionEditor();
- InvestTransactionEditor(TransactionEditorContainer* regForm, KMyMoneyRegister::InvestTransaction* item, const KMyMoneyRegister::SelectedTransactions& list, const QDate& lastPostDate);
- virtual ~InvestTransactionEditor();
+ explicit InvestTransactionEditor(TransactionEditorContainer* regForm,
+ KMyMoneyRegister::InvestTransaction* item,
+ const KMyMoneyRegister::SelectedTransactions& list,
+ const QDate& lastPostDate);
+ ~InvestTransactionEditor() override;
/**
* This method returns information about the completeness of the data
@@ -64,13 +69,11 @@
*
* @sa transactionDataSufficient()
*/
- virtual bool isComplete(QString& reason) const;
+ bool isComplete(QString& reason) const override;
- virtual QWidget* firstWidget() const;
+ QWidget* firstWidget() const override;
- virtual bool fixTransactionCommodity(const MyMoneyAccount& /* account */) {
- return true;
- }
+ bool fixTransactionCommodity(const MyMoneyAccount& /* account */) override;
void totalAmount(MyMoneyMoney& amount) const;
@@ -95,21 +98,17 @@
*
* @note Usually not used directly. If unsure, use enterTransactions() instead.
*/
- bool createTransaction(MyMoneyTransaction& t, const MyMoneyTransaction& torig, const MyMoneySplit& sorig, bool skipPriceDialog = false);
-
- priceModeE priceMode() const;
+ bool createTransaction(MyMoneyTransaction& t,
+ const MyMoneyTransaction& torig,
+ const MyMoneySplit& sorig,
+ bool skipPriceDialog = false) override;
- const MyMoneySecurity& security() const {
- return m_security;
- }
+ eDialogs::PriceMode priceMode() const;
- const QList& feeSplits() const {
- return m_feeSplits;
- }
+ MyMoneySecurity security() const;
- const QList& interestSplits() const {
- return m_interestSplits;
- }
+ QList feeSplits() const;
+ QList interestSplits() const;
protected slots:
void slotCreateSecurity(const QString& name, QString& id);
@@ -135,7 +134,7 @@
* This method creates all necessary widgets for this transaction editor.
* All signals will be connected to the relevant slots.
*/
- void createEditWidgets();
+ void createEditWidgets() override;
/**
* This method (re-)loads the widgets with the transaction information
@@ -144,46 +143,13 @@
* @param action preset the edit wigdets for @a action if no transaction
* is present
*/
- void loadEditWidgets(KMyMoneyRegister::Action action = KMyMoneyRegister::ActionNone);
-
- void activityFactory(eMyMoney::Split::InvestmentTransactionType type);
-
- MyMoneyMoney subtotal(const QList& splits) const;
+ void loadEditWidgets(KMyMoneyRegister::Action action) override;
+ void loadEditWidgets() override;
- /**
- * This method creates a transaction to be used for the split fee/interest editor.
- * It has a reference to a phony account and the splits contained in @a splits .
- */
- bool createPseudoTransaction(MyMoneyTransaction& t, const QList& splits);
-
- /**
- * Convenience method used by slotEditInterestSplits() and slotEditFeeSplits().
- *
- * @param categoryWidgetName name of the category widget
- * @param amountWidgetName name of the amount widget
- * @param splits the splits that make up the transaction to be edited
- * @param isIncome @c false for fees, @c true for interest
- * @param slotEditSplits name of the slot to be connected to the focusIn signal of the
- * category widget named @p categoryWidgetName in case of multiple splits
- * in @p splits .
- */
- int editSplits(const QString& categoryWidgetName, const QString& amountWidgetName, QList& splits, bool isIncome, const char* slotEditSplits);
-
- void updatePriceMode(const MyMoneySplit& split = MyMoneySplit());
-
- void setupFinalWidgets();
+ void setupFinalWidgets() override;
private:
- MyMoneySplit m_assetAccountSplit;
- QList m_interestSplits;
- QList m_feeSplits;
- MyMoneySecurity m_security;
- MyMoneySecurity m_currency;
- eMyMoney::Split::InvestmentTransactionType m_transactionType;
- /// \internal d-pointer class.
- class Private;
- /// \internal d-pointer instance.
- Private* const d;
+ Q_DECLARE_PRIVATE(InvestTransactionEditor)
};
#endif // INVESTTRANSACTIONEDITOR_H
diff --git a/kmymoney/dialogs/investtransactioneditor.cpp b/kmymoney/dialogs/investtransactioneditor.cpp
--- a/kmymoney/dialogs/investtransactioneditor.cpp
+++ b/kmymoney/dialogs/investtransactioneditor.cpp
@@ -4,6 +4,7 @@
begin : Fri Dec 15 2006
copyright : (C) 2006 by Thomas Baumgart
email : Thomas Baumgart
+ (C) 2017 by Łukasz Wojniłowicz
***************************************************************************/
/***************************************************************************
@@ -16,6 +17,7 @@
***************************************************************************/
#include "investtransactioneditor.h"
+#include "transactioneditor_p.h"
#include
@@ -46,381 +48,468 @@
#include "kcurrencycalculator.h"
#include "kmymoneyglobalsettings.h"
#include "investactivities.h"
-#include "kmymoneyutils.h"
#include "kmymoneycompletion.h"
+#include "dialogenums.h"
+using namespace eMyMoney;
using namespace KMyMoneyRegister;
using namespace KMyMoneyTransactionForm;
using namespace Invest;
-class InvestTransactionEditor::Private
+class InvestTransactionEditorPrivate : public TransactionEditorPrivate
{
+ Q_DISABLE_COPY(InvestTransactionEditorPrivate)
+ Q_DECLARE_PUBLIC(InvestTransactionEditor)
friend class Invest::Activity;
public:
- Private(InvestTransactionEditor* parent) :
- m_parent(parent),
- m_activity(0) {
+ InvestTransactionEditorPrivate(InvestTransactionEditor* qq) :
+ TransactionEditorPrivate(qq),
+ m_activity(0)
+ {
m_phonyAccount = MyMoneyAccount("Phony-ID", MyMoneyAccount());
}
- ~Private() {
+ ~InvestTransactionEditorPrivate()
+ {
delete m_activity;
}
- QWidget* haveWidget(const QString& name) {
- return m_parent->haveWidget(name);
+ QWidget* haveWidget(const QString& name)
+ {
+ Q_Q(InvestTransactionEditor);
+ return q->haveWidget(name);
}
- void hideCategory(const QString& name) {
+ void hideCategory(const QString& name)
+ {
if (KMyMoneyCategory* cat = dynamic_cast(haveWidget(name))) {
cat->hide();
cat->splitButton()->hide();
}
}
- InvestTransactionEditor* m_parent;
- Activity* m_activity;
- MyMoneyAccount m_phonyAccount;
- MyMoneySplit m_phonySplit;
+ void activityFactory(Split::InvestmentTransactionType type)
+ {
+ Q_Q(InvestTransactionEditor);
+ if (!m_activity || type != m_activity->type()) {
+ delete m_activity;
+ switch (type) {
+ default:
+ case Split::InvestmentTransactionType::BuyShares:
+ m_activity = new Buy(q);
+ break;
+ case Split::InvestmentTransactionType::SellShares:
+ m_activity = new Sell(q);
+ break;
+ case Split::InvestmentTransactionType::Dividend:
+ case Split::InvestmentTransactionType::Yield:
+ m_activity = new Div(q);
+ break;
+ case Split::InvestmentTransactionType::ReinvestDividend:
+ m_activity = new Reinvest(q);
+ break;
+ case Split::InvestmentTransactionType::AddShares:
+ m_activity = new Add(q);
+ break;
+ case Split::InvestmentTransactionType::RemoveShares:
+ m_activity = new Remove(q);
+ break;
+ case Split::InvestmentTransactionType::SplitShares:
+ m_activity = new Invest::Split(q);
+ break;
+ case Split::InvestmentTransactionType::InterestIncome:
+ m_activity = new IntInc(q);
+ break;
+ }
+ }
+ }
+
+ MyMoneyMoney subtotal(const QList& splits) const
+ {
+ QList::const_iterator it_s;
+ MyMoneyMoney sum;
+
+ for (it_s = splits.begin(); it_s != splits.end(); ++it_s) {
+ sum += (*it_s).value();
+ }
+
+ return sum;
+ }
+
+ /**
+ * This method creates a transaction to be used for the split fee/interest editor.
+ * It has a reference to a phony account and the splits contained in @a splits .
+ */
+ bool createPseudoTransaction(MyMoneyTransaction& t, const QList& splits)
+ {
+ t.removeSplits();
+
+ MyMoneySplit split;
+ split.setAccountId(m_phonyAccount.id());
+ split.setValue(-subtotal(splits));
+ split.setShares(split.value());
+ t.addSplit(split);
+ m_phonySplit = split;
+
+ QList::const_iterator it_s;
+ for (it_s = splits.begin(); it_s != splits.end(); ++it_s) {
+ split = *it_s;
+ split.clearId();
+ t.addSplit(split);
+ }
+ return true;
+ }
+
+ /**
+ * Convenience method used by slotEditInterestSplits() and slotEditFeeSplits().
+ *
+ * @param categoryWidgetName name of the category widget
+ * @param amountWidgetName name of the amount widget
+ * @param splits the splits that make up the transaction to be edited
+ * @param isIncome @c false for fees, @c true for interest
+ * @param slotEditSplits name of the slot to be connected to the focusIn signal of the
+ * category widget named @p categoryWidgetName in case of multiple splits
+ * in @p splits .
+ */
+
+ int editSplits(const QString& categoryWidgetName,
+ const QString& amountWidgetName,
+ QList& splits,
+ bool isIncome,
+ const char* slotEditSplits)
+ {
+ Q_Q(InvestTransactionEditor);
+ int rc = QDialog::Rejected;
+
+ if (!m_openEditSplits) {
+ // only get in here in a single instance
+ m_openEditSplits = true;
+
+ // force focus change to update all data
+ KMyMoneyCategory* category = dynamic_cast(m_editWidgets[categoryWidgetName]);
+ QWidget* w = category->splitButton();
+ if (w)
+ w->setFocus();
+
+ kMyMoneyEdit* amount = dynamic_cast(haveWidget(amountWidgetName));
+
+ MyMoneyTransaction transaction;
+ transaction.setCommodity(m_currency.id());
+ if (splits.count() == 0 && !category->selectedItem().isEmpty()) {
+ MyMoneySplit s;
+ s.setAccountId(category->selectedItem());
+ s.setShares(amount->value());
+ s.setValue(s.shares());
+ splits << s;
+ }
+ // use the transactions commodity as the currency indicator for the splits
+ // this is used to allow some useful setting for the fractions in the amount fields
+ try {
+ m_phonyAccount.setCurrencyId(m_transaction.commodity());
+ m_phonyAccount.fraction(MyMoneyFile::instance()->security(m_transaction.commodity()));
+ } catch (const MyMoneyException &) {
+ qDebug("Unable to setup precision");
+ }
+
+ if (createPseudoTransaction(transaction, splits)) {
+ MyMoneyMoney value;
+
+ QPointer dlg = new KSplitTransactionDlg(transaction,
+ m_phonySplit,
+ m_phonyAccount,
+ false,
+ isIncome,
+ MyMoneyMoney(),
+ m_priceInfo,
+ m_regForm);
+ // q->connect(dlg, SIGNAL(newCategory(MyMoneyAccount&)), q, SIGNAL(newCategory(MyMoneyAccount&)));
+
+ if ((rc = dlg->exec()) == QDialog::Accepted) {
+ transaction = dlg->transaction();
+ // collect splits out of the transaction
+ splits.clear();
+ QList::const_iterator it_s;
+ MyMoneyMoney fees;
+ for (it_s = transaction.splits().constBegin(); it_s != transaction.splits().constEnd(); ++it_s) {
+ if ((*it_s).accountId() == m_phonyAccount.id())
+ continue;
+ splits << *it_s;
+ fees += (*it_s).shares();
+ }
+ if (isIncome)
+ fees = -fees;
+
+ QString categoryId;
+ q->setupCategoryWidget(category, splits, categoryId, slotEditSplits);
+ amount->setValue(fees);
+ q->slotUpdateTotalAmount();
+ }
+
+ delete dlg;
+ }
+
+ // focus jumps into the memo field
+ if ((w = haveWidget("memo")) != 0) {
+ w->setFocus();
+ }
+
+ m_openEditSplits = false;
+ }
+ return rc;
+ }
+
+ void updatePriceMode(const MyMoneySplit& split = MyMoneySplit())
+ {
+ Q_Q(InvestTransactionEditor);
+ auto label = dynamic_cast(haveWidget("price-label"));
+ if (label) {
+ auto sharesEdit = dynamic_cast(haveWidget("shares"));
+ auto priceEdit = dynamic_cast(haveWidget("price"));
+ MyMoneyMoney price;
+ if (!split.id().isEmpty())
+ price = split.price().reduce();
+ else
+ price = priceEdit->value().abs();
+
+ if (q->priceMode() == eDialogs::PriceMode::PricePerTransaction) {
+ priceEdit->setPrecision(m_currency.pricePrecision());
+ label->setText(i18n("Transaction amount"));
+ if (!sharesEdit->value().isZero())
+ priceEdit->setValue(sharesEdit->value().abs() * price);
+
+ } else if (q->priceMode() == eDialogs::PriceMode::PricePerShare) {
+ priceEdit->setPrecision(m_security.pricePrecision());
+ label->setText(i18n("Price/Share"));
+ priceEdit->setValue(price);
+ } else
+ priceEdit->setValue(price);
+ }
+ }
+
+// InvestTransactionEditor* q_ptr;
+ Activity* m_activity;
+ MyMoneyAccount m_phonyAccount;
+ MyMoneySplit m_phonySplit;
+ MyMoneySplit m_assetAccountSplit;
+ QList m_interestSplits;
+ QList m_feeSplits;
+ MyMoneySecurity m_security;
+ MyMoneySecurity m_currency;
+ Split::InvestmentTransactionType m_transactionType;
};
InvestTransactionEditor::InvestTransactionEditor() :
- m_transactionType(eMyMoney::Split::InvestmentTransactionType::UnknownTransactionType),
- d(new Private(this))
+ TransactionEditor(*new InvestTransactionEditorPrivate(this))
{
+ Q_D(InvestTransactionEditor);
+ d->m_transactionType = Split::InvestmentTransactionType::UnknownTransactionType;
}
InvestTransactionEditor::~InvestTransactionEditor()
{
- delete d;
}
-InvestTransactionEditor::InvestTransactionEditor(TransactionEditorContainer* regForm, KMyMoneyRegister::InvestTransaction* item, const KMyMoneyRegister::SelectedTransactions& list, const QDate& lastPostDate) :
- TransactionEditor(regForm, item, list, lastPostDate),
- d(new Private(this))
+InvestTransactionEditor::InvestTransactionEditor(TransactionEditorContainer* regForm,
+ KMyMoneyRegister::InvestTransaction* item,
+ const KMyMoneyRegister::SelectedTransactions& list,
+ const QDate& lastPostDate) :
+ TransactionEditor(*new InvestTransactionEditorPrivate(this),
+ regForm,
+ item,
+ list,
+ lastPostDate)
{
+ Q_D(InvestTransactionEditor);
// after the gometries of the container are updated hide the widgets which are not needed by the current activity
- connect(m_regForm, SIGNAL(geometriesUpdated()), this, SLOT(slotTransactionContainerGeometriesUpdated()));
+ connect(d->m_regForm, &TransactionEditorContainer::geometriesUpdated, this, &InvestTransactionEditor::slotTransactionContainerGeometriesUpdated);
// dissect the transaction into its type, splits, currency, security etc.
- KMyMoneyUtils::dissectTransaction(m_transaction, m_split,
- m_assetAccountSplit,
- m_feeSplits,
- m_interestSplits,
- m_security,
- m_currency,
- m_transactionType);
+ KMyMoneyUtils::dissectTransaction(d->m_transaction, d->m_split,
+ d->m_assetAccountSplit,
+ d->m_feeSplits,
+ d->m_interestSplits,
+ d->m_security,
+ d->m_currency,
+ d->m_transactionType);
// determine initial activity object
- activityFactory(m_transactionType);
-}
-
-void InvestTransactionEditor::activityFactory(eMyMoney::Split::InvestmentTransactionType type)
-{
- if (!d->m_activity || type != d->m_activity->type()) {
- delete d->m_activity;
- switch (type) {
- default:
- case eMyMoney::Split::InvestmentTransactionType::BuyShares:
- d->m_activity = new Buy(this);
- break;
- case eMyMoney::Split::InvestmentTransactionType::SellShares:
- d->m_activity = new Sell(this);
- break;
- case eMyMoney::Split::InvestmentTransactionType::Dividend:
- case eMyMoney::Split::InvestmentTransactionType::Yield:
- d->m_activity = new Div(this);
- break;
- case eMyMoney::Split::InvestmentTransactionType::ReinvestDividend:
- d->m_activity = new Reinvest(this);
- break;
- case eMyMoney::Split::InvestmentTransactionType::AddShares:
- d->m_activity = new Add(this);
- break;
- case eMyMoney::Split::InvestmentTransactionType::RemoveShares:
- d->m_activity = new Remove(this);
- break;
- case eMyMoney::Split::InvestmentTransactionType::SplitShares:
- d->m_activity = new Split(this);
- break;
- case eMyMoney::Split::InvestmentTransactionType::InterestIncome:
- d->m_activity = new IntInc(this);
- break;
- }
- }
+ d->activityFactory(d->m_transactionType);
}
void InvestTransactionEditor::createEditWidgets()
{
- KMyMoneyActivityCombo* activity = new KMyMoneyActivityCombo();
- m_editWidgets["activity"] = activity;
- connect(activity, SIGNAL(activitySelected(eMyMoney::Split::InvestmentTransactionType)), this, SLOT(slotUpdateActivity(eMyMoney::Split::InvestmentTransactionType)));
- connect(activity, SIGNAL(activitySelected(eMyMoney::Split::InvestmentTransactionType)), this, SLOT(slotUpdateButtonState()));
+ Q_D(InvestTransactionEditor);
+ auto activity = new KMyMoneyActivityCombo();
+ d->m_editWidgets["activity"] = activity;
+ connect(activity, &KMyMoneyActivityCombo::activitySelected, this, &InvestTransactionEditor::slotUpdateActivity);
+ connect(activity, &KMyMoneyActivityCombo::activitySelected, this, static_cast(&InvestTransactionEditor::slotUpdateButtonState));
- m_editWidgets["postdate"] = new kMyMoneyDateInput;
+ d->m_editWidgets["postdate"] = new kMyMoneyDateInput;
- KMyMoneySecurity* security = new KMyMoneySecurity;
+ auto security = new KMyMoneySecurity;
security->setPlaceholderText(i18n("Security"));
- m_editWidgets["security"] = security;
- connect(security, SIGNAL(itemSelected(QString)), this, SLOT(slotUpdateSecurity(QString)));
- connect(security, SIGNAL(editTextChanged(QString)), this, SLOT(slotUpdateButtonState()));
- connect(security, SIGNAL(createItem(QString,QString&)), this, SLOT(slotCreateSecurity(QString,QString&)));
- connect(security, SIGNAL(objectCreation(bool)), this, SIGNAL(objectCreation(bool)));
+ d->m_editWidgets["security"] = security;
+ connect(security, &KMyMoneyCombo::itemSelected, this, &InvestTransactionEditor::slotUpdateSecurity);
+ connect(security, &QComboBox::editTextChanged, this, static_cast(&InvestTransactionEditor::slotUpdateButtonState));
+ connect(security, &KMyMoneyCombo::createItem, this, &InvestTransactionEditor::slotCreateSecurity);
+ connect(security, &KMyMoneyCombo::objectCreation, this, &TransactionEditor::objectCreation);
- KMyMoneyCategory* asset = new KMyMoneyCategory(0, false);
+ auto asset = new KMyMoneyCategory(0, false);
asset->setPlaceholderText(i18n("Asset account"));
- m_editWidgets["asset-account"] = asset;
- connect(asset, SIGNAL(editTextChanged(QString)), this, SLOT(slotUpdateButtonState()));
- connect(asset, SIGNAL(objectCreation(bool)), this, SIGNAL(objectCreation(bool)));
+ d->m_editWidgets["asset-account"] = asset;
+ connect(asset, &QComboBox::editTextChanged, this, static_cast(&InvestTransactionEditor::slotUpdateButtonState));
+ connect(asset, &KMyMoneyCombo::objectCreation, this, &TransactionEditor::objectCreation);
- KMyMoneyCategory* fees = new KMyMoneyCategory(0, true);
+ auto fees = new KMyMoneyCategory(0, true);
fees->setPlaceholderText(i18n("Fees"));
- m_editWidgets["fee-account"] = fees;
- connect(fees, SIGNAL(itemSelected(QString)), this, SLOT(slotUpdateFeeCategory(QString)));
- connect(fees, SIGNAL(editTextChanged(QString)), this, SLOT(slotUpdateButtonState()));
- connect(fees, SIGNAL(editTextChanged(QString)), this, SLOT(slotUpdateFeeVisibility(QString)));
- connect(fees, SIGNAL(createItem(QString,QString&)), this, SLOT(slotCreateFeeCategory(QString,QString&)));
- connect(fees, SIGNAL(objectCreation(bool)), this, SIGNAL(objectCreation(bool)));
- connect(fees->splitButton(), SIGNAL(clicked()), this, SLOT(slotEditFeeSplits()));
-
- KMyMoneyCategory* interest = new KMyMoneyCategory(0, true);
+ d->m_editWidgets["fee-account"] = fees;
+ connect(fees, &KMyMoneyCombo::itemSelected, this, &InvestTransactionEditor::slotUpdateFeeCategory);
+ connect(fees, &QComboBox::editTextChanged, this, static_cast(&InvestTransactionEditor::slotUpdateButtonState));
+ connect(fees, &QComboBox::editTextChanged, this, &InvestTransactionEditor::slotUpdateFeeVisibility);
+ connect(fees, &KMyMoneyCombo::createItem, this, &InvestTransactionEditor::slotCreateFeeCategory);
+ connect(fees, &KMyMoneyCombo::objectCreation, this, &TransactionEditor::objectCreation);
+ connect(fees->splitButton(), &QAbstractButton::clicked, this, &InvestTransactionEditor::slotEditFeeSplits);
+
+ auto interest = new KMyMoneyCategory(0, true);
interest->setPlaceholderText(i18n("Interest"));
- m_editWidgets["interest-account"] = interest;
- connect(interest, SIGNAL(itemSelected(QString)), this, SLOT(slotUpdateInterestCategory(QString)));
- connect(interest, SIGNAL(editTextChanged(QString)), this, SLOT(slotUpdateButtonState()));
- connect(interest, SIGNAL(editTextChanged(QString)), this, SLOT(slotUpdateInterestVisibility(QString)));
- connect(interest, SIGNAL(createItem(QString,QString&)), this, SLOT(slotCreateInterestCategory(QString,QString&)));
- connect(interest, SIGNAL(objectCreation(bool)), this, SIGNAL(objectCreation(bool)));
- connect(interest->splitButton(), SIGNAL(clicked()), this, SLOT(slotEditInterestSplits()));
-
- KTagContainer* tag = new KTagContainer;
+ d->m_editWidgets["interest-account"] = interest;
+ connect(interest, &KMyMoneyCombo::itemSelected, this, &InvestTransactionEditor::slotUpdateInterestCategory);
+ connect(interest, &QComboBox::editTextChanged, this, static_cast(&InvestTransactionEditor::slotUpdateButtonState));
+ connect(interest, &QComboBox::editTextChanged, this, &InvestTransactionEditor::slotUpdateInterestVisibility);
+ connect(interest, &KMyMoneyCombo::createItem, this, &InvestTransactionEditor::slotCreateInterestCategory);
+ connect(interest, &KMyMoneyCombo::objectCreation, this, &TransactionEditor::objectCreation);
+ connect(interest->splitButton(), &QAbstractButton::clicked, this, &InvestTransactionEditor::slotEditInterestSplits);
+
+ auto tag = new KTagContainer;
tag->tagCombo()->setPlaceholderText(i18n("Tag"));
tag->tagCombo()->setObjectName(QLatin1String("Tag"));
- m_editWidgets["tag"] = tag;
- connect(tag->tagCombo(), SIGNAL(editTextChanged(QString)), this, SLOT(slotUpdateButtonState()));
- connect(tag->tagCombo(), SIGNAL(createItem(QString,QString&)), this, SIGNAL(createTag(QString,QString&)));
- connect(tag->tagCombo(), SIGNAL(objectCreation(bool)), this, SIGNAL(objectCreation(bool)));
+ d->m_editWidgets["tag"] = tag;
+ connect(tag->tagCombo(), &QComboBox::editTextChanged, this, static_cast(&InvestTransactionEditor::slotUpdateButtonState));
+ connect(tag->tagCombo(), &KMyMoneyMVCCombo::createItem, this, &TransactionEditor::createTag);
+ connect(tag->tagCombo(), &KMyMoneyMVCCombo::objectCreation, this, &TransactionEditor::objectCreation);
- KTextEdit* memo = new KTextEdit;
+ auto memo = new KTextEdit;
memo->setTabChangesFocus(true);
- m_editWidgets["memo"] = memo;
- connect(memo, SIGNAL(textChanged()), this, SLOT(slotUpdateInvestMemoState()));
- connect(memo, SIGNAL(textChanged()), this, SLOT(slotUpdateButtonState()));
+ d->m_editWidgets["memo"] = memo;
+ connect(memo, &QTextEdit::textChanged, this, &InvestTransactionEditor::slotUpdateInvestMemoState);
+ connect(memo, &QTextEdit::textChanged, this, static_cast(&InvestTransactionEditor::slotUpdateButtonState));
- d->m_activity->m_memoText.clear();
- d->m_activity->m_memoChanged = false;
+ d->m_activity->memoText().clear();
+ d->m_activity->memoChanged() = false;
kMyMoneyEdit* value = new kMyMoneyEdit;
value->setPlaceholderText(i18n("Shares"));
value->setResetButtonVisible(false);
- m_editWidgets["shares"] = value;
- connect(value, SIGNAL(textChanged(QString)), this, SLOT(slotUpdateButtonState()));
- connect(value, SIGNAL(valueChanged(QString)), this, SLOT(slotUpdateTotalAmount()));
+ d->m_editWidgets["shares"] = value;
+ connect(value, &kMyMoneyEdit::textChanged, this, static_cast(&InvestTransactionEditor::slotUpdateButtonState));
+ connect(value, &kMyMoneyEdit::valueChanged, this, &InvestTransactionEditor::slotUpdateTotalAmount);
value = new kMyMoneyEdit;
value->setPlaceholderText(i18n("Price"));
value->setResetButtonVisible(false);
- m_editWidgets["price"] = value;
- connect(value, SIGNAL(textChanged(QString)), this, SLOT(slotUpdateButtonState()));
- connect(value, SIGNAL(valueChanged(QString)), this, SLOT(slotUpdateTotalAmount()));
+ d->m_editWidgets["price"] = value;
+ connect(value, &kMyMoneyEdit::textChanged, this, static_cast(&InvestTransactionEditor::slotUpdateButtonState));
+ connect(value, &kMyMoneyEdit::valueChanged, this, &InvestTransactionEditor::slotUpdateTotalAmount);
value = new kMyMoneyEdit;
// TODO once we have the selected transactions as array of Transaction
// we can allow multiple splits for fee and interest
value->setResetButtonVisible(false);
- m_editWidgets["fee-amount"] = value;
- connect(value, SIGNAL(textChanged(QString)), this, SLOT(slotUpdateButtonState()));
- connect(value, SIGNAL(valueChanged(QString)), this, SLOT(slotUpdateTotalAmount()));
+ d->m_editWidgets["fee-amount"] = value;
+ connect(value, &kMyMoneyEdit::textChanged, this, static_cast(&InvestTransactionEditor::slotUpdateButtonState));
+ connect(value, &kMyMoneyEdit::valueChanged, this, &InvestTransactionEditor::slotUpdateTotalAmount);
value = new kMyMoneyEdit;
// TODO once we have the selected transactions as array of Transaction
// we can allow multiple splits for fee and interest
value->setResetButtonVisible(false);
- m_editWidgets["interest-amount"] = value;
- connect(value, SIGNAL(textChanged(QString)), this, SLOT(slotUpdateButtonState()));
- connect(value, SIGNAL(valueChanged(QString)), this, SLOT(slotUpdateTotalAmount()));
+ d->m_editWidgets["interest-amount"] = value;
+ connect(value, &kMyMoneyEdit::textChanged, this, static_cast(&InvestTransactionEditor::slotUpdateButtonState));
+ connect(value, &kMyMoneyEdit::valueChanged, this, &InvestTransactionEditor::slotUpdateTotalAmount);
- KMyMoneyReconcileCombo* reconcile = new KMyMoneyReconcileCombo;
- m_editWidgets["status"] = reconcile;
- connect(reconcile, SIGNAL(itemSelected(QString)), this, SLOT(slotUpdateButtonState()));
+ auto reconcile = new KMyMoneyReconcileCombo;
+ d->m_editWidgets["status"] = reconcile;
+ connect(reconcile, &KMyMoneyMVCCombo::itemSelected, this, static_cast(&InvestTransactionEditor::slotUpdateButtonState));
KMyMoneyRegister::QWidgetContainer::iterator it_w;
- for (it_w = m_editWidgets.begin(); it_w != m_editWidgets.end(); ++it_w) {
+ for (it_w = d->m_editWidgets.begin(); it_w != d->m_editWidgets.end(); ++it_w) {
(*it_w)->installEventFilter(this);
}
QLabel* label;
- m_editWidgets["activity-label"] = label = new QLabel(i18n("Activity"));
+ d->m_editWidgets["activity-label"] = label = new QLabel(i18n("Activity"));
label->setAlignment(Qt::AlignVCenter);
- m_editWidgets["postdate-label"] = label = new QLabel(i18n("Date"));
+ d->m_editWidgets["postdate-label"] = label = new QLabel(i18n("Date"));
label->setAlignment(Qt::AlignVCenter);
- m_editWidgets["security-label"] = label = new QLabel(i18n("Security"));
+ d->m_editWidgets["security-label"] = label = new QLabel(i18n("Security"));
label->setAlignment(Qt::AlignVCenter);
- m_editWidgets["shares-label"] = label = new QLabel(i18n("Shares"));
+ d->m_editWidgets["shares-label"] = label = new QLabel(i18n("Shares"));
label->setAlignment(Qt::AlignVCenter);
- m_editWidgets["asset-label"] = label = new QLabel(i18n("Account"));
+ d->m_editWidgets["asset-label"] = label = new QLabel(i18n("Account"));
label->setAlignment(Qt::AlignVCenter);
- m_editWidgets["price-label"] = label = new QLabel(i18n("Price/share"));
+ d->m_editWidgets["price-label"] = label = new QLabel(i18n("Price/share"));
label->setAlignment(Qt::AlignVCenter);
- m_editWidgets["fee-label"] = label = new QLabel(i18n("Fees"));
+ d->m_editWidgets["fee-label"] = label = new QLabel(i18n("Fees"));
label->setAlignment(Qt::AlignVCenter);
- m_editWidgets["fee-amount-label"] = label = new QLabel("");
+ d->m_editWidgets["fee-amount-label"] = label = new QLabel("");
label->setAlignment(Qt::AlignVCenter);
- m_editWidgets["interest-label"] = label = new QLabel(i18n("Interest"));
+ d->m_editWidgets["interest-label"] = label = new QLabel(i18n("Interest"));
label->setAlignment(Qt::AlignVCenter);
- m_editWidgets["interest-amount-label"] = label = new QLabel(i18n("Interest"));
+ d->m_editWidgets["interest-amount-label"] = label = new QLabel(i18n("Interest"));
label->setAlignment(Qt::AlignVCenter);
- m_editWidgets["memo-label"] = label = new QLabel(i18n("Memo"));
+ d->m_editWidgets["memo-label"] = label = new QLabel(i18n("Memo"));
label->setAlignment(Qt::AlignVCenter);
- m_editWidgets["total"] = label = new QLabel("");
+ d->m_editWidgets["total"] = label = new QLabel("");
label->setAlignment(Qt::AlignVCenter | Qt::AlignRight);
- m_editWidgets["total-label"] = label = new QLabel(i18nc("Total value", "Total"));
+ d->m_editWidgets["total-label"] = label = new QLabel(i18nc("Total value", "Total"));
label->setAlignment(Qt::AlignVCenter);
- m_editWidgets["status-label"] = label = new QLabel(i18n("Status"));
+ d->m_editWidgets["status-label"] = label = new QLabel(i18n("Status"));
label->setAlignment(Qt::AlignVCenter);
// if we don't have more than 1 selected transaction, we don't need
// the "don't change" item in some of the combo widgets
- if (m_transactions.count() < 2) {
+ if (d->m_transactions.count() < 2) {
reconcile->removeDontCare();
}
}
int InvestTransactionEditor::slotEditFeeSplits()
{
- return editSplits("fee-account", "fee-amount", m_feeSplits, false, SLOT(slotEditFeeSplits()));
+ Q_D(InvestTransactionEditor);
+ return d->editSplits("fee-account", "fee-amount", d->m_feeSplits, false, SLOT(slotEditFeeSplits()));
}
int InvestTransactionEditor::slotEditInterestSplits()
{
- return editSplits("interest-account", "interest-amount", m_interestSplits, true, SLOT(slotEditInterestSplits()));
-}
-
-int InvestTransactionEditor::editSplits(const QString& categoryWidgetName, const QString& amountWidgetName, QList& splits, bool isIncome, const char* slotEditSplits)
-{
- int rc = QDialog::Rejected;
-
- if (!m_openEditSplits) {
- // only get in here in a single instance
- m_openEditSplits = true;
-
- // force focus change to update all data
- KMyMoneyCategory* category = dynamic_cast(m_editWidgets[categoryWidgetName]);
- QWidget* w = category->splitButton();
- if (w)
- w->setFocus();
-
- kMyMoneyEdit* amount = dynamic_cast(haveWidget(amountWidgetName));
-
- MyMoneyTransaction transaction;
- transaction.setCommodity(m_currency.id());
- if (splits.count() == 0 && !category->selectedItem().isEmpty()) {
- MyMoneySplit s;
- s.setAccountId(category->selectedItem());
- s.setShares(amount->value());
- s.setValue(s.shares());
- splits << s;
- }
- // use the transactions commodity as the currency indicator for the splits
- // this is used to allow some useful setting for the fractions in the amount fields
- try {
- d->m_phonyAccount.setCurrencyId(m_transaction.commodity());
- d->m_phonyAccount.fraction(MyMoneyFile::instance()->security(m_transaction.commodity()));
- } catch (const MyMoneyException &) {
- qDebug("Unable to setup precision");
- }
-
- if (createPseudoTransaction(transaction, splits)) {
- MyMoneyMoney value;
-
- QPointer dlg = new KSplitTransactionDlg(transaction,
- d->m_phonySplit,
- d->m_phonyAccount,
- false,
- isIncome,
- MyMoneyMoney(),
- m_priceInfo,
- m_regForm);
- // connect(dlg, SIGNAL(newCategory(MyMoneyAccount&)), this, SIGNAL(newCategory(MyMoneyAccount&)));
-
- if ((rc = dlg->exec()) == QDialog::Accepted) {
- transaction = dlg->transaction();
- // collect splits out of the transaction
- splits.clear();
- QList::const_iterator it_s;
- MyMoneyMoney fees;
- for (it_s = transaction.splits().constBegin(); it_s != transaction.splits().constEnd(); ++it_s) {
- if ((*it_s).accountId() == d->m_phonyAccount.id())
- continue;
- splits << *it_s;
- fees += (*it_s).shares();
- }
- if (isIncome)
- fees = -fees;
-
- QString categoryId;
- setupCategoryWidget(category, splits, categoryId, slotEditSplits);
- amount->setValue(fees);
- slotUpdateTotalAmount();
- }
-
- delete dlg;
- }
-
- // focus jumps into the memo field
- if ((w = haveWidget("memo")) != 0) {
- w->setFocus();
- }
-
- m_openEditSplits = false;
- }
- return rc;
-}
-
-bool InvestTransactionEditor::createPseudoTransaction(MyMoneyTransaction& t, const QList& splits)
-{
- t.removeSplits();
-
- MyMoneySplit split;
- split.setAccountId(d->m_phonyAccount.id());
- split.setValue(-subtotal(splits));
- split.setShares(split.value());
- t.addSplit(split);
- d->m_phonySplit = split;
-
- QList::const_iterator it_s;
- for (it_s = splits.begin(); it_s != splits.end(); ++it_s) {
- split = *it_s;
- split.clearId();
- t.addSplit(split);
- }
- return true;
+ Q_D(InvestTransactionEditor);
+ return d->editSplits("interest-account", "interest-amount", d->m_interestSplits, true, SLOT(slotEditInterestSplits()));
}
void InvestTransactionEditor::slotCreateSecurity(const QString& name, QString& id)
{
+ Q_D(InvestTransactionEditor);
MyMoneyAccount acc;
QRegExp exp("([^:]+)");
if (exp.indexIn(name) != -1) {
acc.setName(exp.cap(1));
- emit createSecurity(acc, m_account);
+ emit createSecurity(acc, d->m_account);
// return id
id = acc.id();
@@ -449,8 +538,9 @@
void InvestTransactionEditor::slotUpdateFeeVisibility(const QString& txt)
{
- static const QSet transactionTypesWithoutFee = QSet()
- << eMyMoney::Split::InvestmentTransactionType::AddShares << eMyMoney::Split::InvestmentTransactionType::RemoveShares << eMyMoney::Split::InvestmentTransactionType::SplitShares;
+ Q_D(InvestTransactionEditor);
+ static const QSet transactionTypesWithoutFee = QSet()
+ << Split::InvestmentTransactionType::AddShares << Split::InvestmentTransactionType::RemoveShares << Split::InvestmentTransactionType::SplitShares;
kMyMoneyEdit* feeAmount = dynamic_cast(haveWidget("fee-amount"));
feeAmount->setHidden(txt.isEmpty());
@@ -481,8 +571,9 @@
void InvestTransactionEditor::slotUpdateInterestVisibility(const QString& txt)
{
- static const QSet transactionTypesWithInterest = QSet()
- << eMyMoney::Split::InvestmentTransactionType::BuyShares << eMyMoney::Split::InvestmentTransactionType::SellShares << eMyMoney::Split::InvestmentTransactionType::Dividend << eMyMoney::Split::InvestmentTransactionType::InterestIncome << eMyMoney::Split::InvestmentTransactionType::Yield;
+ Q_D(InvestTransactionEditor);
+ static const QSet transactionTypesWithInterest = QSet()
+ << Split::InvestmentTransactionType::BuyShares << Split::InvestmentTransactionType::SellShares << Split::InvestmentTransactionType::Dividend << Split::InvestmentTransactionType::InterestIncome << Split::InvestmentTransactionType::Yield;
QWidget* w = haveWidget("interest-amount");
w->setHidden(txt.isEmpty());
@@ -517,110 +608,117 @@
void InvestTransactionEditor::slotReloadEditWidgets()
{
- KMyMoneyCategory* interest = dynamic_cast(haveWidget("interest-account"));
- KMyMoneyCategory* fees = dynamic_cast(haveWidget("fee-account"));
- KMyMoneySecurity* security = dynamic_cast(haveWidget("security"));
+ Q_D(InvestTransactionEditor);
+ auto interest = dynamic_cast(haveWidget("interest-account"));
+ auto fees = dynamic_cast(haveWidget("fee-account"));
+ auto security = dynamic_cast(haveWidget("security"));
AccountSet aSet;
QString id;
// interest-account
aSet.clear();
- aSet.addAccountGroup(eMyMoney::Account::Income);
+ aSet.addAccountGroup(Account::Income);
aSet.load(interest->selector());
- setupCategoryWidget(interest, m_interestSplits, id, SLOT(slotEditInterestSplits()));
+ setupCategoryWidget(interest, d->m_interestSplits, id, SLOT(slotEditInterestSplits()));
// fee-account
aSet.clear();
- aSet.addAccountGroup(eMyMoney::Account::Expense);
+ aSet.addAccountGroup(Account::Expense);
aSet.load(fees->selector());
- setupCategoryWidget(fees, m_feeSplits, id, SLOT(slotEditFeeSplits()));
+ setupCategoryWidget(fees, d->m_feeSplits, id, SLOT(slotEditFeeSplits()));
// security
aSet.clear();
- aSet.load(security->selector(), i18n("Security"), m_account.accountList(), true);
+ aSet.load(security->selector(), i18n("Security"), d->m_account.accountList(), true);
+}
+
+void InvestTransactionEditor::loadEditWidgets(KMyMoneyRegister::Action)
+{
+ loadEditWidgets();
}
-void InvestTransactionEditor::loadEditWidgets(KMyMoneyRegister::Action /* action */)
+void InvestTransactionEditor::loadEditWidgets()
{
+ Q_D(InvestTransactionEditor);
QString id;
- kMyMoneyDateInput* postDate = dynamic_cast(haveWidget("postdate"));
- KMyMoneyReconcileCombo* reconcile = dynamic_cast(haveWidget("status"));
- KMyMoneySecurity* security = dynamic_cast(haveWidget("security"));
- KMyMoneyActivityCombo* activity = dynamic_cast(haveWidget("activity"));
- KMyMoneyCategory* asset = dynamic_cast(haveWidget("asset-account"));
- KTextEdit* memo = dynamic_cast(m_editWidgets["memo"]);
+ auto postDate = dynamic_cast(haveWidget("postdate"));
+ auto reconcile = dynamic_cast(haveWidget("status"));
+ auto security = dynamic_cast(haveWidget("security"));
+ auto activity = dynamic_cast(haveWidget("activity"));
+ auto asset = dynamic_cast(haveWidget("asset-account"));
+ auto memo = dynamic_cast(d->m_editWidgets["memo"]);
kMyMoneyEdit* value;
- KMyMoneyCategory* interest = dynamic_cast(haveWidget("interest-account"));
- KMyMoneyCategory* fees = dynamic_cast(haveWidget("fee-account"));
+ auto interest = dynamic_cast(haveWidget("interest-account"));
+ auto fees = dynamic_cast(haveWidget("fee-account"));
// check if the current transaction has a reference to an equity account
bool haveEquityAccount = false;
QList::const_iterator it_s;
- for (it_s = m_transaction.splits().constBegin(); !haveEquityAccount && it_s != m_transaction.splits().constEnd(); ++it_s) {
+ for (it_s = d->m_transaction.splits().constBegin(); !haveEquityAccount && it_s != d->m_transaction.splits().constEnd(); ++it_s) {
MyMoneyAccount acc = MyMoneyFile::instance()->account((*it_s).accountId());
- if (acc.accountType() == eMyMoney::Account::Equity)
+ if (acc.accountType() == Account::Equity)
haveEquityAccount = true;
}
// asset-account
AccountSet aSet;
aSet.clear();
- aSet.addAccountType(eMyMoney::Account::Checkings);
- aSet.addAccountType(eMyMoney::Account::Savings);
- aSet.addAccountType(eMyMoney::Account::Cash);
- aSet.addAccountType(eMyMoney::Account::Asset);
- aSet.addAccountType(eMyMoney::Account::Currency);
- aSet.addAccountType(eMyMoney::Account::CreditCard);
+ aSet.addAccountType(Account::Checkings);
+ aSet.addAccountType(Account::Savings);
+ aSet.addAccountType(Account::Cash);
+ aSet.addAccountType(Account::Asset);
+ aSet.addAccountType(Account::Currency);
+ aSet.addAccountType(Account::CreditCard);
if (KMyMoneyGlobalSettings::expertMode() || haveEquityAccount)
- aSet.addAccountGroup(eMyMoney::Account::Equity);
+ aSet.addAccountGroup(Account::Equity);
aSet.load(asset->selector());
// security
security->setSuppressObjectCreation(false); // allow object creation on the fly
aSet.clear();
- aSet.load(security->selector(), i18n("Security"), m_account.accountList(), true);
+ aSet.load(security->selector(), i18n("Security"), d->m_account.accountList(), true);
// memo
- memo->setText(m_split.memo());
- d->m_activity->m_memoText = m_split.memo();
- d->m_activity->m_memoChanged = false;
+ memo->setText(d->m_split.memo());
+ d->m_activity->memoText() = d->m_split.memo();
+ d->m_activity->memoChanged() = false;
if (!isMultiSelection()) {
// date
- if (m_transaction.postDate().isValid())
- postDate->setDate(m_transaction.postDate());
- else if (m_lastPostDate.isValid())
- postDate->setDate(m_lastPostDate);
+ if (d->m_transaction.postDate().isValid())
+ postDate->setDate(d->m_transaction.postDate());
+ else if (d->m_lastPostDate.isValid())
+ postDate->setDate(d->m_lastPostDate);
else
postDate->setDate(QDate::currentDate());
// security (but only if it's not the investment account)
- if (m_split.accountId() != m_account.id()) {
- security->completion()->setSelected(m_split.accountId());
- security->slotItemSelected(m_split.accountId());
+ if (d->m_split.accountId() != d->m_account.id()) {
+ security->completion()->setSelected(d->m_split.accountId());
+ security->slotItemSelected(d->m_split.accountId());
}
// activity
activity->setActivity(d->m_activity->type());
slotUpdateActivity(activity->activity());
- asset->completion()->setSelected(m_assetAccountSplit.accountId());
- asset->slotItemSelected(m_assetAccountSplit.accountId());
+ asset->completion()->setSelected(d->m_assetAccountSplit.accountId());
+ asset->slotItemSelected(d->m_assetAccountSplit.accountId());
// interest-account
aSet.clear();
- aSet.addAccountGroup(eMyMoney::Account::Income);
+ aSet.addAccountGroup(Account::Income);
aSet.load(interest->selector());
- setupCategoryWidget(interest, m_interestSplits, id, SLOT(slotEditInterestSplits()));
+ setupCategoryWidget(interest, d->m_interestSplits, id, SLOT(slotEditInterestSplits()));
slotUpdateInterestVisibility(interest->currentText());
// fee-account
aSet.clear();
- aSet.addAccountGroup(eMyMoney::Account::Expense);
+ aSet.addAccountGroup(Account::Expense);
aSet.load(fees->selector());
- setupCategoryWidget(fees, m_feeSplits, id, SLOT(slotEditFeeSplits()));
+ setupCategoryWidget(fees, d->m_feeSplits, id, SLOT(slotEditFeeSplits()));
slotUpdateFeeVisibility(fees->currentText());
// shares
@@ -628,35 +726,35 @@
// we can see the hint
value = dynamic_cast(haveWidget("shares"));
if (typeid(*(d->m_activity)) != typeid(Invest::Split(this)))
- value->setPrecision(MyMoneyMoney::denomToPrec(m_security.smallestAccountFraction()));
+ value->setPrecision(MyMoneyMoney::denomToPrec(d->m_security.smallestAccountFraction()));
else
value->setPrecision(-1);
- if (!m_split.shares().isZero())
- value->setValue(m_split.shares().abs());
+ if (!d->m_split.shares().isZero())
+ value->setValue(d->m_split.shares().abs());
// price
- updatePriceMode(m_split);
+ d->updatePriceMode(d->m_split);
// fee amount
value = dynamic_cast(haveWidget("fee-amount"));
- value->setValue(subtotal(m_feeSplits));
+ value->setValue(d->subtotal(d->m_feeSplits));
// interest amount
value = dynamic_cast(haveWidget("interest-amount"));
- value->setValue(-subtotal(m_interestSplits));
+ value->setValue(-d->subtotal(d->m_interestSplits));
// total
slotUpdateTotalAmount();
// status
- if (m_split.reconcileFlag() == eMyMoney::Split::State::Unknown)
- m_split.setReconcileFlag(eMyMoney::Split::State::NotReconciled);
- reconcile->setState(m_split.reconcileFlag());
+ if (d->m_split.reconcileFlag() == Split::State::Unknown)
+ d->m_split.setReconcileFlag(Split::State::NotReconciled);
+ reconcile->setState(d->m_split.reconcileFlag());
} else {
postDate->loadDate(QDate());
- reconcile->setState(eMyMoney::Split::State::Unknown);
+ reconcile->setState(Split::State::Unknown);
// We don't allow to change the activity
activity->setActivity(d->m_activity->type());
@@ -665,11 +763,11 @@
// scan the list of selected transactions and check that they have
// the same activity.
- KMyMoneyRegister::SelectedTransactions::iterator it_t = m_transactions.begin();
- const QString& action = m_item->split().action();
- bool isNegative = m_item->split().shares().isNegative();
+ KMyMoneyRegister::SelectedTransactions::iterator it_t = d->m_transactions.begin();
+ const QString& action = d->m_item->split().action();
+ bool isNegative = d->m_item->split().shares().isNegative();
bool allSameActivity = true;
- for (it_t = m_transactions.begin(); allSameActivity && (it_t != m_transactions.end()); ++it_t) {
+ for (it_t = d->m_transactions.begin(); allSameActivity && (it_t != d->m_transactions.end()); ++it_t) {
allSameActivity = (action == (*it_t).split().action() && (*it_t).split().shares().isNegative() == isNegative);
}
@@ -695,45 +793,35 @@
QWidget* InvestTransactionEditor::firstWidget() const
{
- return 0; // let the creator use the first widget in the tab order
+ return nullptr; // let the creator use the first widget in the tab order
}
bool InvestTransactionEditor::isComplete(QString& reason) const
{
+ Q_D(const InvestTransactionEditor);
reason.clear();
return d->m_activity->isComplete(reason);
}
-MyMoneyMoney InvestTransactionEditor::subtotal(const QList