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,102 @@ 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 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; }; } // 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,17 +748,32 @@ 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; } @@ -617,7 +791,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,24 +806,38 @@ return true; } -void Split::showWidgets() const +Invest::Split::Split(InvestTransactionEditor* editor) : + Activity(editor) +{ +} + +Invest::Split::~Split() +{ +} + +eMyMoney::Split::InvestmentTransactionType Invest::Split::type() const +{ + return eMyMoney::Split::InvestmentTransactionType::SplitShares; +} + +void Invest::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/")); } -bool Split::isComplete(QString& reason) const +bool Invest::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) +bool Invest::Split::createTransaction(MyMoneyTransaction& t, MyMoneySplit& s0, MyMoneySplit& assetAccountSplit, QList& feeSplits, QList& m_feeSplits, QList& interestSplits, QList& m_interestSplits, MyMoneySecurity& security, MyMoneySecurity& currency) { Q_UNUSED(t); Q_UNUSED(assetAccountSplit); @@ -658,7 +846,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 +865,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 +897,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 +906,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 +932,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(eMyMoney::Split::InvestmentTransactionType type) + { + Q_Q(InvestTransactionEditor); + if (!m_activity || type != m_activity->type()) { + delete m_activity; + switch (type) { + default: + case eMyMoney::Split::InvestmentTransactionType::BuyShares: + m_activity = new Buy(q); + break; + case eMyMoney::Split::InvestmentTransactionType::SellShares: + m_activity = new Sell(q); + break; + case eMyMoney::Split::InvestmentTransactionType::Dividend: + case eMyMoney::Split::InvestmentTransactionType::Yield: + m_activity = new Div(q); + break; + case eMyMoney::Split::InvestmentTransactionType::ReinvestDividend: + m_activity = new Reinvest(q); + break; + case eMyMoney::Split::InvestmentTransactionType::AddShares: + m_activity = new Add(q); + break; + case eMyMoney::Split::InvestmentTransactionType::RemoveShares: + m_activity = new Remove(q); + break; + case eMyMoney::Split::InvestmentTransactionType::SplitShares: + m_activity = new Invest::Split(q); + break; + case eMyMoney::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; + eMyMoney::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 = eMyMoney::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, &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, &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, &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, &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, &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, &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, &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, &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, &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, &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, &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, &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,6 +538,7 @@ void InvestTransactionEditor::slotUpdateFeeVisibility(const QString& txt) { + Q_D(InvestTransactionEditor); static const QSet transactionTypesWithoutFee = QSet() << eMyMoney::Split::InvestmentTransactionType::AddShares << eMyMoney::Split::InvestmentTransactionType::RemoveShares << eMyMoney::Split::InvestmentTransactionType::SplitShares; @@ -481,6 +571,7 @@ void InvestTransactionEditor::slotUpdateInterestVisibility(const QString& txt) { + Q_D(InvestTransactionEditor); 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; @@ -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 /* action */) +void InvestTransactionEditor::loadEditWidgets(KMyMoneyRegister::Action) { + loadEditWidgets(); +} + +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,31 +726,31 @@ // 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() == eMyMoney::Split::State::Unknown) + d->m_split.setReconcileFlag(eMyMoney::Split::State::NotReconciled); + reconcile->setState(d->m_split.reconcileFlag()); } else { postDate->loadDate(QDate()); @@ -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& 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; -} - void InvestTransactionEditor::slotUpdateSecurity(const QString& stockId) { - MyMoneyFile* file = MyMoneyFile::instance(); + Q_D(InvestTransactionEditor); + auto file = MyMoneyFile::instance(); MyMoneyAccount stock = file->account(stockId); - m_security = file->security(stock.currencyId()); - m_currency = file->security(m_security.tradingCurrency()); - bool currencyKnown = !m_currency.id().isEmpty(); + d->m_security = file->security(stock.currencyId()); + d->m_currency = file->security(d->m_security.tradingCurrency()); + bool currencyKnown = !d->m_currency.id().isEmpty(); if (!currencyKnown) { - m_currency.setTradingSymbol("???"); + d->m_currency.setTradingSymbol("???"); } else { if (typeid(*(d->m_activity)) != typeid(Invest::Split(this))) { - dynamic_cast(haveWidget("shares"))->setPrecision(MyMoneyMoney::denomToPrec(m_security.smallestAccountFraction())); + dynamic_cast(haveWidget("shares"))->setPrecision(MyMoneyMoney::denomToPrec(d->m_security.smallestAccountFraction())); } else { dynamic_cast(haveWidget("shares"))->setPrecision(-1); } } - updatePriceMode(); + d->updatePriceMode(); d->m_activity->preloadAssetAccount(); @@ -747,15 +835,21 @@ resizeForm(); } +bool InvestTransactionEditor::fixTransactionCommodity(const MyMoneyAccount& /* account */) +{ + return true; +} + + void InvestTransactionEditor::totalAmount(MyMoneyMoney& amount) const { - KMyMoneyActivityCombo* activityCombo = dynamic_cast(haveWidget("activity")); - kMyMoneyEdit* sharesEdit = dynamic_cast(haveWidget("shares")); - kMyMoneyEdit* priceEdit = dynamic_cast(haveWidget("price")); - kMyMoneyEdit* feesEdit = dynamic_cast(haveWidget("fee-amount")); - kMyMoneyEdit* interestEdit = dynamic_cast(haveWidget("interest-amount")); + auto activityCombo = dynamic_cast(haveWidget("activity")); + auto sharesEdit = dynamic_cast(haveWidget("shares")); + auto priceEdit = dynamic_cast(haveWidget("price")); + auto feesEdit = dynamic_cast(haveWidget("fee-amount")); + auto interestEdit = dynamic_cast(haveWidget("interest-amount")); - if (priceMode() == InvestTransactionEditor::PricePerTransaction) + if (priceMode() == eDialogs::PriceMode::PricePerTransaction) amount = priceEdit->value().abs(); else amount = sharesEdit->value().abs() * priceEdit->value().abs(); @@ -790,18 +884,20 @@ void InvestTransactionEditor::slotUpdateTotalAmount() { + Q_D(InvestTransactionEditor); QLabel* total = dynamic_cast(haveWidget("total")); if (total && total->isVisible()) { MyMoneyMoney amount; totalAmount(amount); - total->setText(amount.convert(m_currency.smallestAccountFraction(), static_cast(m_security.roundingMethod())) - .formatMoney(m_currency.tradingSymbol(), MyMoneyMoney::denomToPrec(m_currency.smallestAccountFraction()))); + total->setText(amount.convert(d->m_currency.smallestAccountFraction(), static_cast(d->m_security.roundingMethod())) + .formatMoney(d->m_currency.tradingSymbol(), MyMoneyMoney::denomToPrec(d->m_currency.smallestAccountFraction()))); } } void InvestTransactionEditor::slotTransactionContainerGeometriesUpdated() { + Q_D(InvestTransactionEditor); // when the geometries of the transaction container are updated some edit widgets that were // previously hidden are being shown (see QAbstractItemView::updateEditorGeometries) so we // need to update the activity with the current activity in order to show only the widgets @@ -811,8 +907,9 @@ void InvestTransactionEditor::slotUpdateActivity(eMyMoney::Split::InvestmentTransactionType activity) { + Q_D(InvestTransactionEditor); // create new activity object if required - activityFactory(activity); + d->activityFactory(activity); // hide all dynamic widgets d->hideCategory("interest-account"); @@ -857,33 +954,53 @@ } } -InvestTransactionEditor::priceModeE InvestTransactionEditor::priceMode() const +eDialogs::PriceMode InvestTransactionEditor::priceMode() const { - priceModeE mode = static_cast(Price); - KMyMoneySecurity* sec = dynamic_cast(m_editWidgets["security"]); + Q_D(const InvestTransactionEditor); + eDialogs::PriceMode mode = static_cast(eDialogs::PriceMode::Price); + KMyMoneySecurity* sec = dynamic_cast(d->m_editWidgets["security"]); QString accId; if (!sec->currentText().isEmpty()) { accId = sec->selectedItem(); if (accId.isEmpty()) - accId = m_account.id(); + accId = d->m_account.id(); } - while (!accId.isEmpty() && mode == Price) { + while (!accId.isEmpty() && mode == eDialogs::PriceMode::Price) { MyMoneyAccount acc = MyMoneyFile::instance()->account(accId); if (acc.value("priceMode").isEmpty()) accId = acc.parentAccountId(); else - mode = static_cast(acc.value("priceMode").toInt()); + mode = static_cast(acc.value("priceMode").toInt()); } // if mode is still then use that - if (mode == Price) - mode = PricePerShare; + if (mode == eDialogs::PriceMode::Price) + mode = eDialogs::PriceMode::PricePerShare; return mode; } +MyMoneySecurity InvestTransactionEditor::security() const +{ + Q_D(const InvestTransactionEditor); + return d->m_security; +} + +QList InvestTransactionEditor::feeSplits() const +{ + Q_D(const InvestTransactionEditor); + return d->m_feeSplits; +} + +QList InvestTransactionEditor::interestSplits() const +{ + Q_D(const InvestTransactionEditor); + return d->m_interestSplits; +} + bool InvestTransactionEditor::setupPrice(const MyMoneyTransaction& t, MyMoneySplit& split) { - MyMoneyFile* file = MyMoneyFile::instance(); + Q_D(InvestTransactionEditor); + auto file = MyMoneyFile::instance(); MyMoneyAccount acc = file->account(split.accountId()); MyMoneySecurity toCurrency(file->security(acc.currencyId())); int fract = acc.fraction(); @@ -894,11 +1011,11 @@ QMap::Iterator it_p; QString key = t.commodity() + '-' + acc.currencyId(); - it_p = m_priceInfo.find(key); + it_p = d->m_priceInfo.find(key); // if it's not found, then collect it from the user first MyMoneyMoney price; - if (it_p == m_priceInfo.end()) { + if (it_p == d->m_priceInfo.end()) { MyMoneySecurity fromCurrency = file->security(t.commodity()); MyMoneyMoney fromValue, toValue; @@ -913,7 +1030,7 @@ toValue, t.postDate(), fract, - m_regForm); + d->m_regForm); if (calc->exec() == QDialog::Rejected) { delete calc; @@ -921,7 +1038,7 @@ } price = calc->price(); delete calc; - m_priceInfo[key] = price; + d->m_priceInfo[key] = price; } else { price = (*it_p); } @@ -938,13 +1055,14 @@ bool InvestTransactionEditor::createTransaction(MyMoneyTransaction& t, const MyMoneyTransaction& torig, const MyMoneySplit& sorig, bool /* skipPriceDialog */) { - MyMoneyFile* file = MyMoneyFile::instance(); + Q_D(InvestTransactionEditor); + auto file = MyMoneyFile::instance(); // we start with the previous values, make sure we can add them later on t = torig; MyMoneySplit s0 = sorig; s0.clearId(); - KMyMoneySecurity* sec = dynamic_cast(m_editWidgets["security"]); + KMyMoneySecurity* sec = dynamic_cast(d->m_editWidgets["security"]); if (!isMultiSelection() || (isMultiSelection() && !sec->currentText().isEmpty())) { QString securityId = sec->selectedItem(); if (!securityId.isEmpty()) { @@ -955,23 +1073,23 @@ t.setCommodity(security.tradingCurrency()); } else { - s0.setAccountId(m_account.id()); - t.setCommodity(m_account.currencyId()); + s0.setAccountId(d->m_account.id()); + t.setCommodity(d->m_account.currencyId()); } } // extract price info from original transaction - m_priceInfo.clear(); + d->m_priceInfo.clear(); QList::const_iterator it_s; if (!torig.id().isEmpty()) { for (it_s = torig.splits().begin(); it_s != torig.splits().end(); ++it_s) { if ((*it_s).id() != sorig.id()) { MyMoneyAccount cat = file->account((*it_s).accountId()); - if (cat.currencyId() != m_account.currencyId()) { + if (cat.currencyId() != d->m_account.currencyId()) { if (cat.currencyId().isEmpty()) - cat.setCurrencyId(m_account.currencyId()); + cat.setCurrencyId(d->m_account.currencyId()); if (!(*it_s).shares().isZero() && !(*it_s).value().isZero()) { - m_priceInfo[cat.currencyId()] = ((*it_s).shares() / (*it_s).value()).reduce(); + d->m_priceInfo[cat.currencyId()] = ((*it_s).shares() / (*it_s).value()).reduce(); } } } @@ -980,7 +1098,7 @@ t.removeSplits(); - kMyMoneyDateInput* postDate = dynamic_cast(m_editWidgets["postdate"]); + kMyMoneyDateInput* postDate = dynamic_cast(d->m_editWidgets["postdate"]); if (postDate->date().isValid()) { t.setPostDate(postDate->date()); } @@ -990,9 +1108,9 @@ // FIXME a better approach would be to have a 'dirty' flag with the widgets // which identifies if the originally loaded value has been modified // by the user - KTextEdit* memo = dynamic_cast(m_editWidgets["memo"]); + KTextEdit* memo = dynamic_cast(d->m_editWidgets["memo"]); if (memo) { - if (!isMultiSelection() || (isMultiSelection() && d->m_activity->m_memoChanged)) + if (!isMultiSelection() || (isMultiSelection() && d->m_activity->memoChanged())) s0.setMemo(memo->toPlainText()); } @@ -1021,19 +1139,19 @@ // keep the current activity object and create a new one // that can be destroyed later on - Activity* activity = d->m_activity; + auto activity = d->m_activity; d->m_activity = 0; // make sure we create a new one - activityFactory(activity->type()); + d->activityFactory(activity->type()); // if the activity is not set in the combo widget, we keep // the one which is used in the original transaction - KMyMoneyActivityCombo* activityCombo = dynamic_cast(haveWidget("activity")); + auto activityCombo = dynamic_cast(haveWidget("activity")); if (activityCombo->activity() == eMyMoney::Split::InvestmentTransactionType::UnknownTransactionType) { - activityFactory(transactionType); + d->activityFactory(transactionType); } // if we mark the split reconciled here, we'll use today's date if no reconciliation date is given - KMyMoneyReconcileCombo* status = dynamic_cast(m_editWidgets["status"]); + auto status = dynamic_cast(d->m_editWidgets["status"]); if (status->state() != eMyMoney::Split::State::Unknown) s0.setReconcileFlag(status->state()); @@ -1041,7 +1159,7 @@ s0.setReconcileDate(QDate::currentDate()); // call the creation logic for the current selected activity - bool rc = d->m_activity->createTransaction(t, s0, assetAccountSplit, feeSplits, m_feeSplits, interestSplits, m_interestSplits, security, currency); + bool rc = d->m_activity->createTransaction(t, s0, assetAccountSplit, feeSplits, d->m_feeSplits, interestSplits, d->m_interestSplits, security, currency); // now switch back to the original activity delete d->m_activity; @@ -1086,33 +1204,6 @@ return rc; } -void InvestTransactionEditor::updatePriceMode(const MyMoneySplit& split) -{ - QLabel* label = dynamic_cast(haveWidget("price-label")); - if (label) { - kMyMoneyEdit* sharesEdit = dynamic_cast(haveWidget("shares")); - kMyMoneyEdit* priceEdit = dynamic_cast(haveWidget("price")); - MyMoneyMoney price; - if (!split.id().isEmpty()) - price = split.price().reduce(); - else - price = priceEdit->value().abs(); - - if (priceMode() == PricePerTransaction) { - priceEdit->setPrecision(m_currency.pricePrecision()); - label->setText(i18n("Transaction amount")); - if (!sharesEdit->value().isZero()) - priceEdit->setValue(sharesEdit->value().abs() * price); - - } else if (priceMode() == PricePerShare) { - priceEdit->setPrecision(m_security.pricePrecision()); - label->setText(i18n("Price/Share")); - priceEdit->setValue(price); - } else - priceEdit->setValue(price); - } -} - void InvestTransactionEditor::setupFinalWidgets() { addFinalWidget(haveWidget("memo")); @@ -1120,8 +1211,9 @@ void InvestTransactionEditor::slotUpdateInvestMemoState() { - KTextEdit* memo = dynamic_cast(m_editWidgets["memo"]); + Q_D(InvestTransactionEditor); + auto memo = dynamic_cast(d->m_editWidgets["memo"]); if (memo) { - d->m_activity->m_memoChanged = (memo->toPlainText() != d->m_activity->m_memoText); + d->m_activity->memoChanged() = (memo->toPlainText() != d->m_activity->memoText()); } } diff --git a/kmymoney/dialogs/kaccountselectdlg.h b/kmymoney/dialogs/kaccountselectdlg.h --- a/kmymoney/dialogs/kaccountselectdlg.h +++ b/kmymoney/dialogs/kaccountselectdlg.h @@ -9,6 +9,7 @@ John C Thomas Baumgart Kevin Tambascio + (C) 2017 by Łukasz Wojniłowicz ***************************************************************************/ /*************************************************************************** @@ -26,7 +27,7 @@ // ---------------------------------------------------------------------------- // QT Includes -#include +#include // ---------------------------------------------------------------------------- // KDE Includes @@ -34,28 +35,22 @@ // ---------------------------------------------------------------------------- // Project Includes -#include "mymoneyaccount.h" -#include "kmymoneyutils.h" -#include "ui_kaccountselectdlgdecl.h" - /** * @author Thomas Baumgart */ +class MyMoneyAccount; -class KAccountSelectDlgDecl : public QDialog, public Ui::KAccountSelectDlgDecl -{ -public: - KAccountSelectDlgDecl(QWidget *parent) : QDialog(parent) { - setupUi(this); - } -}; +namespace eDialogs { enum Category : int; } -class KAccountSelectDlg : public KAccountSelectDlgDecl +class KAccountSelectDlgPrivate; +class KAccountSelectDlg : public QDialog { Q_OBJECT + Q_DISABLE_COPY(KAccountSelectDlg) + public: - explicit KAccountSelectDlg(const KMyMoneyUtils::categoryTypeE type, const QString& purpose = "General", QWidget *parent = 0); + explicit KAccountSelectDlg(const eDialogs::Category type, const QString& purpose, QWidget *parent = nullptr); ~KAccountSelectDlg(); /** @@ -92,7 +87,7 @@ * * @return QString containing the id of the selected account */ - const QString& selectedAccount() const; + QString selectedAccount() const; /** * This method is used to set the mode of the dialog. Two modes @@ -120,15 +115,15 @@ * @retval false Dialog was left using the 'Skip' button * @retval true Dialog was left using the 'Abort' button */ - bool aborted() const { - return m_aborted; - }; + bool aborted() const; + + void hideQifEntry(); public slots: /** * Reimplemented from QDialog */ - int exec(); + int exec() override; protected slots: /** @@ -154,11 +149,8 @@ void slotReloadWidget(); private: - QString m_purpose; - MyMoneyAccount m_account; - int m_mode; // 0 - select or create, 1 - create only - KMyMoneyUtils::categoryTypeE m_accountType; - bool m_aborted; + KAccountSelectDlgPrivate * const d_ptr; + Q_DECLARE_PRIVATE(KAccountSelectDlg) }; #endif diff --git a/kmymoney/dialogs/kaccountselectdlg.cpp b/kmymoney/dialogs/kaccountselectdlg.cpp --- a/kmymoney/dialogs/kaccountselectdlg.cpp +++ b/kmymoney/dialogs/kaccountselectdlg.cpp @@ -9,6 +9,7 @@ John C Thomas Baumgart Kevin Tambascio + (C) 2017 by Łukasz Wojniłowicz ***************************************************************************/ /*************************************************************************** @@ -39,24 +40,54 @@ // ---------------------------------------------------------------------------- // Project Includes +#include "ui_kaccountselectdlg.h" + +#include "mymoneyaccount.h" #include "mymoneyfile.h" #include "kmymoneycategory.h" #include "kmymoneyaccountselector.h" #include <../kmymoney.h> +#include "dialogenums.h" #include "icons/icons.h" using namespace Icons; -KAccountSelectDlg::KAccountSelectDlg(const KMyMoneyUtils::categoryTypeE accountType, const QString& purpose, QWidget *parent) - : KAccountSelectDlgDecl(parent), - m_purpose(purpose), - m_accountType(accountType), +class KAccountSelectDlgPrivate +{ + Q_DISABLE_COPY(KAccountSelectDlgPrivate) + +public: + KAccountSelectDlgPrivate() : + ui(new Ui::KAccountSelectDlg), m_aborted(false) + { + } + + ~KAccountSelectDlgPrivate() + { + delete ui; + } + + Ui::KAccountSelectDlg *ui; + QString m_purpose; + MyMoneyAccount m_account; + int m_mode; // 0 - select or create, 1 - create only + eDialogs::Category m_accountType; + bool m_aborted; +}; + +KAccountSelectDlg::KAccountSelectDlg(const eDialogs::Category accountType, const QString& purpose, QWidget *parent) : + QDialog(parent), + d_ptr(new KAccountSelectDlgPrivate) { + Q_D(KAccountSelectDlg); + d->ui->setupUi(this); + d->m_purpose = purpose; + d->m_accountType = accountType; // Hide the abort button. It needs to be shown on request by the caller // using showAbortButton() - m_kButtonAbort->hide(); + d->ui->m_kButtonAbort->hide(); slotReloadWidget(); @@ -64,73 +95,78 @@ QIcon::fromTheme(g_Icons[Icon::MediaSkipForward]), i18n("Skip this transaction"), i18n("Use this to skip importing this transaction and proceed with the next one.")); - KGuiItem::assign(m_qbuttonCancel, skipButtonItem); + KGuiItem::assign(d->ui->m_qbuttonCancel, skipButtonItem); KGuiItem createButtenItem(i18n("&Create..."), QIcon::fromTheme(g_Icons[Icon::DocumentNew]), i18n("Create a new account/category"), i18n("Use this to add a new account/category to the file")); - KGuiItem::assign(m_createButton, createButtenItem); - KGuiItem::assign(m_qbuttonOk, KStandardGuiItem::ok()); + KGuiItem::assign(d->ui->m_createButton, createButtenItem); + KGuiItem::assign(d->ui->m_qbuttonOk, KStandardGuiItem::ok()); KGuiItem abortButtenItem(i18n("&Abort"), QIcon::fromTheme(g_Icons[Icon::DialogCancel]), i18n("Abort the import operation and dismiss all changes"), i18n("Use this to abort the import. Your financial data will be in the state before you started the QIF import.")); - KGuiItem::assign(m_kButtonAbort, abortButtenItem); + KGuiItem::assign(d->ui->m_kButtonAbort, abortButtenItem); + connect(MyMoneyFile::instance(), &MyMoneyFile::dataChanged, this, &KAccountSelectDlg::slotReloadWidget); - connect(MyMoneyFile::instance(), SIGNAL(dataChanged()), this, SLOT(slotReloadWidget())); - - connect(m_createButton, SIGNAL(clicked()), this, SLOT(slotCreateAccount())); - connect(m_qbuttonOk, SIGNAL(clicked()), this, SLOT(accept())); - connect(m_qbuttonCancel, SIGNAL(clicked()), this, SLOT(reject())); - connect(m_kButtonAbort, SIGNAL(clicked()), this, SLOT(abort())); + connect(d->ui->m_createButton, &QAbstractButton::clicked, this, &KAccountSelectDlg::slotCreateAccount); + connect(d->ui->m_qbuttonOk, &QAbstractButton::clicked, this, &QDialog::accept); + connect(d->ui->m_qbuttonCancel, &QAbstractButton::clicked, this, &QDialog::reject); + connect(d->ui->m_kButtonAbort, &QAbstractButton::clicked, this, &KAccountSelectDlg::abort); } KAccountSelectDlg::~KAccountSelectDlg() { + Q_D(KAccountSelectDlg); + delete d; } void KAccountSelectDlg::slotReloadWidget() { + Q_D(KAccountSelectDlg); AccountSet set; - if (m_accountType & KMyMoneyUtils::asset) + if (d->m_accountType & eDialogs::Category::asset) set.addAccountGroup(eMyMoney::Account::Asset); - if (m_accountType & KMyMoneyUtils::liability) + if (d->m_accountType & eDialogs::Category::liability) set.addAccountGroup(eMyMoney::Account::Liability); - if (m_accountType & KMyMoneyUtils::income) + if (d->m_accountType & eDialogs::Category::income) set.addAccountGroup(eMyMoney::Account::Income); - if (m_accountType & KMyMoneyUtils::expense) + if (d->m_accountType & eDialogs::Category::expense) set.addAccountGroup(eMyMoney::Account::Expense); - if (m_accountType & KMyMoneyUtils::equity) + if (d->m_accountType & eDialogs::Category::equity) set.addAccountGroup(eMyMoney::Account::Equity); - if (m_accountType & KMyMoneyUtils::checking) + if (d->m_accountType & eDialogs::Category::checking) set.addAccountType(eMyMoney::Account::Checkings); - if (m_accountType & KMyMoneyUtils::savings) + if (d->m_accountType & eDialogs::Category::savings) set.addAccountType(eMyMoney::Account::Savings); - if (m_accountType & KMyMoneyUtils::investment) + if (d->m_accountType & eDialogs::Category::investment) set.addAccountType(eMyMoney::Account::Investment); - if (m_accountType & KMyMoneyUtils::creditCard) + if (d->m_accountType & eDialogs::Category::creditCard) set.addAccountType(eMyMoney::Account::CreditCard); - set.load(m_accountSelector->selector()); + set.load(d->ui->m_accountSelector->selector()); } void KAccountSelectDlg::setDescription(const QString& msg) { - m_descLabel->setText(msg); + Q_D(KAccountSelectDlg); + d->ui->m_descLabel->setText(msg); } void KAccountSelectDlg::setHeader(const QString& msg) { - m_headerLabel->setText(msg); + Q_D(KAccountSelectDlg); + d->ui->m_headerLabel->setText(msg); } void KAccountSelectDlg::setAccount(const MyMoneyAccount& account, const QString& id) { - m_account = account; - m_accountSelector->setSelectedItem(id); + Q_D(KAccountSelectDlg); + d->m_account = account; + d->ui->m_accountSelector->setSelectedItem(id); } void KAccountSelectDlg::slotCreateInstitution() @@ -140,21 +176,22 @@ void KAccountSelectDlg::slotCreateAccount() { - if (!(m_accountType & (KMyMoneyUtils::expense | KMyMoneyUtils::income))) { - kmymoney->slotAccountNew(m_account); - if (!m_account.id().isEmpty()) { + Q_D(KAccountSelectDlg); + if (!((int)d->m_accountType & ((int)eDialogs::Category::expense | (int)eDialogs::Category::income))) { + kmymoney->slotAccountNew(d->m_account); + if (!d->m_account.id().isEmpty()) { slotReloadWidget(); - m_accountSelector->setSelectedItem(m_account.id()); + d->ui->m_accountSelector->setSelectedItem(d->m_account.id()); accept(); } } else { - if (m_account.accountType() == eMyMoney::Account::Expense) - kmymoney->createCategory(m_account, MyMoneyFile::instance()->expense()); + if (d->m_account.accountType() == eMyMoney::Account::Expense) + kmymoney->createCategory(d->m_account, MyMoneyFile::instance()->expense()); else - kmymoney->createCategory(m_account, MyMoneyFile::instance()->income()); - if (!m_account.id().isEmpty()) { + kmymoney->createCategory(d->m_account, MyMoneyFile::instance()->income()); + if (!d->m_account.id().isEmpty()) { slotReloadWidget(); - m_accountSelector->setSelectedItem(m_account.id()); + d->ui->m_accountSelector->setSelectedItem(d->m_account.id()); accept(); } } @@ -162,36 +199,53 @@ void KAccountSelectDlg::abort() { - m_aborted = true; + Q_D(KAccountSelectDlg); + d->m_aborted = true; reject(); } void KAccountSelectDlg::setMode(const int mode) { - m_mode = mode ? 1 : 0; + Q_D(KAccountSelectDlg); + d->m_mode = mode ? 1 : 0; } void KAccountSelectDlg::showAbortButton(const bool visible) { - m_kButtonAbort->setVisible(visible); + Q_D(KAccountSelectDlg); + d->ui->m_kButtonAbort->setVisible(visible); +} + +bool KAccountSelectDlg::aborted() const +{ + Q_D(const KAccountSelectDlg); + return d->m_aborted; +} + +void KAccountSelectDlg::hideQifEntry() +{ + Q_D(KAccountSelectDlg); + d->ui->m_qifEntry->hide(); } int KAccountSelectDlg::exec() { + Q_D(KAccountSelectDlg); int rc = Rejected; - if (m_mode == 1) { + if (d->m_mode == 1) { slotCreateAccount(); rc = result(); } if (rc != Accepted) { - m_createButton->setFocus(); - rc = KAccountSelectDlgDecl::exec(); + d->ui->m_createButton->setFocus(); + rc = QDialog::exec(); } return rc; } -const QString& KAccountSelectDlg::selectedAccount() const +QString KAccountSelectDlg::selectedAccount() const { - return m_accountSelector->selectedItem(); + Q_D(const KAccountSelectDlg); + return d->ui->m_accountSelector->selectedItem(); } diff --git a/kmymoney/dialogs/kaccountselectdlgdecl.ui b/kmymoney/dialogs/kaccountselectdlg.ui rename from kmymoney/dialogs/kaccountselectdlgdecl.ui rename to kmymoney/dialogs/kaccountselectdlg.ui --- a/kmymoney/dialogs/kaccountselectdlgdecl.ui +++ b/kmymoney/dialogs/kaccountselectdlg.ui @@ -1,7 +1,7 @@ - KAccountSelectDlgDecl - + KAccountSelectDlg + Qt::WindowModal diff --git a/kmymoney/dialogs/kavailablecurrencydlg.h b/kmymoney/dialogs/kavailablecurrencydlg.h --- a/kmymoney/dialogs/kavailablecurrencydlg.h +++ b/kmymoney/dialogs/kavailablecurrencydlg.h @@ -14,8 +14,8 @@ * * ***************************************************************************/ -#ifndef KAVAILABLECURRENCYEDITDLG_H -#define KAVAILABLECURRENCYEDITDLG_H +#ifndef KAVAILABLECURRENCYDLG_H +#define KAVAILABLECURRENCYDLG_H // ---------------------------------------------------------------------------- // QT Includes @@ -38,7 +38,7 @@ { Q_OBJECT public: - KAvailableCurrencyDlg(QWidget *parent = 0); + KAvailableCurrencyDlg(QWidget *parent = nullptr); ~KAvailableCurrencyDlg(); Ui::KAvailableCurrencyDlg* ui; diff --git a/kmymoney/dialogs/kavailablecurrencydlg.cpp b/kmymoney/dialogs/kavailablecurrencydlg.cpp --- a/kmymoney/dialogs/kavailablecurrencydlg.cpp +++ b/kmymoney/dialogs/kavailablecurrencydlg.cpp @@ -45,12 +45,12 @@ m_searchWidget = new KTreeWidgetSearchLineWidget(this, ui->m_currencyList); m_searchWidget->setSizePolicy(QSizePolicy(QSizePolicy::Preferred, QSizePolicy::Fixed)); ui->verticalLayout->insertWidget(0, m_searchWidget); - connect(ui->m_currencyList, SIGNAL(itemSelectionChanged()), this, SLOT(slotItemSelectionChanged())); + connect(ui->m_currencyList, &QTreeWidget::itemSelectionChanged, this, &KAvailableCurrencyDlg::slotItemSelectionChanged); slotLoadCurrencies(); //resize the column widths - for (int i = 0; i < 3; ++i) + for (auto i = 0; i < 3; ++i) ui->m_currencyList->resizeColumnToContents(i); m_searchWidget->setFocus(); diff --git a/kmymoney/dialogs/kbackupdlg.h b/kmymoney/dialogs/kbackupdlg.h --- a/kmymoney/dialogs/kbackupdlg.h +++ b/kmymoney/dialogs/kbackupdlg.h @@ -6,6 +6,7 @@ email : mte@users.sourceforge.net Javier Campos Morales Felix Rodriguez + (C) 2017 by Łukasz Wojniłowicz ***************************************************************************/ /*************************************************************************** @@ -21,34 +22,32 @@ #define KBACKUPDLG_H #include -#include "ui_kbackupdlgdecl.h" + +namespace Ui { class KBackupDlg; } /** *@author Michael Edwardes */ - -class kbackupdlgdecl : public QDialog, public Ui::kbackupdlgdecl +class KBackupDlg : public QDialog { + Q_OBJECT + Q_DISABLE_COPY(KBackupDlg) + public: - kbackupdlgdecl(QWidget *parent) : QDialog(parent) { - setupUi(this); - } -}; + explicit KBackupDlg(QWidget* parent = nullptr); + ~KBackupDlg(); -class KBackupDlg : public kbackupdlgdecl -{ - Q_OBJECT -private: - void readConfig(); - void writeConfig(); + QString mountPoint() const; + bool mountCheckBox() const; protected slots: void chooseButtonClicked(); -public: - KBackupDlg(QWidget* parent); - ~KBackupDlg(); +private: + Ui::KBackupDlg *ui; + void readConfig(); + void writeConfig(); }; #endif // KBACKUPDLG_H diff --git a/kmymoney/dialogs/kbackupdlg.cpp b/kmymoney/dialogs/kbackupdlg.cpp --- a/kmymoney/dialogs/kbackupdlg.cpp +++ b/kmymoney/dialogs/kbackupdlg.cpp @@ -6,6 +6,7 @@ email : mte@users.sourceforge.net Javier Campos Morales Felix Rodriguez + (C) 2017 by Łukasz Wojniłowicz ***************************************************************************/ /*************************************************************************** @@ -33,42 +34,51 @@ #include #include -#include #include #include // ---------------------------------------------------------------------------- // Project Includes + +#include "ui_kbackupdlg.h" + #include "icons/icons.h" using namespace Icons; -KBackupDlg::KBackupDlg(QWidget* parent) - : kbackupdlgdecl(parent) +KBackupDlg::KBackupDlg(QWidget* parent) : + QDialog(parent), + ui(new Ui::KBackupDlg) { + ui->setupUi(this); readConfig(); - KGuiItem chooseButtenItem(i18n("C&hoose..."), - QIcon::fromTheme(g_Icons[Icon::Folder]), - i18n("Select mount point"), - i18n("Use this to browse to the mount point.")); - KGuiItem::assign(chooseButton, chooseButtenItem); + ui->chooseButton->setIcon(QIcon::fromTheme(g_Icons[Icon::Folder])); - connect(chooseButton, SIGNAL(clicked()), this, SLOT(chooseButtonClicked())); - connect(buttonBox, SIGNAL(accepted()), this, SLOT(accept())); - connect(buttonBox, SIGNAL(rejected()), this, SLOT(reject())); + connect(ui->chooseButton, &QAbstractButton::clicked, this, &KBackupDlg::chooseButtonClicked); } KBackupDlg::~KBackupDlg() { writeConfig(); + delete ui; +} + +QString KBackupDlg::mountPoint() const +{ + return ui->txtMountPoint->text(); +} + +bool KBackupDlg::mountCheckBox() const +{ + return ui->mountCheckBox; } void KBackupDlg::chooseButtonClicked() { - QUrl newDir = QFileDialog::getExistingDirectoryUrl(this, QString(), QUrl::fromLocalFile(QStandardPaths::writableLocation(QStandardPaths::DocumentsLocation))); + auto newDir = QFileDialog::getExistingDirectoryUrl(this, QString(), QUrl::fromLocalFile(QStandardPaths::writableLocation(QStandardPaths::DocumentsLocation))); if (!newDir.path().isEmpty()) - txtMountPoint->setText(newDir.path()); + ui->txtMountPoint->setText(newDir.path()); } void KBackupDlg::readConfig() @@ -81,15 +91,15 @@ #endif KSharedConfigPtr config = KSharedConfig::openConfig(); KConfigGroup grp = config->group("Last Use Settings"); - mountCheckBox->setChecked(grp.readEntry("KBackupDlg_mountDevice", false)); - txtMountPoint->setText(grp.readEntry("KBackupDlg_BackupMountPoint", backupDefaultLocation)); + ui->mountCheckBox->setChecked(grp.readEntry("KBackupDlg_mountDevice", false)); + ui->txtMountPoint->setText(grp.readEntry("KBackupDlg_BackupMountPoint", backupDefaultLocation)); } void KBackupDlg::writeConfig() { KSharedConfigPtr config = KSharedConfig::openConfig(); KConfigGroup grp = config->group("Last Use Settings"); - grp.writeEntry("KBackupDlg_mountDevice", mountCheckBox->isChecked()); - grp.writeEntry("KBackupDlg_BackupMountPoint", txtMountPoint->text()); + grp.writeEntry("KBackupDlg_mountDevice", ui->mountCheckBox->isChecked()); + grp.writeEntry("KBackupDlg_BackupMountPoint", ui->txtMountPoint->text()); config->sync(); } diff --git a/kmymoney/dialogs/kbackupdlgdecl.ui b/kmymoney/dialogs/kbackupdlg.ui rename from kmymoney/dialogs/kbackupdlgdecl.ui rename to kmymoney/dialogs/kbackupdlg.ui --- a/kmymoney/dialogs/kbackupdlgdecl.ui +++ b/kmymoney/dialogs/kbackupdlg.ui @@ -1,7 +1,7 @@ - kbackupdlgdecl - + KBackupDlg + 0 @@ -128,6 +128,12 @@ + + Select mount point + + + Use this to browse to the mount point. + C&hoose... @@ -179,5 +185,38 @@ - + + + buttonBox + accepted() + KBackupDlg + accept() + + + 320 + 272 + + + 320 + 150 + + + + + buttonBox + rejected() + KBackupDlg + reject() + + + 320 + 272 + + + 320 + 150 + + + + diff --git a/kmymoney/dialogs/kbalancechartdlg.h b/kmymoney/dialogs/kbalancechartdlg.h --- a/kmymoney/dialogs/kbalancechartdlg.h +++ b/kmymoney/dialogs/kbalancechartdlg.h @@ -4,6 +4,7 @@ begin : Mon Nov 26 2007 copyright : (C) 2007 by Thomas Baumgart email : Thomas Baumgart + (C) 2017 by Łukasz Wojniłowicz ***************************************************************************/ /*************************************************************************** @@ -42,7 +43,7 @@ { Q_OBJECT public: - explicit KBalanceChartDlg(const MyMoneyAccount& account, QWidget* parent = 0); + explicit KBalanceChartDlg(const MyMoneyAccount& account, QWidget* parent = nullptr); ~KBalanceChartDlg(); protected: diff --git a/kmymoney/dialogs/kbalancechartdlg.cpp b/kmymoney/dialogs/kbalancechartdlg.cpp --- a/kmymoney/dialogs/kbalancechartdlg.cpp +++ b/kmymoney/dialogs/kbalancechartdlg.cpp @@ -4,6 +4,7 @@ begin : Mon Nov 26 2007 copyright : (C) 2007 by Thomas Baumgart email : Thomas Baumgart + (C) 2017 by Łukasz Wojniłowicz ***************************************************************************/ /*************************************************************************** @@ -65,8 +66,8 @@ // add the buttons QDialogButtonBox *buttonBox = new QDialogButtonBox(QDialogButtonBox::Close); - connect(buttonBox, SIGNAL(accepted()), this, SLOT(accept())); - connect(buttonBox, SIGNAL(rejected()), this, SLOT(reject())); + connect(buttonBox, &QDialogButtonBox::accepted, this, &QDialog::accept); + connect(buttonBox, &QDialogButtonBox::rejected, this, &QDialog::reject); mainLayout->addWidget(buttonBox); } diff --git a/kmymoney/dialogs/kbalancewarning.h b/kmymoney/dialogs/kbalancewarning.h --- a/kmymoney/dialogs/kbalancewarning.h +++ b/kmymoney/dialogs/kbalancewarning.h @@ -4,6 +4,7 @@ begin : Mon Feb 9 2009 copyright : (C) 2009 by Thomas Baumgart email : Thomas Baumgart + (C) 2017 by Łukasz Wojniłowicz ***************************************************************************/ /*************************************************************************** diff --git a/kmymoney/dialogs/kbalancewarning.cpp b/kmymoney/dialogs/kbalancewarning.cpp --- a/kmymoney/dialogs/kbalancewarning.cpp +++ b/kmymoney/dialogs/kbalancewarning.cpp @@ -4,6 +4,7 @@ begin : Mon Feb 9 2009 copyright : (C) 2009 by Thomas Baumgart email : Thomas Baumgart + (C) 2017 by Łukasz Wojniłowicz ***************************************************************************/ /*************************************************************************** diff --git a/kmymoney/dialogs/kcategoryreassigndlg.h b/kmymoney/dialogs/kcategoryreassigndlg.h --- a/kmymoney/dialogs/kcategoryreassigndlg.h +++ b/kmymoney/dialogs/kcategoryreassigndlg.h @@ -2,6 +2,7 @@ kcategoryreassigndlg.cpp ------------------- copyright : (C) 2007 by Thomas Baumgart + (C) 2017 by Łukasz Wojniłowicz ***************************************************************************/ @@ -20,36 +21,29 @@ // ---------------------------------------------------------------------------- // QT Includes +#include + // ---------------------------------------------------------------------------- // KDE Includes // ---------------------------------------------------------------------------- // Project Includes -#include "ui_kcategoryreassigndlgdecl.h" +class MyMoneyAccount; +namespace Ui { class KCategoryReassignDlg; } /** * Implementation of the dialog that lets the user select a payee in order * to re-assign transactions (for instance, if payees are deleted). */ -class KCategoryReassignDlgDecl : public QDialog, public Ui::KCategoryReassignDlgDecl -{ -public: - KCategoryReassignDlgDecl(QWidget *parent) : QDialog(parent) { - setupUi(this); - } -}; - -class MyMoneyAccount; -class KCategoryReassignDlg : public KCategoryReassignDlgDecl +class KCategoryReassignDlg : public QDialog { Q_OBJECT -public: - /** Default constructor */ - KCategoryReassignDlg(QWidget* parent = 0); + Q_DISABLE_COPY(KCategoryReassignDlg) - /** Destructor */ +public: + explicit KCategoryReassignDlg(QWidget* parent = nullptr); ~KCategoryReassignDlg(); /** @@ -67,6 +61,8 @@ protected: void accept(); +private: + Ui::KCategoryReassignDlg *ui; }; #endif // KCATEGORYREASSIGNDLG_H diff --git a/kmymoney/dialogs/kcategoryreassigndlg.cpp b/kmymoney/dialogs/kcategoryreassigndlg.cpp --- a/kmymoney/dialogs/kcategoryreassigndlg.cpp +++ b/kmymoney/dialogs/kcategoryreassigndlg.cpp @@ -2,6 +2,7 @@ kcategoryreassigndlg.cpp ------------------- copyright : (C) 2007 by Thomas Baumgart + (C) 2017 by Łukasz Wojniłowicz ***************************************************************************/ @@ -31,21 +32,26 @@ // ---------------------------------------------------------------------------- // Project Includes +#include "ui_kcategoryreassigndlg.h" + #include "mymoneyfile.h" #include "mymoneyaccount.h" #include "kmymoneycategory.h" #include "kmymoneyaccountselector.h" KCategoryReassignDlg::KCategoryReassignDlg(QWidget* parent) : - KCategoryReassignDlgDecl(parent) + QDialog(parent), + ui(new Ui::KCategoryReassignDlg) { - kMandatoryFieldGroup* mandatory = new kMandatoryFieldGroup(this); - mandatory->add(m_category); - mandatory->setOkButton(buttonBox->button(QDialogButtonBox::Ok)); + ui->setupUi(this); + auto mandatory = new kMandatoryFieldGroup(this); + mandatory->add(ui->m_category); + mandatory->setOkButton(ui->buttonBox->button(QDialogButtonBox::Ok)); } KCategoryReassignDlg::~KCategoryReassignDlg() { + delete ui; } QString KCategoryReassignDlg::show(const MyMoneyAccount& category) @@ -56,23 +62,23 @@ AccountSet set; set.addAccountGroup(eMyMoney::Account::Income); set.addAccountGroup(eMyMoney::Account::Expense); - set.load(m_category->selector()); + set.load(ui->m_category->selector()); // remove the category we are about to delete - m_category->selector()->removeItem(category.id()); + ui->m_category->selector()->removeItem(category.id()); // make sure the available categories have the same currency QStringList list; QStringList::const_iterator it_a; - m_category->selector()->itemList(list); + ui->m_category->selector()->itemList(list); for (it_a = list.constBegin(); it_a != list.constEnd(); ++it_a) { MyMoneyAccount acc = MyMoneyFile::instance()->account(*it_a); if (acc.currencyId() != category.currencyId()) - m_category->selector()->removeItem(*it_a); + ui->m_category->selector()->removeItem(*it_a); } // reload the list - m_category->selector()->itemList(list); + ui->m_category->selector()->itemList(list); // if there is no category for reassignment left, we bail out if (list.isEmpty()) { @@ -85,18 +91,17 @@ return QString(); // otherwise return index of selected payee - return m_category->selectedItem(); + return ui->m_category->selectedItem(); } void KCategoryReassignDlg::accept() { // force update of payeeCombo - buttonBox->button(QDialogButtonBox::Ok)->setFocus(); + ui->buttonBox->button(QDialogButtonBox::Ok)->setFocus(); - if (m_category->selectedItem().isEmpty()) { + if (ui->m_category->selectedItem().isEmpty()) KMessageBox::information(this, i18n("This dialog does not allow new categories to be created. Please pick a category from the list."), i18n("Category creation")); - } else { - KCategoryReassignDlgDecl::accept(); - } + else + QDialog::accept(); } diff --git a/kmymoney/dialogs/kcategoryreassigndlgdecl.ui b/kmymoney/dialogs/kcategoryreassigndlg.ui rename from kmymoney/dialogs/kcategoryreassigndlgdecl.ui rename to kmymoney/dialogs/kcategoryreassigndlg.ui --- a/kmymoney/dialogs/kcategoryreassigndlgdecl.ui +++ b/kmymoney/dialogs/kcategoryreassigndlg.ui @@ -1,7 +1,7 @@ - KCategoryReassignDlgDecl - + KCategoryReassignDlg + 0 @@ -121,7 +121,7 @@ buttonBox accepted() - KCategoryReassignDlgDecl + KCategoryReassignDlg accept() @@ -137,7 +137,7 @@ buttonBox rejected() - KCategoryReassignDlgDecl + KCategoryReassignDlg reject() diff --git a/kmymoney/dialogs/kchooseimportexportdlg.h b/kmymoney/dialogs/kchooseimportexportdlg.h --- a/kmymoney/dialogs/kchooseimportexportdlg.h +++ b/kmymoney/dialogs/kchooseimportexportdlg.h @@ -7,6 +7,7 @@ Javier Campos Morales Felix Rodriguez John C + (C) 2017 by Łukasz Wojniłowicz ***************************************************************************/ /*************************************************************************** @@ -35,27 +36,24 @@ /** *@author Michael Edwardes */ + +class KChooseImportExportDlgPrivate; class KChooseImportExportDlg : public QDialog { Q_OBJECT -private: - void readConfig(); - void writeConfig(); - QString m_lastType; - -protected slots: - void slotTypeActivated(const QString& text); + Q_DISABLE_COPY(KChooseImportExportDlg) public: - explicit KChooseImportExportDlg(int type, QWidget *parent = 0); + explicit KChooseImportExportDlg(int type, QWidget *parent = nullptr); ~KChooseImportExportDlg(); - QString importExportType(); + QString importExportType() const; + +protected slots: + void slotTypeActivated(const QString& text); private: - /// \internal d-pointer class. - struct Private; - /// \internal d-pointer instance. - Private* const d; + KChooseImportExportDlgPrivate * const d_ptr; + Q_DECLARE_PRIVATE(KChooseImportExportDlg) }; #endif diff --git a/kmymoney/dialogs/kchooseimportexportdlg.cpp b/kmymoney/dialogs/kchooseimportexportdlg.cpp --- a/kmymoney/dialogs/kchooseimportexportdlg.cpp +++ b/kmymoney/dialogs/kchooseimportexportdlg.cpp @@ -7,6 +7,7 @@ Javier Campos Morales Felix Rodriguez John C + (C) 2017 by Łukasz Wojniłowicz ***************************************************************************/ /*************************************************************************** @@ -36,80 +37,97 @@ // ---------------------------------------------------------------------------- // Project Includes -#include "ui_kchooseimportexportdlgdecl.h" +#include "ui_kchooseimportexportdlg.h" -struct KChooseImportExportDlg::Private { - Ui::KChooseImportExportDlgDecl ui; +class KChooseImportExportDlgPrivate +{ + Q_DISABLE_COPY(KChooseImportExportDlgPrivate) + +public: + KChooseImportExportDlgPrivate() : + ui(new Ui::KChooseImportExportDlg) + { + } + + ~KChooseImportExportDlgPrivate() + { + delete ui; + } + + void readConfig() + { + auto config = KSharedConfig::openConfig(); + auto grp = config->group("Last Use Settings"); + m_lastType = grp.readEntry("KChooseImportExportDlg_LastType"); + } + + void writeConfig() const + { + auto config = KSharedConfig::openConfig(); + auto grp = config->group("Last Use Settings"); + grp.writeEntry("KChooseImportExportDlg_LastType", ui->typeCombo->currentText()); + config->sync(); + } + + Ui::KChooseImportExportDlg *ui; + QString m_lastType; }; -KChooseImportExportDlg::KChooseImportExportDlg(int type, QWidget *parent) - : QDialog(parent), d(new Private) -{ - d->ui.setupUi(this); - QString filename; +KChooseImportExportDlg::KChooseImportExportDlg(int type, QWidget *parent) : + QDialog(parent), + d_ptr(new KChooseImportExportDlgPrivate) +{ + Q_D(KChooseImportExportDlg); + d->ui->setupUi(this); setModal(true); if (type == 0) { // import - d->ui.topLabel->setText(i18n("Please choose the type of import you wish to perform. A simple explanation\n" + d->ui->topLabel->setText(i18n("Please choose the type of import you wish to perform. A simple explanation\n" "of the import type is available at the bottom of the screen and is updated when\n" "you select an item from the choice box." "\n\nOnce you have chosen an import type please press the OK button.")); - d->ui.promptLabel->setText(i18n("Choose import type:")); + d->ui->promptLabel->setText(i18n("Choose import type:")); setWindowTitle(i18n("Choose Import Type Dialog")); } else { // export - d->ui.topLabel->setText(i18n("Please choose the type of export you wish to perform. A simple explanation\n" + d->ui->topLabel->setText(i18n("Please choose the type of export you wish to perform. A simple explanation\n" "of the export type is available at the bottom of the screen and is updated when\n" "you select an item from the choice box." "\n\nOnce you have chosen an export type please press the OK button.")); - d->ui.promptLabel->setText(i18n("Choose export type:")); + d->ui->promptLabel->setText(i18n("Choose export type:")); setWindowTitle(i18n("Choose Export Type Dialog")); } - readConfig(); - slotTypeActivated(m_lastType); - d->ui.typeCombo->setCurrentItem(((m_lastType == "QIF") ? i18n("QIF") : i18n("CSV")), false); + d->readConfig(); + slotTypeActivated(d->m_lastType); + d->ui->typeCombo->setCurrentItem(((d->m_lastType == "QIF") ? i18n("QIF") : i18n("CSV")), false); - connect(d->ui.typeCombo, SIGNAL(activated(QString)), this, SLOT(slotTypeActivated(QString))); - connect(d->ui.buttonBox, SIGNAL(accepted()), this, SLOT(accept())); - connect(d->ui.buttonBox, SIGNAL(rejected()), this, SLOT(reject())); + connect(d->ui->typeCombo, static_cast(&QComboBox::activated), this, &KChooseImportExportDlg::slotTypeActivated); } KChooseImportExportDlg::~KChooseImportExportDlg() { - writeConfig(); + Q_D(KChooseImportExportDlg); + d->writeConfig(); delete d; } void KChooseImportExportDlg::slotTypeActivated(const QString& text) { + Q_D(KChooseImportExportDlg); if (text == "QIF") { - d->ui.descriptionLabel->setText(i18n("QIF files are created by the popular accounting program Quicken.\n" + d->ui->descriptionLabel->setText(i18n("QIF files are created by the popular accounting program Quicken.\n" "Another dialog will appear, if you choose this type, asking for further\n" "information relevant to the Quicken format.")); } else { - d->ui.descriptionLabel->setText(i18n("The CSV type uses a comma delimited text file that can be used by\n" + d->ui->descriptionLabel->setText(i18n("The CSV type uses a comma delimited text file that can be used by\n" "most popular spreadsheet programs available for Linux and other operating\n" "systems.")); } } -QString KChooseImportExportDlg::importExportType() -{ - return d->ui.typeCombo->currentText(); -} - -void KChooseImportExportDlg::readConfig() -{ - KSharedConfigPtr config = KSharedConfig::openConfig(); - KConfigGroup grp = config->group("Last Use Settings"); - m_lastType = grp.readEntry("KChooseImportExportDlg_LastType"); -} - -void KChooseImportExportDlg::writeConfig() +QString KChooseImportExportDlg::importExportType() const { - KSharedConfigPtr config = KSharedConfig::openConfig(); - KConfigGroup grp = config->group("Last Use Settings"); - grp.writeEntry("KChooseImportExportDlg_LastType", d->ui.typeCombo->currentText()); - config->sync(); + Q_D(const KChooseImportExportDlg); + return d->ui->typeCombo->currentText(); } diff --git a/kmymoney/dialogs/kchooseimportexportdlgdecl.ui b/kmymoney/dialogs/kchooseimportexportdlg.ui rename from kmymoney/dialogs/kchooseimportexportdlgdecl.ui rename to kmymoney/dialogs/kchooseimportexportdlg.ui --- a/kmymoney/dialogs/kchooseimportexportdlgdecl.ui +++ b/kmymoney/dialogs/kchooseimportexportdlg.ui @@ -1,13 +1,13 @@ - KChooseImportExportDlgDecl - + KChooseImportExportDlg + 0 0 530 - 276 + 309 @@ -173,5 +173,38 @@ - + + + buttonBox + accepted() + KChooseImportExportDlg + accept() + + + 264 + 280 + + + 264 + 154 + + + + + buttonBox + rejected() + KChooseImportExportDlg + reject() + + + 264 + 280 + + + 264 + 154 + + + + diff --git a/kmymoney/dialogs/kconfirmmanualenterdlg.h b/kmymoney/dialogs/kconfirmmanualenterdlg.h --- a/kmymoney/dialogs/kconfirmmanualenterdlg.h +++ b/kmymoney/dialogs/kconfirmmanualenterdlg.h @@ -4,6 +4,7 @@ begin : Mon Apr 9 2007 copyright : (C) 2007 by Thomas Baumgart email : Thomas Baumgart + (C) 2017 by Łukasz Wojniłowicz ***************************************************************************/ /*************************************************************************** @@ -32,12 +33,15 @@ class MyMoneySchedule; class MyMoneyTransaction; +namespace Ui { class KConfirmManualEnterDlg; } + class KConfirmManualEnterDlg : public QDialog { Q_OBJECT + Q_DISABLE_COPY(KConfirmManualEnterDlg) public: - explicit KConfirmManualEnterDlg(const MyMoneySchedule& schedule, QWidget* parent = 0); + explicit KConfirmManualEnterDlg(const MyMoneySchedule& schedule, QWidget* parent = nullptr); ~KConfirmManualEnterDlg(); typedef enum { @@ -58,10 +62,7 @@ Action action() const; private: - /// \internal d-pointer class. - struct Private; - /// \internal d-pointer instance. - Private* const d; + Ui::KConfirmManualEnterDlg *ui; }; #endif // KCONFIRMMANUALENTERDLG_H diff --git a/kmymoney/dialogs/kconfirmmanualenterdlg.cpp b/kmymoney/dialogs/kconfirmmanualenterdlg.cpp --- a/kmymoney/dialogs/kconfirmmanualenterdlg.cpp +++ b/kmymoney/dialogs/kconfirmmanualenterdlg.cpp @@ -4,6 +4,7 @@ begin : Mon Apr 9 2007 copyright : (C) 2007 by Thomas Baumgart email : Thomas Baumgart + (C) 2017 by Łukasz Wojniłowicz ***************************************************************************/ /*************************************************************************** @@ -33,6 +34,8 @@ // ---------------------------------------------------------------------------- // Project Includes +#include "ui_kconfirmmanualenterdlg.h" + #include "mymoneymoney.h" #include "mymoneyfile.h" #include "mymoneyaccount.h" @@ -43,37 +46,33 @@ #include "mymoneyexception.h" #include "kmymoneyutils.h" #include "mymoneytransaction.h" -#include "ui_kconfirmmanualenterdlgdecl.h" - -struct KConfirmManualEnterDlg::Private { - Ui::KConfirmManualEnterDlgDecl ui; -}; KConfirmManualEnterDlg::KConfirmManualEnterDlg(const MyMoneySchedule& schedule, QWidget* parent) : - QDialog(parent), d(new Private) + QDialog(parent), + ui(new Ui::KConfirmManualEnterDlg) { - d->ui.setupUi(this); - d->ui.buttonGroup1->setId(d->ui.m_discardRadio, 0); - d->ui.buttonGroup1->setId(d->ui.m_onceRadio, 1); - d->ui.buttonGroup1->setId(d->ui.m_setRadio, 2); + ui->setupUi(this); + ui->buttonGroup1->setId(ui->m_discardRadio, 0); + ui->buttonGroup1->setId(ui->m_onceRadio, 1); + ui->buttonGroup1->setId(ui->m_setRadio, 2); - d->ui.m_onceRadio->setChecked(true); + ui->m_onceRadio->setChecked(true); if (schedule.type() == eMyMoney::Schedule::Type::LoanPayment) { - d->ui.m_setRadio->setEnabled(false); - d->ui.m_discardRadio->setEnabled(false); + ui->m_setRadio->setEnabled(false); + ui->m_discardRadio->setEnabled(false); } } KConfirmManualEnterDlg::~KConfirmManualEnterDlg() { - delete d; + delete ui; } void KConfirmManualEnterDlg::loadTransactions(const MyMoneyTransaction& to, const MyMoneyTransaction& tn) { QString messageDetail(""); - MyMoneyFile* file = MyMoneyFile::instance(); + auto file = MyMoneyFile::instance(); int noItemsChanged = 0; try { @@ -179,15 +178,15 @@ } messageDetail += ""; - d->ui.m_details->setText(messageDetail); + ui->m_details->setText(messageDetail); return; } KConfirmManualEnterDlg::Action KConfirmManualEnterDlg::action() const { - if (d->ui.m_discardRadio->isChecked()) + if (ui->m_discardRadio->isChecked()) return UseOriginal; - if (d->ui.m_setRadio->isChecked()) + if (ui->m_setRadio->isChecked()) return ModifyAlways; return ModifyOnce; } diff --git a/kmymoney/dialogs/kconfirmmanualenterdlgdecl.ui b/kmymoney/dialogs/kconfirmmanualenterdlg.ui rename from kmymoney/dialogs/kconfirmmanualenterdlgdecl.ui rename to kmymoney/dialogs/kconfirmmanualenterdlg.ui --- a/kmymoney/dialogs/kconfirmmanualenterdlgdecl.ui +++ b/kmymoney/dialogs/kconfirmmanualenterdlg.ui @@ -1,7 +1,7 @@ - KConfirmManualEnterDlgDecl - + KConfirmManualEnterDlg + 0 @@ -119,7 +119,7 @@ buttonBox accepted() - KConfirmManualEnterDlgDecl + KConfirmManualEnterDlg accept() @@ -135,7 +135,7 @@ buttonBox rejected() - KConfirmManualEnterDlgDecl + KConfirmManualEnterDlg reject() diff --git a/kmymoney/dialogs/kcurrencycalculator.h b/kmymoney/dialogs/kcurrencycalculator.h --- a/kmymoney/dialogs/kcurrencycalculator.h +++ b/kmymoney/dialogs/kcurrencycalculator.h @@ -9,6 +9,7 @@ John C Thomas Baumgart Kevin Tambascio + (C) 2017 by Łukasz Wojniłowicz ***************************************************************************/ /*************************************************************************** @@ -34,28 +35,26 @@ // ---------------------------------------------------------------------------- // Project Includes -#include "ui_kcurrencycalculatordecl.h" -#include "mymoneymoney.h" -#include "mymoneysecurity.h" +class QDate; +class MyMoneyMoney; class MyMoneySplit; class MyMoneyTransaction; -class QDialogButtonBox; +class MyMoneySecurity; + +namespace Ui { class KCurrencyCalculator; } + +typedef qint64 signed64; /** * @author Thomas Baumgart */ -class KCurrencyCalculatorDecl : public QDialog, public Ui::KCurrencyCalculatorDecl -{ -public: - KCurrencyCalculatorDecl(QWidget *parent) : QDialog(parent) { - setupUi(this); - } -}; -class KCurrencyCalculator : public KCurrencyCalculatorDecl +class KCurrencyCalculatorPrivate; +class KCurrencyCalculator : public QDialog { Q_OBJECT + Q_DISABLE_COPY(KCurrencyCalculator) public: /** @@ -69,7 +68,13 @@ * * @note @p value must not be 0! */ - KCurrencyCalculator(const MyMoneySecurity& from, const MyMoneySecurity& to, const MyMoneyMoney& value, const MyMoneyMoney& shares, const QDate& date, const signed64 resultFraction = 100, QWidget *parent = 0); + explicit KCurrencyCalculator(const MyMoneySecurity& from, + const MyMoneySecurity& to, + const MyMoneyMoney& value, + const MyMoneyMoney& shares, + const QDate& date, + const signed64 resultFraction = 100, + QWidget *parent = nullptr); ~KCurrencyCalculator(); /** @@ -87,25 +92,23 @@ void setupPriceEditor(); - static bool setupSplitPrice(MyMoneyMoney& shares, const MyMoneyTransaction& t, const MyMoneySplit& s, const QMap& priceInfo, QWidget* parentWidget); - -protected: - void updateExample(const MyMoneyMoney& price); + static bool setupSplitPrice(MyMoneyMoney& shares, + const MyMoneyTransaction& t, + const MyMoneySplit& s, + const QMap& priceInfo, + QWidget* parentWidget); protected slots: void slotSetToAmount(); void slotSetExchangeRate(); void slotUpdateResult(const QString& txt); void slotUpdateRate(const QString& txt); - virtual void accept(); + void accept() override; private: - MyMoneySecurity m_fromCurrency; - MyMoneySecurity m_toCurrency; - MyMoneyMoney m_result; - MyMoneyMoney m_value; - signed64 m_resultFraction; - QDialogButtonBox *m_buttonBox; + KCurrencyCalculatorPrivate * const d_ptr; + Q_DECLARE_PRIVATE(KCurrencyCalculator) }; #endif diff --git a/kmymoney/dialogs/kcurrencycalculator.cpp b/kmymoney/dialogs/kcurrencycalculator.cpp --- a/kmymoney/dialogs/kcurrencycalculator.cpp +++ b/kmymoney/dialogs/kcurrencycalculator.cpp @@ -9,6 +9,7 @@ John C Thomas Baumgart Kevin Tambascio + (C) 2017 by Łukasz Wojniłowicz ***************************************************************************/ /*************************************************************************** @@ -31,7 +32,6 @@ #include #include #include -#include // ---------------------------------------------------------------------------- // KDE Includes @@ -41,6 +41,8 @@ // ---------------------------------------------------------------------------- // Project Includes +#include "ui_kcurrencycalculator.h" + #include "mymoneyfile.h" #include "mymoneyaccount.h" #include "mymoneysecurity.h" @@ -52,15 +54,174 @@ #include "mymoneytransaction.h" #include "kmymoneyglobalsettings.h" -#include "kmymoneyutils.h" +class KCurrencyCalculatorPrivate +{ + Q_DISABLE_COPY(KCurrencyCalculatorPrivate) + Q_DECLARE_PUBLIC(KCurrencyCalculator) + +public: + KCurrencyCalculatorPrivate(KCurrencyCalculator *qq, + const MyMoneySecurity& from, + const MyMoneySecurity& to, + const MyMoneyMoney& value, + const MyMoneyMoney& shares, + const QDate& date, + const signed64 resultFraction) : + q_ptr(qq), + ui(new Ui::KCurrencyCalculator), + m_fromCurrency(from), + m_toCurrency(to), + m_result(shares.abs()), + m_value(value.abs()), + m_date(date), + m_resultFraction(resultFraction) + { + } + + ~KCurrencyCalculatorPrivate() + { + delete ui; + } + + void init() + { + Q_Q(KCurrencyCalculator); + ui->setupUi(q); + auto file = MyMoneyFile::instance(); + + //set main widget of QDialog + ui->buttonGroup1->setId(ui->m_amountButton, 0); + ui->buttonGroup1->setId(ui->m_rateButton, 1); + + ui->m_dateFrame->hide(); + if (m_date.isValid()) + ui->m_dateEdit->setDate(m_date); + else + ui->m_dateEdit->setDate(QDate::currentDate()); + + ui->m_fromCurrencyText->setText(QString(MyMoneySecurity::securityTypeToString(m_fromCurrency.securityType()) + ' ' + (m_fromCurrency.isCurrency() ? m_fromCurrency.id() : m_fromCurrency.tradingSymbol()))); + ui->m_toCurrencyText->setText(QString(MyMoneySecurity::securityTypeToString(m_toCurrency.securityType()) + ' ' + (m_toCurrency.isCurrency() ? m_toCurrency.id() : m_toCurrency.tradingSymbol()))); + + //set bold font + auto boldFont = ui->m_fromCurrencyText->font(); + boldFont.setBold(true); + ui->m_fromCurrencyText->setFont(boldFont); + boldFont = ui->m_toCurrencyText->font(); + boldFont.setBold(true); + ui->m_toCurrencyText->setFont(boldFont); + + ui->m_fromAmount->setText(m_value.formatMoney(QString(), MyMoneyMoney::denomToPrec(m_fromCurrency.smallestAccountFraction()))); + + ui->m_dateText->setText(QLocale().toString(m_date)); + + ui->m_updateButton->setChecked(KMyMoneyGlobalSettings::priceHistoryUpdate()); + + // setup initial result + if (m_result == MyMoneyMoney() && !m_value.isZero()) { + const MyMoneyPrice &pr = file->price(m_fromCurrency.id(), m_toCurrency.id(), m_date); + if (pr.isValid()) { + m_result = m_value * pr.rate(m_toCurrency.id()); + } + } + + // fill in initial values + ui->m_toAmount->loadText(m_result.formatMoney(QString(), MyMoneyMoney::denomToPrec(m_resultFraction))); + ui->m_toAmount->setPrecision(MyMoneyMoney::denomToPrec(m_resultFraction)); + + ui->m_conversionRate->setPrecision(m_fromCurrency.pricePrecision()); + + q->connect(ui->m_amountButton, &QAbstractButton::clicked, q, &KCurrencyCalculator::slotSetToAmount); + q->connect(ui->m_rateButton, &QAbstractButton::clicked, q, &KCurrencyCalculator::slotSetExchangeRate); + + q->connect(ui->m_toAmount, &kMyMoneyEdit::valueChanged, q, &KCurrencyCalculator::slotUpdateResult); + q->connect(ui->m_conversionRate, &kMyMoneyEdit::valueChanged, q, &KCurrencyCalculator::slotUpdateRate); -bool KCurrencyCalculator::setupSplitPrice(MyMoneyMoney& shares, const MyMoneyTransaction& t, const MyMoneySplit& s, const QMap& priceInfo, QWidget* parentWidget) + // use this as the default + ui->m_amountButton->animateClick(); + q->slotUpdateResult(ui->m_toAmount->text()); + + // If the from security is not a currency, we only allow entering a price + if (!m_fromCurrency.isCurrency()) { + ui->m_rateButton->animateClick(); + ui->m_amountButton->hide(); + ui->m_toAmount->hide(); + } + } + + void updateExample(const MyMoneyMoney& price) + { + QString msg; + if (price.isZero()) { + msg = QString("1 %1 = ? %2").arg(m_fromCurrency.tradingSymbol()) + .arg(m_toCurrency.tradingSymbol()); + if (m_fromCurrency.isCurrency()) { + msg += QString("\n"); + msg += QString("1 %1 = ? %2").arg(m_toCurrency.tradingSymbol()) + .arg(m_fromCurrency.tradingSymbol()); + } + } else { + msg = QString("1 %1 = %2 %3").arg(m_fromCurrency.tradingSymbol()) + .arg(price.formatMoney(QString(), m_fromCurrency.pricePrecision())) + .arg(m_toCurrency.tradingSymbol()); + if (m_fromCurrency.isCurrency()) { + msg += QString("\n"); + msg += QString("1 %1 = %2 %3").arg(m_toCurrency.tradingSymbol()) + .arg((MyMoneyMoney::ONE / price).formatMoney(QString(), m_toCurrency.pricePrecision())) + .arg(m_fromCurrency.tradingSymbol()); + } + } + ui->m_conversionExample->setText(msg); + ui->buttonBox->button(QDialogButtonBox::Ok)->setEnabled(!price.isZero()); + } + + KCurrencyCalculator *q_ptr; + Ui::KCurrencyCalculator *ui; + MyMoneySecurity m_fromCurrency; + MyMoneySecurity m_toCurrency; + MyMoneyMoney m_result; + MyMoneyMoney m_value; + QDate m_date; + signed64 m_resultFraction; +}; + +KCurrencyCalculator::KCurrencyCalculator(const MyMoneySecurity& from, + const MyMoneySecurity& to, + const MyMoneyMoney& value, + const MyMoneyMoney& shares, + const QDate& date, + const signed64 resultFraction, + QWidget *parent) : + QDialog(parent), + d_ptr(new KCurrencyCalculatorPrivate(this, + from, + to, + value, + shares, + date, + resultFraction)) { - bool rc = true; - MyMoneyFile* file = MyMoneyFile::instance(); + Q_D(KCurrencyCalculator); + d->init(); +} + +KCurrencyCalculator::~KCurrencyCalculator() +{ + Q_D(KCurrencyCalculator); + delete d; +} + +bool KCurrencyCalculator::setupSplitPrice(MyMoneyMoney& shares, + const MyMoneyTransaction& t, + const MyMoneySplit& s, + const QMap& priceInfo, + QWidget* parentWidget) +{ + auto rc = true; + auto file = MyMoneyFile::instance(); if (!s.value().isZero()) { - MyMoneyAccount cat = file->account(s.accountId()); + auto cat = file->account(s.accountId()); MyMoneySecurity toCurrency; toCurrency = file->security(cat.currencyId()); // determine the fraction required for this category/account @@ -68,11 +229,10 @@ if (cat.currencyId() != t.commodity()) { - MyMoneySecurity fromCurrency; - MyMoneyMoney fromValue, toValue; - fromCurrency = file->security(t.commodity()); + MyMoneyMoney toValue; + auto fromCurrency = file->security(t.commodity()); // display only positive values to the user - fromValue = s.value().abs(); + auto fromValue = s.value().abs(); // if we had a price info in the beginning, we use it here if (priceInfo.find(cat.currencyId()) != priceInfo.end()) { @@ -116,195 +276,86 @@ return rc; } -KCurrencyCalculator::KCurrencyCalculator(const MyMoneySecurity& from, const MyMoneySecurity& to, const MyMoneyMoney& value, const MyMoneyMoney& shares, const QDate& date, const signed64 resultFraction, QWidget *parent) : - KCurrencyCalculatorDecl(parent), - m_fromCurrency(from), - m_toCurrency(to), - m_result(shares.abs()), - m_value(value.abs()), - m_resultFraction(resultFraction), - m_buttonBox(0) -{ - MyMoneyFile* file = MyMoneyFile::instance(); - - //set main widget of QDialog - QVBoxLayout *mainLayout = new QVBoxLayout; - setLayout(mainLayout); - mainLayout->addWidget(m_layoutWidget); - - m_buttonBox = new QDialogButtonBox(this); - m_buttonBox->setStandardButtons(QDialogButtonBox::Ok|QDialogButtonBox::Cancel); - QPushButton *okButton = m_buttonBox->button(QDialogButtonBox::Ok); - okButton->setDefault(true); - /// @todo remove Ctrl-Enter behavior in future release - okButton->setShortcut(Qt::CTRL | Qt::Key_Return); - connect(m_buttonBox, SIGNAL(accepted()), this, SLOT(accept())); - connect(m_buttonBox, SIGNAL(rejected()), this, SLOT(reject())); - mainLayout->addWidget(m_buttonBox); - - buttonGroup1->setId(m_amountButton, 0); - buttonGroup1->setId(m_rateButton, 1); - - m_dateFrame->hide(); - if (date.isValid()) - m_dateEdit->setDate(date); - else - m_dateEdit->setDate(QDate::currentDate()); - - m_fromCurrencyText->setText(QString(MyMoneySecurity::securityTypeToString(m_fromCurrency.securityType()) + ' ' + (m_fromCurrency.isCurrency() ? m_fromCurrency.id() : m_fromCurrency.tradingSymbol()))); - m_toCurrencyText->setText(QString(MyMoneySecurity::securityTypeToString(m_toCurrency.securityType()) + ' ' + (m_toCurrency.isCurrency() ? m_toCurrency.id() : m_toCurrency.tradingSymbol()))); - - //set bold font - QFont boldFont = m_fromCurrencyText->font(); - boldFont.setBold(true); - m_fromCurrencyText->setFont(boldFont); - boldFont = m_toCurrencyText->font(); - boldFont.setBold(true); - m_toCurrencyText->setFont(boldFont); - - m_fromAmount->setText(m_value.formatMoney(QString(), MyMoneyMoney::denomToPrec(m_fromCurrency.smallestAccountFraction()))); - - m_dateText->setText(QLocale().toString(date)); - - m_updateButton->setChecked(KMyMoneyGlobalSettings::priceHistoryUpdate()); - - // setup initial result - if (m_result == MyMoneyMoney() && !m_value.isZero()) { - const MyMoneyPrice &pr = file->price(m_fromCurrency.id(), m_toCurrency.id(), date); - if (pr.isValid()) { - m_result = m_value * pr.rate(m_toCurrency.id()); - } - } - - // fill in initial values - m_toAmount->loadText(m_result.formatMoney(QString(), MyMoneyMoney::denomToPrec(m_resultFraction))); - m_toAmount->setPrecision(MyMoneyMoney::denomToPrec(m_resultFraction)); - - m_conversionRate->setPrecision(m_fromCurrency.pricePrecision()); - - connect(m_amountButton, SIGNAL(clicked()), this, SLOT(slotSetToAmount())); - connect(m_rateButton, SIGNAL(clicked()), this, SLOT(slotSetExchangeRate())); - - connect(m_toAmount, SIGNAL(valueChanged(QString)), this, SLOT(slotUpdateResult(QString))); - connect(m_conversionRate, SIGNAL(valueChanged(QString)), this, SLOT(slotUpdateRate(QString))); - - // use this as the default - m_amountButton->animateClick(); - slotUpdateResult(m_toAmount->text()); - - // If the from security is not a currency, we only allow entering a price - if (!m_fromCurrency.isCurrency()) { - m_rateButton->animateClick(); - m_amountButton->hide(); - m_toAmount->hide(); - } - okButton->setFocus(); -} - -KCurrencyCalculator::~KCurrencyCalculator() -{ -} - void KCurrencyCalculator::setupPriceEditor() { - m_dateFrame->show(); - m_amountDateFrame->hide(); - m_updateButton->setChecked(true); - m_updateButton->hide(); + Q_D(KCurrencyCalculator); + d->ui->m_dateFrame->show(); + d->ui->m_amountDateFrame->hide(); + d->ui->m_updateButton->setChecked(true); + d->ui->m_updateButton->hide(); } void KCurrencyCalculator::slotSetToAmount() { - m_rateButton->setChecked(false); - m_toAmount->setEnabled(true); - m_conversionRate->setEnabled(false); + Q_D(KCurrencyCalculator); + d->ui->m_rateButton->setChecked(false); + d->ui->m_toAmount->setEnabled(true); + d->ui->m_conversionRate->setEnabled(false); } void KCurrencyCalculator::slotSetExchangeRate() { - m_amountButton->setChecked(false); - m_toAmount->setEnabled(false); - m_conversionRate->setEnabled(true); + Q_D(KCurrencyCalculator); + d->ui->m_amountButton->setChecked(false); + d->ui->m_toAmount->setEnabled(false); + d->ui->m_conversionRate->setEnabled(true); } void KCurrencyCalculator::slotUpdateResult(const QString& /*txt*/) { - MyMoneyMoney result = m_toAmount->value(); + Q_D(KCurrencyCalculator); + MyMoneyMoney result = d->ui->m_toAmount->value(); MyMoneyMoney price(0, 1); if (result.isNegative()) { - m_toAmount->setValue(-result); + d->ui->m_toAmount->setValue(-result); slotUpdateResult(QString()); return; } if (!result.isZero()) { - price = result / m_value; + price = result / d->m_value; - m_conversionRate->loadText(price.formatMoney(QString(), m_fromCurrency.pricePrecision())); - m_result = (m_value * price).convert(m_resultFraction); - m_toAmount->loadText(m_result.formatMoney(m_resultFraction)); + d->ui->m_conversionRate->loadText(price.formatMoney(QString(), d->m_fromCurrency.pricePrecision())); + d->m_result = (d->m_value * price).convert(d->m_resultFraction); + d->ui->m_toAmount->loadText(d->m_result.formatMoney(d->m_resultFraction)); } - updateExample(price); + d->updateExample(price); } void KCurrencyCalculator::slotUpdateRate(const QString& /*txt*/) { - MyMoneyMoney price = m_conversionRate->value(); + Q_D(KCurrencyCalculator); + auto price = d->ui->m_conversionRate->value(); if (price.isNegative()) { - m_conversionRate->setValue(-price); + d->ui->m_conversionRate->setValue(-price); slotUpdateRate(QString()); return; } if (!price.isZero()) { - m_conversionRate->loadText(price.formatMoney(QString(), m_fromCurrency.pricePrecision())); - m_result = (m_value * price).convert(m_resultFraction); - m_toAmount->loadText(m_result.formatMoney(QString(), MyMoneyMoney::denomToPrec(m_resultFraction))); + d->ui->m_conversionRate->loadText(price.formatMoney(QString(), d->m_fromCurrency.pricePrecision())); + d->m_result = (d->m_value * price).convert(d->m_resultFraction); + d->ui->m_toAmount->loadText(d->m_result.formatMoney(QString(), MyMoneyMoney::denomToPrec(d->m_resultFraction))); } - updateExample(price); -} - -void KCurrencyCalculator::updateExample(const MyMoneyMoney& price) -{ - QString msg; - if (price.isZero()) { - msg = QString("1 %1 = ? %2").arg(m_fromCurrency.tradingSymbol()) - .arg(m_toCurrency.tradingSymbol()); - if (m_fromCurrency.isCurrency()) { - msg += QString("\n"); - msg += QString("1 %1 = ? %2").arg(m_toCurrency.tradingSymbol()) - .arg(m_fromCurrency.tradingSymbol()); - } - } else { - msg = QString("1 %1 = %2 %3").arg(m_fromCurrency.tradingSymbol()) - .arg(price.formatMoney(QString(), m_fromCurrency.pricePrecision())) - .arg(m_toCurrency.tradingSymbol()); - if (m_fromCurrency.isCurrency()) { - msg += QString("\n"); - msg += QString("1 %1 = %2 %3").arg(m_toCurrency.tradingSymbol()) - .arg((MyMoneyMoney::ONE / price).formatMoney(QString(), m_toCurrency.pricePrecision())) - .arg(m_fromCurrency.tradingSymbol()); - } - } - m_conversionExample->setText(msg); - m_buttonBox->button(QDialogButtonBox::Ok)->setEnabled(!price.isZero()); + d->updateExample(price); } void KCurrencyCalculator::accept() { - if (m_conversionRate->isEnabled()) + Q_D(KCurrencyCalculator); + if (d->ui->m_conversionRate->isEnabled()) slotUpdateRate(QString()); else slotUpdateResult(QString()); - if (m_updateButton->isChecked()) { - MyMoneyPrice pr = MyMoneyFile::instance()->price(m_fromCurrency.id(), m_toCurrency.id(), m_dateEdit->date()); + if (d->ui->m_updateButton->isChecked()) { + auto pr = MyMoneyFile::instance()->price(d->m_fromCurrency.id(), d->m_toCurrency.id(), d->ui->m_dateEdit->date()); if (!pr.isValid() - || pr.date() != m_dateEdit->date() - || (pr.date() == m_dateEdit->date() && pr.rate(m_fromCurrency.id()) != price())) { - pr = MyMoneyPrice(m_fromCurrency.id(), m_toCurrency.id(), m_dateEdit->date(), price(), i18n("User")); + || pr.date() != d->ui->m_dateEdit->date() + || (pr.date() == d->ui->m_dateEdit->date() && pr.rate(d->m_fromCurrency.id()) != price())) { + pr = MyMoneyPrice(d->m_fromCurrency.id(), d->m_toCurrency.id(), d->ui->m_dateEdit->date(), price(), i18n("User")); MyMoneyFileTransaction ft; try { MyMoneyFile::instance()->addPrice(pr); @@ -316,18 +367,18 @@ } // remember setting for next round - KMyMoneyGlobalSettings::setPriceHistoryUpdate(m_updateButton->isChecked()); - - KCurrencyCalculatorDecl::accept(); + KMyMoneyGlobalSettings::setPriceHistoryUpdate(d->ui->m_updateButton->isChecked()); + QDialog::accept(); } MyMoneyMoney KCurrencyCalculator::price() const { + Q_D(const KCurrencyCalculator); // This should fix https://bugs.kde.org/show_bug.cgi?id=205254 and // https://bugs.kde.org/show_bug.cgi?id=325953 as well as // https://bugs.kde.org/show_bug.cgi?id=300965 - if (m_amountButton->isChecked()) - return m_toAmount->value().abs() / m_value.abs(); + if (d->ui->m_amountButton->isChecked()) + return d->ui->m_toAmount->value().abs() / d->m_value.abs(); else - return m_conversionRate->value(); + return d->ui->m_conversionRate->value(); } diff --git a/kmymoney/dialogs/kcurrencycalculator.ui b/kmymoney/dialogs/kcurrencycalculator.ui new file mode 100644 --- /dev/null +++ b/kmymoney/dialogs/kcurrencycalculator.ui @@ -0,0 +1,400 @@ + + + KCurrencyCalculator + + + true + + + + 0 + 0 + 387 + 268 + + + + Exchange Rate/Price Editor + + + true + + + + + + + + QFrame::NoFrame + + + QFrame::Plain + + + + 0 + + + 0 + + + 0 + + + 0 + + + + + + + Amount + + + false + + + + + + + xxx + + + false + + + + + + + Qt::Horizontal + + + QSizePolicy::Expanding + + + + 80 + 20 + + + + + + + + Date + + + false + + + + + + + xxx + + + false + + + + + + + Qt::Horizontal + + + QSizePolicy::Expanding + + + + 145 + 20 + + + + + + + + + + + + + + + Convert + + + + 0 + + + + + + + + Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter + + + false + + + + + + + to + + + Qt::AlignCenter + + + false + + + + + + + + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + false + + + + + + + + + + + + + + + + + + + + true + + + + 0 + + + 0 + + + 0 + + + 0 + + + + + QFrame::NoFrame + + + QFrame::Plain + + + + 0 + + + 0 + + + 0 + + + 0 + + + + + To a&mount + + + buttonGroup1 + + + + + + + Exchange &rate / Price + + + buttonGroup1 + + + + + + + + + + + + + QFrame::NoFrame + + + QFrame::Plain + + + + 0 + + + 0 + + + 0 + + + 0 + + + + + Date + + + false + + + + + + + + + + + + + xx +xx + + + false + + + + + + + + + + + + Update price history + + + true + + + + + + + Qt::Vertical + + + QSizePolicy::Expanding + + + + 20 + 16 + + + + + + + + QDialogButtonBox::Cancel|QDialogButtonBox::Ok + + + + + + + + + + + kMyMoneyDateInput + QWidget +
kmymoneydateinput.h
+ 1 +
+ + kMyMoneyEdit + QWidget +
kmymoneyedit.h
+
+
+ + m_amountButton + m_rateButton + m_updateButton + + + + + buttonBox + accepted() + KCurrencyCalculator + accept() + + + 189 + 233 + + + 193 + 133 + + + + + buttonBox + rejected() + KCurrencyCalculator + reject() + + + 189 + 233 + + + 193 + 133 + + + + + + + +
diff --git a/kmymoney/dialogs/kcurrencycalculatordecl.ui b/kmymoney/dialogs/kcurrencycalculatordecl.ui deleted file mode 100644 --- a/kmymoney/dialogs/kcurrencycalculatordecl.ui +++ /dev/null @@ -1,317 +0,0 @@ - - - - - - KCurrencyCalculatorDecl - - - true - - - - 0 - 0 - 387 - 268 - - - - Exchange Rate/Price Editor - - - true - - - - - - - QFrame::NoFrame - - - QFrame::Plain - - - - 0 - - - - - - - Amount - - - false - - - - - - - xxx - - - false - - - - - - - - 80 - 20 - - - - QSizePolicy::Expanding - - - Qt::Horizontal - - - - - - - Date - - - false - - - - - - - xxx - - - false - - - - - - - - 145 - 20 - - - - QSizePolicy::Expanding - - - Qt::Horizontal - - - - - - - - - - - - - - Convert - - - - 0 - - - - - - - - Qt::AlignVCenter|Qt::AlignLeft - - - false - - - - - - - to - - - Qt::AlignVCenter|Qt::AlignHCenter - - - false - - - - - - - - - - Qt::AlignVCenter|Qt::AlignRight - - - false - - - - - - - - - - - - - - - - - - - - true - - - - 0 - - - - - QFrame::NoFrame - - - QFrame::Plain - - - - 0 - - - - - To amount - - - buttonGroup1 - - - - - - - Exchange rate / Price - - - buttonGroup1 - - - - - - - - - - - - - QFrame::NoFrame - - - QFrame::Plain - - - - 0 - - - - - Date - - - false - - - - - - - - - - - - - xx -xx - - - false - - - - - - - - - - - - Update price history - - - true - - - - - - - - 20 - 16 - - - - QSizePolicy::Expanding - - - Qt::Vertical - - - - - - - - - m_amountButton - m_rateButton - m_updateButton - - - - - - - QDialog - QDialog -
kdialog.h
-
-
-
diff --git a/kmymoney/dialogs/kcurrencyeditdlg.h b/kmymoney/dialogs/kcurrencyeditdlg.h --- a/kmymoney/dialogs/kcurrencyeditdlg.h +++ b/kmymoney/dialogs/kcurrencyeditdlg.h @@ -36,43 +36,37 @@ // ---------------------------------------------------------------------------- // Project Includes -#include "mymoneysecurity.h" - -namespace Ui -{ -class KCurrencyEditDlg; -} - class QTreeWidgetItem; class KAvailableCurrencyDlg; class KCurrencyEditorDlg; class KTreeWidgetSearchLineWidget; +class MyMoneySecurity; /** * @author Thomas Baumgart */ +class KCurrencyEditDlgPrivate; class KCurrencyEditDlg : public QDialog { Q_OBJECT + Q_DISABLE_COPY(KCurrencyEditDlg) + public: - KCurrencyEditDlg(QWidget *parent = 0); + explicit KCurrencyEditDlg(QWidget *parent = nullptr); ~KCurrencyEditDlg(); - Ui::KCurrencyEditDlg* ui; - public slots: void slotSelectCurrency(const QString& id); -protected: - - protected slots: - void slotSelectCurrency(QTreeWidgetItem *); + void slotSelectCurrency(QTreeWidgetItem *citem, QTreeWidgetItem *pitem); + void slotSelectCurrency(QTreeWidgetItem *item); void slotItemSelectionChanged(); void slotStartRename(); void slotOpenContextMenu(const QPoint& p); void slotLoadCurrencies(); - void slotUpdateCurrency(QTreeWidgetItem *item); + void slotUpdateCurrency(QTreeWidgetItem* citem, int column); + void slotUpdateCurrency(QTreeWidgetItem *citem, QTreeWidgetItem *pitem); private slots: void timerDone(); @@ -89,15 +83,8 @@ void selectBaseCurrency(const MyMoneySecurity& currency); private: - typedef enum:int { RemoveSelected, RemoveUnused} removalModeE; - KAvailableCurrencyDlg* m_availableCurrencyDlg; - KCurrencyEditorDlg* m_currencyEditorDlg; - MyMoneySecurity m_currency; - /** - * Search widget for the list - */ - KTreeWidgetSearchLineWidget* m_searchWidget; - void removeCurrency(const removalModeE& mode); + KCurrencyEditDlgPrivate * const d_ptr; + Q_DECLARE_PRIVATE(KCurrencyEditDlg) }; #endif diff --git a/kmymoney/dialogs/kcurrencyeditdlg.cpp b/kmymoney/dialogs/kcurrencyeditdlg.cpp --- a/kmymoney/dialogs/kcurrencyeditdlg.cpp +++ b/kmymoney/dialogs/kcurrencyeditdlg.cpp @@ -85,47 +85,110 @@ return QStyledItemDelegate::createEditor(parent, option, index); } -KCurrencyEditDlg::KCurrencyEditDlg(QWidget *parent) : ui(new Ui::KCurrencyEditDlg) +class KCurrencyEditDlgPrivate { - Q_UNUSED(parent); - ui->setupUi(this); - m_searchWidget = new KTreeWidgetSearchLineWidget(this, ui->m_currencyList); - m_searchWidget->setSizePolicy(QSizePolicy(QSizePolicy::Preferred, QSizePolicy::Fixed)); - m_searchWidget->setFocus(); - ui->verticalLayout->insertWidget(0, m_searchWidget); - ui->m_currencyList->setItemDelegate(new KCurrencyEditDelegate(ui->m_currencyList)); - ui->m_closeButton->setIcon(QIcon::fromTheme(g_Icons[Icon::DialogClose])); - ui->m_editCurrencyButton->setIcon(QIcon::fromTheme(g_Icons[Icon::DocumentEdit])); - ui->m_selectBaseCurrencyButton->setIcon(QIcon::fromTheme(g_Icons[Icon::KMyMoney])); - - connect(ui->m_currencyList, SIGNAL(customContextMenuRequested(QPoint)), this, SLOT(slotOpenContextMenu(QPoint))); - connect(MyMoneyFile::instance(), SIGNAL(dataChanged()), this, SLOT(slotLoadCurrencies())); - connect(ui->m_currencyList, SIGNAL(itemChanged(QTreeWidgetItem*,int)), this, SLOT(slotUpdateCurrency(QTreeWidgetItem*))); - connect(ui->m_currencyList, SIGNAL(itemSelectionChanged()), this, SLOT(slotItemSelectionChanged())); - - connect(ui->m_selectBaseCurrencyButton, SIGNAL(clicked()), this, SLOT(slotSelectBaseCurrency())); - connect(ui->m_addCurrencyButton, SIGNAL(clicked()), this, SLOT(slotAddCurrency())); - connect(ui->m_removeCurrencyButton, SIGNAL(clicked()), this, SLOT(slotRemoveCurrency())); - connect(ui->m_editCurrencyButton, SIGNAL(clicked()), this, SLOT(slotEditCurrency())); - connect(ui->m_removeUnusedCurrencyButton, SIGNAL(clicked()), this, SLOT(slotRemoveUnusedCurrency())); + Q_DISABLE_COPY(KCurrencyEditDlgPrivate) + Q_DECLARE_PUBLIC(KCurrencyEditDlg) + +public: + KCurrencyEditDlgPrivate(KCurrencyEditDlg *qq) : + q_ptr(qq), + ui(new Ui::KCurrencyEditDlg) + { + } + + ~KCurrencyEditDlgPrivate() + { + delete ui; + } + + enum removalModeE :int { RemoveSelected, RemoveUnused }; + + void removeCurrency(const removalModeE& mode) + { + Q_Q(KCurrencyEditDlg); + auto file = MyMoneyFile::instance(); + MyMoneyFileTransaction ft; + QBitArray skip((int)eStorage::Reference::Count); + skip.fill(false); // check reference to all... + skip.setBit((int)eStorage::Reference::Price); // ...except price + + QTreeWidgetItemIterator it (ui->m_currencyList); // iterate over whole tree + if (mode == RemoveUnused) { + while (*it) { + MyMoneySecurity currency = (*it)->data(0, Qt::UserRole).value(); + if (file->baseCurrency() != currency && !file->isReferenced(currency, skip)) + KMyMoneyUtils::deleteSecurity(currency, q); + ++it; + } + } else if (mode == RemoveSelected) { + QList currencyRows = ui->m_currencyList->selectedItems(); + foreach(auto currencyRow, currencyRows) { + MyMoneySecurity currency = currencyRow->data(0, Qt::UserRole).value(); + if (file->baseCurrency() != currency && !file->isReferenced(currency, skip)) + KMyMoneyUtils::deleteSecurity(currency, q); + } + } + ft.commit(); + ui->m_removeUnusedCurrencyButton->setDisabled(file->currencyList().count() <= 1); + } + + KCurrencyEditDlg *q_ptr; + Ui::KCurrencyEditDlg *ui; + + KAvailableCurrencyDlg *m_availableCurrencyDlg; + KCurrencyEditorDlg *m_currencyEditorDlg; + MyMoneySecurity m_currency; + /** + * Search widget for the list + */ + KTreeWidgetSearchLineWidget* m_searchWidget; +}; + +KCurrencyEditDlg::KCurrencyEditDlg(QWidget *parent) : + QDialog(parent), + d_ptr(new KCurrencyEditDlgPrivate(this)) +{ + Q_D(KCurrencyEditDlg); + d->ui->setupUi(this); + d->m_searchWidget = new KTreeWidgetSearchLineWidget(this, d->ui->m_currencyList); + d->m_searchWidget->setSizePolicy(QSizePolicy(QSizePolicy::Preferred, QSizePolicy::Fixed)); + d->m_searchWidget->setFocus(); + d->ui->verticalLayout->insertWidget(0, d->m_searchWidget); + d->ui->m_currencyList->setItemDelegate(new KCurrencyEditDelegate(d->ui->m_currencyList)); + d->ui->m_closeButton->setIcon(QIcon::fromTheme(g_Icons[Icon::DialogClose])); + d->ui->m_editCurrencyButton->setIcon(QIcon::fromTheme(g_Icons[Icon::DocumentEdit])); + d->ui->m_selectBaseCurrencyButton->setIcon(QIcon::fromTheme(g_Icons[Icon::KMyMoney])); + + connect(d->ui->m_currencyList, &QWidget::customContextMenuRequested, this, &KCurrencyEditDlg::slotOpenContextMenu); + connect(MyMoneyFile::instance(), &MyMoneyFile::dataChanged, this, &KCurrencyEditDlg::slotLoadCurrencies); + connect(d->ui->m_currencyList, &QTreeWidget::itemChanged, this, static_cast(&KCurrencyEditDlg::slotUpdateCurrency)); + connect(d->ui->m_currencyList, &QTreeWidget::itemSelectionChanged, this, &KCurrencyEditDlg::slotItemSelectionChanged); + + connect(d->ui->m_selectBaseCurrencyButton, &QAbstractButton::clicked, this, &KCurrencyEditDlg::slotSelectBaseCurrency); + connect(d->ui->m_addCurrencyButton, &QAbstractButton::clicked, this, &KCurrencyEditDlg::slotAddCurrency); + connect(d->ui->m_removeCurrencyButton, &QAbstractButton::clicked, this, &KCurrencyEditDlg::slotRemoveCurrency); + connect(d->ui->m_editCurrencyButton, &QAbstractButton::clicked, this, &KCurrencyEditDlg::slotEditCurrency); + connect(d->ui->m_removeUnusedCurrencyButton, &QAbstractButton::clicked, this, &KCurrencyEditDlg::slotRemoveUnusedCurrency); QTimer::singleShot(10, this, SLOT(timerDone())); } void KCurrencyEditDlg::timerDone() { + Q_D(KCurrencyEditDlg); slotLoadCurrencies(); //resize the column widths - for (int i = 0; i < 3; ++i) - ui->m_currencyList->resizeColumnToContents(i); + for (auto i = 0; i < 3; ++i) + d->ui->m_currencyList->resizeColumnToContents(i); - if (!m_currency.id().isEmpty()) { - QTreeWidgetItemIterator it(ui->m_currencyList); + if (!d->m_currency.id().isEmpty()) { + QTreeWidgetItemIterator it(d->ui->m_currencyList); QTreeWidgetItem* q; while ((q = *it) != 0) { - if (q->text(1) == m_currency.id()) { - ui->m_currencyList->scrollToItem(q); + if (q->text(1) == d->m_currency.id()) { + d->ui->m_currencyList->scrollToItem(q); break; } ++it; @@ -135,12 +198,15 @@ KCurrencyEditDlg::~KCurrencyEditDlg() { + Q_D(KCurrencyEditDlg); + delete d; } void KCurrencyEditDlg::slotLoadCurrencies() { - disconnect(ui->m_currencyList, SIGNAL(currentItemChanged(QTreeWidgetItem*,QTreeWidgetItem*)), this, SLOT(slotSelectCurrency(QTreeWidgetItem*))); - disconnect(ui->m_currencyList, SIGNAL(itemChanged(QTreeWidgetItem*,int)), this, SLOT(slotUpdateCurrency(QTreeWidgetItem*))); + Q_D(KCurrencyEditDlg); + disconnect(d->ui->m_currencyList, &QTreeWidget::currentItemChanged, this, static_cast(&KCurrencyEditDlg::slotSelectCurrency)); + disconnect(d->ui->m_currencyList, &QTreeWidget::itemChanged, this, static_cast(&KCurrencyEditDlg::slotUpdateCurrency)); QList list = MyMoneyFile::instance()->currencyList(); QList::ConstIterator it; QTreeWidgetItem *first = 0; @@ -161,9 +227,9 @@ mask.clear(); empty.setMask(mask); - ui->m_currencyList->clear(); + d->ui->m_currencyList->clear(); for (it = list.constBegin(); it != list.constEnd(); ++it) { - QTreeWidgetItem *p = new QTreeWidgetItem(ui->m_currencyList); + QTreeWidgetItem *p = new QTreeWidgetItem(d->ui->m_currencyList); p->setText(0, (*it).name()); p->setData(0, Qt::UserRole, QVariant::fromValue(*it)); p->setFlags(p->flags() | Qt::ItemIsEditable); @@ -172,77 +238,92 @@ if ((*it).id() == baseCurrency) { p->setData(0, Qt::DecorationRole, QIcon::fromTheme(g_Icons[Icon::KMyMoney])); - if (m_currency.id().isEmpty()) + if (d->m_currency.id().isEmpty()) first = p; } else { p->setData(0, Qt::DecorationRole, empty); } // if we had a previously selected - if (!m_currency.id().isEmpty()) { - if (m_currency.id() == p->text(1)) + if (!d->m_currency.id().isEmpty()) { + if (d->m_currency.id() == p->text(1)) first = p; } else if ((*it).id() == localCurrency && !first) first = p; } - ui->m_removeUnusedCurrencyButton->setDisabled(list.count() <= 1); - ui->m_currencyList->sortItems(0, Qt::AscendingOrder); + d->ui->m_removeUnusedCurrencyButton->setDisabled(list.count() <= 1); + d->ui->m_currencyList->sortItems(0, Qt::AscendingOrder); - connect(ui->m_currencyList, SIGNAL(currentItemChanged(QTreeWidgetItem*,QTreeWidgetItem*)), this, SLOT(slotSelectCurrency(QTreeWidgetItem*))); - connect(ui->m_currencyList, SIGNAL(itemChanged(QTreeWidgetItem*,int)), this, SLOT(slotUpdateCurrency(QTreeWidgetItem*))); + connect(d->ui->m_currencyList, &QTreeWidget::currentItemChanged, this, static_cast(&KCurrencyEditDlg::slotSelectCurrency)); + connect(d->ui->m_currencyList, &QTreeWidget::itemChanged, this, static_cast(&KCurrencyEditDlg::slotUpdateCurrency)); if (first == 0) - first = ui->m_currencyList->invisibleRootItem()->child(0); + first = d->ui->m_currencyList->invisibleRootItem()->child(0); if (first != 0) { - ui->m_currencyList->setCurrentItem(first); - ui->m_currencyList->scrollToItem(first); + d->ui->m_currencyList->setCurrentItem(first); + d->ui->m_currencyList->scrollToItem(first); } slotSelectCurrency(first); } -void KCurrencyEditDlg::slotUpdateCurrency(QTreeWidgetItem* item) +void KCurrencyEditDlg::slotUpdateCurrency(QTreeWidgetItem* citem, int) +{ + slotUpdateCurrency(citem, nullptr); +} + +void KCurrencyEditDlg::slotUpdateCurrency(QTreeWidgetItem* citem, QTreeWidgetItem *pitem) { + Q_D(KCurrencyEditDlg); + Q_UNUSED(pitem) //if there is no current item selected, exit - if (!ui->m_currencyList->currentItem() || item != ui->m_currencyList->currentItem()) + if (!d->ui->m_currencyList->currentItem() || citem != d->ui->m_currencyList->currentItem()) return; //verify that the stored currency id is not empty and the edited fields are not empty either - if (!m_currency.id().isEmpty() - && !ui->m_currencyList->currentItem()->text(2).isEmpty() - && !ui->m_currencyList->currentItem()->text(0).isEmpty()) { + if (!d->m_currency.id().isEmpty() + && !d->ui->m_currencyList->currentItem()->text(2).isEmpty() + && !d->ui->m_currencyList->currentItem()->text(0).isEmpty()) { //check that either the name or the id have changed - if (ui->m_currencyList->currentItem()->text(2) != m_currency.tradingSymbol() - || ui->m_currencyList->currentItem()->text(0) != m_currency.name()) { + if (d->ui->m_currencyList->currentItem()->text(2) != d->m_currency.tradingSymbol() + || d->ui->m_currencyList->currentItem()->text(0) != d->m_currency.name()) { //update the name and the id - m_currency.setName(ui->m_currencyList->currentItem()->text(0)); - m_currency.setTradingSymbol(ui->m_currencyList->currentItem()->text(2)); + d->m_currency.setName(d->ui->m_currencyList->currentItem()->text(0)); + d->m_currency.setTradingSymbol(d->ui->m_currencyList->currentItem()->text(2)); - emit updateCurrency(m_currency.id(), m_currency.name(), m_currency.tradingSymbol()); + emit updateCurrency(d->m_currency.id(), d->m_currency.name(), d->m_currency.tradingSymbol()); } } } void KCurrencyEditDlg::slotSelectCurrency(const QString& id) { - QTreeWidgetItemIterator it(ui->m_currencyList); + Q_D(KCurrencyEditDlg); + QTreeWidgetItemIterator it(d->ui->m_currencyList); while (*it) { if ((*it)->text(1) == id) { - ui->m_currencyList->blockSignals(true); + d->ui->m_currencyList->blockSignals(true); slotSelectCurrency(*it); - ui->m_currencyList->setCurrentItem(*it); - ui->m_currencyList->scrollToItem(*it); - ui->m_currencyList->blockSignals(false); + d->ui->m_currencyList->setCurrentItem(*it); + d->ui->m_currencyList->scrollToItem(*it); + d->ui->m_currencyList->blockSignals(false); break; } ++it; } } +void KCurrencyEditDlg::slotSelectCurrency(QTreeWidgetItem *citem, QTreeWidgetItem *pitem) +{ + Q_UNUSED(pitem) + slotSelectCurrency(citem); +} + void KCurrencyEditDlg::slotSelectCurrency(QTreeWidgetItem *item) { - MyMoneyFile* file = MyMoneyFile::instance(); + Q_D(KCurrencyEditDlg); + auto file = MyMoneyFile::instance(); QString baseId; try { baseId = MyMoneyFile::instance()->baseCurrency().id(); @@ -251,72 +332,77 @@ if (item) { try { - m_currency = file->security(item->text(1)); + d->m_currency = file->security(item->text(1)); } catch (const MyMoneyException &) { - m_currency = MyMoneySecurity(); + d->m_currency = MyMoneySecurity(); } QBitArray skip((int)eStorage::Reference::Count); skip.fill(false); skip.setBit((int)eStorage::Reference::Price); - const bool rc1 = m_currency.id() == baseId; - const bool rc2 = file->isReferenced(m_currency, skip); - const int count = ui->m_currencyList->selectedItems().count(); + const bool rc1 = d->m_currency.id() == baseId; + const bool rc2 = file->isReferenced(d->m_currency, skip); + const int count = d->ui->m_currencyList->selectedItems().count(); - ui->m_selectBaseCurrencyButton->setDisabled(rc1 || count != 1); - ui->m_editCurrencyButton->setDisabled(count != 1); - ui->m_removeCurrencyButton->setDisabled((rc1 || rc2) && count <= 1); - emit selectObject(m_currency); + d->ui->m_selectBaseCurrencyButton->setDisabled(rc1 || count != 1); + d->ui->m_editCurrencyButton->setDisabled(count != 1); + d->ui->m_removeCurrencyButton->setDisabled((rc1 || rc2) && count <= 1); + emit selectObject(d->m_currency); } } void KCurrencyEditDlg::slotItemSelectionChanged() { - int count = ui->m_currencyList->selectedItems().count(); - if (!ui->m_selectBaseCurrencyButton->isEnabled() && count == 1) - slotSelectCurrency(ui->m_currencyList->currentItem()); + Q_D(KCurrencyEditDlg); + int count = d->ui->m_currencyList->selectedItems().count(); + if (!d->ui->m_selectBaseCurrencyButton->isEnabled() && count == 1) + slotSelectCurrency(d->ui->m_currencyList->currentItem()); if (count > 1) - ui->m_removeCurrencyButton->setEnabled(true); + d->ui->m_removeCurrencyButton->setEnabled(true); } void KCurrencyEditDlg::slotStartRename() { - QTreeWidgetItemIterator it_l(ui->m_currencyList, QTreeWidgetItemIterator::Selected); + Q_D(KCurrencyEditDlg); + QTreeWidgetItemIterator it_l(d->ui->m_currencyList, QTreeWidgetItemIterator::Selected); QTreeWidgetItem* it_v; if ((it_v = *it_l) != 0) { - ui->m_currencyList->editItem(it_v, 0); + d->ui->m_currencyList->editItem(it_v, 0); } } void KCurrencyEditDlg::slotOpenContextMenu(const QPoint& p) { - QTreeWidgetItem* item = ui->m_currencyList->itemAt(p); + Q_D(KCurrencyEditDlg); + QTreeWidgetItem* item = d->ui->m_currencyList->itemAt(p); if (item) emit openContextMenu(item->data(0, Qt::UserRole).value()); } void KCurrencyEditDlg::slotSelectBaseCurrency() { - if (!m_currency.id().isEmpty()) { - QTreeWidgetItem* p = ui->m_currencyList->currentItem(); - emit selectBaseCurrency(m_currency); + Q_D(KCurrencyEditDlg); + if (!d->m_currency.id().isEmpty()) { + QTreeWidgetItem* p = d->ui->m_currencyList->currentItem(); + emit selectBaseCurrency(d->m_currency); // in case the dataChanged() signal was not sent out (nested FileTransaction) // we update the list manually - if (p == ui->m_currencyList->currentItem()) + if (p == d->ui->m_currencyList->currentItem()) slotLoadCurrencies(); } } void KCurrencyEditDlg::slotAddCurrency() { - m_availableCurrencyDlg = new KAvailableCurrencyDlg; // create new dialog for selecting currencies to add - if (m_availableCurrencyDlg->exec() != QDialog::Rejected) { - MyMoneyFile* file = MyMoneyFile::instance(); + Q_D(KCurrencyEditDlg); + d->m_availableCurrencyDlg = new KAvailableCurrencyDlg; // create new dialog for selecting currencies to add + if (d->m_availableCurrencyDlg->exec() != QDialog::Rejected) { + auto file = MyMoneyFile::instance(); QMap ancientCurrencies = file->ancientCurrencies(); MyMoneyFileTransaction ft; - QList currencyRows = m_availableCurrencyDlg->ui->m_currencyList->selectedItems(); // get selected currencies from new dialog + QList currencyRows = d->m_availableCurrencyDlg->ui->m_currencyList->selectedItems(); // get selected currencies from new dialog foreach (auto currencyRow, currencyRows) { MyMoneySecurity currency = currencyRow->data(0, Qt::UserRole).value(); file->addCurrency(currency); @@ -324,57 +410,32 @@ file->addPrice(ancientCurrencies[currency]); // ...we want to add last known exchange rate as well } ft.commit(); - ui->m_removeUnusedCurrencyButton->setDisabled(file->currencyList().count() <= 1); - } - delete m_availableCurrencyDlg; -} - -void KCurrencyEditDlg::removeCurrency(const removalModeE& mode) -{ - MyMoneyFile* file = MyMoneyFile::instance(); - MyMoneyFileTransaction ft; - QBitArray skip((int)eStorage::Reference::Count); - skip.fill(false); // check reference to all... - skip.setBit((int)eStorage::Reference::Price); // ...except price - - QTreeWidgetItemIterator it (ui->m_currencyList); // iterate over whole tree - if (mode == RemoveUnused) { - while (*it) { - MyMoneySecurity currency = (*it)->data(0, Qt::UserRole).value(); - if (file->baseCurrency() != currency && !file->isReferenced(currency, skip)) - KMyMoneyUtils::deleteSecurity(currency, this); - ++it; - } - } else if (mode == RemoveSelected) { - QList currencyRows = ui->m_currencyList->selectedItems(); - foreach(auto currencyRow, currencyRows) { - MyMoneySecurity currency = currencyRow->data(0, Qt::UserRole).value(); - if (file->baseCurrency() != currency && !file->isReferenced(currency, skip)) - KMyMoneyUtils::deleteSecurity(currency, this); - } + d->ui->m_removeUnusedCurrencyButton->setDisabled(file->currencyList().count() <= 1); } - ft.commit(); - ui->m_removeUnusedCurrencyButton->setDisabled(file->currencyList().count() <= 1); + delete d->m_availableCurrencyDlg; } void KCurrencyEditDlg::slotRemoveCurrency() { - removeCurrency(RemoveSelected); + Q_D(KCurrencyEditDlg); + d->removeCurrency(KCurrencyEditDlgPrivate::RemoveSelected); } void KCurrencyEditDlg::slotRemoveUnusedCurrency() { - removeCurrency(RemoveUnused); + Q_D(KCurrencyEditDlg); + d->removeCurrency(KCurrencyEditDlgPrivate::RemoveUnused); } void KCurrencyEditDlg::slotEditCurrency() { - MyMoneySecurity currency = ui->m_currencyList->currentItem()->data(0, Qt::UserRole).value(); - m_currencyEditorDlg = new KCurrencyEditorDlg(currency); // create new dialog for editing currency - if (m_currencyEditorDlg->exec() != QDialog::Rejected) { - MyMoneyFile* file = MyMoneyFile::instance(); + Q_D(KCurrencyEditDlg); + MyMoneySecurity currency = d->ui->m_currencyList->currentItem()->data(0, Qt::UserRole).value(); + d->m_currencyEditorDlg = new KCurrencyEditorDlg(currency); // create new dialog for editing currency + if (d->m_currencyEditorDlg->exec() != QDialog::Rejected) { + auto file = MyMoneyFile::instance(); MyMoneyFileTransaction ft; - currency.setPricePrecision(m_currencyEditorDlg->ui->m_pricePrecision->value()); + currency.setPricePrecision(d->m_currencyEditorDlg->ui->m_pricePrecision->value()); try { file->modifyCurrency(currency); ft.commit(); @@ -382,5 +443,5 @@ qDebug("%s", qPrintable(e.what())); } } - delete m_currencyEditorDlg; + delete d->m_currencyEditorDlg; } diff --git a/kmymoney/dialogs/kcurrencyeditordlg.h b/kmymoney/dialogs/kcurrencyeditordlg.h --- a/kmymoney/dialogs/kcurrencyeditordlg.h +++ b/kmymoney/dialogs/kcurrencyeditordlg.h @@ -38,7 +38,7 @@ { Q_OBJECT public: - KCurrencyEditorDlg(MyMoneySecurity ¤cy, QWidget *parent = 0); + KCurrencyEditorDlg(MyMoneySecurity ¤cy, QWidget *parent = nullptr); ~KCurrencyEditorDlg(); Ui::KCurrencyEditorDlg* ui; diff --git a/kmymoney/dialogs/keditequityentrydecl.ui b/kmymoney/dialogs/keditequityentry.ui rename from kmymoney/dialogs/keditequityentrydecl.ui rename to kmymoney/dialogs/keditequityentry.ui --- a/kmymoney/dialogs/keditequityentrydecl.ui +++ b/kmymoney/dialogs/keditequityentry.ui @@ -3,8 +3,8 @@ Kevin Tambascio - KEditEquityEntryDecl - + KEditEquityEntry + 0 diff --git a/kmymoney/dialogs/keditscheduledlg.h b/kmymoney/dialogs/keditscheduledlg.h --- a/kmymoney/dialogs/keditscheduledlg.h +++ b/kmymoney/dialogs/keditscheduledlg.h @@ -4,6 +4,7 @@ begin : Mon Sep 3 2007 copyright : (C) 2007 by Thomas Baumgart email : Thomas Baumgart + (C) 2017 by Łukasz Wojniłowicz ***************************************************************************/ /*************************************************************************** @@ -29,8 +30,6 @@ // ---------------------------------------------------------------------------- // Project Includes -#include "ui_keditscheduledlgdecl.h" - class MyMoneySchedule; class MyMoneyTransaction; class TransactionEditor; @@ -38,25 +37,15 @@ /** * @author Thomas Baumgart */ -class KEditScheduleDlgDecl : public QDialog, public Ui::KEditScheduleDlgDecl -{ -public: - explicit KEditScheduleDlgDecl(QWidget *parent) : QDialog(parent) { - setupUi(this); - } -}; -class KEditScheduleDlg : public KEditScheduleDlgDecl + +class KEditScheduleDlgPrivate; +class KEditScheduleDlg : public QDialog { Q_OBJECT + Q_DISABLE_COPY(KEditScheduleDlg) + public: - /** - * Standard QWidget constructor. - **/ - explicit KEditScheduleDlg(const MyMoneySchedule& schedule, QWidget *parent = 0); - - /** - * Standard destructor. - **/ + explicit KEditScheduleDlg(const MyMoneySchedule& schedule, QWidget *parent = nullptr); ~KEditScheduleDlg(); TransactionEditor* startEdit(); @@ -66,10 +55,9 @@ * * @return MyMoneySchedule The schedule details. **/ - const MyMoneySchedule& schedule() const; + const MyMoneySchedule& schedule(); protected: - MyMoneyTransaction transaction() const; /** * This method adjusts @a _date according to the rules specified by * the schedule's weekend option. @@ -77,10 +65,10 @@ QDate adjustDate(const QDate& _date) const; /// Overridden for internal reasons. No API changes. - bool focusNextPrevChild(bool next); + bool focusNextPrevChild(bool next) override; /// Overridden for internal reasons. No API changes. - void resizeEvent(QResizeEvent* ev); + void resizeEvent(QResizeEvent* ev) override; private slots: void slotSetupSize(); @@ -94,19 +82,11 @@ void slotFilterPaymentType(int index); /// Overridden for internal reasons. No API changes. - void accept(); + void accept() override; private: - /** - * Helper method to recalculate and update Transactions Remaining - * when other values are changed - */ - void updateTransactionsRemaining(); - - /// \internal d-pointer class. - class Private; - /// \internal d-pointer instance. - Private* const d; + KEditScheduleDlgPrivate * const d_ptr; + Q_DECLARE_PRIVATE(KEditScheduleDlg) }; #endif diff --git a/kmymoney/dialogs/keditscheduledlg.cpp b/kmymoney/dialogs/keditscheduledlg.cpp --- a/kmymoney/dialogs/keditscheduledlg.cpp +++ b/kmymoney/dialogs/keditscheduledlg.cpp @@ -4,6 +4,7 @@ begin : Mon Sep 3 2007 copyright : (C) 2007 by Thomas Baumgart email : Thomas Baumgart + (C) 2017 by Łukasz Wojniłowicz ***************************************************************************/ /*************************************************************************** @@ -32,12 +33,13 @@ #include #include #include -#include #include // ---------------------------------------------------------------------------- // Project Includes +#include "ui_keditscheduledlg.h" + #include "mymoneyfile.h" #include "mymoneyschedule.h" #include "mymoneytransaction.h" @@ -54,122 +56,170 @@ using namespace eMyMoney; -class KEditScheduleDlg::Private +class KEditScheduleDlgPrivate { + Q_DISABLE_COPY(KEditScheduleDlgPrivate) + Q_DECLARE_PUBLIC(KEditScheduleDlg) + public: - MyMoneySchedule m_schedule; - KMyMoneyRegister::Transaction* m_item; - QWidgetList m_tabOrderWidgets; - TransactionEditor* m_editor; - kMandatoryFieldGroup* m_requiredFields; -}; + KEditScheduleDlgPrivate(KEditScheduleDlg *qq) : + q_ptr(qq), + ui(new Ui::KEditScheduleDlg) + { + } -KEditScheduleDlg::KEditScheduleDlg(const MyMoneySchedule& schedule, QWidget *parent) : - KEditScheduleDlgDecl(parent), - d(new Private) -{ - setModal(true); - d->m_schedule = schedule; - d->m_editor = 0; + ~KEditScheduleDlgPrivate() + { + delete ui; + } + + void init() + { + Q_Q(KEditScheduleDlg); + ui->setupUi(q); - KGuiItem::assign(buttonOk, KStandardGuiItem::ok()); - KGuiItem::assign(buttonCancel, KStandardGuiItem::cancel()); - KGuiItem::assign(buttonHelp, KStandardGuiItem::help()); + m_requiredFields = new kMandatoryFieldGroup(q); + m_requiredFields->setOkButton(ui->buttonBox->button(QDialogButtonBox::Ok)); // button to be enabled when all fields present - d->m_requiredFields = new kMandatoryFieldGroup(this); - d->m_requiredFields->setOkButton(buttonOk); // button to be enabled when all fields present + // make sure, we have a tabbar with the form + // insert it after the horizontal line + ui->m_paymentInformationLayout->insertWidget(2, ui->m_form->tabBar(ui->m_form->parentWidget())); - // make sure, we have a tabbar with the form - // insert it after the horizontal line - m_paymentInformationLayout->insertWidget(2, m_form->tabBar(m_form->parentWidget())); + // we never need to see the register + ui->m_register->hide(); - // we never need to see the register - m_register->hide(); + // ... setup the form ... + ui->m_form->setupForm(m_schedule.account()); - // ... setup the form ... - m_form->setupForm(d->m_schedule.account()); + // ... and the register ... + ui->m_register->clear(); - // ... and the register ... - m_register->clear(); + // ... now add the transaction to register and form ... + auto t = transaction(); + if (m_schedule.transaction().splits().isEmpty()) + m_item = KMyMoneyRegister::Register::transactionFactory(ui->m_register, t, MyMoneySplit(), 0); + else + m_item = KMyMoneyRegister::Register::transactionFactory(ui->m_register, t, + m_schedule.transaction().splits().isEmpty() ? MyMoneySplit() : m_schedule.transaction().splits().front(), 0); + ui->m_register->selectItem(m_item); + // show the account row + m_item->setShowRowInForm(0, true); + + ui->m_form->slotSetTransaction(m_item); + + // setup widget contents + ui->m_nameEdit->setText(m_schedule.name()); + + ui->m_frequencyEdit->setCurrentItem((int)m_schedule.occurrencePeriod()); + if (ui->m_frequencyEdit->currentItem() == Schedule::Occurrence::Any) + ui->m_frequencyEdit->setCurrentItem((int)Schedule::Occurrence::Monthly); + q->slotFrequencyChanged((int)ui->m_frequencyEdit->currentItem()); + ui->m_frequencyNoEdit->setValue(m_schedule.occurrenceMultiplier()); + + // load option widgets + ui->m_paymentMethodEdit->insertItem(i18n("Direct deposit"), (int)Schedule::PaymentType::DirectDeposit); + ui->m_paymentMethodEdit->insertItem(i18n("Manual deposit"), (int)Schedule::PaymentType::ManualDeposit); + ui->m_paymentMethodEdit->insertItem(i18n("Direct debit"), (int)Schedule::PaymentType::DirectDebit); + ui->m_paymentMethodEdit->insertItem(i18n("Standing order"), (int)Schedule::PaymentType::StandingOrder); + ui->m_paymentMethodEdit->insertItem(i18n("Bank transfer"), (int)Schedule::PaymentType::BankTransfer); + ui->m_paymentMethodEdit->insertItem(i18n("Write check"), (int)Schedule::PaymentType::WriteChecque); + ui->m_paymentMethodEdit->insertItem(i18nc("Other payment method", "Other"), (int)Schedule::PaymentType::Other); + + auto method = m_schedule.paymentType(); + if (method == Schedule::PaymentType::Any) + method = Schedule::PaymentType::Other; + ui->m_paymentMethodEdit->setCurrentItem((int)method); + + switch (m_schedule.weekendOption()) { + case Schedule::WeekendOption::MoveNothing: + ui->m_weekendOptionEdit->setCurrentIndex(0); + break; + case Schedule::WeekendOption::MoveBefore: + ui->m_weekendOptionEdit->setCurrentIndex(1); + break; + case Schedule::WeekendOption::MoveAfter: + ui->m_weekendOptionEdit->setCurrentIndex(2); + break; + } + ui->m_estimateEdit->setChecked(!m_schedule.isFixed()); + ui->m_lastDayInMonthEdit->setChecked(m_schedule.lastDayInMonth()); + ui->m_autoEnterEdit->setChecked(m_schedule.autoEnter()); + ui->m_endSeriesEdit->setChecked(m_schedule.willEnd()); + + ui->m_endOptionsFrame->setEnabled(m_schedule.willEnd()); + if (m_schedule.willEnd()) { + ui->m_RemainingEdit->setValue(m_schedule.transactionsRemaining()); + ui->m_FinalPaymentEdit->setDate(m_schedule.endDate()); + } - // ... now add the transaction to register and form ... - MyMoneyTransaction t = transaction(); - if (d->m_schedule.transaction().splits().isEmpty()) - d->m_item = KMyMoneyRegister::Register::transactionFactory(m_register, t, MyMoneySplit(), 0); - else - d->m_item = KMyMoneyRegister::Register::transactionFactory(m_register, t, - d->m_schedule.transaction().splits().isEmpty() ? MyMoneySplit() : d->m_schedule.transaction().splits().front(), 0); - m_register->selectItem(d->m_item); - // show the account row - d->m_item->setShowRowInForm(0, true); + q->connect(ui->m_RemainingEdit, static_cast(&QSpinBox::valueChanged), + q, &KEditScheduleDlg::slotRemainingChanged); + q->connect(ui->m_FinalPaymentEdit, &kMyMoneyDateInput::dateChanged, + q, &KEditScheduleDlg::slotEndDateChanged); + q->connect(ui->m_frequencyEdit, &KMyMoneyGeneralCombo::itemSelected, + q, &KEditScheduleDlg::slotFrequencyChanged); + q->connect(ui->m_frequencyNoEdit, static_cast(&QSpinBox::valueChanged), + q, &KEditScheduleDlg::slotOccurrenceMultiplierChanged); + q->connect(ui->buttonBox, &QDialogButtonBox::helpRequested, q, &KEditScheduleDlg::slotShowHelp); + + q->setModal(true); + // force the initial height to be as small as possible + QTimer::singleShot(0, q, SLOT(slotSetupSize())); + + // we just hide the variation field for now and enable the logic + // once we have a respective member in the MyMoneySchedule object + ui->m_variation->hide(); + } - m_form->slotSetTransaction(d->m_item); + /** + * Helper method to recalculate and update Transactions Remaining + * when other values are changed + */ + void updateTransactionsRemaining() + { + auto remain = m_schedule.transactionsRemaining(); + if (remain != ui->m_RemainingEdit->value()) { + ui->m_RemainingEdit->blockSignals(true); + ui->m_RemainingEdit->setValue(remain); + ui->m_RemainingEdit->blockSignals(false); + } + } - // setup widget contents - m_nameEdit->setText(d->m_schedule.name()); + MyMoneyTransaction transaction() const + { + auto t = m_schedule.transaction(); - m_frequencyEdit->setCurrentItem((int)d->m_schedule.occurrencePeriod()); - if (m_frequencyEdit->currentItem() == Schedule::Occurrence::Any) - m_frequencyEdit->setCurrentItem((int)Schedule::Occurrence::Monthly); - slotFrequencyChanged((int)m_frequencyEdit->currentItem()); - m_frequencyNoEdit->setValue(d->m_schedule.occurrenceMultiplier()); + if (m_editor) { + m_editor->createTransaction(t, m_schedule.transaction(), m_schedule.transaction().splits().isEmpty() ? MyMoneySplit() : m_schedule.transaction().splits().front(), false); + } - // load option widgets - m_paymentMethodEdit->insertItem(i18n("Direct deposit"), (int)Schedule::PaymentType::DirectDeposit); - m_paymentMethodEdit->insertItem(i18n("Manual deposit"), (int)Schedule::PaymentType::ManualDeposit); - m_paymentMethodEdit->insertItem(i18n("Direct debit"), (int)Schedule::PaymentType::DirectDebit); - m_paymentMethodEdit->insertItem(i18n("Standing order"), (int)Schedule::PaymentType::StandingOrder); - m_paymentMethodEdit->insertItem(i18n("Bank transfer"), (int)Schedule::PaymentType::BankTransfer); - m_paymentMethodEdit->insertItem(i18n("Write check"), (int)Schedule::PaymentType::WriteChecque); - m_paymentMethodEdit->insertItem(i18nc("Other payment method", "Other"), (int)Schedule::PaymentType::Other); - - auto method = d->m_schedule.paymentType(); - if (method == Schedule::PaymentType::Any) - method = Schedule::PaymentType::Other; - m_paymentMethodEdit->setCurrentItem((int)method); - - switch (d->m_schedule.weekendOption()) { - case Schedule::WeekendOption::MoveNothing: - m_weekendOptionEdit->setCurrentIndex(0); - break; - case Schedule::WeekendOption::MoveBefore: - m_weekendOptionEdit->setCurrentIndex(1); - break; - case Schedule::WeekendOption::MoveAfter: - m_weekendOptionEdit->setCurrentIndex(2); - break; - } - m_estimateEdit->setChecked(!d->m_schedule.isFixed()); - m_lastDayInMonthEdit->setChecked(d->m_schedule.lastDayInMonth()); - m_autoEnterEdit->setChecked(d->m_schedule.autoEnter()); - m_endSeriesEdit->setChecked(d->m_schedule.willEnd()); - - m_endOptionsFrame->setEnabled(d->m_schedule.willEnd()); - if (d->m_schedule.willEnd()) { - m_RemainingEdit->setValue(d->m_schedule.transactionsRemaining()); - m_FinalPaymentEdit->setDate(d->m_schedule.endDate()); + t.clearId(); + t.setEntryDate(QDate()); + return t; } + + KEditScheduleDlg *q_ptr; + Ui::KEditScheduleDlg *ui; + MyMoneySchedule m_schedule; + KMyMoneyRegister::Transaction* m_item; + QWidgetList m_tabOrderWidgets; + TransactionEditor* m_editor; + kMandatoryFieldGroup* m_requiredFields; +}; - connect(m_RemainingEdit, SIGNAL(valueChanged(int)), - this, SLOT(slotRemainingChanged(int))); - connect(m_FinalPaymentEdit, SIGNAL(dateChanged(QDate)), - this, SLOT(slotEndDateChanged(QDate))); - connect(m_frequencyEdit, SIGNAL(itemSelected(int)), - this, SLOT(slotFrequencyChanged(int))); - connect(m_frequencyNoEdit, SIGNAL(valueChanged(int)), - this, SLOT(slotOccurrenceMultiplierChanged(int))); - connect(buttonHelp, SIGNAL(clicked()), this, SLOT(slotShowHelp())); - - // force the initial height to be as small as possible - QTimer::singleShot(0, this, SLOT(slotSetupSize())); - - // we just hide the variation field for now and enable the logic - // once we have a respective member in the MyMoneySchedule object - m_variation->hide(); +KEditScheduleDlg::KEditScheduleDlg(const MyMoneySchedule& schedule, QWidget *parent) : + QDialog(parent), + d_ptr(new KEditScheduleDlgPrivate(this)) +{ + Q_D(KEditScheduleDlg); + d->m_schedule = schedule; + d->m_editor = 0; + d->init(); } KEditScheduleDlg::~KEditScheduleDlg() { + Q_D(KEditScheduleDlg); delete d; } @@ -180,8 +230,9 @@ TransactionEditor* KEditScheduleDlg::startEdit() { - KMyMoneyRegister::SelectedTransactions list(m_register); - TransactionEditor* editor = d->m_item->createEditor(m_form, list, QDate()); + Q_D(KEditScheduleDlg); + KMyMoneyRegister::SelectedTransactions list(d->ui->m_register); + TransactionEditor* editor = d->m_item->createEditor(d->ui->m_form, list, QDate()); // check that we use the same transaction commodity in all selected transactions // if not, we need to update this in the editor's list. The user can also bail out @@ -196,18 +247,18 @@ } if (editor) { - editor->m_scheduleInfo = m_nameEdit->text(); - connect(editor, SIGNAL(transactionDataSufficient(bool)), buttonOk, SLOT(setEnabled(bool))); - connect(editor, SIGNAL(escapePressed()), buttonCancel, SLOT(animateClick())); - connect(editor, SIGNAL(returnPressed()), buttonOk, SLOT(animateClick())); + editor->setScheduleInfo(d->ui->m_nameEdit->text()); + connect(editor, &TransactionEditor::transactionDataSufficient, d->ui->buttonBox->button(QDialogButtonBox::Ok), &QWidget::setEnabled); + connect(editor, &TransactionEditor::escapePressed, d->ui->buttonBox->button(QDialogButtonBox::Cancel), &QAbstractButton::animateClick); + connect(editor, &TransactionEditor::returnPressed, d->ui->buttonBox->button(QDialogButtonBox::Ok), &QAbstractButton::animateClick); - connect(MyMoneyFile::instance(), SIGNAL(dataChanged()), editor, SLOT(slotReloadEditWidgets())); + connect(MyMoneyFile::instance(), &MyMoneyFile::dataChanged, editor, &TransactionEditor::slotReloadEditWidgets); // connect(editor, SIGNAL(finishEdit(KMyMoneyRegister::SelectedTransactions)), this, SLOT(slotLeaveEditMode(KMyMoneyRegister::SelectedTransactions))); - connect(editor, SIGNAL(createPayee(QString,QString&)), kmymoney, SLOT(slotPayeeNew(QString,QString&))); - connect(editor, SIGNAL(createTag(QString,QString&)), kmymoney, SLOT(slotTagNew(QString,QString&))); - connect(editor, SIGNAL(createCategory(MyMoneyAccount&,MyMoneyAccount)), kmymoney, SLOT(slotCategoryNew(MyMoneyAccount&,MyMoneyAccount))); - connect(editor, SIGNAL(createSecurity(MyMoneyAccount&,MyMoneyAccount)), kmymoney, SLOT(slotInvestmentNew(MyMoneyAccount&,MyMoneyAccount))); - connect(MyMoneyFile::instance(), SIGNAL(dataChanged()), editor, SLOT(slotReloadEditWidgets())); + connect(editor, &TransactionEditor::createPayee, kmymoney, static_cast(&KMyMoneyApp::slotPayeeNew)); + connect(editor, &TransactionEditor::createTag, kmymoney, static_cast(&KMyMoneyApp::slotTagNew)); + connect(editor, &TransactionEditor::createCategory, kmymoney, static_cast(&KMyMoneyApp::slotCategoryNew)); + connect(editor, &TransactionEditor::createSecurity, kmymoney, static_cast(&KMyMoneyApp::slotInvestmentNew)); + connect(MyMoneyFile::instance(), &MyMoneyFile::dataChanged, editor, &TransactionEditor::slotReloadEditWidgets); // create the widgets, place them in the parent and load them with data // setup tab order @@ -219,7 +270,7 @@ break; case Schedule::Type::Bill: action = KMyMoneyRegister::ActionWithdrawal; - editor->m_paymentMethod = d->m_schedule.paymentType(); + editor->setPaymentMethod(d->m_schedule.paymentType()); break; case Schedule::Type::Transfer: action = KMyMoneyRegister::ActionTransfer; @@ -231,7 +282,8 @@ if (d->m_schedule.transaction().splits().count() > 0) { auto isDeposit = false; auto isTransfer = false; - foreach (const auto split, d->m_schedule.transaction().splits()) { + auto splits = d->m_schedule.transaction().splits(); + foreach (const auto split, splits) { if (split.accountId() == d->m_schedule.account().id()) { isDeposit = !(split.shares().isNegative()); } else { @@ -261,7 +313,7 @@ Q_ASSERT(!d->m_tabOrderWidgets.isEmpty()); - d->m_tabOrderWidgets.push_front(m_paymentMethodEdit); + d->m_tabOrderWidgets.push_front(d->ui->m_paymentMethodEdit); // editor->setup() leaves the tabbar as the last widget in the stack, but we // need it as first here. So we move it around. @@ -276,23 +328,23 @@ // don't forget our three buttons and additional widgets // make sure to use the correct order - d->m_tabOrderWidgets.push_front(m_frequencyEdit); - d->m_tabOrderWidgets.push_front(m_frequencyNoEdit); - d->m_tabOrderWidgets.push_front(m_nameEdit); - - d->m_tabOrderWidgets.append(m_weekendOptionEdit); - d->m_tabOrderWidgets.append(m_estimateEdit); - d->m_tabOrderWidgets.append(m_variation); - d->m_tabOrderWidgets.append(m_lastDayInMonthEdit); - d->m_tabOrderWidgets.append(m_autoEnterEdit); - d->m_tabOrderWidgets.append(m_endSeriesEdit); - d->m_tabOrderWidgets.append(m_RemainingEdit); - d->m_tabOrderWidgets.append(m_FinalPaymentEdit); - - d->m_tabOrderWidgets.append(buttonOk); - d->m_tabOrderWidgets.append(buttonCancel); - d->m_tabOrderWidgets.append(buttonHelp); - for (int i = 0; i < d->m_tabOrderWidgets.size(); ++i) { + d->m_tabOrderWidgets.push_front(d->ui->m_frequencyEdit); + d->m_tabOrderWidgets.push_front(d->ui->m_frequencyNoEdit); + d->m_tabOrderWidgets.push_front(d->ui->m_nameEdit); + + d->m_tabOrderWidgets.append(d->ui->m_weekendOptionEdit); + d->m_tabOrderWidgets.append(d->ui->m_estimateEdit); + d->m_tabOrderWidgets.append(d->ui->m_variation); + d->m_tabOrderWidgets.append(d->ui->m_lastDayInMonthEdit); + d->m_tabOrderWidgets.append(d->ui->m_autoEnterEdit); + d->m_tabOrderWidgets.append(d->ui->m_endSeriesEdit); + d->m_tabOrderWidgets.append(d->ui->m_RemainingEdit); + d->m_tabOrderWidgets.append(d->ui->m_FinalPaymentEdit); + + d->m_tabOrderWidgets.append(d->ui->buttonBox->button(QDialogButtonBox::Ok)); + d->m_tabOrderWidgets.append(d->ui->buttonBox->button(QDialogButtonBox::Cancel)); + d->m_tabOrderWidgets.append(d->ui->buttonBox->button(QDialogButtonBox::Help)); + for (auto i = 0; i < d->m_tabOrderWidgets.size(); ++i) { QWidget* w = d->m_tabOrderWidgets.at(i); if (w) { w->installEventFilter(this); @@ -303,12 +355,12 @@ // connect the postdate modification signal to our update routine kMyMoneyDateInput* dateEdit = dynamic_cast(editor->haveWidget("postdate")); if (dateEdit) - connect(dateEdit, SIGNAL(dateChanged(QDate)), this, SLOT(slotPostDateChanged(QDate))); + connect(dateEdit, &kMyMoneyDateInput::dateChanged, this, &KEditScheduleDlg::slotPostDateChanged); - m_nameEdit->setFocus(); + d->ui->m_nameEdit->setFocus(); // add the required fields to the mandatory group - d->m_requiredFields->add(m_nameEdit); + d->m_requiredFields->add(d->ui->m_nameEdit); d->m_requiredFields->add(editor->haveWidget("account")); d->m_requiredFields->add(editor->haveWidget("category")); d->m_requiredFields->add(editor->haveWidget("amount")); @@ -322,8 +374,8 @@ d->m_editor = editor; slotSetPaymentMethod((int)d->m_schedule.paymentType()); - connect(m_paymentMethodEdit, SIGNAL(itemSelected(int)), this, SLOT(slotSetPaymentMethod(int))); - connect(editor, SIGNAL(operationTypeChanged(int)), this, SLOT(slotFilterPaymentType(int))); + connect(d->ui->m_paymentMethodEdit, &KMyMoneyGeneralCombo::itemSelected, this, &KEditScheduleDlg::slotSetPaymentMethod); + connect(editor, &TransactionEditor::operationTypeChanged, this, &KEditScheduleDlg::slotFilterPaymentType); } return editor; @@ -331,9 +383,10 @@ void KEditScheduleDlg::accept() { + Q_D(KEditScheduleDlg); // Force the focus to be on the OK button. This will trigger creation // of any unknown objects (payees, categories etc.) - buttonOk->setFocus(); + d->ui->buttonBox->button(QDialogButtonBox::Ok)->setFocus(); // only accept if the button is really still enabled. We could end // up here, if the user filled all fields, the focus is on the category @@ -341,25 +394,26 @@ // OK button in this context, he will be asked if he wants to create // the category or not. In case he decides no, we end up here with no // category filled in, so we don't run through the final acceptance. - if (buttonOk->isEnabled()) - KEditScheduleDlgDecl::accept(); + if (d->ui->buttonBox->button(QDialogButtonBox::Ok)->isEnabled()) + QDialog::accept(); } -const MyMoneySchedule& KEditScheduleDlg::schedule() const +const MyMoneySchedule& KEditScheduleDlg::schedule() { + Q_D(KEditScheduleDlg); if (d->m_editor) { - MyMoneyTransaction t = transaction(); + auto t = d->transaction(); if (d->m_schedule.nextDueDate() != t.postDate()) { d->m_schedule.setNextDueDate(t.postDate()); d->m_schedule.setStartDate(t.postDate()); } d->m_schedule.setTransaction(t); - d->m_schedule.setName(m_nameEdit->text()); - d->m_schedule.setFixed(!m_estimateEdit->isChecked()); - d->m_schedule.setOccurrencePeriod(static_cast(m_frequencyEdit->currentItem())); - d->m_schedule.setOccurrenceMultiplier(m_frequencyNoEdit->value()); + d->m_schedule.setName(d->ui->m_nameEdit->text()); + d->m_schedule.setFixed(!d->ui->m_estimateEdit->isChecked()); + d->m_schedule.setOccurrencePeriod(static_cast(d->ui->m_frequencyEdit->currentItem())); + d->m_schedule.setOccurrenceMultiplier(d->ui->m_frequencyNoEdit->value()); - switch (m_weekendOptionEdit->currentIndex()) { + switch (d->ui->m_weekendOptionEdit->currentIndex()) { case 0: d->m_schedule.setWeekendOption(Schedule::WeekendOption::MoveNothing); break; @@ -391,14 +445,14 @@ qDebug("No tabbar found in KEditScheduleDlg::schedule(). Defaulting type to BILL"); } - if(m_lastDayInMonthEdit->isEnabled()) - d->m_schedule.setLastDayInMonth(m_lastDayInMonthEdit->isChecked()); + if(d->ui->m_lastDayInMonthEdit->isEnabled()) + d->m_schedule.setLastDayInMonth(d->ui->m_lastDayInMonthEdit->isChecked()); else d->m_schedule.setLastDayInMonth(false); - d->m_schedule.setAutoEnter(m_autoEnterEdit->isChecked()); - d->m_schedule.setPaymentType(static_cast(m_paymentMethodEdit->currentItem())); - if (m_endSeriesEdit->isEnabled() && m_endSeriesEdit->isChecked()) { - d->m_schedule.setEndDate(m_FinalPaymentEdit->date()); + d->m_schedule.setAutoEnter(d->ui->m_autoEnterEdit->isChecked()); + d->m_schedule.setPaymentType(static_cast(d->ui->m_paymentMethodEdit->currentItem())); + if (d->ui->m_endSeriesEdit->isEnabled() && d->ui->m_endSeriesEdit->isChecked()) { + d->m_schedule.setEndDate(d->ui->m_FinalPaymentEdit->date()); } else { d->m_schedule.setEndDate(QDate()); } @@ -406,26 +460,13 @@ return d->m_schedule; } -MyMoneyTransaction KEditScheduleDlg::transaction() const -{ - MyMoneyTransaction t = d->m_schedule.transaction(); - - if (d->m_editor) { - d->m_editor->createTransaction(t, d->m_schedule.transaction(), d->m_schedule.transaction().splits().isEmpty() ? MyMoneySplit() : d->m_schedule.transaction().splits().front(), false); - } - - t.clearId(); - t.setEntryDate(QDate()); - return t; -} - bool KEditScheduleDlg::focusNextPrevChild(bool next) { - bool rc = false; - QWidget *w = 0; + Q_D(KEditScheduleDlg); + auto rc = false; - w = qApp->focusWidget(); - int currentWidgetIndex = d->m_tabOrderWidgets.indexOf(w); + auto w = qApp->focusWidget(); + auto currentWidgetIndex = d->m_tabOrderWidgets.indexOf(w); while (w && currentWidgetIndex == -1) { // qDebug("'%s' not in list, use parent", qPrintable(w->objectName())); w = w->parentWidget(); @@ -456,57 +497,62 @@ void KEditScheduleDlg::resizeEvent(QResizeEvent* ev) { - m_register->resize(KMyMoneyRegister::DetailColumn); - m_form->resize(KMyMoneyTransactionForm::ValueColumn1); - KEditScheduleDlgDecl::resizeEvent(ev); + Q_D(KEditScheduleDlg); + d->ui->m_register->resize(KMyMoneyRegister::DetailColumn); + d->ui->m_form->resize(KMyMoneyTransactionForm::ValueColumn1); + QDialog::resizeEvent(ev); } void KEditScheduleDlg::slotRemainingChanged(int value) { + Q_D(KEditScheduleDlg); // Make sure the required fields are set - kMyMoneyDateInput* dateEdit = dynamic_cast(d->m_editor->haveWidget("postdate")); + auto dateEdit = dynamic_cast(d->m_editor->haveWidget("postdate")); d->m_schedule.setNextDueDate(dateEdit->date()); - d->m_schedule.setOccurrencePeriod(static_cast(m_frequencyEdit->currentItem())); - d->m_schedule.setOccurrenceMultiplier(m_frequencyNoEdit->value()); + d->m_schedule.setOccurrencePeriod(static_cast(d->ui->m_frequencyEdit->currentItem())); + d->m_schedule.setOccurrenceMultiplier(d->ui->m_frequencyNoEdit->value()); if (d->m_schedule.transactionsRemaining() != value) { - m_FinalPaymentEdit->blockSignals(true); - m_FinalPaymentEdit->setDate(d->m_schedule.dateAfter(value)); - m_FinalPaymentEdit->blockSignals(false); + d->ui->m_FinalPaymentEdit->blockSignals(true); + d->ui->m_FinalPaymentEdit->setDate(d->m_schedule.dateAfter(value)); + d->ui->m_FinalPaymentEdit->blockSignals(false); } } void KEditScheduleDlg::slotEndDateChanged(const QDate& date) { + Q_D(KEditScheduleDlg); // Make sure the required fields are set - kMyMoneyDateInput* dateEdit = dynamic_cast(d->m_editor->haveWidget("postdate")); + auto dateEdit = dynamic_cast(d->m_editor->haveWidget("postdate")); d->m_schedule.setNextDueDate(dateEdit->date()); - d->m_schedule.setOccurrencePeriod(static_cast(m_frequencyEdit->currentItem())); - d->m_schedule.setOccurrenceMultiplier(m_frequencyNoEdit->value()); + d->m_schedule.setOccurrencePeriod(static_cast(d->ui->m_frequencyEdit->currentItem())); + d->m_schedule.setOccurrenceMultiplier(d->ui->m_frequencyNoEdit->value()); if (d->m_schedule.endDate() != date) { d->m_schedule.setEndDate(date); - updateTransactionsRemaining(); + d->updateTransactionsRemaining(); } } void KEditScheduleDlg::slotPostDateChanged(const QDate& date) { + Q_D(KEditScheduleDlg); if (d->m_schedule.nextDueDate() != date) { - if (m_endOptionsFrame->isEnabled()) { + if (d->ui->m_endOptionsFrame->isEnabled()) { d->m_schedule.setNextDueDate(date); - d->m_schedule.setOccurrenceMultiplier(m_frequencyNoEdit->value()); - d->m_schedule.setOccurrencePeriod(static_cast(m_frequencyEdit->currentItem())); - d->m_schedule.setEndDate(m_FinalPaymentEdit->date()); - updateTransactionsRemaining(); + d->m_schedule.setOccurrenceMultiplier(d->ui->m_frequencyNoEdit->value()); + d->m_schedule.setOccurrencePeriod(static_cast(d->ui->m_frequencyEdit->currentItem())); + d->m_schedule.setEndDate(d->ui->m_FinalPaymentEdit->date()); + d->updateTransactionsRemaining(); } } } void KEditScheduleDlg::slotSetPaymentMethod(int item) { - kMyMoneyLineEdit* dateEdit = dynamic_cast(d->m_editor->haveWidget("number")); + Q_D(KEditScheduleDlg); + auto dateEdit = dynamic_cast(d->m_editor->haveWidget("number")); if (dateEdit) { dateEdit->setVisible(item == (int)Schedule::PaymentType::WriteChecque); @@ -521,30 +567,31 @@ void KEditScheduleDlg::slotFrequencyChanged(int item) { - m_endSeriesEdit->setEnabled(item != (int)Schedule::Occurrence::Once); - bool isEndSeries = m_endSeriesEdit->isChecked(); + Q_D(KEditScheduleDlg); + d->ui->m_endSeriesEdit->setEnabled(item != (int)Schedule::Occurrence::Once); + bool isEndSeries = d->ui->m_endSeriesEdit->isChecked(); if (isEndSeries) - m_endOptionsFrame->setEnabled(item != (int)Schedule::Occurrence::Once); + d->ui->m_endOptionsFrame->setEnabled(item != (int)Schedule::Occurrence::Once); switch (item) { case (int)Schedule::Occurrence::Daily: case (int)Schedule::Occurrence::Weekly: - m_frequencyNoEdit->setEnabled(true); - m_lastDayInMonthEdit->setEnabled(false); + d->ui->m_frequencyNoEdit->setEnabled(true); + d->ui->m_lastDayInMonthEdit->setEnabled(false); break; case (int)Schedule::Occurrence::EveryHalfMonth: case (int)Schedule::Occurrence::Monthly: case (int)Schedule::Occurrence::Yearly: // Supports Frequency Number - m_frequencyNoEdit->setEnabled(true); - m_lastDayInMonthEdit->setEnabled(true); + d->ui->m_frequencyNoEdit->setEnabled(true); + d->ui->m_lastDayInMonthEdit->setEnabled(true); break; default: // Multiplier is always 1 - m_frequencyNoEdit->setEnabled(false); - m_frequencyNoEdit->setValue(1); - m_lastDayInMonthEdit->setEnabled(true); + d->ui->m_frequencyNoEdit->setEnabled(false); + d->ui->m_frequencyNoEdit->setValue(1); + d->ui->m_lastDayInMonthEdit->setEnabled(true); break; } if (isEndSeries && (item != (int)Schedule::Occurrence::Once)) { @@ -552,39 +599,30 @@ // of remaining transactions kMyMoneyDateInput* dateEdit = dynamic_cast(d->m_editor->haveWidget("postdate")); d->m_schedule.setNextDueDate(dateEdit->date()); - d->m_schedule.setOccurrenceMultiplier(m_frequencyNoEdit->value()); + d->m_schedule.setOccurrenceMultiplier(d->ui->m_frequencyNoEdit->value()); d->m_schedule.setOccurrencePeriod(static_cast(item)); - d->m_schedule.setEndDate(m_FinalPaymentEdit->date()); - updateTransactionsRemaining(); + d->m_schedule.setEndDate(d->ui->m_FinalPaymentEdit->date()); + d->updateTransactionsRemaining(); } } void KEditScheduleDlg::slotOccurrenceMultiplierChanged(int multiplier) { + Q_D(KEditScheduleDlg); // Make sure the required fields are set - int oldOccurrenceMultiplier = d->m_schedule.occurrenceMultiplier(); + auto oldOccurrenceMultiplier = d->m_schedule.occurrenceMultiplier(); if (multiplier != oldOccurrenceMultiplier) { - if (m_endOptionsFrame->isEnabled()) { + if (d->ui->m_endOptionsFrame->isEnabled()) { kMyMoneyDateInput* dateEdit = dynamic_cast(d->m_editor->haveWidget("postdate")); d->m_schedule.setNextDueDate(dateEdit->date()); d->m_schedule.setOccurrenceMultiplier(multiplier); - d->m_schedule.setOccurrencePeriod(static_cast(m_frequencyEdit->currentItem())); - d->m_schedule.setEndDate(m_FinalPaymentEdit->date()); - updateTransactionsRemaining(); + d->m_schedule.setOccurrencePeriod(static_cast(d->ui->m_frequencyEdit->currentItem())); + d->m_schedule.setEndDate(d->ui->m_FinalPaymentEdit->date()); + d->updateTransactionsRemaining(); } } } -void KEditScheduleDlg::updateTransactionsRemaining() -{ - int remain = d->m_schedule.transactionsRemaining(); - if (remain != m_RemainingEdit->value()) { - m_RemainingEdit->blockSignals(true); - m_RemainingEdit->setValue(remain); - m_RemainingEdit->blockSignals(false); - } -} - void KEditScheduleDlg::slotShowHelp() { KHelpClient::invokeHelp("details.schedules.intro"); @@ -592,31 +630,32 @@ void KEditScheduleDlg::slotFilterPaymentType(int index) { + Q_D(KEditScheduleDlg); //save selected item to reload if possible - int selectedId = m_paymentMethodEdit->itemData(m_paymentMethodEdit->currentIndex(), Qt::UserRole).toInt(); + auto selectedId = d->ui->m_paymentMethodEdit->itemData(d->ui->m_paymentMethodEdit->currentIndex(), Qt::UserRole).toInt(); //clear and reload the widget with the correct items - m_paymentMethodEdit->clear(); + d->ui->m_paymentMethodEdit->clear(); // load option widgets KMyMoneyRegister::Action action = static_cast(index); if (action != KMyMoneyRegister::ActionWithdrawal) { - m_paymentMethodEdit->insertItem(i18n("Direct deposit"), (int)Schedule::PaymentType::DirectDeposit); - m_paymentMethodEdit->insertItem(i18n("Manual deposit"), (int)Schedule::PaymentType::ManualDeposit); + d->ui->m_paymentMethodEdit->insertItem(i18n("Direct deposit"), (int)Schedule::PaymentType::DirectDeposit); + d->ui->m_paymentMethodEdit->insertItem(i18n("Manual deposit"), (int)Schedule::PaymentType::ManualDeposit); } if (action != KMyMoneyRegister::ActionDeposit) { - m_paymentMethodEdit->insertItem(i18n("Direct debit"), (int)Schedule::PaymentType::DirectDebit); - m_paymentMethodEdit->insertItem(i18n("Write check"), (int)Schedule::PaymentType::WriteChecque); + d->ui->m_paymentMethodEdit->insertItem(i18n("Direct debit"), (int)Schedule::PaymentType::DirectDebit); + d->ui->m_paymentMethodEdit->insertItem(i18n("Write check"), (int)Schedule::PaymentType::WriteChecque); } - m_paymentMethodEdit->insertItem(i18n("Standing order"), (int)Schedule::PaymentType::StandingOrder); - m_paymentMethodEdit->insertItem(i18n("Bank transfer"), (int)Schedule::PaymentType::BankTransfer); - m_paymentMethodEdit->insertItem(i18nc("Other payment method", "Other"), (int)Schedule::PaymentType::Other); + d->ui->m_paymentMethodEdit->insertItem(i18n("Standing order"), (int)Schedule::PaymentType::StandingOrder); + d->ui->m_paymentMethodEdit->insertItem(i18n("Bank transfer"), (int)Schedule::PaymentType::BankTransfer); + d->ui->m_paymentMethodEdit->insertItem(i18nc("Other payment method", "Other"), (int)Schedule::PaymentType::Other); - int newIndex = m_paymentMethodEdit->findData(QVariant(selectedId), Qt::UserRole, Qt::MatchExactly); + auto newIndex = d->ui->m_paymentMethodEdit->findData(QVariant(selectedId), Qt::UserRole, Qt::MatchExactly); if (newIndex > -1) { - m_paymentMethodEdit->setCurrentIndex(newIndex); + d->ui->m_paymentMethodEdit->setCurrentIndex(newIndex); } else { - m_paymentMethodEdit->setCurrentIndex(0); + d->ui->m_paymentMethodEdit->setCurrentIndex(0); } } diff --git a/kmymoney/dialogs/keditscheduledlg.ui b/kmymoney/dialogs/keditscheduledlg.ui new file mode 100644 --- /dev/null +++ b/kmymoney/dialogs/keditscheduledlg.ui @@ -0,0 +1,469 @@ + + + KEditScheduleDlg + + + + 0 + 0 + 798 + 640 + + + + Edit Scheduled transaction + + + true + + + + + + + + + + Schedule name: + + + false + + + + + + + Qt::StrongFocus + + + + + + + + + + + Frequency: + + + false + + + + + + + Qt::StrongFocus + + + Number of selected periods between entries + + + 1 + + + 999 + + + + + + + + + + + + + + Payment information + + + + + + + + Payment method + + + false + + + + + + + + 0 + 0 + + + + + + + + Qt::Horizontal + + + QSizePolicy::Expanding + + + + 61 + 21 + + + + + + + + + + QFrame::HLine + + + QFrame::Sunken + + + + + + + 0 + + + 12 + + + + + + + 5 + + + 1 + + + + + + + + + + Options + + + + + + + + + Do nothing + + + + + Change the date to the previous processing day + + + + + Change the date to the next processing day + + + + + + + + If this schedule occurs on a non-processing day: + + + false + + + + + + + + + + + The amount is an estimate because it varies for each payment + + + + + + + false + + + 32767 + + + 10 + + + + + + + Qt::Horizontal + + + QSizePolicy::Expanding + + + + 21 + 20 + + + + + + + + + + Process this schedule always at the last day of a month + + + + + + + Enter this schedule into the register automatically when it is due + + + + + + + This schedule will end at some time + + + + + + + QFrame::NoFrame + + + QFrame::Raised + + + + 0 + + + 0 + + + 0 + + + 0 + + + + + Qt::Horizontal + + + QSizePolicy::Fixed + + + + 20 + 20 + + + + + + + + Number of transactions remaining: + + + false + + + + + + + 0 + + + 9999 + + + + + + + Date of final transaction: + + + false + + + + + + + Qt::StrongFocus + + + + + + + + + + + + + Qt::Vertical + + + QSizePolicy::Expanding + + + + 20 + 16 + + + + + + + + QDialogButtonBox::Cancel|QDialogButtonBox::Help|QDialogButtonBox::Ok + + + + + + + + + KComboBox + QComboBox +
kcombobox.h
+
+ + KLineEdit + QLineEdit +
klineedit.h
+
+ + KMyMoneyRegister::Register + QWidget +
register.h
+
+ + KMyMoneyGeneralCombo + QWidget +
kmymoneymvccombo.h
+ 1 +
+ + KMyMoneyOccurrencePeriodCombo + QWidget +
kmymoneymvccombo.h
+ 1 +
+ + KMyMoneyTransactionForm::TransactionForm + QWidget +
transactionform.h
+
+ + kMyMoneyDateInput + QWidget +
kmymoneydateinput.h
+
+
+ + + + m_endSeriesEdit + toggled(bool) + m_endOptionsFrame + setEnabled(bool) + + + 20 + 20 + + + 20 + 20 + + + + + m_estimateEdit + toggled(bool) + m_variation + setEnabled(bool) + + + 20 + 20 + + + 20 + 20 + + + + + buttonBox + accepted() + KEditScheduleDlg + accept() + + + 398 + 616 + + + 398 + 319 + + + + + buttonBox + rejected() + KEditScheduleDlg + reject() + + + 398 + 616 + + + 398 + 319 + + + + +
diff --git a/kmymoney/dialogs/keditscheduledlgdecl.ui b/kmymoney/dialogs/keditscheduledlgdecl.ui deleted file mode 100644 --- a/kmymoney/dialogs/keditscheduledlgdecl.ui +++ /dev/null @@ -1,496 +0,0 @@ - - - - - - KEditScheduleDlgDecl - - - - 0 - 0 - 798 - 640 - - - - Edit Scheduled transaction - - - true - - - - - - - - - - Schedule name: - - - false - - - - - - - Qt::StrongFocus - - - - - - - - - - - Frequency: - - - false - - - - - - - 999 - - - 1 - - - Number of selected periods between entries - - - Qt::StrongFocus - - - - - - - - - - - - - - Payment information - - - - - - - - Payment method - - - false - - - - - - - - 3 - 0 - 0 - 0 - - - - - - - - - 61 - 21 - - - - QSizePolicy::Expanding - - - Qt::Horizontal - - - - - - - - - QFrame::HLine - - - QFrame::Sunken - - - - - - - 0 - - - 12 - - - - Security - - - - - Details - - - - - C - - - - - Payment - - - - - Deposit - - - - - Quantity - - - - - Price - - - - - Value - - - - - Balance - - - - - - - - 5 - - - 1 - - - - - - - - - - Options - - - - - - - - - Do nothing - - - - - Change the date to the previous processing day - - - - - Change the date to the next processing day - - - - - - - - If this schedule occurs on a non-processing day: - - - false - - - - - - - - - - - The amount is an estimate because it varies for each payment - - - - - - - false - - - 10 - - - 32767 - - - - - - - - 21 - 20 - - - - QSizePolicy::Expanding - - - Qt::Horizontal - - - - - - - - - Process this schedule always at the last day of a month - - - - - - - Enter this schedule into the register automatically when it is due - - - - - - - This schedule will end at some time - - - - - - - QFrame::NoFrame - - - QFrame::Raised - - - - 0 - - - - - - 20 - 20 - - - - QSizePolicy::Fixed - - - Qt::Horizontal - - - - - - - Number of transactions remaining: - - - false - - - - - - - 0 - - - 9999 - - - - - - - Date of final transaction: - - - false - - - - - - - Qt::StrongFocus - - - - - - - - - - - - - - 20 - 16 - - - - QSizePolicy::Expanding - - - Qt::Vertical - - - - - - - 0 - - - 6 - - - - - Help - - - - - - - - 280 - 0 - - - - QSizePolicy::Expanding - - - Qt::Horizontal - - - - - - - OK - - - true - - - true - - - - - - - Cancel - - - - - - - - - - - KComboBox - QComboBox -
kcombobox.h
-
- - KMyMoneyGeneralCombo - QWidget -
kmymoneymvccombo.h
- 1 -
- - KMyMoneyOccurrencePeriodCombo - QWidget -
kmymoneymvccombo.h
- 1 -
- -
- - - buttonOk - clicked() - KEditScheduleDlgDecl - accept() - - - m_endSeriesEdit - toggled(bool) - m_endOptionsFrame - setEnabled(bool) - - - buttonCancel - clicked() - KEditScheduleDlgDecl - reject() - - - m_estimateEdit - toggled(bool) - m_variation - setEnabled(bool) - - -
diff --git a/kmymoney/dialogs/kenterscheduledlg.h b/kmymoney/dialogs/kenterscheduledlg.h --- a/kmymoney/dialogs/kenterscheduledlg.h +++ b/kmymoney/dialogs/kenterscheduledlg.h @@ -4,6 +4,7 @@ begin : Sat Apr 7 2007 copyright : (C) 2007 by Thomas Baumgart email : Thomas Baumgart + (C) 2017 by Łukasz Wojniłowicz ***************************************************************************/ /*************************************************************************** @@ -30,26 +31,25 @@ // Project Includes class MyMoneySchedule; +class MyMoneyTransaction; class TransactionEditor; -#include "ui_kenterscheduledlgdecl.h" -#include "kmymoneyutils.h" +namespace Ui { class KEnterScheduleDlg; } + +namespace eDialogs { enum class ScheduleResultCode; } /** * @author Thomas Baumgart */ -class KEnterScheduleDlgDecl : public QDialog, public Ui::KEnterScheduleDlgDecl -{ -public: - KEnterScheduleDlgDecl(QWidget *parent) : QDialog(parent) { - setupUi(this); - } -}; -class KEnterScheduleDlg : public KEnterScheduleDlgDecl + +class KEnterScheduleDlgPrivate; +class KEnterScheduleDlg : public QDialog { Q_OBJECT + Q_DISABLE_COPY(KEnterScheduleDlg) + public: - KEnterScheduleDlg(QWidget *parent, const MyMoneySchedule& schedule); + explicit KEnterScheduleDlg(QWidget *parent, const MyMoneySchedule& schedule); ~KEnterScheduleDlg(); TransactionEditor* startEdit(); @@ -67,11 +67,11 @@ * value only makes sense, once the dialog has been executed. * Before execution it returns @a Cancel. */ - KMyMoneyUtils::EnterScheduleResultCodeE resultCode() const; + eDialogs::ScheduleResultCode resultCode() const; protected: /// Overridden for internal reasons. No API changes. - bool focusNextPrevChild(bool next); + bool focusNextPrevChild(bool next) override; /** * This method returns the adjusts @a _date according to @@ -79,10 +79,10 @@ */ QDate date(const QDate& _date) const; - void resizeEvent(QResizeEvent* ev); + void resizeEvent(QResizeEvent* ev) override; public slots: - int exec(); + int exec() override; private slots: void slotSetupSize(); @@ -91,10 +91,8 @@ void slotSkip(); private: - /// \internal d-pointer class. - class Private; - /// \internal d-pointer instance. - Private* const d; + KEnterScheduleDlgPrivate * const d_ptr; + Q_DECLARE_PRIVATE(KEnterScheduleDlg) }; #endif diff --git a/kmymoney/dialogs/kenterscheduledlg.cpp b/kmymoney/dialogs/kenterscheduledlg.cpp --- a/kmymoney/dialogs/kenterscheduledlg.cpp +++ b/kmymoney/dialogs/kenterscheduledlg.cpp @@ -4,6 +4,7 @@ begin : Sat Apr 7 2007 copyright : (C) 2007 by Thomas Baumgart email : Thomas Baumgart + (C) 2017 by Łukasz Wojniłowicz ***************************************************************************/ /*************************************************************************** @@ -38,6 +39,7 @@ // ---------------------------------------------------------------------------- // Project Includes +#include "ui_kenterscheduledlg.h" #include "mymoneyfile.h" #include "mymoneyschedule.h" #include "register.h" @@ -50,102 +52,123 @@ #include "kmymoney.h" #include "icons/icons.h" #include "mymoneyenums.h" +#include "dialogenums.h" using namespace Icons; -class KEnterScheduleDlg::Private +class KEnterScheduleDlgPrivate { + Q_DISABLE_COPY(KEnterScheduleDlgPrivate) + public: - Private() : m_item(0), m_showWarningOnce(true) {} - ~Private() {} + KEnterScheduleDlgPrivate() : + ui(new Ui::KEnterScheduleDlg), + m_item(nullptr), + m_showWarningOnce(true) + { + } + ~KEnterScheduleDlgPrivate() + { + delete ui; + } + + Ui::KEnterScheduleDlg *ui; MyMoneySchedule m_schedule; KMyMoneyRegister::Transaction* m_item; QWidgetList m_tabOrderWidgets; bool m_showWarningOnce; - KMyMoneyUtils::EnterScheduleResultCodeE m_extendedReturnCode; + eDialogs::ScheduleResultCode m_extendedReturnCode; }; KEnterScheduleDlg::KEnterScheduleDlg(QWidget *parent, const MyMoneySchedule& schedule) : - KEnterScheduleDlgDecl(parent), - d(new Private) + QDialog(parent), + d_ptr(new KEnterScheduleDlgPrivate) { + Q_D(KEnterScheduleDlg); + d->ui->setupUi(this); d->m_schedule = schedule; - d->m_extendedReturnCode = KMyMoneyUtils::Enter; - buttonOk->setIcon(QIcon::fromTheme(g_Icons[Icon::KeyEnter])); - buttonSkip->setIcon(QIcon::fromTheme(g_Icons[Icon::MediaSeekForward])); - KGuiItem::assign(buttonCancel, KStandardGuiItem::cancel()); - KGuiItem::assign(buttonHelp, KStandardGuiItem::help()); - buttonIgnore->setHidden(true); - buttonSkip->setHidden(true); + d->m_extendedReturnCode = eDialogs::ScheduleResultCode::Enter; + d->ui->buttonOk->setIcon(QIcon::fromTheme(g_Icons[Icon::KeyEnter])); + d->ui->buttonSkip->setIcon(QIcon::fromTheme(g_Icons[Icon::MediaSeekForward])); + KGuiItem::assign(d->ui->buttonCancel, KStandardGuiItem::cancel()); + KGuiItem::assign(d->ui->buttonHelp, KStandardGuiItem::help()); + d->ui->buttonIgnore->setHidden(true); + d->ui->buttonSkip->setHidden(true); // make sure, we have a tabbar with the form - KMyMoneyTransactionForm::TabBar* tabbar = m_form->tabBar(m_form->parentWidget()); + KMyMoneyTransactionForm::TabBar* tabbar = d->ui->m_form->tabBar(d->ui->m_form->parentWidget()); // we never need to see the register - m_register->hide(); + d->ui->m_register->hide(); // ... setup the form ... - m_form->setupForm(d->m_schedule.account()); + d->ui->m_form->setupForm(d->m_schedule.account()); // ... and the register ... - m_register->clear(); + d->ui->m_register->clear(); // ... now add the transaction to register and form ... MyMoneyTransaction t = transaction(); - d->m_item = KMyMoneyRegister::Register::transactionFactory(m_register, t, + d->m_item = KMyMoneyRegister::Register::transactionFactory(d->ui->m_register, t, d->m_schedule.transaction().splits().isEmpty() ? MyMoneySplit() : d->m_schedule.transaction().splits().front(), 0); - m_register->selectItem(d->m_item); + d->ui->m_register->selectItem(d->m_item); // show the account row d->m_item->setShowRowInForm(0, true); - m_form->slotSetTransaction(d->m_item); + d->ui->m_form->slotSetTransaction(d->m_item); // no need to see the tabbar tabbar->hide(); // setup name and type - m_scheduleName->setText(d->m_schedule.name()); - m_type->setText(KMyMoneyUtils::scheduleTypeToString(d->m_schedule.type())); + d->ui->m_scheduleName->setText(d->m_schedule.name()); + d->ui->m_type->setText(KMyMoneyUtils::scheduleTypeToString(d->m_schedule.type())); - connect(buttonHelp, SIGNAL(clicked()), this, SLOT(slotShowHelp())); - connect(buttonIgnore, SIGNAL(clicked()), this, SLOT(slotIgnore())); - connect(buttonSkip, SIGNAL(clicked()), this, SLOT(slotSkip())); + connect(d->ui->buttonHelp, &QAbstractButton::clicked, this, &KEnterScheduleDlg::slotShowHelp); + connect(d->ui->buttonIgnore, &QAbstractButton::clicked, this, &KEnterScheduleDlg::slotIgnore); + connect(d->ui->buttonSkip, &QAbstractButton::clicked, this, &KEnterScheduleDlg::slotSkip); } KEnterScheduleDlg::~KEnterScheduleDlg() { + Q_D(KEnterScheduleDlg); delete d; } -KMyMoneyUtils::EnterScheduleResultCodeE KEnterScheduleDlg::resultCode() const +eDialogs::ScheduleResultCode KEnterScheduleDlg::resultCode() const { + Q_D(const KEnterScheduleDlg); if (result() == QDialog::Accepted) return d->m_extendedReturnCode; - return KMyMoneyUtils::Cancel; + return eDialogs::ScheduleResultCode::Cancel; } void KEnterScheduleDlg::showExtendedKeys(bool visible) { - buttonIgnore->setVisible(visible); - buttonSkip->setVisible(visible); + Q_D(KEnterScheduleDlg); + d->ui->buttonIgnore->setVisible(visible); + d->ui->buttonSkip->setVisible(visible); } void KEnterScheduleDlg::slotIgnore() { - d->m_extendedReturnCode = KMyMoneyUtils::Ignore; + Q_D(KEnterScheduleDlg); + d->m_extendedReturnCode = eDialogs::ScheduleResultCode::Ignore; accept(); } void KEnterScheduleDlg::slotSkip() { - d->m_extendedReturnCode = KMyMoneyUtils::Skip; + Q_D(KEnterScheduleDlg); + d->m_extendedReturnCode = eDialogs::ScheduleResultCode::Skip; accept(); } MyMoneyTransaction KEnterScheduleDlg::transaction() { - MyMoneyTransaction t = d->m_schedule.transaction(); + Q_D(KEnterScheduleDlg); + auto t = d->m_schedule.transaction(); try { if (d->m_schedule.type() == eMyMoney::Schedule::Type::LoanPayment) { @@ -162,18 +185,20 @@ QDate KEnterScheduleDlg::date(const QDate& _date) const { - QDate date(_date); + Q_D(const KEnterScheduleDlg); + auto date(_date); return d->m_schedule.adjustedDate(date, d->m_schedule.weekendOption()); } void KEnterScheduleDlg::resizeEvent(QResizeEvent* ev) { - m_register->resize(KMyMoneyRegister::DetailColumn); - m_form->resize(KMyMoneyTransactionForm::ValueColumn1); - KEnterScheduleDlgDecl::resizeEvent(ev); + Q_UNUSED(ev) + Q_D(KEnterScheduleDlg); + d->ui->m_register->resize(KMyMoneyRegister::DetailColumn); + d->ui->m_form->resize(KMyMoneyTransactionForm::ValueColumn1); + QDialog::resizeEvent(ev); } - void KEnterScheduleDlg::slotSetupSize() { resize(width(), minimumSizeHint().height()); @@ -181,6 +206,7 @@ int KEnterScheduleDlg::exec() { + Q_D(KEnterScheduleDlg); if (d->m_showWarningOnce) { d->m_showWarningOnce = false; KMessageBox::information(this, QString("") + i18n("

Please check that all the details in the following dialog are correct and press OK.

Editable data can be changed and can either be applied to just this occurrence or for all subsequent occurrences for this schedule. (You will be asked what you intend after pressing OK in the following dialog)

") + QString("
"), i18n("Enter scheduled transaction"), "EnterScheduleDlgInfo"); @@ -188,16 +214,16 @@ // force the initial height to be as small as possible QTimer::singleShot(0, this, SLOT(slotSetupSize())); - - return KEnterScheduleDlgDecl::exec(); + return QDialog::exec(); } TransactionEditor* KEnterScheduleDlg::startEdit() { - KMyMoneyRegister::SelectedTransactions list(m_register); - TransactionEditor* editor = d->m_item->createEditor(m_form, list, QDate()); - editor->m_scheduleInfo = d->m_schedule.name(); - editor->m_paymentMethod = d->m_schedule.paymentType(); + Q_D(KEnterScheduleDlg); + KMyMoneyRegister::SelectedTransactions list(d->ui->m_register); + TransactionEditor* editor = d->m_item->createEditor(d->ui->m_form, list, QDate()); + editor->setScheduleInfo(d->m_schedule.name()); + editor->setPaymentMethod(d->m_schedule.paymentType()); // check that we use the same transaction commodity in all selected transactions // if not, we need to update this in the editor's list. The user can also bail out @@ -212,17 +238,17 @@ } if (editor) { - connect(editor, SIGNAL(transactionDataSufficient(bool)), buttonOk, SLOT(setEnabled(bool))); - connect(editor, SIGNAL(escapePressed()), buttonCancel, SLOT(animateClick())); - connect(editor, SIGNAL(returnPressed()), buttonOk, SLOT(animateClick())); + connect(editor, &TransactionEditor::transactionDataSufficient, d->ui->buttonOk, &QWidget::setEnabled); + connect(editor, &TransactionEditor::escapePressed, d->ui->buttonCancel, &QAbstractButton::animateClick); + connect(editor, &TransactionEditor::returnPressed, d->ui->buttonOk, &QAbstractButton::animateClick); - connect(MyMoneyFile::instance(), SIGNAL(dataChanged()), editor, SLOT(slotReloadEditWidgets())); + connect(MyMoneyFile::instance(), &MyMoneyFile::dataChanged, editor, &TransactionEditor::slotReloadEditWidgets); // connect(editor, SIGNAL(finishEdit(KMyMoneyRegister::SelectedTransactions)), this, SLOT(slotLeaveEditMode(KMyMoneyRegister::SelectedTransactions))); - connect(editor, SIGNAL(createPayee(QString,QString&)), kmymoney, SLOT(slotPayeeNew(QString,QString&))); - connect(editor, SIGNAL(createTag(QString,QString&)), kmymoney, SLOT(slotTagNew(QString,QString&))); - connect(editor, SIGNAL(createCategory(MyMoneyAccount&,MyMoneyAccount)), kmymoney, SLOT(slotCategoryNew(MyMoneyAccount&,MyMoneyAccount))); - connect(editor, SIGNAL(createSecurity(MyMoneyAccount&,MyMoneyAccount)), kmymoney, SLOT(slotInvestmentNew(MyMoneyAccount&,MyMoneyAccount))); - connect(MyMoneyFile::instance(), SIGNAL(dataChanged()), editor, SLOT(slotReloadEditWidgets())); + connect(editor, &TransactionEditor::createPayee, kmymoney, static_cast(&KMyMoneyApp::slotPayeeNew)); + connect(editor, &TransactionEditor::createTag, kmymoney, static_cast(&KMyMoneyApp::slotTagNew)); + connect(editor, &TransactionEditor::createCategory, kmymoney, static_cast(&KMyMoneyApp::slotCategoryNew)); + connect(editor, &TransactionEditor::createSecurity, kmymoney, static_cast(&KMyMoneyApp::slotInvestmentNew)); + connect(MyMoneyFile::instance(), &MyMoneyFile::dataChanged, editor, &TransactionEditor::slotReloadEditWidgets); // create the widgets, place them in the parent and load them with data // setup tab order @@ -254,7 +280,7 @@ QString num = t.splits().first().number(); QWidget* w = editor->haveWidget("number"); if (d->m_schedule.paymentType() == eMyMoney::Schedule::PaymentType::WriteChecque) { - MyMoneyFile* file = MyMoneyFile::instance(); + auto file = MyMoneyFile::instance(); if (file->checkNoUsed(d->m_schedule.account().id(), num)) { // increment and try again num = KMyMoneyUtils::getAdjacentNumber(num); @@ -286,11 +312,11 @@ } // don't forget our three buttons - d->m_tabOrderWidgets.append(buttonOk); - d->m_tabOrderWidgets.append(buttonCancel); - d->m_tabOrderWidgets.append(buttonHelp); + d->m_tabOrderWidgets.append(d->ui->buttonOk); + d->m_tabOrderWidgets.append(d->ui->buttonCancel); + d->m_tabOrderWidgets.append(d->ui->buttonHelp); - for (int i = 0; i < d->m_tabOrderWidgets.size(); ++i) { + for (auto i = 0; i < d->m_tabOrderWidgets.size(); ++i) { QWidget* w = d->m_tabOrderWidgets.at(i); if (w) { w->installEventFilter(this); @@ -316,10 +342,10 @@ bool KEnterScheduleDlg::focusNextPrevChild(bool next) { - bool rc = false; - QWidget *w = 0; - - w = qApp->focusWidget(); + Q_D(KEnterScheduleDlg); + auto rc = false; + + auto w = qApp->focusWidget(); int currentWidgetIndex = d->m_tabOrderWidgets.indexOf(w); while (w && currentWidgetIndex == -1) { // qDebug("'%s' not in list, use parent", w->className()); diff --git a/kmymoney/dialogs/kenterscheduledlgdecl.ui b/kmymoney/dialogs/kenterscheduledlg.ui rename from kmymoney/dialogs/kenterscheduledlgdecl.ui rename to kmymoney/dialogs/kenterscheduledlg.ui --- a/kmymoney/dialogs/kenterscheduledlgdecl.ui +++ b/kmymoney/dialogs/kenterscheduledlg.ui @@ -3,8 +3,8 @@ - KEnterScheduleDlgDecl - + KEnterScheduleDlg + 0 @@ -305,13 +305,13 @@ buttonOk clicked() - KEnterScheduleDlgDecl + KEnterScheduleDlg accept() buttonCancel clicked() - KEnterScheduleDlgDecl + KEnterScheduleDlg reject() diff --git a/kmymoney/dialogs/kequitypriceupdateconfdlg.h b/kmymoney/dialogs/kequitypriceupdateconfdlg.h --- a/kmymoney/dialogs/kequitypriceupdateconfdlg.h +++ b/kmymoney/dialogs/kequitypriceupdateconfdlg.h @@ -20,34 +20,30 @@ #include -enum updatingPricePolicyE : int {eUpdateAllPrices = 0, eUpdateMissingPrices, eUpdateDownloadedPrices, eUpdateSameSourcePrices, eAsk, eUpdatingPricePolicyEnd}; - -namespace Ui -{ -class EquityPriceUpdateConfDlg; -} +namespace eDialogs { enum class UpdatePrice; } +class EquityPriceUpdateConfDlgPrivate; class EquityPriceUpdateConfDlg : public QDialog { Q_OBJECT + Q_DISABLE_COPY(EquityPriceUpdateConfDlg) public: - explicit EquityPriceUpdateConfDlg(const updatingPricePolicyE policy); + explicit EquityPriceUpdateConfDlg(eDialogs::UpdatePrice policy); ~EquityPriceUpdateConfDlg(); - Ui::EquityPriceUpdateConfDlg* ui; - - updatingPricePolicyE policy(); -private: - void updatingPricePolicyChanged(const updatingPricePolicyE policy, bool toggled); + eDialogs::UpdatePrice policy() const; - updatingPricePolicyE m_updatingPricePolicy; private slots: void updateAllToggled(bool toggled); void updateMissingToggled(bool toggled); void updateDownloadedToggled(bool toggled); void updateSameSourceToggled(bool toggled); void askToggled(bool toggled); + +private: + EquityPriceUpdateConfDlgPrivate * const d_ptr; + Q_DECLARE_PRIVATE(EquityPriceUpdateConfDlg) }; #endif // KEQUITYPRICEUPDATECONFDLG_H diff --git a/kmymoney/dialogs/kequitypriceupdateconfdlg.cpp b/kmymoney/dialogs/kequitypriceupdateconfdlg.cpp --- a/kmymoney/dialogs/kequitypriceupdateconfdlg.cpp +++ b/kmymoney/dialogs/kequitypriceupdateconfdlg.cpp @@ -19,110 +19,137 @@ #include "ui_kequitypriceupdateconfdlg.h" -EquityPriceUpdateConfDlg::EquityPriceUpdateConfDlg(const updatingPricePolicyE policy) : ui(new Ui::EquityPriceUpdateConfDlg) +#include "dialogenums.h" + +class EquityPriceUpdateConfDlgPrivate +{ + Q_DISABLE_COPY(EquityPriceUpdateConfDlgPrivate) + +public: + EquityPriceUpdateConfDlgPrivate() : + ui(new Ui::EquityPriceUpdateConfDlg) + { + } + + ~EquityPriceUpdateConfDlgPrivate() + { + delete ui; + } + + void updatingPricePolicyChanged(const eDialogs::UpdatePrice policy, bool toggled) + { + if (!toggled) + return; + + switch(policy) { + case eDialogs::UpdatePrice::All: + ui->m_updateMissing->setChecked(false); + ui->m_updateDownloaded->setChecked(false); + ui->m_updateSource->setChecked(false); + ui->m_ask->setChecked(false); + break; + case eDialogs::UpdatePrice::Missing: + ui->m_updateAll->setChecked(false); + ui->m_updateDownloaded->setChecked(false); + ui->m_updateSource->setChecked(false); + ui->m_ask->setChecked(false); + break; + case eDialogs::UpdatePrice::Downloaded: + ui->m_updateAll->setChecked(false); + ui->m_updateMissing->setChecked(false); + ui->m_updateSource->setChecked(false); + ui->m_ask->setChecked(false); + break; + case eDialogs::UpdatePrice::SameSource: + ui->m_updateAll->setChecked(false); + ui->m_updateMissing->setChecked(false); + ui->m_updateDownloaded->setChecked(false); + ui->m_ask->setChecked(false); + break; + case eDialogs::UpdatePrice::Ask: + ui->m_updateAll->setChecked(false); + ui->m_updateDownloaded->setChecked(false); + ui->m_updateSource->setChecked(false); + ui->m_updateMissing->setChecked(false); + break; + } + m_updatingPricePolicy = policy; + } + + Ui::EquityPriceUpdateConfDlg *ui; + eDialogs::UpdatePrice m_updatingPricePolicy; +}; + +EquityPriceUpdateConfDlg::EquityPriceUpdateConfDlg(eDialogs::UpdatePrice policy) : + QDialog(nullptr), + d_ptr(new EquityPriceUpdateConfDlgPrivate) { - ui->setupUi(this); + Q_D(EquityPriceUpdateConfDlg); + d->ui->setupUi(this); switch(policy) { - case eUpdateAllPrices: - ui->m_updateAll->setChecked(true); - break; - case eUpdateMissingPrices: - ui->m_updateMissing->setChecked(true); + case eDialogs::UpdatePrice::All: + d->ui->m_updateAll->setChecked(true); break; - case eUpdateDownloadedPrices: - ui->m_updateDownloaded->setChecked(true); + case eDialogs::UpdatePrice::Missing: + d->ui->m_updateMissing->setChecked(true); break; - case eUpdateSameSourcePrices: - ui->m_updateSource->setChecked(true); + case eDialogs::UpdatePrice::Downloaded: + d->ui->m_updateDownloaded->setChecked(true); break; - case eAsk: - ui->m_ask->setChecked(true); + case eDialogs::UpdatePrice::SameSource: + d->ui->m_updateSource->setChecked(true); break; - default: + case eDialogs::UpdatePrice::Ask: + d->ui->m_ask->setChecked(true); break; } - m_updatingPricePolicy = policy; - connect(ui->m_updateAll, &QAbstractButton::toggled, this, &EquityPriceUpdateConfDlg::updateAllToggled); - connect(ui->m_updateMissing, &QAbstractButton::toggled, this, &EquityPriceUpdateConfDlg::updateMissingToggled); - connect(ui->m_updateDownloaded, &QAbstractButton::toggled, this, &EquityPriceUpdateConfDlg::updateDownloadedToggled); - connect(ui->m_updateSource, &QAbstractButton::toggled, this, &EquityPriceUpdateConfDlg::updateSameSourceToggled); - connect(ui->m_ask, &QAbstractButton::toggled, this, &EquityPriceUpdateConfDlg::askToggled); + d->m_updatingPricePolicy = policy; + connect(d->ui->m_updateAll, &QAbstractButton::toggled, this, &EquityPriceUpdateConfDlg::updateAllToggled); + connect(d->ui->m_updateMissing, &QAbstractButton::toggled, this, &EquityPriceUpdateConfDlg::updateMissingToggled); + connect(d->ui->m_updateDownloaded, &QAbstractButton::toggled, this, &EquityPriceUpdateConfDlg::updateDownloadedToggled); + connect(d->ui->m_updateSource, &QAbstractButton::toggled, this, &EquityPriceUpdateConfDlg::updateSameSourceToggled); + connect(d->ui->m_ask, &QAbstractButton::toggled, this, &EquityPriceUpdateConfDlg::askToggled); } EquityPriceUpdateConfDlg::~EquityPriceUpdateConfDlg() { - delete ui; + Q_D(EquityPriceUpdateConfDlg); + delete d; } void EquityPriceUpdateConfDlg::updateAllToggled(bool toggled) { - updatingPricePolicyChanged(eUpdateAllPrices, toggled); + Q_D(EquityPriceUpdateConfDlg); + d->updatingPricePolicyChanged(eDialogs::UpdatePrice::All, toggled); } void EquityPriceUpdateConfDlg::updateMissingToggled(bool toggled) { - updatingPricePolicyChanged(eUpdateMissingPrices, toggled); + Q_D(EquityPriceUpdateConfDlg); + d->updatingPricePolicyChanged(eDialogs::UpdatePrice::Missing, toggled); } void EquityPriceUpdateConfDlg::updateDownloadedToggled(bool toggled) { - updatingPricePolicyChanged(eUpdateDownloadedPrices, toggled); + Q_D(EquityPriceUpdateConfDlg); + d->updatingPricePolicyChanged(eDialogs::UpdatePrice::Downloaded, toggled); } void EquityPriceUpdateConfDlg::updateSameSourceToggled(bool toggled) { - updatingPricePolicyChanged(eUpdateSameSourcePrices, toggled); + Q_D(EquityPriceUpdateConfDlg); + d->updatingPricePolicyChanged(eDialogs::UpdatePrice::SameSource, toggled); } void EquityPriceUpdateConfDlg::askToggled(bool toggled) { - updatingPricePolicyChanged(eAsk, toggled); + Q_D(EquityPriceUpdateConfDlg); + d->updatingPricePolicyChanged(eDialogs::UpdatePrice::Ask, toggled); } -updatingPricePolicyE EquityPriceUpdateConfDlg::policy() +eDialogs::UpdatePrice EquityPriceUpdateConfDlg::policy() const { - return m_updatingPricePolicy; -} - -void EquityPriceUpdateConfDlg::updatingPricePolicyChanged(const updatingPricePolicyE policy, bool toggled) -{ - if (!toggled) - return; - - switch(policy) { - case eUpdateAllPrices: - ui->m_updateMissing->setChecked(false); - ui->m_updateDownloaded->setChecked(false); - ui->m_updateSource->setChecked(false); - ui->m_ask->setChecked(false); - break; - case eUpdateMissingPrices: - ui->m_updateAll->setChecked(false); - ui->m_updateDownloaded->setChecked(false); - ui->m_updateSource->setChecked(false); - ui->m_ask->setChecked(false); - break; - case eUpdateDownloadedPrices: - ui->m_updateAll->setChecked(false); - ui->m_updateMissing->setChecked(false); - ui->m_updateSource->setChecked(false); - ui->m_ask->setChecked(false); - break; - case eUpdateSameSourcePrices: - ui->m_updateAll->setChecked(false); - ui->m_updateMissing->setChecked(false); - ui->m_updateDownloaded->setChecked(false); - ui->m_ask->setChecked(false); - break; - case eAsk: - ui->m_updateAll->setChecked(false); - ui->m_updateDownloaded->setChecked(false); - ui->m_updateSource->setChecked(false); - ui->m_updateMissing->setChecked(false); - break; - default: - break; - } - m_updatingPricePolicy = policy; + Q_D(const EquityPriceUpdateConfDlg); + return d->m_updatingPricePolicy; } diff --git a/kmymoney/dialogs/kequitypriceupdatedlg.h b/kmymoney/dialogs/kequitypriceupdatedlg.h --- a/kmymoney/dialogs/kequitypriceupdatedlg.h +++ b/kmymoney/dialogs/kequitypriceupdatedlg.h @@ -9,6 +9,7 @@ John C Thomas Baumgart Kevin Tambascio + (C) 2017 by Łukasz Wojniłowicz ***************************************************************************/ /*************************************************************************** @@ -34,30 +35,27 @@ // ---------------------------------------------------------------------------- // Project Includes -#include "webpricequote.h" -#include "mymoneyprice.h" -#include "kequitypriceupdateconfdlg.h" -#include "ui_kequitypriceupdatedlgdecl.h" - class MyMoneySecurity; +class MyMoneyStatement; +class MyMoneyPrice; + +typedef QPair MyMoneySecurityPair; +typedef QMap MyMoneyPriceEntries; +typedef QMap MyMoneyPriceList; /** * @author Kevin Tambascio & Ace Jones */ -class MyMoneyStatement; -class KEquityPriceUpdateDlgDecl : public QDialog, public Ui::KEquityPriceUpdateDlgDecl -{ -public: - KEquityPriceUpdateDlgDecl(QWidget *parent) : QDialog(parent) { - setupUi(this); - } -}; -class KEquityPriceUpdateDlg : public KEquityPriceUpdateDlgDecl +class KEquityPriceUpdateDlgPrivate; +class KEquityPriceUpdateDlg : public QDialog { Q_OBJECT + Q_DISABLE_COPY(KEquityPriceUpdateDlg) + public: - explicit KEquityPriceUpdateDlg(QWidget *parent, const QString& securityId = QString()); + explicit KEquityPriceUpdateDlg(QWidget *parent, const QString& securityId); + explicit KEquityPriceUpdateDlg(QWidget *parent); ~KEquityPriceUpdateDlg(); void storePrices(); MyMoneyPrice price(const QString& id) const; @@ -76,14 +74,13 @@ void slotQuoteFailed(const QString& _kmmID, const QString& _webID); protected: - void addPricePair(const MyMoneySecurityPair& pair, bool dontCheckExistance = false); void addInvestment(const MyMoneySecurity& inv); void finishUpdate(); private: - bool m_fUpdateAll; - updatingPricePolicyE m_updatingPricePolicy; - WebPriceQuote m_webQuote; + KEquityPriceUpdateDlgPrivate * const d_ptr; + Q_DECLARE_PRIVATE(KEquityPriceUpdateDlg) + }; #endif // KEQUITYPRICEUPDATEDLG_H diff --git a/kmymoney/dialogs/kequitypriceupdatedlg.cpp b/kmymoney/dialogs/kequitypriceupdatedlg.cpp --- a/kmymoney/dialogs/kequitypriceupdatedlg.cpp +++ b/kmymoney/dialogs/kequitypriceupdatedlg.cpp @@ -10,7 +10,7 @@ Thomas Baumgart Kevin Tambascio Ace Jones - 2017 Łukasz Wojniłowicz + (C) 2017 by Łukasz Wojniłowicz ***************************************************************************/ /*************************************************************************** @@ -30,6 +30,7 @@ #include #include #include +#include // ---------------------------------------------------------------------------- // KDE Includes @@ -46,11 +47,16 @@ // ---------------------------------------------------------------------------- // Project Includes +#include "ui_kequitypriceupdatedlg.h" + #include "kmymoney.h" #include "mymoneyfile.h" #include "mymoneyaccount.h" #include "mymoneysecurity.h" #include "mymoneyprice.h" +#include "webpricequote.h" +#include "kequitypriceupdateconfdlg.h" +#include "dialogenums.h" #define WEBID_COL 0 #define NAME_COL 1 @@ -59,245 +65,283 @@ #define KMMID_COL 4 #define SOURCE_COL 5 -KEquityPriceUpdateDlg::KEquityPriceUpdateDlg(QWidget *parent, const QString& securityId) : - KEquityPriceUpdateDlgDecl(parent), - m_fUpdateAll(false) +class KEquityPriceUpdateDlgPrivate { - QStringList headerList; - headerList << i18n("ID") << i18nc("Equity name", "Name") - << i18n("Price") << i18n("Date"); + Q_DISABLE_COPY(KEquityPriceUpdateDlgPrivate) + Q_DECLARE_PUBLIC(KEquityPriceUpdateDlg) + +public: + KEquityPriceUpdateDlgPrivate(KEquityPriceUpdateDlg *qq) : + q_ptr(qq), + ui(new Ui::KEquityPriceUpdateDlg) + { + } - lvEquityList->header()->setSortIndicator(0, Qt::AscendingOrder); - lvEquityList->setColumnWidth(NAME_COL, 125); + ~KEquityPriceUpdateDlgPrivate() + { + delete ui; + } - // This is a "get it up and running" hack. Will replace this in the future. - headerList << i18nc("Internal identifier", "Internal ID") - << i18nc("Online quote source", "Source"); - lvEquityList->setColumnWidth(KMMID_COL, 0); + void init(const QString& securityId) + { + Q_Q(KEquityPriceUpdateDlg); + ui->setupUi(q); + m_fUpdateAll = false; + QStringList headerList; + headerList << i18n("ID") << i18nc("Equity name", "Name") + << i18n("Price") << i18n("Date"); - lvEquityList->setHeaderLabels(headerList); + ui->lvEquityList->header()->setSortIndicator(0, Qt::AscendingOrder); + ui->lvEquityList->setColumnWidth(NAME_COL, 125); - lvEquityList->setSelectionMode(QAbstractItemView::MultiSelection); - lvEquityList->setAllColumnsShowFocus(true); + // This is a "get it up and running" hack. Will replace this in the future. + headerList << i18nc("Internal identifier", "Internal ID") + << i18nc("Online quote source", "Source"); + ui->lvEquityList->setColumnWidth(KMMID_COL, 0); - btnUpdateAll->setEnabled(false); + ui->lvEquityList->setHeaderLabels(headerList); - MyMoneyFile* file = MyMoneyFile::instance(); + ui->lvEquityList->setSelectionMode(QAbstractItemView::MultiSelection); + ui->lvEquityList->setAllColumnsShowFocus(true); - // - // Add each price pair that we know about - // + ui->btnUpdateAll->setEnabled(false); - // send in securityId == "XXX YYY" to get a single-shot update for XXX to YYY. - // for consistency reasons, this accepts the same delimiters as WebPriceQuote::launch() - QRegExp splitrx("([0-9a-z\\.]+)[^a-z0-9]+([0-9a-z\\.]+)", Qt::CaseInsensitive); - MyMoneySecurityPair currencyIds; - if (splitrx.indexIn(securityId) != -1) { - currencyIds = MyMoneySecurityPair(splitrx.cap(1), splitrx.cap(2)); - } + auto file = MyMoneyFile::instance(); - MyMoneyPriceList prices = file->priceList(); - for (MyMoneyPriceList::ConstIterator it_price = prices.constBegin(); it_price != prices.constEnd(); ++it_price) { - const MyMoneySecurityPair& pair = it_price.key(); - if (file->security(pair.first).isCurrency() && (securityId.isEmpty() || (pair == currencyIds))) { - const MyMoneyPriceEntries& entries = (*it_price); - if (entries.count() > 0 && entries.begin().key() <= QDate::currentDate()) { - addPricePair(pair); - btnUpdateAll->setEnabled(true); - } - } - } + // + // Add each price pair that we know about + // - // - // Add each investment - // - - QList securities = file->securityList(); - for (QList::const_iterator it = securities.constBegin(); it != securities.constEnd(); ++it) { - if (!(*it).isCurrency() - && (securityId.isEmpty() || ((*it).id() == securityId)) - && !(*it).value("kmm-online-source").isEmpty() - ) { - addInvestment(*it); - btnUpdateAll->setEnabled(true); + // send in securityId == "XXX YYY" to get a single-shot update for XXX to YYY. + // for consistency reasons, this accepts the same delimiters as WebPriceQuote::launch() + QRegExp splitrx("([0-9a-z\\.]+)[^a-z0-9]+([0-9a-z\\.]+)", Qt::CaseInsensitive); + MyMoneySecurityPair currencyIds; + if (splitrx.indexIn(securityId) != -1) { + currencyIds = MyMoneySecurityPair(splitrx.cap(1), splitrx.cap(2)); } - } - - // if list is empty, add the request price pair - if (lvEquityList->invisibleRootItem()->childCount() == 0) { - addPricePair(currencyIds, true); - } - connect(buttonBox, SIGNAL(accepted()), this, SLOT(accept())); - connect(buttonBox, SIGNAL(rejected()), this, SLOT(reject())); - connect(btnUpdateSelected, SIGNAL(clicked()), this, SLOT(slotUpdateSelectedClicked())); - connect(btnUpdateAll, SIGNAL(clicked()), this, SLOT(slotUpdateAllClicked())); + MyMoneyPriceList prices = file->priceList(); + for (MyMoneyPriceList::ConstIterator it_price = prices.constBegin(); it_price != prices.constEnd(); ++it_price) { + const MyMoneySecurityPair& pair = it_price.key(); + if (file->security(pair.first).isCurrency() && (securityId.isEmpty() || (pair == currencyIds))) { + const MyMoneyPriceEntries& entries = (*it_price); + if (entries.count() > 0 && entries.begin().key() <= QDate::currentDate()) { + addPricePair(pair, false); + ui->btnUpdateAll->setEnabled(true); + } + } + } - connect(m_fromDate, SIGNAL(dateChanged(QDate)), this, SLOT(slotDateChanged())); - connect(m_toDate, SIGNAL(dateChanged(QDate)), this, SLOT(slotDateChanged())); + // + // Add each investment + // + + QList securities = file->securityList(); + for (QList::const_iterator it = securities.constBegin(); it != securities.constEnd(); ++it) { + if (!(*it).isCurrency() + && (securityId.isEmpty() || ((*it).id() == securityId)) + && !(*it).value("kmm-online-source").isEmpty() + ) { + addInvestment(*it); + ui->btnUpdateAll->setEnabled(true); + } + } - connect(&m_webQuote, &WebPriceQuote::csvquote, - this, &KEquityPriceUpdateDlg::slotReceivedCSVQuote); - connect(&m_webQuote, SIGNAL(quote(QString,QString,QDate,double)), - this, SLOT(slotReceivedQuote(QString,QString,QDate,double))); - connect(&m_webQuote, SIGNAL(failed(QString,QString)), - this, SLOT(slotQuoteFailed(QString,QString))); - connect(&m_webQuote, SIGNAL(status(QString)), - this, SLOT(logStatusMessage(QString))); - connect(&m_webQuote, SIGNAL(error(QString)), - this, SLOT(logErrorMessage(QString))); + // if list is empty, add the request price pair + if (ui->lvEquityList->invisibleRootItem()->childCount() == 0) { + addPricePair(currencyIds, true); + } - connect(lvEquityList, SIGNAL(itemSelectionChanged()), this, SLOT(slotUpdateSelection())); + q->connect(ui->btnUpdateSelected, &QAbstractButton::clicked, q, &KEquityPriceUpdateDlg::slotUpdateSelectedClicked); + q->connect(ui->btnUpdateAll, &QAbstractButton::clicked, q, &KEquityPriceUpdateDlg::slotUpdateAllClicked); - connect(btnConfigure, &QAbstractButton::clicked, this, &KEquityPriceUpdateDlg::slotConfigureClicked); + q->connect(ui->m_fromDate, &kMyMoneyDateInput::dateChanged, q, &KEquityPriceUpdateDlg::slotDateChanged); + q->connect(ui->m_toDate, &kMyMoneyDateInput::dateChanged, q, &KEquityPriceUpdateDlg::slotDateChanged); - if (!securityId.isEmpty()) { - btnUpdateSelected->hide(); - btnUpdateAll->hide(); - // delete layout1; + q->connect(&m_webQuote, &WebPriceQuote::csvquote, + q, &KEquityPriceUpdateDlg::slotReceivedCSVQuote); + q->connect(&m_webQuote, &WebPriceQuote::quote, + q, &KEquityPriceUpdateDlg::slotReceivedQuote); + q->connect(&m_webQuote, &WebPriceQuote::failed, + q, &KEquityPriceUpdateDlg::slotQuoteFailed); + q->connect(&m_webQuote, &WebPriceQuote::status, + q, &KEquityPriceUpdateDlg::logStatusMessage); + q->connect(&m_webQuote, &WebPriceQuote::error, + q, &KEquityPriceUpdateDlg::logErrorMessage); - QTimer::singleShot(100, this, SLOT(slotUpdateAllClicked())); - } + q->connect(ui->lvEquityList, &QTreeWidget::itemSelectionChanged, q, &KEquityPriceUpdateDlg::slotUpdateSelection); - // Hide OK button until we have received the first update - buttonBox->button(QDialogButtonBox::Ok)->setEnabled(false); + q->connect(ui->btnConfigure, &QAbstractButton::clicked, q, &KEquityPriceUpdateDlg::slotConfigureClicked); - slotUpdateSelection(); + if (!securityId.isEmpty()) { + ui->btnUpdateSelected->hide(); + ui->btnUpdateAll->hide(); + // delete layout1; - // previous versions of this dialog allowed to store a "Don't ask again" switch. - // Since we don't support it anymore, we just get rid of it - KSharedConfigPtr config = KSharedConfig::openConfig(); - KConfigGroup grp = config->group("Notification Messages"); - grp.deleteEntry("KEquityPriceUpdateDlg::slotQuoteFailed::Price Update Failed"); - grp.sync(); - grp = config->group("Equity Price Update"); - int policyValue = grp.readEntry("PriceUpdatingPolicy", QString().setNum(eUpdateMissingPrices)).toInt(); - if (policyValue >= eUpdatingPricePolicyEnd || policyValue < eUpdateAllPrices) - m_updatingPricePolicy = eUpdateMissingPrices; - else - m_updatingPricePolicy = static_cast(policyValue); -} + QTimer::singleShot(100, q, SLOT(slotUpdateAllClicked())); + } -KEquityPriceUpdateDlg::~KEquityPriceUpdateDlg() -{ - KSharedConfigPtr config = KSharedConfig::openConfig(); - KConfigGroup grp = config->group("Equity Price Update"); - grp.writeEntry("PriceUpdatingPolicy", static_cast(m_updatingPricePolicy)); - grp.sync(); -} + // Hide OK button until we have received the first update + ui->buttonBox->button(QDialogButtonBox::Ok)->setEnabled(false); + + q->slotUpdateSelection(); + + // previous versions of this dialog allowed to store a "Don't ask again" switch. + // Since we don't support it anymore, we just get rid of it + KSharedConfigPtr config = KSharedConfig::openConfig(); + KConfigGroup grp = config->group("Notification Messages"); + grp.deleteEntry("KEquityPriceUpdateDlg::slotQuoteFailed::Price Update Failed"); + grp.sync(); + grp = config->group("Equity Price Update"); + int policyValue = grp.readEntry("PriceUpdatingPolicy", (int)eDialogs::UpdatePrice::Missing); + if (policyValue > (int)eDialogs::UpdatePrice::Ask || policyValue < (int)eDialogs::UpdatePrice::All) + m_updatingPricePolicy = eDialogs::UpdatePrice::Missing; + else + m_updatingPricePolicy = static_cast(policyValue); + } -void KEquityPriceUpdateDlg::addPricePair(const MyMoneySecurityPair& pair, bool dontCheckExistance) -{ - MyMoneyFile* file = MyMoneyFile::instance(); - - const QString symbol = QString::fromLatin1("%1 > %2").arg(pair.first, pair.second); - const QString id = QString::fromLatin1("%1 %2").arg(pair.first, pair.second); - // Check that the pair does not already exist - if (lvEquityList->findItems(id, Qt::MatchExactly, KMMID_COL).empty()) { - const MyMoneyPrice &pr = file->price(pair.first, pair.second); - if (pr.source() != QLatin1String("KMyMoney")) { - bool keep = true; - if ((pair.first == file->baseCurrency().id()) - || (pair.second == file->baseCurrency().id())) { - const QString& foreignCurrency = file->foreignCurrency(pair.first, pair.second); - // check that the foreign currency is still in use - QList::const_iterator it_a; - QList list; - file->accountList(list); - for (it_a = list.constBegin(); !dontCheckExistance && it_a != list.constEnd(); ++it_a) { - // if it's an account denominated in the foreign currency - // keep it - if (((*it_a).currencyId() == foreignCurrency) - && !(*it_a).isClosed()) - break; - // if it's an investment traded in the foreign currency - // keep it - if ((*it_a).isInvest() && !(*it_a).isClosed()) { - MyMoneySecurity sec = file->security((*it_a).currencyId()); - if (sec.tradingCurrency() == foreignCurrency) + void addPricePair(const MyMoneySecurityPair& pair, bool dontCheckExistance) + { + auto file = MyMoneyFile::instance(); + + const auto symbol = QString::fromLatin1("%1 > %2").arg(pair.first, pair.second); + const auto id = QString::fromLatin1("%1 %2").arg(pair.first, pair.second); + // Check that the pair does not already exist + if (ui->lvEquityList->findItems(id, Qt::MatchExactly, KMMID_COL).empty()) { + const MyMoneyPrice &pr = file->price(pair.first, pair.second); + if (pr.source() != QLatin1String("KMyMoney")) { + bool keep = true; + if ((pair.first == file->baseCurrency().id()) + || (pair.second == file->baseCurrency().id())) { + const QString& foreignCurrency = file->foreignCurrency(pair.first, pair.second); + // check that the foreign currency is still in use + QList::const_iterator it_a; + QList list; + file->accountList(list); + for (it_a = list.constBegin(); !dontCheckExistance && it_a != list.constEnd(); ++it_a) { + // if it's an account denominated in the foreign currency + // keep it + if (((*it_a).currencyId() == foreignCurrency) + && !(*it_a).isClosed()) break; + // if it's an investment traded in the foreign currency + // keep it + if ((*it_a).isInvest() && !(*it_a).isClosed()) { + MyMoneySecurity sec = file->security((*it_a).currencyId()); + if (sec.tradingCurrency() == foreignCurrency) + break; + } + } + // if it is in use, it_a is not equal to list.end() + if (it_a == list.constEnd() && !dontCheckExistance) + keep = false; + } + + if (keep) { + auto item = new QTreeWidgetItem(); + item->setText(WEBID_COL, symbol); + item->setText(NAME_COL, i18n("%1 units in %2", pair.first, pair.second)); + if (pr.isValid()) { + MyMoneySecurity fromCurrency = file->currency(pair.second); + MyMoneySecurity toCurrency = file->currency(pair.first); + item->setText(PRICE_COL, pr.rate(pair.second).formatMoney(fromCurrency.tradingSymbol(), toCurrency.pricePrecision())); + item->setText(DATE_COL, pr.date().toString(Qt::ISODate)); } + item->setText(KMMID_COL, id); + item->setText(SOURCE_COL, "Yahoo Currency"); // This string value should not be localized + ui->lvEquityList->invisibleRootItem()->addChild(item); } - // if it is in use, it_a is not equal to list.end() - if (it_a == list.constEnd() && !dontCheckExistance) - keep = false; } + } + } + + void addInvestment(const MyMoneySecurity& inv) + { + const auto id = inv.id(); + // Check that the pair does not already exist + if (ui->lvEquityList->findItems(id, Qt::MatchExactly, KMMID_COL).empty()) { + auto file = MyMoneyFile::instance(); + // check that the security is still in use + QList::const_iterator it_a; + QList list; + file->accountList(list); + for (it_a = list.constBegin(); it_a != list.constEnd(); ++it_a) { + if ((*it_a).isInvest() + && ((*it_a).currencyId() == inv.id()) + && !(*it_a).isClosed()) + break; + } + // if it is in use, it_a is not equal to list.end() + if (it_a != list.constEnd()) { + QString webID; + WebPriceQuoteSource onlineSource(inv.value("kmm-online-source")); + if (onlineSource.m_webIDBy == WebPriceQuoteSource::identifyBy::IdentificationNumber) + webID = inv.value("kmm-security-id"); // insert ISIN number... + else if (onlineSource.m_webIDBy == WebPriceQuoteSource::identifyBy::Name) + webID = inv.name(); // ...or name... + else + webID = inv.tradingSymbol(); // ...or symbol - if (keep) { QTreeWidgetItem* item = new QTreeWidgetItem(); - item->setText(WEBID_COL, symbol); - item->setText(NAME_COL, i18n("%1 units in %2", pair.first, pair.second)); + item->setForeground(WEBID_COL, KColorScheme(QPalette::Normal).foreground(KColorScheme::NormalText)); + if (webID.isEmpty()) { + webID = i18n("[No identifier]"); + item->setForeground(WEBID_COL, KColorScheme(QPalette::Normal).foreground(KColorScheme::NegativeText)); + } + item->setText(WEBID_COL, webID); + item->setText(NAME_COL, inv.name()); + MyMoneySecurity currency = file->currency(inv.tradingCurrency()); + const MyMoneyPrice &pr = file->price(id.toUtf8(), inv.tradingCurrency()); if (pr.isValid()) { - MyMoneySecurity fromCurrency = file->currency(pair.second); - MyMoneySecurity toCurrency = file->currency(pair.first); - item->setText(PRICE_COL, pr.rate(pair.second).formatMoney(fromCurrency.tradingSymbol(), toCurrency.pricePrecision())); + item->setText(PRICE_COL, pr.rate(currency.id()).formatMoney(currency.tradingSymbol(), inv.pricePrecision())); item->setText(DATE_COL, pr.date().toString(Qt::ISODate)); } item->setText(KMMID_COL, id); - item->setText(SOURCE_COL, "Yahoo Currency"); // This string value should not be localized - lvEquityList->invisibleRootItem()->addChild(item); + if (inv.value("kmm-online-quote-system") == "Finance::Quote") + item->setText(SOURCE_COL, QString("Finance::Quote %1").arg(inv.value("kmm-online-source"))); + else + item->setText(SOURCE_COL, inv.value("kmm-online-source")); + + ui->lvEquityList->invisibleRootItem()->addChild(item); + + // If this investment is denominated in a foreign currency, ensure that + // the appropriate price pair is also on the list + + if (currency.id() != file->baseCurrency().id()) { + addPricePair(MyMoneySecurityPair(currency.id(), file->baseCurrency().id()), false); + } } } } -} - -void KEquityPriceUpdateDlg::addInvestment(const MyMoneySecurity& inv) -{ - const QString id = inv.id(); - // Check that the pair does not already exist - if (lvEquityList->findItems(id, Qt::MatchExactly, KMMID_COL).empty()) { - MyMoneyFile* file = MyMoneyFile::instance(); - // check that the security is still in use - QList::const_iterator it_a; - QList list; - file->accountList(list); - for (it_a = list.constBegin(); it_a != list.constEnd(); ++it_a) { - if ((*it_a).isInvest() - && ((*it_a).currencyId() == inv.id()) - && !(*it_a).isClosed()) - break; - } - // if it is in use, it_a is not equal to list.end() - if (it_a != list.constEnd()) { - QString webID; - WebPriceQuoteSource onlineSource(inv.value("kmm-online-source")); - if (onlineSource.m_webIDBy == WebPriceQuoteSource::identifyBy::IdentificationNumber) - webID = inv.value("kmm-security-id"); // insert ISIN number... - else if (onlineSource.m_webIDBy == WebPriceQuoteSource::identifyBy::Name) - webID = inv.name(); // ...or name... - else - webID = inv.tradingSymbol(); // ...or symbol - QTreeWidgetItem* item = new QTreeWidgetItem(); - item->setForeground(WEBID_COL, KColorScheme(QPalette::Normal).foreground(KColorScheme::NormalText)); - if (webID.isEmpty()) { - webID = i18n("[No identifier]"); - item->setForeground(WEBID_COL, KColorScheme(QPalette::Normal).foreground(KColorScheme::NegativeText)); - } - item->setText(WEBID_COL, webID); - item->setText(NAME_COL, inv.name()); - MyMoneySecurity currency = file->currency(inv.tradingCurrency()); - const MyMoneyPrice &pr = file->price(id.toUtf8(), inv.tradingCurrency()); - if (pr.isValid()) { - item->setText(PRICE_COL, pr.rate(currency.id()).formatMoney(currency.tradingSymbol(), inv.pricePrecision())); - item->setText(DATE_COL, pr.date().toString(Qt::ISODate)); - } - item->setText(KMMID_COL, id); - if (inv.value("kmm-online-quote-system") == "Finance::Quote") - item->setText(SOURCE_COL, QString("Finance::Quote %1").arg(inv.value("kmm-online-source"))); - else - item->setText(SOURCE_COL, inv.value("kmm-online-source")); + KEquityPriceUpdateDlg *q_ptr; + Ui::KEquityPriceUpdateDlg *ui; + bool m_fUpdateAll; + eDialogs::UpdatePrice m_updatingPricePolicy; + WebPriceQuote m_webQuote; +}; - lvEquityList->invisibleRootItem()->addChild(item); +KEquityPriceUpdateDlg::KEquityPriceUpdateDlg(QWidget *parent, const QString& securityId) : + QDialog(parent), + d_ptr(new KEquityPriceUpdateDlgPrivate(this)) +{ + Q_D(KEquityPriceUpdateDlg); + d->init(securityId); +} - // If this investment is denominated in a foreign currency, ensure that - // the appropriate price pair is also on the list +KEquityPriceUpdateDlg::KEquityPriceUpdateDlg(QWidget *parent) : + KEquityPriceUpdateDlg(parent, QString()) +{ +} - if (currency.id() != file->baseCurrency().id()) { - addPricePair(MyMoneySecurityPair(currency.id(), file->baseCurrency().id())); - } - } - } +KEquityPriceUpdateDlg::~KEquityPriceUpdateDlg() +{ + Q_D(KEquityPriceUpdateDlg); + auto config = KSharedConfig::openConfig(); + auto grp = config->group("Equity Price Update"); + grp.writeEntry("PriceUpdatingPolicy", static_cast(d->m_updatingPricePolicy)); + grp.sync(); + delete d; } void KEquityPriceUpdateDlg::logErrorMessage(const QString& message) @@ -307,14 +351,16 @@ void KEquityPriceUpdateDlg::logStatusMessage(const QString& message) { - lbStatus->append(message); + Q_D(KEquityPriceUpdateDlg); + d->ui->lbStatus->append(message); } MyMoneyPrice KEquityPriceUpdateDlg::price(const QString& id) const { + Q_D(const KEquityPriceUpdateDlg); MyMoneyPrice price; - QTreeWidgetItem* item = 0; - QList foundItems = lvEquityList->findItems(id, Qt::MatchExactly, KMMID_COL); + QTreeWidgetItem* item = nullptr; + QList foundItems = d->ui->lvEquityList->findItems(id, Qt::MatchExactly, KMMID_COL); if (! foundItems.empty()) item = foundItems.at(0); @@ -343,17 +389,18 @@ void KEquityPriceUpdateDlg::storePrices() { + Q_D(KEquityPriceUpdateDlg); // update the new prices into the equities - MyMoneyFile* file = MyMoneyFile::instance(); + auto file = MyMoneyFile::instance(); QString name; MyMoneyFileTransaction ft; try { - for (int i = 0; i < lvEquityList->invisibleRootItem()->childCount(); ++i) { - QTreeWidgetItem* item = lvEquityList->invisibleRootItem()->child(i); + for (auto i = 0; i < d->ui->lvEquityList->invisibleRootItem()->childCount(); ++i) { + QTreeWidgetItem* item = d->ui->lvEquityList->invisibleRootItem()->child(i); // turn on signals before we modify the last entry in the list - file->blockSignals(i < lvEquityList->invisibleRootItem()->childCount() - 1); + file->blockSignals(i < d->ui->lvEquityList->invisibleRootItem()->childCount() - 1); MyMoneyMoney rate(item->text(PRICE_COL)); if (!rate.isZero()) { @@ -388,37 +435,40 @@ void KEquityPriceUpdateDlg::slotConfigureClicked() { - EquityPriceUpdateConfDlg *dlg = new EquityPriceUpdateConfDlg(m_updatingPricePolicy); + Q_D(KEquityPriceUpdateDlg); + QPointer dlg = new EquityPriceUpdateConfDlg(d->m_updatingPricePolicy); if (dlg->exec() == QDialog::Accepted) - m_updatingPricePolicy = dlg->policy(); + d->m_updatingPricePolicy = dlg->policy(); delete dlg; } void KEquityPriceUpdateDlg::slotUpdateSelection() { + Q_D(KEquityPriceUpdateDlg); // Only enable the update button if there is a selection - btnUpdateSelected->setEnabled(false); + d->ui->btnUpdateSelected->setEnabled(false); - if (! lvEquityList->selectedItems().empty()) - btnUpdateSelected->setEnabled(true); + if (! d->ui->lvEquityList->selectedItems().empty()) + d->ui->btnUpdateSelected->setEnabled(true); } void KEquityPriceUpdateDlg::slotUpdateSelectedClicked() { + Q_D(KEquityPriceUpdateDlg); // disable sorting while the update is running to maintain the current order of items on which // the update process depends and which could be changed with sorting enabled due to the updated values - lvEquityList->setSortingEnabled(false); - QTreeWidgetItem* item = lvEquityList->invisibleRootItem()->child(0); - int skipCnt = 1; + d->ui->lvEquityList->setSortingEnabled(false); + auto item = d->ui->lvEquityList->invisibleRootItem()->child(0); + auto skipCnt = 1; while (item && !item->isSelected()) { - item = lvEquityList->invisibleRootItem()->child(skipCnt); + item = d->ui->lvEquityList->invisibleRootItem()->child(skipCnt); ++skipCnt; } - m_webQuote.setDate(m_fromDate->date(), m_toDate->date()); + d->m_webQuote.setDate(d->ui->m_fromDate->date(), d->ui->m_toDate->date()); if (item) { - prgOnlineProgress->setMaximum(1 + lvEquityList->invisibleRootItem()->childCount()); - prgOnlineProgress->setValue(skipCnt); - m_webQuote.launch(item->text(WEBID_COL), item->text(KMMID_COL), item->text(SOURCE_COL)); + d->ui->prgOnlineProgress->setMaximum(1 + d->ui->lvEquityList->invisibleRootItem()->childCount()); + d->ui->prgOnlineProgress->setValue(skipCnt); + d->m_webQuote.launch(item->text(WEBID_COL), item->text(KMMID_COL), item->text(SOURCE_COL)); } else { @@ -428,15 +478,16 @@ void KEquityPriceUpdateDlg::slotUpdateAllClicked() { + Q_D(KEquityPriceUpdateDlg); // disable sorting while the update is running to maintain the current order of items on which // the update process depends and which could be changed with sorting enabled due to the updated values - lvEquityList->setSortingEnabled(false); - QTreeWidgetItem* item = lvEquityList->invisibleRootItem()->child(0); + d->ui->lvEquityList->setSortingEnabled(false); + QTreeWidgetItem* item = d->ui->lvEquityList->invisibleRootItem()->child(0); if (item) { - prgOnlineProgress->setMaximum(1 + lvEquityList->invisibleRootItem()->childCount()); - prgOnlineProgress->setValue(1); - m_fUpdateAll = true; - m_webQuote.launch(item->text(WEBID_COL), item->text(KMMID_COL), item->text(SOURCE_COL)); + d->ui->prgOnlineProgress->setMaximum(1 + d->ui->lvEquityList->invisibleRootItem()->childCount()); + d->ui->prgOnlineProgress->setValue(1); + d->m_fUpdateAll = true; + d->m_webQuote.launch(item->text(WEBID_COL), item->text(KMMID_COL), item->text(SOURCE_COL)); } else { logErrorMessage("Security list is empty."); @@ -445,20 +496,22 @@ void KEquityPriceUpdateDlg::slotDateChanged() { - m_fromDate->blockSignals(true); - m_toDate->blockSignals(true); - if (m_toDate->date() > QDate::currentDate()) - m_toDate->setDate(QDate::currentDate()); - if (m_toDate->date() < m_fromDate->date()) - m_fromDate->setDate(m_toDate->date()); - m_fromDate->blockSignals(false); - m_toDate->blockSignals(false); + Q_D(KEquityPriceUpdateDlg); + d->ui->m_fromDate->blockSignals(true); + d->ui->m_toDate->blockSignals(true); + if (d->ui->m_toDate->date() > QDate::currentDate()) + d->ui->m_toDate->setDate(QDate::currentDate()); + if (d->ui->m_toDate->date() < d->ui->m_fromDate->date()) + d->ui->m_fromDate->setDate(d->ui->m_toDate->date()); + d->ui->m_fromDate->blockSignals(false); + d->ui->m_toDate->blockSignals(false); } void KEquityPriceUpdateDlg::slotQuoteFailed(const QString& _kmmID, const QString& _webID) { - QList foundItems = lvEquityList->findItems(_kmmID, Qt::MatchExactly, KMMID_COL); - QTreeWidgetItem* item = 0; + Q_D(KEquityPriceUpdateDlg); + auto foundItems = d->ui->lvEquityList->findItems(_kmmID, Qt::MatchExactly, KMMID_COL); + QTreeWidgetItem* item = nullptr; if (! foundItems.empty()) item = foundItems.at(0); @@ -493,21 +546,21 @@ // As long as the user doesn't want to cancel, move on! if (result != KMessageBox::Cancel) { - QTreeWidgetItem* next = 0; - prgOnlineProgress->setValue(prgOnlineProgress->value() + 1); + QTreeWidgetItem* next = nullptr; + d->ui->prgOnlineProgress->setValue(d->ui->prgOnlineProgress->value() + 1); item->setSelected(false); // launch the NEXT one ... in case of m_fUpdateAll == false, we // need to parse the list to find the next selected one - next = lvEquityList->invisibleRootItem()->child(lvEquityList->invisibleRootItem()->indexOfChild(item) + 1); - if (!m_fUpdateAll) { + next = d->ui->lvEquityList->invisibleRootItem()->child(d->ui->lvEquityList->invisibleRootItem()->indexOfChild(item) + 1); + if (!d->m_fUpdateAll) { while (next && !next->isSelected()) { - prgOnlineProgress->setValue(prgOnlineProgress->value() + 1); - next = lvEquityList->invisibleRootItem()->child(lvEquityList->invisibleRootItem()->indexOfChild(next) + 1); + d->ui->prgOnlineProgress->setValue(d->ui->prgOnlineProgress->value() + 1); + next = d->ui->lvEquityList->invisibleRootItem()->child(d->ui->lvEquityList->invisibleRootItem()->indexOfChild(next) + 1); } } if (next) { - m_webQuote.launch(next->text(WEBID_COL), next->text(KMMID_COL), next->text(SOURCE_COL)); + d->m_webQuote.launch(next->text(WEBID_COL), next->text(KMMID_COL), next->text(SOURCE_COL)); } else { finishUpdate(); } @@ -518,16 +571,17 @@ void KEquityPriceUpdateDlg::slotReceivedCSVQuote(const QString& _kmmID, const QString& _webID, MyMoneyStatement& st) { - QList foundItems = lvEquityList->findItems(_kmmID, Qt::MatchExactly, KMMID_COL); - QTreeWidgetItem* item = 0; + Q_D(KEquityPriceUpdateDlg); + auto foundItems = d->ui->lvEquityList->findItems(_kmmID, Qt::MatchExactly, KMMID_COL); + QTreeWidgetItem* item = nullptr; if (! foundItems.empty()) item = foundItems.at(0); - QTreeWidgetItem* next = 0; + QTreeWidgetItem* next = nullptr; if (item) { - MyMoneyFile *file = MyMoneyFile::instance(); + auto file = MyMoneyFile::instance(); MyMoneySecurity fromCurrency, toCurrency; if (!_kmmID.contains(QLatin1Char(' '))) { @@ -550,7 +604,7 @@ } } - if (m_updatingPricePolicy != eUpdateAllPrices) { + if (d->m_updatingPricePolicy != eDialogs::UpdatePrice::All) { QStringList qSources = WebPriceQuote::quoteSources(); for (auto it = st.m_listPrices.begin(); it != st.m_listPrices.end();) { MyMoneyPrice storedPrice = file->price(toCurrency.id(), fromCurrency.id(), (*it).m_date, true); @@ -558,23 +612,23 @@ if (!priceValid) ++it; else { - switch(m_updatingPricePolicy) { - case eUpdateMissingPrices: + switch(d->m_updatingPricePolicy) { + case eDialogs::UpdatePrice::Missing: it = st.m_listPrices.erase(it); break; - case eUpdateDownloadedPrices: + case eDialogs::UpdatePrice::Downloaded: if (!qSources.contains(storedPrice.source())) it = st.m_listPrices.erase(it); else ++it; break; - case eUpdateSameSourcePrices: + case eDialogs::UpdatePrice::SameSource: if (storedPrice.source().compare((*it).m_sourceName) != 0) it = st.m_listPrices.erase(it); else ++it; break; - case eAsk: + case eDialogs::UpdatePrice::Ask: { int result = KMessageBox::questionYesNoCancel(this, i18n("For %1 on %2 price %3 already exists.
" @@ -624,18 +678,18 @@ logStatusMessage(i18n("Price for %1 updated (id %2)", _webID, _kmmID)); // make sure to make OK button available } - buttonBox->button(QDialogButtonBox::Ok)->setEnabled(true); + d->ui->buttonBox->button(QDialogButtonBox::Ok)->setEnabled(true); - prgOnlineProgress->setValue(prgOnlineProgress->value() + 1); + d->ui->prgOnlineProgress->setValue(d->ui->prgOnlineProgress->value() + 1); item->setSelected(false); // launch the NEXT one ... in case of m_fUpdateAll == false, we // need to parse the list to find the next selected one - next = lvEquityList->invisibleRootItem()->child(lvEquityList->invisibleRootItem()->indexOfChild(item) + 1); - if (!m_fUpdateAll) { + next = d->ui->lvEquityList->invisibleRootItem()->child(d->ui->lvEquityList->invisibleRootItem()->indexOfChild(item) + 1); + if (!d->m_fUpdateAll) { while (next && !next->isSelected()) { - prgOnlineProgress->setValue(prgOnlineProgress->value() + 1); - next = lvEquityList->invisibleRootItem()->child(lvEquityList->invisibleRootItem()->indexOfChild(next) + 1); + d->ui->prgOnlineProgress->setValue(d->ui->prgOnlineProgress->value() + 1); + next = d->ui->lvEquityList->invisibleRootItem()->child(d->ui->lvEquityList->invisibleRootItem()->indexOfChild(next) + 1); } } } else { @@ -643,7 +697,7 @@ } if (next) { - m_webQuote.launch(next->text(WEBID_COL), next->text(KMMID_COL), next->text(SOURCE_COL)); + d->m_webQuote.launch(next->text(WEBID_COL), next->text(KMMID_COL), next->text(SOURCE_COL)); } else { finishUpdate(); } @@ -651,8 +705,9 @@ void KEquityPriceUpdateDlg::slotReceivedQuote(const QString& _kmmID, const QString& _webID, const QDate& _date, const double& _price) { - QList foundItems = lvEquityList->findItems(_kmmID, Qt::MatchExactly, KMMID_COL); - QTreeWidgetItem* item = 0; + Q_D(KEquityPriceUpdateDlg); + auto foundItems = d->ui->lvEquityList->findItems(_kmmID, Qt::MatchExactly, KMMID_COL); + QTreeWidgetItem* item = nullptr; if (! foundItems.empty()) item = foundItems.at(0); @@ -698,21 +753,21 @@ item->setText(DATE_COL, date.toString(Qt::ISODate)); logStatusMessage(i18n("Price for %1 updated (id %2)", _webID, _kmmID)); // make sure to make OK button available - buttonBox->button(QDialogButtonBox::Ok)->setEnabled(true); + d->ui->buttonBox->button(QDialogButtonBox::Ok)->setEnabled(true); } else { logErrorMessage(i18n("Received an invalid price for %1, unable to update.", _webID)); } - prgOnlineProgress->setValue(prgOnlineProgress->value() + 1); + d->ui->prgOnlineProgress->setValue(d->ui->prgOnlineProgress->value() + 1); item->setSelected(false); // launch the NEXT one ... in case of m_fUpdateAll == false, we // need to parse the list to find the next selected one - next = lvEquityList->invisibleRootItem()->child(lvEquityList->invisibleRootItem()->indexOfChild(item) + 1); - if (!m_fUpdateAll) { + next = d->ui->lvEquityList->invisibleRootItem()->child(d->ui->lvEquityList->invisibleRootItem()->indexOfChild(item) + 1); + if (!d->m_fUpdateAll) { while (next && !next->isSelected()) { - prgOnlineProgress->setValue(prgOnlineProgress->value() + 1); - next = lvEquityList->invisibleRootItem()->child(lvEquityList->invisibleRootItem()->indexOfChild(next) + 1); + d->ui->prgOnlineProgress->setValue(d->ui->prgOnlineProgress->value() + 1); + next = d->ui->lvEquityList->invisibleRootItem()->child(d->ui->lvEquityList->invisibleRootItem()->indexOfChild(next) + 1); } } } else { @@ -720,7 +775,7 @@ } if (next) { - m_webQuote.launch(next->text(WEBID_COL), next->text(KMMID_COL), next->text(SOURCE_COL)); + d->m_webQuote.launch(next->text(WEBID_COL), next->text(KMMID_COL), next->text(SOURCE_COL)); } else { finishUpdate(); } @@ -728,12 +783,13 @@ void KEquityPriceUpdateDlg::finishUpdate() { + Q_D(KEquityPriceUpdateDlg); // we've run past the end, reset to the default value. - m_fUpdateAll = false; + d->m_fUpdateAll = false; // force progress bar to show 100% - prgOnlineProgress->setValue(prgOnlineProgress->maximum()); + d->ui->prgOnlineProgress->setValue(d->ui->prgOnlineProgress->maximum()); // re-enable the sorting that was disabled during the update process - lvEquityList->setSortingEnabled(true); + d->ui->lvEquityList->setSortingEnabled(true); } // Make sure, that these definitions are only used within this file diff --git a/kmymoney/dialogs/kequitypriceupdatedlgdecl.ui b/kmymoney/dialogs/kequitypriceupdatedlg.ui rename from kmymoney/dialogs/kequitypriceupdatedlgdecl.ui rename to kmymoney/dialogs/kequitypriceupdatedlg.ui --- a/kmymoney/dialogs/kequitypriceupdatedlgdecl.ui +++ b/kmymoney/dialogs/kequitypriceupdatedlg.ui @@ -1,8 +1,8 @@ Kevin Tambascio <ktambascio@users.sourceforge.net> - KEquityPriceUpdateDlgDecl - + KEquityPriceUpdateDlg + 0 @@ -156,8 +156,42 @@ kMyMoneyDateInput QWidget
kmymoneydateinput.h
+ 1 - + + + buttonBox + accepted() + KEquityPriceUpdateDlg + accept() + + + 268 + 458 + + + 268 + 240 + + + + + buttonBox + rejected() + KEquityPriceUpdateDlg + reject() + + + 268 + 458 + + + 268 + 240 + + + +
diff --git a/kmymoney/dialogs/kfindtransactiondlg.h b/kmymoney/dialogs/kfindtransactiondlg.h --- a/kmymoney/dialogs/kfindtransactiondlg.h +++ b/kmymoney/dialogs/kfindtransactiondlg.h @@ -3,6 +3,7 @@ ------------------- copyright : (C) 2003 by Thomas Baumgart email : ipwizard@users.sourceforge.net + (C) 2017 by Łukasz Wojniłowicz ***************************************************************************/ /*************************************************************************** @@ -21,65 +22,51 @@ // QT Includes #include -#include -#include -#include // ---------------------------------------------------------------------------- // KDE Includes -#include - // ---------------------------------------------------------------------------- // Project Includes -#include "mymoneysplit.h" -#include "mymoneytransaction.h" -#include "mymoneytransactionfilter.h" - -class QTreeWidget; class QTreeWidgetItem; -class DateRangeDlg; + +namespace Ui { class KSortOptionDlg; } /** * @author Thomas Baumgart */ class KSortOptionDlg : public QDialog { + Q_OBJECT + Q_DISABLE_COPY(KSortOptionDlg) + public: - KSortOptionDlg(QWidget *parent); + explicit KSortOptionDlg(QWidget *parent = nullptr); ~KSortOptionDlg(); - void init(); + void setSortOption(const QString& option, const QString& def); QString sortOption() const; void hideDefaultButton(); private: - struct Private; - Private* const d; + Ui::KSortOptionDlg *ui; }; -namespace Ui -{ -class KFindTransactionDlgDecl; -} - +class KFindTransactionDlgPrivate; class KFindTransactionDlg : public QDialog { Q_OBJECT + Q_DISABLE_COPY(KFindTransactionDlg) public: /** @param withEquityAccounts set to false to hide equity accounts in account page */ - KFindTransactionDlg(QWidget *parent = 0, bool withEquityAccounts = false); - ~KFindTransactionDlg(); + explicit KFindTransactionDlg(QWidget *parent = nullptr, bool withEquityAccounts = false); + virtual ~KFindTransactionDlg(); - virtual bool eventFilter(QObject *o, QEvent *e); - -protected: - void resizeEvent(QResizeEvent*); - void showEvent(QShowEvent* event); + bool eventFilter(QObject *o, QEvent *e) override; protected slots: virtual void slotReset(); @@ -91,7 +78,6 @@ */ virtual void slotShowHelp(); - void slotUpdateSelections(); virtual void slotAmountSelected(); @@ -130,79 +116,14 @@ void selectionNotEmpty(bool); protected: - enum opTypeE { - addAccountToFilter = 0, - addCategoryToFilter, - addPayeeToFilter, - addTagToFilter - }; - - void setupCategoriesPage(); - void setupAccountsPage(bool withEquityAccounts=false); - void setupAmountPage(); - void setupPayeesPage(); - void setupTagsPage(); - void setupDetailsPage(); - - void setupFilter(); - - void selectAllItems(QTreeWidget* view, const bool state); - void selectAllSubItems(QTreeWidgetItem* item, const bool state); - void selectItems(QTreeWidget* view, const QStringList& list, const bool state); - void selectSubItems(QTreeWidgetItem* item, const QStringList& list, const bool state); - - /** - * This method loads the m_payeesView with the payees name - * found in the engine. - */ - void loadPayees(); + KFindTransactionDlgPrivate * const d_ptr; + KFindTransactionDlg(KFindTransactionDlgPrivate &dd, QWidget *parent, bool withEquityAccounts); - /** - * This method loads the m_tagsView with the tags name - * found in the engine. - */ - void loadTags(); + void resizeEvent(QResizeEvent*) override; + void showEvent(QShowEvent* event) override; - /** - * This method loads the register with the matching transactions - */ - void loadView(); - - /** - * This method returns information about the selection state - * of the items in the m_accountsView. - * - * @param view pointer to the listview to scan - * - * @retval true if all items in the view are marked - * @retval false if at least one item is not marked - * - * @note If the view contains no items the method returns @p true. - */ - bool allItemsSelected(const QTreeWidget* view) const; - bool allItemsSelected(const QTreeWidgetItem *item) const; - - void scanCheckListItems(const QTreeWidget* view, const opTypeE op); - void scanCheckListItems(const QTreeWidgetItem* item, const opTypeE op); - void addItemToFilter(const opTypeE op, const QString& id); - -protected: - QDate m_startDates[(int)eMyMoney::TransactionFilter::Date::LastDateItem]; - QDate m_endDates[(int)eMyMoney::TransactionFilter::Date::LastDateItem]; - - /** - * This member holds a list of all transactions matching the filter criteria - */ - QList > m_transactionList; - - MyMoneyTransactionFilter m_filter; - - QMap m_helpAnchor; - - bool m_needReload; - - Ui::KFindTransactionDlgDecl* m_ui; - DateRangeDlg *m_dateRange; +private: + Q_DECLARE_PRIVATE(KFindTransactionDlg) }; #endif diff --git a/kmymoney/dialogs/kfindtransactiondlg.cpp b/kmymoney/dialogs/kfindtransactiondlg.cpp --- a/kmymoney/dialogs/kfindtransactiondlg.cpp +++ b/kmymoney/dialogs/kfindtransactiondlg.cpp @@ -3,6 +3,7 @@ ------------------- copyright : (C) 2003, 2007 by Thomas Baumgart email : ipwizard@users.sourceforge.net + (C) 2017 by Łukasz Wojniłowicz ***************************************************************************/ /*************************************************************************** @@ -14,18 +15,15 @@ * * ***************************************************************************/ -#include "config-kmymoney.h" - #include "kfindtransactiondlg.h" +#include "kfindtransactiondlg_p.h" // ---------------------------------------------------------------------------- // QT Includes #include -#include #include #include -#include #include #include #include @@ -39,281 +37,209 @@ #include #include #include -#include -#include #include // ---------------------------------------------------------------------------- // Project Includes +#include "mymoneysplit.h" +#include "mymoneytransaction.h" +#include "mymoneytransactionfilter.h" #include "kmymoneyedit.h" -#include "mymoneyfile.h" -#include "mymoneypayee.h" -#include "mymoneytag.h" #include "kmymoneyglobalsettings.h" #include "register.h" #include "transaction.h" #include "daterangedlg.h" -#include "ui_kfindtransactiondlgdecl.h" +#include "ui_kfindtransactiondlg.h" #include "ui_ksortoptiondlg.h" -enum ItemRoles { - ItemIdRole = Qt::UserRole -}; - -struct KSortOptionDlg::Private { - Ui::KSortOptionDlg ui; -}; -KSortOptionDlg::KSortOptionDlg(QWidget *parent) - : QDialog(parent), d(new Private) +KSortOptionDlg::KSortOptionDlg(QWidget *parent) : + QDialog(parent), + ui(new Ui::KSortOptionDlg) { - d->ui.setupUi(this); - init(); + ui->setupUi(this); } KSortOptionDlg::~KSortOptionDlg() { - delete d; -} - -void KSortOptionDlg::init() -{ + delete ui; } void KSortOptionDlg::setSortOption(const QString& option, const QString& def) { if (option.isEmpty()) { - d->ui.m_sortOption->setSettings(def); - d->ui.m_useDefault->setChecked(true); + ui->m_sortOption->setSettings(def); + ui->m_useDefault->setChecked(true); } else { - d->ui.m_sortOption->setSettings(option); - d->ui.m_useDefault->setChecked(false); + ui->m_sortOption->setSettings(option); + ui->m_useDefault->setChecked(false); } } QString KSortOptionDlg::sortOption() const { QString rc; - if (!d->ui.m_useDefault->isChecked()) { - rc = d->ui.m_sortOption->settings(); + if (!ui->m_useDefault->isChecked()) { + rc = ui->m_sortOption->settings(); } return rc; } void KSortOptionDlg::hideDefaultButton() { - d->ui.m_useDefault->hide(); + ui->m_useDefault->hide(); } - -KFindTransactionDlg::KFindTransactionDlg(QWidget *parent, bool withEquityAccounts) - : QDialog(parent) - , m_needReload(false) - , m_ui(new Ui::KFindTransactionDlgDecl) +KFindTransactionDlg::KFindTransactionDlg(QWidget *parent, bool withEquityAccounts) : + QDialog(parent), + d_ptr(new KFindTransactionDlgPrivate(this)) { - m_ui->setupUi(this); - m_dateRange = new DateRangeDlg; - m_ui->dateRangeLayout->insertWidget(0, m_dateRange); - - m_ui->ButtonGroup1->setId(m_ui->m_amountButton, 0); - m_ui->ButtonGroup1->setId(m_ui->m_amountRangeButton, 1); - - m_ui->m_register->installEventFilter(this); - m_ui->m_tabWidget->setTabEnabled(m_ui->m_tabWidget->indexOf(m_ui->m_resultPage), false); - - // 'cause we don't have a separate setupTextPage - connect(m_ui->m_textEdit, SIGNAL(textChanged(QString)), this, SLOT(slotUpdateSelections())); - // if return is pressed trigger a search (slotSearch checks if it's possible to perform the search) - connect(m_ui->m_textEdit, SIGNAL(returnPressed()), this, SLOT(slotSearch())); - // in case the date selection changes, we update the selection - connect(m_dateRange, SIGNAL(rangeChanged()), this, SLOT(slotUpdateSelections())); - - setupAccountsPage(withEquityAccounts); - setupCategoriesPage(); - setupAmountPage(); - setupPayeesPage(); - setupTagsPage(); - setupDetailsPage(); - - // We don't need to add the default into the list (see ::slotShowHelp() why) - // m_helpAnchor[m_ui->m_textTab] = QLatin1String("details.search"); - m_helpAnchor[m_ui->m_accountTab] = QLatin1String("details.search.account"); - m_helpAnchor[m_ui->m_dateTab] = QLatin1String("details.search.date"); - m_helpAnchor[m_ui->m_amountTab] = QLatin1String("details.search.amount"); - m_helpAnchor[m_ui->m_categoryTab] = QLatin1String("details.search.category"); - m_helpAnchor[m_ui->m_payeeTab] = QLatin1String("details.search.payee"); - m_helpAnchor[m_ui->m_tagTab] = QLatin1String("details.search.tag"); //FIXME-ALEX update Help - m_helpAnchor[m_ui->m_detailsTab] = QLatin1String("details.search.details"); - - // setup the register - QList cols; - cols << KMyMoneyRegister::DateColumn; - cols << KMyMoneyRegister::AccountColumn; - cols << KMyMoneyRegister::DetailColumn; - cols << KMyMoneyRegister::ReconcileFlagColumn; - cols << KMyMoneyRegister::PaymentColumn; - cols << KMyMoneyRegister::DepositColumn; - m_ui->m_register->setupRegister(MyMoneyAccount(), cols); - m_ui->m_register->setSelectionMode(QTableWidget::SingleSelection); - - connect(m_ui->m_register, SIGNAL(editTransaction()), this, SLOT(slotSelectTransaction())); - connect(m_ui->m_register->horizontalHeader(), SIGNAL(customContextMenuRequested(QPoint)), this, SLOT(slotSortOptions())); - - slotUpdateSelections(); - - // setup the connections - connect(m_ui->buttonBox->button(QDialogButtonBox::Apply), SIGNAL(clicked()), this, SLOT(slotSearch())); - connect(m_ui->buttonBox->button(QDialogButtonBox::Reset), SIGNAL(clicked()), this, SLOT(slotReset())); - connect(m_ui->buttonBox->button(QDialogButtonBox::Reset), SIGNAL(clicked()), m_ui->m_accountsView, SLOT(slotSelectAllAccounts())); - connect(m_ui->buttonBox->button(QDialogButtonBox::Reset), SIGNAL(clicked()), m_ui->m_categoriesView, SLOT(slotSelectAllAccounts())); - connect(m_ui->buttonBox->button(QDialogButtonBox::Close), SIGNAL(clicked()), this, SLOT(deleteLater())); - connect(m_ui->buttonBox->button(QDialogButtonBox::Help), SIGNAL(clicked()), this, SLOT(slotShowHelp())); - - // only allow searches when a selection has been made - m_ui->buttonBox->button(QDialogButtonBox::Apply)->setEnabled(false); - KGuiItem::assign(m_ui->buttonBox->button(QDialogButtonBox::Apply), KStandardGuiItem::find()); - m_ui->buttonBox->button(QDialogButtonBox::Apply)->setToolTip(i18nc("@info:tooltip for find transaction apply button", "Search transactions")); - connect(this, SIGNAL(selectionNotEmpty(bool)), m_ui->buttonBox->button(QDialogButtonBox::Apply), SLOT(setEnabled(bool))); - - // get signal about engine changes - connect(MyMoneyFile::instance(), SIGNAL(dataChanged()), this, SLOT(slotRefreshView())); - - slotUpdateSelections(); + Q_D(KFindTransactionDlg); + d->init(withEquityAccounts); +} - m_ui->m_textEdit->setFocus(); +KFindTransactionDlg::KFindTransactionDlg(KFindTransactionDlgPrivate &dd, QWidget *parent, bool withEquityAccounts) : + QDialog(parent), + d_ptr(&dd) +{ + Q_D(KFindTransactionDlg); + d->init(withEquityAccounts); } KFindTransactionDlg::~KFindTransactionDlg() { - delete m_ui; + Q_D(KFindTransactionDlg); + delete d; } void KFindTransactionDlg::slotReset() { - m_ui->m_textEdit->setText(QString()); - m_ui->m_regExp->setChecked(false); - m_ui->m_caseSensitive->setChecked(false); - m_ui->m_textNegate->setCurrentItem(0); - - m_ui->m_amountEdit->setEnabled(true); - m_ui->m_amountFromEdit->setEnabled(false); - m_ui->m_amountToEdit->setEnabled(false); - m_ui->m_amountEdit->loadText(QString()); - m_ui->m_amountFromEdit->loadText(QString()); - m_ui->m_amountToEdit->loadText(QString()); - m_ui->m_amountButton->setChecked(true); - m_ui->m_amountRangeButton->setChecked(false); - - m_ui->m_emptyPayeesButton->setChecked(false); - selectAllItems(m_ui->m_payeesView, true); - - m_ui->m_emptyTagsButton->setChecked(false); - selectAllItems(m_ui->m_tagsView, true); - - m_ui->m_typeBox->setCurrentIndex((int)eMyMoney::TransactionFilter::Type::All); - m_ui->m_stateBox->setCurrentIndex((int)eMyMoney::TransactionFilter::State::All); - m_ui->m_validityBox->setCurrentIndex((int)eMyMoney::TransactionFilter::Validity::Any); - - m_ui->m_nrEdit->setEnabled(true); - m_ui->m_nrFromEdit->setEnabled(false); - m_ui->m_nrToEdit->setEnabled(false); - m_ui->m_nrEdit->setText(QString()); - m_ui->m_nrFromEdit->setText(QString()); - m_ui->m_nrToEdit->setText(QString()); - m_ui->m_nrButton->setChecked(true); - m_ui->m_nrRangeButton->setChecked(false); - - m_ui->m_tabWidget->setTabEnabled(m_ui->m_tabWidget->indexOf(m_ui->m_resultPage), false); - m_ui->m_tabWidget->setCurrentIndex(m_ui->m_tabWidget->indexOf(m_ui->m_criteriaTab)); + Q_D(KFindTransactionDlg); + d->ui->m_textEdit->setText(QString()); + d->ui->m_regExp->setChecked(false); + d->ui->m_caseSensitive->setChecked(false); + d->ui->m_textNegate->setCurrentItem(0); + + d->ui->m_amountEdit->setEnabled(true); + d->ui->m_amountFromEdit->setEnabled(false); + d->ui->m_amountToEdit->setEnabled(false); + d->ui->m_amountEdit->loadText(QString()); + d->ui->m_amountFromEdit->loadText(QString()); + d->ui->m_amountToEdit->loadText(QString()); + d->ui->m_amountButton->setChecked(true); + d->ui->m_amountRangeButton->setChecked(false); + + d->ui->m_emptyPayeesButton->setChecked(false); + d->selectAllItems(d->ui->m_payeesView, true); + + d->ui->m_emptyTagsButton->setChecked(false); + d->selectAllItems(d->ui->m_tagsView, true); + + d->ui->m_typeBox->setCurrentIndex((int)eMyMoney::TransactionFilter::Type::All); + d->ui->m_stateBox->setCurrentIndex((int)eMyMoney::TransactionFilter::State::All); + d->ui->m_validityBox->setCurrentIndex((int)eMyMoney::TransactionFilter::Validity::Any); + + d->ui->m_nrEdit->setEnabled(true); + d->ui->m_nrFromEdit->setEnabled(false); + d->ui->m_nrToEdit->setEnabled(false); + d->ui->m_nrEdit->setText(QString()); + d->ui->m_nrFromEdit->setText(QString()); + d->ui->m_nrToEdit->setText(QString()); + d->ui->m_nrButton->setChecked(true); + d->ui->m_nrRangeButton->setChecked(false); + + d->ui->m_tabWidget->setTabEnabled(d->ui->m_tabWidget->indexOf(d->ui->m_resultPage), false); + d->ui->m_tabWidget->setCurrentIndex(d->ui->m_tabWidget->indexOf(d->ui->m_criteriaTab)); // the following call implies a call to slotUpdateSelections, // that's why we call it last - m_dateRange->slotReset(); + d->m_dateRange->slotReset(); slotUpdateSelections(); } void KFindTransactionDlg::slotUpdateSelections() { + Q_D(KFindTransactionDlg); QString txt; // Text tab - if (!m_ui->m_textEdit->text().isEmpty()) { + if (!d->ui->m_textEdit->text().isEmpty()) { if (!txt.isEmpty()) txt += ", "; txt += i18n("Text"); - m_ui->m_regExp->setEnabled(QRegExp(m_ui->m_textEdit->text()).isValid()); + d->ui->m_regExp->setEnabled(QRegExp(d->ui->m_textEdit->text()).isValid()); } else - m_ui->m_regExp->setEnabled(false); + d->ui->m_regExp->setEnabled(false); - m_ui->m_caseSensitive->setEnabled(!m_ui->m_textEdit->text().isEmpty()); - m_ui->m_textNegate->setEnabled(!m_ui->m_textEdit->text().isEmpty()); + d->ui->m_caseSensitive->setEnabled(!d->ui->m_textEdit->text().isEmpty()); + d->ui->m_textNegate->setEnabled(!d->ui->m_textEdit->text().isEmpty()); // Account tab - if (!m_ui->m_accountsView->allItemsSelected()) { + if (!d->ui->m_accountsView->allItemsSelected()) { if (!txt.isEmpty()) txt += ", "; txt += i18n("Account"); } - if (m_dateRange->dateRange() != eMyMoney::TransactionFilter::Date::All) { + if (d->m_dateRange->dateRange() != eMyMoney::TransactionFilter::Date::All) { if (!txt.isEmpty()) txt += ", "; txt += i18n("Date"); } // Amount tab - if ((m_ui->m_amountButton->isChecked() && m_ui->m_amountEdit->isValid()) - || (m_ui->m_amountRangeButton->isChecked() - && (m_ui->m_amountFromEdit->isValid() || m_ui->m_amountToEdit->isValid()))) { + if ((d->ui->m_amountButton->isChecked() && d->ui->m_amountEdit->isValid()) + || (d->ui->m_amountRangeButton->isChecked() + && (d->ui->m_amountFromEdit->isValid() || d->ui->m_amountToEdit->isValid()))) { if (!txt.isEmpty()) txt += ", "; txt += i18n("Amount"); } // Categories tab - if (!m_ui->m_categoriesView->allItemsSelected()) { + if (!d->ui->m_categoriesView->allItemsSelected()) { if (!txt.isEmpty()) txt += ", "; txt += i18n("Category"); } // Tags tab - if (!allItemsSelected(m_ui->m_tagsView) - || m_ui->m_emptyTagsButton->isChecked()) { + if (!d->allItemsSelected(d->ui->m_tagsView) + || d->ui->m_emptyTagsButton->isChecked()) { if (!txt.isEmpty()) txt += ", "; txt += i18n("Tags"); } - m_ui->m_tagsView->setEnabled(!m_ui->m_emptyTagsButton->isChecked()); + d->ui->m_tagsView->setEnabled(!d->ui->m_emptyTagsButton->isChecked()); // Payees tab - if (!allItemsSelected(m_ui->m_payeesView) - || m_ui->m_emptyPayeesButton->isChecked()) { + if (!d->allItemsSelected(d->ui->m_payeesView) + || d->ui->m_emptyPayeesButton->isChecked()) { if (!txt.isEmpty()) txt += ", "; txt += i18n("Payees"); } - m_ui->m_payeesView->setEnabled(!m_ui->m_emptyPayeesButton->isChecked()); + d->ui->m_payeesView->setEnabled(!d->ui->m_emptyPayeesButton->isChecked()); // Details tab - if (m_ui->m_typeBox->currentIndex() != 0 - || m_ui->m_stateBox->currentIndex() != 0 - || m_ui->m_validityBox->currentIndex() != 0 - || (m_ui->m_nrButton->isChecked() && m_ui->m_nrEdit->text().length() != 0) - || (m_ui->m_nrRangeButton->isChecked() - && (m_ui->m_nrFromEdit->text().length() != 0 || m_ui->m_nrToEdit->text().length() != 0))) { + if (d->ui->m_typeBox->currentIndex() != 0 + || d->ui->m_stateBox->currentIndex() != 0 + || d->ui->m_validityBox->currentIndex() != 0 + || (d->ui->m_nrButton->isChecked() && d->ui->m_nrEdit->text().length() != 0) + || (d->ui->m_nrRangeButton->isChecked() + && (d->ui->m_nrFromEdit->text().length() != 0 || d->ui->m_nrToEdit->text().length() != 0))) { if (!txt.isEmpty()) txt += ", "; txt += i18n("Details"); } //Show a warning about transfers if Categories are filtered - bug #1523508 - if (!m_ui->m_categoriesView->allItemsSelected()) { - m_ui->m_transferWarning->setText(i18n("Warning: Filtering by Category will exclude all transfers from the results.")); + if (!d->ui->m_categoriesView->allItemsSelected()) { + d->ui->m_transferWarning->setText(i18n("Warning: Filtering by Category will exclude all transfers from the results.")); } else { - m_ui->m_transferWarning->setText(""); + d->ui->m_transferWarning->setText(""); } // disable the search button if no selection is made @@ -322,516 +248,114 @@ if (txt.isEmpty()) { txt = i18nc("No selection", "(None)"); } - m_ui->m_selectedCriteria->setText(i18n("Current selections: %1", txt)); -} - -bool KFindTransactionDlg::allItemsSelected(const QTreeWidgetItem *item) const -{ - QTreeWidgetItem* it_v; - - for (int i = 0; i < item->childCount(); ++i) { - it_v = item->child(i); - if (!(it_v->checkState(0) == Qt::Checked && allItemsSelected(it_v))) { - return false; - } - } - return true; -} - -bool KFindTransactionDlg::allItemsSelected(const QTreeWidget* view) const -{ - QTreeWidgetItem* it_v; - - for (int i = 0; i < view->invisibleRootItem()->childCount(); ++i) { - it_v = view->invisibleRootItem()->child(i); - if (it_v->flags() & Qt::ItemIsUserCheckable) { - if (!(it_v->checkState(0) == Qt::Checked && allItemsSelected(it_v))) { - return false; - } else { - if (!allItemsSelected(it_v)) - return false; - } - } - } - return true; -} - -void KFindTransactionDlg::setupAccountsPage(bool withEquityAccounts) -{ - m_ui->m_accountsView->setSelectionMode(QTreeWidget::MultiSelection); - AccountSet accountSet; - accountSet.addAccountGroup(eMyMoney::Account::Asset); - accountSet.addAccountGroup(eMyMoney::Account::Liability); - - if (withEquityAccounts) - accountSet.addAccountGroup(eMyMoney::Account::Equity); - - //set the accountset to show closed account if the settings say so - accountSet.setHideClosedAccounts(KMyMoneyGlobalSettings::hideClosedAccounts()); - accountSet.load(m_ui->m_accountsView); - connect(m_ui->m_accountsView, SIGNAL(stateChanged()), this, SLOT(slotUpdateSelections())); -} - -void KFindTransactionDlg::selectAllItems(QTreeWidget* view, const bool state) -{ - QTreeWidgetItem* it_v; - - for (int i = 0; i < view->invisibleRootItem()->childCount(); ++i) { - it_v = view->invisibleRootItem()->child(i); - if (it_v->flags() & Qt::ItemIsUserCheckable) { - it_v->setCheckState(0, state ? Qt::Checked : Qt::Unchecked); - } - selectAllSubItems(it_v, state); - } - slotUpdateSelections(); -} - -void KFindTransactionDlg::selectItems(QTreeWidget* view, const QStringList& list, const bool state) -{ - QTreeWidgetItem* it_v; - - for (int i = 0; i < view->invisibleRootItem()->childCount(); ++i) { - it_v = view->invisibleRootItem()->child(i); - QVariant idData = it_v->data(0, ItemIdRole); - if (it_v->flags() & Qt::ItemIsUserCheckable && list.contains(idData.toString())) { - it_v->setCheckState(0, state ? Qt::Checked : Qt::Unchecked); - } - selectSubItems(it_v, list, state); - } - - slotUpdateSelections(); -} - -void KFindTransactionDlg::setupCategoriesPage() -{ - m_ui->m_categoriesView->setSelectionMode(QTreeWidget::MultiSelection); - AccountSet categorySet; - categorySet.addAccountGroup(eMyMoney::Account::Income); - categorySet.addAccountGroup(eMyMoney::Account::Expense); - categorySet.load(m_ui->m_categoriesView); - connect(m_ui->m_categoriesView, SIGNAL(stateChanged()), this, SLOT(slotUpdateSelections())); -} - -void KFindTransactionDlg::selectAllSubItems(QTreeWidgetItem* item, const bool state) -{ - QTreeWidgetItem* it_v; - - for (int i = 0; i < item->childCount(); ++i) { - it_v = item->child(i); - it_v->setCheckState(0, state ? Qt::Checked : Qt::Unchecked); - selectAllSubItems(it_v, state); - } -} - -void KFindTransactionDlg::selectSubItems(QTreeWidgetItem* item, const QStringList& list, const bool state) -{ - QTreeWidgetItem* it_v; - - for (int i = 0; i < item->childCount(); ++i) { - it_v = item->child(i); - QVariant idData = it_v->data(0, ItemIdRole); - if (list.contains(idData.toString())) - it_v->setCheckState(0, state ? Qt::Checked : Qt::Unchecked); - selectSubItems(it_v, list, state); - } -} - -void KFindTransactionDlg::setupAmountPage() -{ - connect(m_ui->m_amountButton, SIGNAL(clicked()), this, SLOT(slotAmountSelected())); - connect(m_ui->m_amountRangeButton, SIGNAL(clicked()), this, SLOT(slotAmountRangeSelected())); - - connect(m_ui->m_amountEdit, SIGNAL(textChanged(QString)), this, SLOT(slotUpdateSelections())); - connect(m_ui->m_amountFromEdit, SIGNAL(textChanged(QString)), this, SLOT(slotUpdateSelections())); - connect(m_ui->m_amountToEdit, SIGNAL(textChanged(QString)), this, SLOT(slotUpdateSelections())); - - m_ui->m_amountButton->setChecked(true); - slotAmountSelected(); + d->ui->m_selectedCriteria->setText(i18n("Current selections: %1", txt)); } void KFindTransactionDlg::slotAmountSelected() { - m_ui->m_amountEdit->setEnabled(true); - m_ui->m_amountFromEdit->setEnabled(false); - m_ui->m_amountToEdit->setEnabled(false); + Q_D(KFindTransactionDlg); + d->ui->m_amountEdit->setEnabled(true); + d->ui->m_amountFromEdit->setEnabled(false); + d->ui->m_amountToEdit->setEnabled(false); slotUpdateSelections(); } void KFindTransactionDlg::slotAmountRangeSelected() { - m_ui->m_amountEdit->setEnabled(false); - m_ui->m_amountFromEdit->setEnabled(true); - m_ui->m_amountToEdit->setEnabled(true); + Q_D(KFindTransactionDlg); + d->ui->m_amountEdit->setEnabled(false); + d->ui->m_amountFromEdit->setEnabled(true); + d->ui->m_amountToEdit->setEnabled(true); slotUpdateSelections(); } -void KFindTransactionDlg::setupPayeesPage() -{ - m_ui->m_payeesView->setSelectionMode(QAbstractItemView::SingleSelection); - m_ui->m_payeesView->header()->hide(); - m_ui->m_payeesView->setAlternatingRowColors(true); - - loadPayees(); - - m_ui->m_payeesView->sortItems(0, Qt::AscendingOrder); - m_ui->m_emptyPayeesButton->setCheckState(Qt::Unchecked); - - connect(m_ui->m_allPayeesButton, SIGNAL(clicked()), this, SLOT(slotSelectAllPayees())); - connect(m_ui->m_clearPayeesButton, SIGNAL(clicked()), this, SLOT(slotDeselectAllPayees())); - connect(m_ui->m_emptyPayeesButton, SIGNAL(stateChanged(int)), this, SLOT(slotUpdateSelections())); - connect(m_ui->m_payeesView, SIGNAL(itemChanged(QTreeWidgetItem*,int)), this, SLOT(slotUpdateSelections())); -} - -void KFindTransactionDlg::loadPayees() -{ - MyMoneyFile* file = MyMoneyFile::instance(); - QList list; - QList::Iterator it_l; - - list = file->payeeList(); - // load view - for (it_l = list.begin(); it_l != list.end(); ++it_l) { - QTreeWidgetItem* item = new QTreeWidgetItem(m_ui->m_payeesView); - item->setText(0, (*it_l).name()); - item->setData(0, ItemIdRole, (*it_l).id()); - item->setCheckState(0, Qt::Checked); - } -} void KFindTransactionDlg::slotSelectAllPayees() { - selectAllItems(m_ui->m_payeesView, true); + Q_D(KFindTransactionDlg); + d->selectAllItems(d->ui->m_payeesView, true); } void KFindTransactionDlg::slotDeselectAllPayees() { - selectAllItems(m_ui->m_payeesView, false); -} - -void KFindTransactionDlg::setupTagsPage() -{ - m_ui->m_tagsView->setSelectionMode(QAbstractItemView::SingleSelection); - m_ui->m_tagsView->header()->hide(); - m_ui->m_tagsView->setAlternatingRowColors(true); - - loadTags(); - - m_ui->m_tagsView->sortItems(0, Qt::AscendingOrder); - m_ui->m_emptyTagsButton->setCheckState(Qt::Unchecked); - - connect(m_ui->m_allTagsButton, SIGNAL(clicked()), this, SLOT(slotSelectAllTags())); - connect(m_ui->m_clearTagsButton, SIGNAL(clicked()), this, SLOT(slotDeselectAllTags())); - connect(m_ui->m_emptyTagsButton, SIGNAL(stateChanged(int)), this, SLOT(slotUpdateSelections())); - connect(m_ui->m_tagsView, SIGNAL(itemChanged(QTreeWidgetItem*,int)), this, SLOT(slotUpdateSelections())); + Q_D(KFindTransactionDlg); + d->selectAllItems(d->ui->m_payeesView, false); } -void KFindTransactionDlg::loadTags() -{ - MyMoneyFile* file = MyMoneyFile::instance(); - QList list; - QList::Iterator it_l; - - list = file->tagList(); - // load view - for (it_l = list.begin(); it_l != list.end(); ++it_l) { - QTreeWidgetItem* item = new QTreeWidgetItem(m_ui->m_tagsView); - item->setText(0, (*it_l).name()); - item->setData(0, ItemIdRole, (*it_l).id()); - item->setCheckState(0, Qt::Checked); - } -} void KFindTransactionDlg::slotSelectAllTags() { - selectAllItems(m_ui->m_tagsView, true); + Q_D(KFindTransactionDlg); + d->selectAllItems(d->ui->m_tagsView, true); } void KFindTransactionDlg::slotDeselectAllTags() { - selectAllItems(m_ui->m_tagsView, false); -} - -void KFindTransactionDlg::setupDetailsPage() -{ - connect(m_ui->m_typeBox, SIGNAL(activated(int)), this, SLOT(slotUpdateSelections())); - connect(m_ui->m_stateBox, SIGNAL(activated(int)), this, SLOT(slotUpdateSelections())); - connect(m_ui->m_validityBox, SIGNAL(activated(int)), this, SLOT(slotUpdateSelections())); - - connect(m_ui->m_nrButton, SIGNAL(clicked()), this, SLOT(slotNrSelected())); - connect(m_ui->m_nrRangeButton, SIGNAL(clicked()), this, SLOT(slotNrRangeSelected())); - connect(m_ui->m_nrEdit, SIGNAL(textChanged(QString)), this, SLOT(slotUpdateSelections())); - connect(m_ui->m_nrFromEdit, SIGNAL(textChanged(QString)), this, SLOT(slotUpdateSelections())); - connect(m_ui->m_nrToEdit, SIGNAL(textChanged(QString)), this, SLOT(slotUpdateSelections())); - - m_ui->m_nrButton->setChecked(true); - slotNrSelected(); + Q_D(KFindTransactionDlg); + d->selectAllItems(d->ui->m_tagsView, false); } void KFindTransactionDlg::slotNrSelected() { - m_ui->m_nrEdit->setEnabled(true); - m_ui->m_nrFromEdit->setEnabled(false); - m_ui->m_nrToEdit->setEnabled(false); + Q_D(KFindTransactionDlg); + d->ui->m_nrEdit->setEnabled(true); + d->ui->m_nrFromEdit->setEnabled(false); + d->ui->m_nrToEdit->setEnabled(false); slotUpdateSelections(); } void KFindTransactionDlg::slotNrRangeSelected() { - m_ui->m_nrEdit->setEnabled(false); - m_ui->m_nrFromEdit->setEnabled(true); - m_ui->m_nrToEdit->setEnabled(true); + Q_D(KFindTransactionDlg); + d->ui->m_nrEdit->setEnabled(false); + d->ui->m_nrFromEdit->setEnabled(true); + d->ui->m_nrToEdit->setEnabled(true); slotUpdateSelections(); } -void KFindTransactionDlg::addItemToFilter(const opTypeE op, const QString& id) -{ - switch (op) { - case addAccountToFilter: - m_filter.addAccount(id); - break; - case addCategoryToFilter: - m_filter.addCategory(id); - break; - case addPayeeToFilter: - m_filter.addPayee(id); - break; - case addTagToFilter: - m_filter.addTag(id); - break; - } -} - -void KFindTransactionDlg::scanCheckListItems(const QTreeWidgetItem* item, const opTypeE op) -{ - QTreeWidgetItem* it_v; - - for (int i = 0; i < item->childCount(); ++i) { - it_v = item->child(i); - QVariant idData = it_v->data(0, ItemIdRole); - if (it_v->flags() & Qt::ItemIsUserCheckable) { - if (it_v->checkState(0) == Qt::Checked) - addItemToFilter(op, idData.toString()); - } - scanCheckListItems(it_v, op); - } -} - -void KFindTransactionDlg::scanCheckListItems(const QTreeWidget* view, const opTypeE op) -{ - QTreeWidgetItem* it_v; - - for (int i = 0; i < view->invisibleRootItem()->childCount(); ++i) { - it_v = view->invisibleRootItem()->child(i); - QVariant idData = it_v->data(0, ItemIdRole); - if (it_v->flags() & Qt::ItemIsUserCheckable) { - if (it_v->checkState(0) == Qt::Checked) { - addItemToFilter(op, idData.toString()); - } - } - scanCheckListItems(it_v, op); - } -} - -void KFindTransactionDlg::setupFilter() -{ - m_filter.clear(); - - // Text tab - if (!m_ui->m_textEdit->text().isEmpty()) { - QRegExp exp(m_ui->m_textEdit->text(), m_ui->m_caseSensitive->isChecked() ? Qt::CaseSensitive : Qt::CaseInsensitive, !m_ui->m_regExp->isChecked() ? QRegExp::Wildcard : QRegExp::RegExp); - m_filter.setTextFilter(exp, m_ui->m_textNegate->currentIndex() != 0); - } - - // Account tab - if (!m_ui->m_accountsView->allItemsSelected()) { - // retrieve a list of selected accounts - QStringList list; - m_ui->m_accountsView->selectedItems(list); - - // if we're not in expert mode, we need to make sure - // that all stock accounts for the selected investment - // account are also selected - if (!KMyMoneyGlobalSettings::expertMode()) { - QStringList missing; - QStringList::const_iterator it_a, it_b; - for (it_a = list.constBegin(); it_a != list.constEnd(); ++it_a) { - MyMoneyAccount acc = MyMoneyFile::instance()->account(*it_a); - if (acc.accountType() == eMyMoney::Account::Investment) { - for (it_b = acc.accountList().constBegin(); it_b != acc.accountList().constEnd(); ++it_b) { - if (!list.contains(*it_b)) { - missing.append(*it_b); - } - } - } - } - list += missing; - } - - m_filter.addAccount(list); - } - - // Date tab - if ((int)m_dateRange->dateRange() != 0) { - m_filter.setDateFilter(m_dateRange->fromDate(), m_dateRange->toDate()); - } - - // Amount tab - if ((m_ui->m_amountButton->isChecked() && m_ui->m_amountEdit->isValid())) { - m_filter.setAmountFilter(m_ui->m_amountEdit->value(), m_ui->m_amountEdit->value()); - - } else if ((m_ui->m_amountRangeButton->isChecked() - && (m_ui->m_amountFromEdit->isValid() || m_ui->m_amountToEdit->isValid()))) { - - MyMoneyMoney from(MyMoneyMoney::minValue), to(MyMoneyMoney::maxValue); - if (m_ui->m_amountFromEdit->isValid()) - from = m_ui->m_amountFromEdit->value(); - if (m_ui->m_amountToEdit->isValid()) - to = m_ui->m_amountToEdit->value(); - - m_filter.setAmountFilter(from, to); - } - - // Categories tab - if (!m_ui->m_categoriesView->allItemsSelected()) { - m_filter.addCategory(m_ui->m_categoriesView->selectedItems()); - } - - // Tags tab - if (m_ui->m_emptyTagsButton->isChecked()) { - m_filter.addTag(QString()); - - } else if (!allItemsSelected(m_ui->m_tagsView)) { - scanCheckListItems(m_ui->m_tagsView, addTagToFilter); - } - - // Payees tab - if (m_ui->m_emptyPayeesButton->isChecked()) { - m_filter.addPayee(QString()); - - } else if (!allItemsSelected(m_ui->m_payeesView)) { - scanCheckListItems(m_ui->m_payeesView, addPayeeToFilter); - } - - // Details tab - if (m_ui->m_typeBox->currentIndex() != 0) - m_filter.addType(m_ui->m_typeBox->currentIndex()); - - if (m_ui->m_stateBox->currentIndex() != 0) - m_filter.addState(m_ui->m_stateBox->currentIndex()); - - if (m_ui->m_validityBox->currentIndex() != 0) - m_filter.addValidity(m_ui->m_validityBox->currentIndex()); - - if (m_ui->m_nrButton->isChecked() && !m_ui->m_nrEdit->text().isEmpty()) - m_filter.setNumberFilter(m_ui->m_nrEdit->text(), m_ui->m_nrEdit->text()); - - if (m_ui->m_nrRangeButton->isChecked() - && (!m_ui->m_nrFromEdit->text().isEmpty() || !m_ui->m_nrToEdit->text().isEmpty())) { - m_filter.setNumberFilter(m_ui->m_nrFromEdit->text(), m_ui->m_nrToEdit->text()); - } -} - void KFindTransactionDlg::slotSearch() { + Q_D(KFindTransactionDlg); // perform the search only if the button is enabled - if (!m_ui->buttonBox->button(QDialogButtonBox::Apply)->isEnabled()) + if (!d->ui->buttonBox->button(QDialogButtonBox::Apply)->isEnabled()) return; // setup the filter from the dialog widgets - setupFilter(); + d->setupFilter(); // filter is setup, now fill the register slotRefreshView(); - m_ui->m_register->setFocus(); + d->ui->m_register->setFocus(); } void KFindTransactionDlg::slotRefreshView() { - m_needReload = true; + Q_D(KFindTransactionDlg); + d->m_needReload = true; if (isVisible()) { - loadView(); - m_needReload = false; + d->loadView(); + d->m_needReload = false; } } void KFindTransactionDlg::showEvent(QShowEvent* event) { - if (m_needReload) { - loadView(); - m_needReload = false; + Q_D(KFindTransactionDlg); + if (d->m_needReload) { + d->loadView(); + d->m_needReload = false; } QDialog::showEvent(event); } -void KFindTransactionDlg::loadView() -{ - // setup sort order - m_ui->m_register->setSortOrder(KMyMoneyGlobalSettings::sortSearchView()); - - // clear out old data - m_ui->m_register->clear(); - - // retrieve the list from the engine - MyMoneyFile::instance()->transactionList(m_transactionList, m_filter); - - // create the elements for the register - QList >::const_iterator it; - QMapuniqueMap; - MyMoneyMoney deposit, payment; - - int splitCount = 0; - for (it = m_transactionList.constBegin(); it != m_transactionList.constEnd(); ++it) { - const MyMoneySplit& split = (*it).second; - MyMoneyAccount acc = MyMoneyFile::instance()->account(split.accountId()); - ++splitCount; - uniqueMap[(*it).first.id()]++; - - KMyMoneyRegister::Register::transactionFactory(m_ui->m_register, (*it).first, (*it).second, uniqueMap[(*it).first.id()]); - { // debug stuff - if (split.shares().isNegative()) { - payment += split.shares().abs(); - } else { - deposit += split.shares().abs(); - } - } - } - - // add the group markers - m_ui->m_register->addGroupMarkers(); - - // sort the transactions according to the sort setting - m_ui->m_register->sortItems(); - - // remove trailing and adjacent markers - m_ui->m_register->removeUnwantedGroupMarkers(); - - // turn on the ledger lens for the register - m_ui->m_register->setLedgerLensForced(); - - m_ui->m_register->updateRegister(true); - - m_ui->m_register->setFocusToTop(); - m_ui->m_register->selectItem(m_ui->m_register->focusItem()); - -#ifdef KMM_DEBUG - m_ui->m_foundText->setText(i18np("Found %1 matching transaction (D %2 / P %3 = %4)", - "Found %1 matching transactions (D %2 / P %3 = %4)", splitCount, deposit.formatMoney("", 2), payment.formatMoney("", 2), (deposit - payment).formatMoney("", 2))); -#else - m_ui->m_foundText->setText(i18np("Found %1 matching transaction", "Found %1 matching transactions", splitCount)); -#endif - - m_ui->m_tabWidget->setTabEnabled(m_ui->m_tabWidget->indexOf(m_ui->m_resultPage), true); - m_ui->m_tabWidget->setCurrentIndex(m_ui->m_tabWidget->indexOf(m_ui->m_resultPage)); - - QTimer::singleShot(10, this, SLOT(slotRightSize())); -} - void KFindTransactionDlg::slotRightSize() { - m_ui->m_register->update(); + Q_D(KFindTransactionDlg); + d->ui->m_register->update(); } void KFindTransactionDlg::resizeEvent(QResizeEvent* ev) { + Q_D(KFindTransactionDlg); // Columns // 1 = Date // 2 = Account @@ -843,39 +367,40 @@ // don't forget the resizer QDialog::resizeEvent(ev); - if (!m_ui->m_register->isVisible()) + if (!d->ui->m_register->isVisible()) return; // resize the register - int w = m_ui->m_register->contentsRect().width(); + int w = d->ui->m_register->contentsRect().width(); int m_debitWidth = 80; int m_creditWidth = 80; - m_ui->m_register->adjustColumn(1); - m_ui->m_register->adjustColumn(2); - m_ui->m_register->adjustColumn(5); + d->ui->m_register->adjustColumn(1); + d->ui->m_register->adjustColumn(2); + d->ui->m_register->adjustColumn(5); - m_ui->m_register->setColumnWidth(6, m_debitWidth); - m_ui->m_register->setColumnWidth(7, m_creditWidth); + d->ui->m_register->setColumnWidth(6, m_debitWidth); + d->ui->m_register->setColumnWidth(7, m_creditWidth); - for (int i = 0; i < m_ui->m_register->columnCount(); ++i) { + for (auto i = 0; i < d->ui->m_register->columnCount(); ++i) { switch (i) { case 4: // skip the one, we want to set break; default: - w -= m_ui->m_register->columnWidth(i); + w -= d->ui->m_register->columnWidth(i); break; } } - m_ui->m_register->setColumnWidth(4, w); + d->ui->m_register->setColumnWidth(4, w); } void KFindTransactionDlg::slotSelectTransaction() { - QList list = m_ui->m_register->selectedItems(); + Q_D(KFindTransactionDlg); + auto list = d->ui->m_register->selectedItems(); if (!list.isEmpty()) { KMyMoneyRegister::Transaction* t = dynamic_cast(list[0]); if (t) { @@ -887,13 +412,14 @@ bool KFindTransactionDlg::eventFilter(QObject* o, QEvent* e) { - bool rc = false; + Q_D(KFindTransactionDlg); + auto rc = false; if (o->isWidgetType()) { if (e->type() == QEvent::KeyPress) { const QWidget* w = dynamic_cast(o); QKeyEvent *k = static_cast(e); - if (w == m_ui->m_register) { + if (w == d->ui->m_register) { switch (k->key()) { default: break; @@ -912,7 +438,8 @@ void KFindTransactionDlg::slotShowHelp() { - QString anchor = m_helpAnchor[m_ui->m_criteriaTab->currentWidget()]; + Q_D(KFindTransactionDlg); + auto anchor = d->m_helpAnchor[d->ui->m_criteriaTab->currentWidget()]; if (anchor.isEmpty()) anchor = QString("details.search"); diff --git a/kmymoney/dialogs/kfindtransactiondlgdecl.ui b/kmymoney/dialogs/kfindtransactiondlg.ui rename from kmymoney/dialogs/kfindtransactiondlgdecl.ui rename to kmymoney/dialogs/kfindtransactiondlg.ui --- a/kmymoney/dialogs/kfindtransactiondlgdecl.ui +++ b/kmymoney/dialogs/kfindtransactiondlg.ui @@ -1,7 +1,7 @@ - KFindTransactionDlgDecl - + KFindTransactionDlg + 0 diff --git a/kmymoney/dialogs/kfindtransactiondlg_p.h b/kmymoney/dialogs/kfindtransactiondlg_p.h new file mode 100644 --- /dev/null +++ b/kmymoney/dialogs/kfindtransactiondlg_p.h @@ -0,0 +1,627 @@ +/*************************************************************************** + kfindtransactiondlg.cpp + ------------------- + copyright : (C) 2003, 2007 by Thomas Baumgart + email : ipwizard@users.sourceforge.net + (C) 2017 by Łukasz Wojniłowicz + ***************************************************************************/ + +/*************************************************************************** + * * + * q 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 KFINDTRANSACTIONDLG_P_H +#define KFINDTRANSACTIONDLG_P_H + +#include "kfindtransactiondlg.h" + +// ---------------------------------------------------------------------------- +// QT Includes + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +// ---------------------------------------------------------------------------- +// KDE Includes + +#include +#include +#include +#include +#include + +// ---------------------------------------------------------------------------- +// Project Includes + +#include "kmymoneyedit.h" +#include "mymoneyfile.h" +#include "mymoneypayee.h" +#include "mymoneytag.h" +#include "kmymoneyglobalsettings.h" +#include "register.h" +#include "transaction.h" +#include "daterangedlg.h" + +#include "ui_kfindtransactiondlg.h" + +class KFindTransactionDlgPrivate +{ + Q_DISABLE_COPY(KFindTransactionDlgPrivate) + Q_DECLARE_PUBLIC(KFindTransactionDlg) + +public: + enum opTypeE { + addAccountToFilter = 0, + addCategoryToFilter, + addPayeeToFilter, + addTagToFilter + }; + + KFindTransactionDlgPrivate(KFindTransactionDlg *qq) : + q_ptr(qq), + ui(new Ui::KFindTransactionDlg) + { + } + + ~KFindTransactionDlgPrivate() + { + delete ui; + } + + void init(bool withEquityAccounts) + { + Q_Q(KFindTransactionDlg); + m_needReload = false; + ui->setupUi(q); + m_dateRange = new DateRangeDlg; + ui->dateRangeLayout->insertWidget(0, m_dateRange); + + ui->ButtonGroup1->setId(ui->m_amountButton, 0); + ui->ButtonGroup1->setId(ui->m_amountRangeButton, 1); + + ui->m_register->installEventFilter(q); + ui->m_tabWidget->setTabEnabled(ui->m_tabWidget->indexOf(ui->m_resultPage), false); + + // 'cause we don't have a separate setupTextPage + q->connect(ui->m_textEdit, &QLineEdit::textChanged, q, &KFindTransactionDlg::slotUpdateSelections); + // if return is pressed trigger a search (slotSearch checks if it's possible to perform the search) + q->connect(ui->m_textEdit, &KLineEdit::returnPressed, q, &KFindTransactionDlg::slotSearch); + // in case the date selection changes, we update the selection + q->connect(m_dateRange, &DateRangeDlg::rangeChanged, q, &KFindTransactionDlg::slotUpdateSelections); + + setupAccountsPage(withEquityAccounts); + setupCategoriesPage(); + setupAmountPage(); + setupPayeesPage(); + setupTagsPage(); + setupDetailsPage(); + + // We don't need to add the default into the list (see ::slotShowHelp() why) + // m_helpAnchor[m_ui->m_textTab] = QLatin1String("details.search"); + m_helpAnchor[ui->m_accountTab] = QLatin1String("details.search.account"); + m_helpAnchor[ui->m_dateTab] = QLatin1String("details.search.date"); + m_helpAnchor[ui->m_amountTab] = QLatin1String("details.search.amount"); + m_helpAnchor[ui->m_categoryTab] = QLatin1String("details.search.category"); + m_helpAnchor[ui->m_payeeTab] = QLatin1String("details.search.payee"); + m_helpAnchor[ui->m_tagTab] = QLatin1String("details.search.tag"); //FIXME-ALEX update Help + m_helpAnchor[ui->m_detailsTab] = QLatin1String("details.search.details"); + + // setup the register + QList cols { + KMyMoneyRegister::DateColumn, + KMyMoneyRegister::AccountColumn, + KMyMoneyRegister::DetailColumn, + KMyMoneyRegister::ReconcileFlagColumn, + KMyMoneyRegister::PaymentColumn, + KMyMoneyRegister::DepositColumn}; + ui->m_register->setupRegister(MyMoneyAccount(), cols); + ui->m_register->setSelectionMode(QTableWidget::SingleSelection); + + q->connect(ui->m_register, &KMyMoneyRegister::Register::editTransaction, q, &KFindTransactionDlg::slotSelectTransaction); + q->connect(ui->m_register->horizontalHeader(), &QWidget::customContextMenuRequested, q, &KFindTransactionDlg::slotSortOptions); + + q->slotUpdateSelections(); + + // setup the connections + q->connect(ui->buttonBox->button(QDialogButtonBox::Apply), &QAbstractButton::clicked, q, &KFindTransactionDlg::slotSearch); + q->connect(ui->buttonBox->button(QDialogButtonBox::Reset), &QAbstractButton::clicked, q, &KFindTransactionDlg::slotReset); + q->connect(ui->buttonBox->button(QDialogButtonBox::Reset), &QAbstractButton::clicked, ui->m_accountsView, &kMyMoneyAccountSelector::slotSelectAllAccounts); + q->connect(ui->buttonBox->button(QDialogButtonBox::Reset), &QAbstractButton::clicked, ui->m_categoriesView, &kMyMoneyAccountSelector::slotSelectAllAccounts); + q->connect(ui->buttonBox->button(QDialogButtonBox::Close), &QAbstractButton::clicked, q, &QObject::deleteLater); + q->connect(ui->buttonBox->button(QDialogButtonBox::Help), &QAbstractButton::clicked, q, &KFindTransactionDlg::slotShowHelp); + + // only allow searches when a selection has been made + ui->buttonBox->button(QDialogButtonBox::Apply)->setEnabled(false); + KGuiItem::assign(ui->buttonBox->button(QDialogButtonBox::Apply), KStandardGuiItem::find()); + ui->buttonBox->button(QDialogButtonBox::Apply)->setToolTip(i18nc("@info:tooltip for find transaction apply button", "Search transactions")); + q->connect(q, &KFindTransactionDlg::selectionNotEmpty, ui->buttonBox->button(QDialogButtonBox::Apply), &QWidget::setEnabled); + + // get signal about engine changes + q->connect(MyMoneyFile::instance(), &MyMoneyFile::dataChanged, q, &KFindTransactionDlg::slotRefreshView); + + q->slotUpdateSelections(); + + ui->m_textEdit->setFocus(); + } + + /** + * q method returns information about the selection state + * of the items in the m_accountsView. + * + * @param view pointer to the listview to scan + * + * @retval true if all items in the view are marked + * @retval false if at least one item is not marked + * + * @note If the view contains no items the method returns @p true. + */ + bool allItemsSelected(const QTreeWidgetItem *item) const + { + QTreeWidgetItem* it_v; + + for (auto i = 0; i < item->childCount(); ++i) { + it_v = item->child(i); + if (!(it_v->checkState(0) == Qt::Checked && allItemsSelected(it_v))) { + return false; + } + } + return true; + } + + bool allItemsSelected(const QTreeWidget* view) const + { + QTreeWidgetItem* it_v; + + for (int i = 0; i < view->invisibleRootItem()->childCount(); ++i) { + it_v = view->invisibleRootItem()->child(i); + if (it_v->flags() & Qt::ItemIsUserCheckable) { + if (!(it_v->checkState(0) == Qt::Checked && allItemsSelected(it_v))) { + return false; + } else { + if (!allItemsSelected(it_v)) + return false; + } + } + } + return true; + } + + void addItemToFilter(const opTypeE op, const QString& id) + { + switch (op) { + case addAccountToFilter: + m_filter.addAccount(id); + break; + case addCategoryToFilter: + m_filter.addCategory(id); + break; + case addPayeeToFilter: + m_filter.addPayee(id); + break; + case addTagToFilter: + m_filter.addTag(id); + break; + } + } + + void scanCheckListItems(const QTreeWidgetItem* item, const opTypeE op) + { + QTreeWidgetItem* it_v; + + for (auto i = 0; i < item->childCount(); ++i) { + it_v = item->child(i); + QVariant idData = it_v->data(0, Qt::UserRole); + if (it_v->flags() & Qt::ItemIsUserCheckable) { + if (it_v->checkState(0) == Qt::Checked) + addItemToFilter(op, idData.toString()); + } + scanCheckListItems(it_v, op); + } + } + + void scanCheckListItems(const QTreeWidget* view, const opTypeE op) + { + QTreeWidgetItem* it_v; + + for (auto i = 0; i < view->invisibleRootItem()->childCount(); ++i) { + it_v = view->invisibleRootItem()->child(i); + QVariant idData = it_v->data(0, Qt::UserRole); + if (it_v->flags() & Qt::ItemIsUserCheckable) { + if (it_v->checkState(0) == Qt::Checked) { + addItemToFilter(op, idData.toString()); + } + } + scanCheckListItems(it_v, op); + } + } + + void selectAllItems(QTreeWidget* view, const bool state) + { + QTreeWidgetItem* it_v; + + for (int i = 0; i < view->invisibleRootItem()->childCount(); ++i) { + it_v = view->invisibleRootItem()->child(i); + if (it_v->flags() & Qt::ItemIsUserCheckable) { + it_v->setCheckState(0, state ? Qt::Checked : Qt::Unchecked); + } + selectAllSubItems(it_v, state); + } + Q_Q(KFindTransactionDlg); + q->slotUpdateSelections(); + } + + void selectItems(QTreeWidget* view, const QStringList& list, const bool state) + { + QTreeWidgetItem* it_v; + + for (int i = 0; i < view->invisibleRootItem()->childCount(); ++i) { + it_v = view->invisibleRootItem()->child(i); + QVariant idData = it_v->data(0, Qt::UserRole); + if (it_v->flags() & Qt::ItemIsUserCheckable && list.contains(idData.toString())) { + it_v->setCheckState(0, state ? Qt::Checked : Qt::Unchecked); + } + selectSubItems(it_v, list, state); + } + + Q_Q(KFindTransactionDlg); + q->slotUpdateSelections(); + } + + void selectAllSubItems(QTreeWidgetItem* item, const bool state) + { + QTreeWidgetItem* it_v; + + for (int i = 0; i < item->childCount(); ++i) { + it_v = item->child(i); + it_v->setCheckState(0, state ? Qt::Checked : Qt::Unchecked); + selectAllSubItems(it_v, state); + } + } + + void selectSubItems(QTreeWidgetItem* item, const QStringList& list, const bool state) + { + QTreeWidgetItem* it_v; + + for (int i = 0; i < item->childCount(); ++i) { + it_v = item->child(i); + QVariant idData = it_v->data(0, Qt::UserRole); + if (list.contains(idData.toString())) + it_v->setCheckState(0, state ? Qt::Checked : Qt::Unchecked); + selectSubItems(it_v, list, state); + } + } + + /** + * q method loads the register with the matching transactions + */ + void loadView() + { + // setup sort order + ui->m_register->setSortOrder(KMyMoneyGlobalSettings::sortSearchView()); + + // clear out old data + ui->m_register->clear(); + + // retrieve the list from the engine + MyMoneyFile::instance()->transactionList(m_transactionList, m_filter); + + // create the elements for the register + QList >::const_iterator it; + QMapuniqueMap; + MyMoneyMoney deposit, payment; + + int splitCount = 0; + for (it = m_transactionList.constBegin(); it != m_transactionList.constEnd(); ++it) { + const MyMoneySplit& split = (*it).second; + MyMoneyAccount acc = MyMoneyFile::instance()->account(split.accountId()); + ++splitCount; + uniqueMap[(*it).first.id()]++; + + KMyMoneyRegister::Register::transactionFactory(ui->m_register, (*it).first, (*it).second, uniqueMap[(*it).first.id()]); + { // debug stuff + if (split.shares().isNegative()) { + payment += split.shares().abs(); + } else { + deposit += split.shares().abs(); + } + } + } + + // add the group markers + ui->m_register->addGroupMarkers(); + + // sort the transactions according to the sort setting + ui->m_register->sortItems(); + + // remove trailing and adjacent markers + ui->m_register->removeUnwantedGroupMarkers(); + + // turn on the ledger lens for the register + ui->m_register->setLedgerLensForced(); + + ui->m_register->updateRegister(true); + + ui->m_register->setFocusToTop(); + ui->m_register->selectItem(ui->m_register->focusItem()); + + #ifdef KMM_DEBUG + ui->m_foundText->setText(i18np("Found %1 matching transaction (D %2 / P %3 = %4)", + "Found %1 matching transactions (D %2 / P %3 = %4)", splitCount, deposit.formatMoney("", 2), payment.formatMoney("", 2), (deposit - payment).formatMoney("", 2))); + #else + ui->m_foundText->setText(i18np("Found %1 matching transaction", "Found %1 matching transactions", splitCount)); + #endif + + ui->m_tabWidget->setTabEnabled(ui->m_tabWidget->indexOf(ui->m_resultPage), true); + ui->m_tabWidget->setCurrentIndex(ui->m_tabWidget->indexOf(ui->m_resultPage)); + + Q_Q(KFindTransactionDlg); + QTimer::singleShot(10, q, SLOT(slotRightSize())); + } + + /** + * q method loads the m_tagsView with the tags name + * found in the engine. + */ + void loadTags() + { + MyMoneyFile* file = MyMoneyFile::instance(); + QList list; + QList::Iterator it_l; + + list = file->tagList(); + // load view + for (it_l = list.begin(); it_l != list.end(); ++it_l) { + auto item = new QTreeWidgetItem(ui->m_tagsView); + item->setText(0, (*it_l).name()); + item->setData(0, Qt::UserRole, (*it_l).id()); + item->setCheckState(0, Qt::Checked); + } + } + + /** + * q method loads the m_payeesView with the payees name + * found in the engine. + */ + void loadPayees() + { + MyMoneyFile* file = MyMoneyFile::instance(); + QList list; + QList::Iterator it_l; + + list = file->payeeList(); + // load view + for (it_l = list.begin(); it_l != list.end(); ++it_l) { + auto item = new QTreeWidgetItem(ui->m_payeesView); + item->setText(0, (*it_l).name()); + item->setData(0, Qt::UserRole, (*it_l).id()); + item->setCheckState(0, Qt::Checked); + } + } + + void setupFilter() + { + m_filter.clear(); + + // Text tab + if (!ui->m_textEdit->text().isEmpty()) { + QRegExp exp(ui->m_textEdit->text(), ui->m_caseSensitive->isChecked() ? Qt::CaseSensitive : Qt::CaseInsensitive, !ui->m_regExp->isChecked() ? QRegExp::Wildcard : QRegExp::RegExp); + m_filter.setTextFilter(exp, ui->m_textNegate->currentIndex() != 0); + } + + // Account tab + if (!ui->m_accountsView->allItemsSelected()) { + // retrieve a list of selected accounts + QStringList list; + ui->m_accountsView->selectedItems(list); + + // if we're not in expert mode, we need to make sure + // that all stock accounts for the selected investment + // account are also selected + if (!KMyMoneyGlobalSettings::expertMode()) { + QStringList missing; + QStringList::const_iterator it_a, it_b; + for (it_a = list.constBegin(); it_a != list.constEnd(); ++it_a) { + MyMoneyAccount acc = MyMoneyFile::instance()->account(*it_a); + if (acc.accountType() == eMyMoney::Account::Investment) { + for (it_b = acc.accountList().constBegin(); it_b != acc.accountList().constEnd(); ++it_b) { + if (!list.contains(*it_b)) { + missing.append(*it_b); + } + } + } + } + list += missing; + } + + m_filter.addAccount(list); + } + + // Date tab + if ((int)m_dateRange->dateRange() != 0) { + m_filter.setDateFilter(m_dateRange->fromDate(), m_dateRange->toDate()); + } + + // Amount tab + if ((ui->m_amountButton->isChecked() && ui->m_amountEdit->isValid())) { + m_filter.setAmountFilter(ui->m_amountEdit->value(), ui->m_amountEdit->value()); + + } else if ((ui->m_amountRangeButton->isChecked() + && (ui->m_amountFromEdit->isValid() || ui->m_amountToEdit->isValid()))) { + + MyMoneyMoney from(MyMoneyMoney::minValue), to(MyMoneyMoney::maxValue); + if (ui->m_amountFromEdit->isValid()) + from = ui->m_amountFromEdit->value(); + if (ui->m_amountToEdit->isValid()) + to = ui->m_amountToEdit->value(); + + m_filter.setAmountFilter(from, to); + } + + // Categories tab + if (!ui->m_categoriesView->allItemsSelected()) { + m_filter.addCategory(ui->m_categoriesView->selectedItems()); + } + + // Tags tab + if (ui->m_emptyTagsButton->isChecked()) { + m_filter.addTag(QString()); + + } else if (!allItemsSelected(ui->m_tagsView)) { + scanCheckListItems(ui->m_tagsView, addTagToFilter); + } + + // Payees tab + if (ui->m_emptyPayeesButton->isChecked()) { + m_filter.addPayee(QString()); + + } else if (!allItemsSelected(ui->m_payeesView)) { + scanCheckListItems(ui->m_payeesView, addPayeeToFilter); + } + + // Details tab + if (ui->m_typeBox->currentIndex() != 0) + m_filter.addType(ui->m_typeBox->currentIndex()); + + if (ui->m_stateBox->currentIndex() != 0) + m_filter.addState(ui->m_stateBox->currentIndex()); + + if (ui->m_validityBox->currentIndex() != 0) + m_filter.addValidity(ui->m_validityBox->currentIndex()); + + if (ui->m_nrButton->isChecked() && !ui->m_nrEdit->text().isEmpty()) + m_filter.setNumberFilter(ui->m_nrEdit->text(), ui->m_nrEdit->text()); + + if (ui->m_nrRangeButton->isChecked() + && (!ui->m_nrFromEdit->text().isEmpty() || !ui->m_nrToEdit->text().isEmpty())) { + m_filter.setNumberFilter(ui->m_nrFromEdit->text(), ui->m_nrToEdit->text()); + } + } + + void setupDetailsPage() + { + Q_Q(KFindTransactionDlg); + q->connect(ui->m_typeBox, static_cast(&QComboBox::activated), q, &KFindTransactionDlg::slotUpdateSelections); + q->connect(ui->m_stateBox, static_cast(&QComboBox::activated), q, &KFindTransactionDlg::slotUpdateSelections); + q->connect(ui->m_validityBox, static_cast(&QComboBox::activated), q, &KFindTransactionDlg::slotUpdateSelections); + + q->connect(ui->m_nrButton, &QAbstractButton::clicked, q, &KFindTransactionDlg::slotNrSelected); + q->connect(ui->m_nrRangeButton, &QAbstractButton::clicked, q, &KFindTransactionDlg::slotNrRangeSelected); + q->connect(ui->m_nrEdit, &QLineEdit::textChanged, q, &KFindTransactionDlg::slotUpdateSelections); + q->connect(ui->m_nrFromEdit, &QLineEdit::textChanged, q, &KFindTransactionDlg::slotUpdateSelections); + q->connect(ui->m_nrToEdit, &QLineEdit::textChanged, q, &KFindTransactionDlg::slotUpdateSelections); + + ui->m_nrButton->setChecked(true); + q->slotNrSelected(); + } + + void setupTagsPage() + { + Q_Q(KFindTransactionDlg); + ui->m_tagsView->setSelectionMode(QAbstractItemView::SingleSelection); + ui->m_tagsView->header()->hide(); + ui->m_tagsView->setAlternatingRowColors(true); + + loadTags(); + + ui->m_tagsView->sortItems(0, Qt::AscendingOrder); + ui->m_emptyTagsButton->setCheckState(Qt::Unchecked); + + q->connect(ui->m_allTagsButton, &QAbstractButton::clicked, q, &KFindTransactionDlg::slotSelectAllTags); + q->connect(ui->m_clearTagsButton, &QAbstractButton::clicked, q, &KFindTransactionDlg::slotDeselectAllTags); + q->connect(ui->m_emptyTagsButton, &QCheckBox::stateChanged, q, &KFindTransactionDlg::slotUpdateSelections); + q->connect(ui->m_tagsView, &QTreeWidget::itemChanged, q, &KFindTransactionDlg::slotUpdateSelections); + } + + void setupPayeesPage() + { + Q_Q(KFindTransactionDlg); + ui->m_payeesView->setSelectionMode(QAbstractItemView::SingleSelection); + ui->m_payeesView->header()->hide(); + ui->m_payeesView->setAlternatingRowColors(true); + + loadPayees(); + + ui->m_payeesView->sortItems(0, Qt::AscendingOrder); + ui->m_emptyPayeesButton->setCheckState(Qt::Unchecked); + + q->connect(ui->m_allPayeesButton, &QAbstractButton::clicked, q, &KFindTransactionDlg::slotSelectAllPayees); + q->connect(ui->m_clearPayeesButton, &QAbstractButton::clicked, q, &KFindTransactionDlg::slotDeselectAllPayees); + q->connect(ui->m_emptyPayeesButton, &QCheckBox::stateChanged, q, &KFindTransactionDlg::slotUpdateSelections); + q->connect(ui->m_payeesView, &QTreeWidget::itemChanged, q, &KFindTransactionDlg::slotUpdateSelections); + } + + void setupAmountPage() + { + Q_Q(KFindTransactionDlg); + q->connect(ui->m_amountButton, &QAbstractButton::clicked, q, &KFindTransactionDlg::slotAmountSelected); + q->connect(ui->m_amountRangeButton, &QAbstractButton::clicked, q, &KFindTransactionDlg::slotAmountRangeSelected); + + q->connect(ui->m_amountEdit, &kMyMoneyEdit::textChanged, q, &KFindTransactionDlg::slotUpdateSelections); + q->connect(ui->m_amountFromEdit, &kMyMoneyEdit::textChanged, q, &KFindTransactionDlg::slotUpdateSelections); + q->connect(ui->m_amountToEdit, &kMyMoneyEdit::textChanged, q, &KFindTransactionDlg::slotUpdateSelections); + + ui->m_amountButton->setChecked(true); + q->slotAmountSelected(); + } + + void setupCategoriesPage() + { + Q_Q(KFindTransactionDlg); + ui->m_categoriesView->setSelectionMode(QTreeWidget::MultiSelection); + AccountSet categorySet; + categorySet.addAccountGroup(eMyMoney::Account::Income); + categorySet.addAccountGroup(eMyMoney::Account::Expense); + categorySet.load(ui->m_categoriesView); + q->connect(ui->m_categoriesView, &kMyMoneyAccountSelector::stateChanged, q, &KFindTransactionDlg::slotUpdateSelections); + } + + void setupAccountsPage(bool withEquityAccounts) + { + Q_Q(KFindTransactionDlg); + ui->m_accountsView->setSelectionMode(QTreeWidget::MultiSelection); + AccountSet accountSet; + accountSet.addAccountGroup(eMyMoney::Account::Asset); + accountSet.addAccountGroup(eMyMoney::Account::Liability); + + if (withEquityAccounts) + accountSet.addAccountGroup(eMyMoney::Account::Equity); + + //set the accountset to show closed account if the settings say so + accountSet.setHideClosedAccounts(KMyMoneyGlobalSettings::hideClosedAccounts()); + accountSet.load(ui->m_accountsView); + q->connect(ui->m_accountsView, &kMyMoneyAccountSelector::stateChanged, q, &KFindTransactionDlg::slotUpdateSelections); + } + + KFindTransactionDlg *q_ptr; + Ui::KFindTransactionDlg *ui; + QDate m_startDates[(int)eMyMoney::TransactionFilter::Date::LastDateItem]; + QDate m_endDates[(int)eMyMoney::TransactionFilter::Date::LastDateItem]; + + /** + * q member holds a list of all transactions matching the filter criteria + */ + QList > m_transactionList; + + MyMoneyTransactionFilter m_filter; + + QMap m_helpAnchor; + + bool m_needReload; + DateRangeDlg *m_dateRange; + +}; + +#endif diff --git a/kmymoney/dialogs/kgeneratesqldlg.h b/kmymoney/dialogs/kgeneratesqldlg.h --- a/kmymoney/dialogs/kgeneratesqldlg.h +++ b/kmymoney/dialogs/kgeneratesqldlg.h @@ -2,6 +2,7 @@ kgeneratesql.h ------------------- copyright : (C) 2005 by Tony Bloomfield + (C) 2017 by Łukasz Wojniłowicz ***************************************************************************/ @@ -18,11 +19,6 @@ #define KGENERATESQLDLG_H // ---------------------------------------------------------------------------- -// Std Includes - -#include - -// ---------------------------------------------------------------------------- // QT Includes #include @@ -33,52 +29,30 @@ // ---------------------------------------------------------------------------- // Project Includes -#include "ui_kgeneratesqldlgdecl.h" - -class QDialogButtonBox; -class MyMoneyDbDriver; -class MyMoneySeqAccessMgr; -class kMandatoryFieldGroup; -class KGenerateSqlDlgDecl : public QWidget, public Ui::KGenerateSqlDlgDecl -{ -public: - KGenerateSqlDlgDecl() { - setupUi(this); - } -}; - +class KGenerateSqlDlgPrivate; class KGenerateSqlDlg : public QDialog { Q_OBJECT + Q_DISABLE_COPY(KGenerateSqlDlg) + public: - explicit KGenerateSqlDlg(QWidget *parent = 0); + explicit KGenerateSqlDlg(QWidget *parent = nullptr); ~KGenerateSqlDlg(); /** * execute the generation */ - int exec(); + int exec() override; + public slots: void slotHelp(); void slotdriverSelected(); void slotcreateTables(); void slotsaveSQL(); -private: - void initializeForm(); - QString selectedDriver(); - KGenerateSqlDlgDecl* m_widget; - QDialogButtonBox* m_buttonBox; - QPushButton* m_createTablesButton; - QPushButton* m_saveSqlButton; +private: + KGenerateSqlDlgPrivate * const d_ptr; + Q_DECLARE_PRIVATE(KGenerateSqlDlg) - QList m_supportedDrivers; - //MyMoneyDbDrivers m_map; - std::unique_ptr m_requiredFields; - bool m_sqliteSelected; - QExplicitlySharedDataPointer m_dbDriver; - QString m_dbName; - MyMoneySeqAccessMgr* m_storage; - bool m_mustDetachStorage; }; #endif diff --git a/kmymoney/dialogs/kgeneratesqldlg.cpp b/kmymoney/dialogs/kgeneratesqldlg.cpp --- a/kmymoney/dialogs/kgeneratesqldlg.cpp +++ b/kmymoney/dialogs/kgeneratesqldlg.cpp @@ -2,6 +2,7 @@ kgeneratesqldlg.cpp ------------------- copyright : (C) 2009 by Tony Bloomfield + (C) 2017 by Łukasz Wojniłowicz ***************************************************************************/ @@ -17,9 +18,12 @@ #include "kgeneratesqldlg.h" // ---------------------------------------------------------------------------- -// System includes +// Std Includes + +#include -#include +// ---------------------------------------------------------------------------- +// System includes // ---------------------------------------------------------------------------- // QT Includes @@ -38,91 +42,133 @@ #include #include #include -#include // ---------------------------------------------------------------------------- // Project Includes +#include "ui_kgeneratesqldlg.h" + #include "mymoneyfile.h" -#include "storage/mymoneystoragesql.h" #include "storage/mymoneyseqaccessmgr.h" #include "kguiutils.h" #include "misc/platformtools.h" +#include "mymoneydbdriver.h" +#include "mymoneydbdef.h" -KGenerateSqlDlg::KGenerateSqlDlg(QWidget *) +class KGenerateSqlDlgPrivate { - m_buttonBox = new QDialogButtonBox(QDialogButtonBox::Ok|QDialogButtonBox::Cancel|QDialogButtonBox::Help); - m_createTablesButton = m_buttonBox->addButton(i18n("Create Tables"), QDialogButtonBox::ButtonRole::AcceptRole); - m_saveSqlButton = m_buttonBox->addButton(i18n("Save SQL"), QDialogButtonBox::ButtonRole::ActionRole); - Q_ASSERT(m_createTablesButton); - Q_ASSERT(m_saveSqlButton); - - QPushButton *okButton = m_buttonBox->button(QDialogButtonBox::Ok); - okButton->setDefault(true); - okButton->setShortcut(Qt::CTRL | Qt::Key_Return); - connect(m_buttonBox, &QDialogButtonBox::accepted, this, &QDialog::accept); - connect(m_buttonBox, &QDialogButtonBox::rejected, this, &QDialog::reject); - - m_widget = new KGenerateSqlDlgDecl(); - QVBoxLayout *mainLayout = new QVBoxLayout; - setLayout(mainLayout); - mainLayout->addWidget(m_widget); - - QWidget *mainWidget = new QWidget(this); - setLayout(mainLayout); - mainLayout->addWidget(mainWidget); - mainLayout->addWidget(m_buttonBox); - initializeForm(); -} + Q_DISABLE_COPY(KGenerateSqlDlgPrivate) + Q_DECLARE_PUBLIC(KGenerateSqlDlg) + +public: + KGenerateSqlDlgPrivate(KGenerateSqlDlg *qq) : + q_ptr(qq), + ui(new Ui::KGenerateSqlDlg) + { + } -KGenerateSqlDlg::~KGenerateSqlDlg() + ~KGenerateSqlDlgPrivate() + { + delete ui; + } + + void init() + { + Q_Q(KGenerateSqlDlg); + ui->setupUi(q); + m_createTablesButton = ui->buttonBox->addButton(i18n("Create Tables"), QDialogButtonBox::ButtonRole::AcceptRole); + m_saveSqlButton = ui->buttonBox->addButton(i18n("Save SQL"), QDialogButtonBox::ButtonRole::ActionRole); + Q_ASSERT(m_createTablesButton); + Q_ASSERT(m_saveSqlButton); + + q->connect(ui->buttonBox, &QDialogButtonBox::accepted, q, &QDialog::accept); + q->connect(ui->buttonBox, &QDialogButtonBox::rejected, q, &QDialog::reject); + initializeForm(); + } + + void initializeForm() + { + Q_Q(KGenerateSqlDlg); + m_requiredFields = nullptr; + // at this point, we don't know which fields are required, so disable everything but the list + m_saveSqlButton->setEnabled(false); + m_createTablesButton->setEnabled(false); + ui->buttonBox->button(QDialogButtonBox::Ok)->setEnabled(false); + + ui->urlSqlite->clear(); + ui->textDbName->clear(); + ui->textHostName->clear(); + ui->textPassword->clear(); + ui->textUserName->clear(); + ui->textSQL->clear(); + ui->urlSqlite->setEnabled(false); + ui->textDbName->setEnabled(false); + ui->textHostName->setEnabled(false); + ui->textPassword->setEnabled(false); + ui->textUserName->setEnabled(false); + ui->textSQL->setEnabled(false); + + q->connect(ui->buttonBox->button(QDialogButtonBox::Help), &QPushButton::clicked, q, &KGenerateSqlDlg::slotHelp); + } + + QString selectedDriver() + { + auto drivers = ui->listDrivers->selectedItems(); + if (drivers.count() != 1) { + return QString(); + } + + return drivers[0]->text().section(' ', 0, 0); + } + + KGenerateSqlDlg *q_ptr; + Ui::KGenerateSqlDlg *ui; + QPushButton *m_createTablesButton; + QPushButton *m_saveSqlButton; + + QList m_supportedDrivers; + //MyMoneyDbDrivers m_map; + std::unique_ptr m_requiredFields; + bool m_sqliteSelected; + QExplicitlySharedDataPointer m_dbDriver; + QString m_dbName; + MyMoneySeqAccessMgr* m_storage; + bool m_mustDetachStorage; +}; + + +KGenerateSqlDlg::KGenerateSqlDlg(QWidget *parent) : + QDialog(parent), + d_ptr(new KGenerateSqlDlgPrivate(this)) { - // Stub required to delete m_requiredFields + Q_D(KGenerateSqlDlg); + d->init(); } -void KGenerateSqlDlg::initializeForm() +KGenerateSqlDlg::~KGenerateSqlDlg() { - m_requiredFields = nullptr; - // at this point, we don't know which fields are required, so disable everything but the list - m_saveSqlButton->setEnabled(false); - m_createTablesButton->setEnabled(false); - QPushButton* okButton = m_buttonBox->button(QDialogButtonBox::Ok); - Q_ASSERT(okButton); - okButton->setEnabled(false); - - m_widget->urlSqlite->clear(); - m_widget->textDbName->clear(); - m_widget->textHostName->clear(); - m_widget->textPassword->clear(); - m_widget->textUserName->clear(); - m_widget->textSQL->clear(); - m_widget->urlSqlite->setEnabled(false); - m_widget->textDbName->setEnabled(false); - m_widget->textHostName->setEnabled(false); - m_widget->textPassword->setEnabled(false); - m_widget->textUserName->setEnabled(false); - m_widget->textSQL->setEnabled(false); - - connect(m_buttonBox->button(QDialogButtonBox::Help), &QPushButton::clicked, this, &KGenerateSqlDlg::slotHelp); + Q_D(KGenerateSqlDlg); + delete d; } int KGenerateSqlDlg::exec() { + Q_D(KGenerateSqlDlg); // list drivers supported by KMM - QMap map = MyMoneyDbDriver::driverMap(); + auto map = MyMoneyDbDriver::driverMap(); // list drivers installed on system - QStringList list = QSqlDatabase::drivers(); + auto list = QSqlDatabase::drivers(); // join the two QStringList::Iterator it = list.begin(); while (it != list.end()) { QString dname = *it; if (map.keys().contains(dname)) { // only keep if driver is supported dname = dname + " - " + map[dname]; - m_supportedDrivers.append(dname); + d->m_supportedDrivers.append(dname); } ++it; } - if (m_supportedDrivers.count() == 0) { + if (d->m_supportedDrivers.count() == 0) { // why does KMessageBox not have a standard dialog with Help button? if ((KMessageBox::questionYesNo(this, i18n("In order to use a database, you need to install some additional software. Click Help for more information"), @@ -133,29 +179,30 @@ } return (1); } - m_widget->listDrivers->clear(); - m_widget->listDrivers->addItems(m_supportedDrivers); - connect(m_widget->listDrivers, SIGNAL(itemSelectionChanged()), - this, SLOT(slotdriverSelected())); + d->ui->listDrivers->clear(); + d->ui->listDrivers->addItems(d->m_supportedDrivers); + connect(d->ui->listDrivers, &QListWidget::itemSelectionChanged, + this, &KGenerateSqlDlg::slotdriverSelected); return (QDialog::exec()); } void KGenerateSqlDlg::slotcreateTables() { - if (m_sqliteSelected) { - m_dbName = m_widget->urlSqlite->text(); + Q_D(KGenerateSqlDlg); + if (d->m_sqliteSelected) { + d->m_dbName = d->ui->urlSqlite->text(); } else { - m_dbName = m_widget->textDbName->text(); + d->m_dbName = d->ui->textDbName->text(); } // check that the database has been pre-created { // all queries etc. must be in a block - see 'remove database' API doc - Q_ASSERT(!selectedDriver().isEmpty()); + Q_ASSERT(!d->selectedDriver().isEmpty()); - QSqlDatabase dbase = QSqlDatabase::addDatabase(selectedDriver(), "creation"); - dbase.setHostName(m_widget->textHostName->text()); - dbase.setDatabaseName(m_dbName); - dbase.setUserName(m_widget->textUserName->text()); - dbase.setPassword(m_widget->textPassword->text()); + QSqlDatabase dbase = QSqlDatabase::addDatabase(d->selectedDriver(), "creation"); + dbase.setHostName(d->ui->textHostName->text()); + dbase.setDatabaseName(d->m_dbName); + dbase.setUserName(d->ui->textUserName->text()); + dbase.setPassword(d->ui->textPassword->text()); if (!dbase.open()) { KMessageBox::error(this, i18n("Unable to open database.\n" @@ -165,7 +212,7 @@ } QSqlQuery q(dbase); QString message(i18n("Tables successfully created")); - QStringList commands = m_widget->textSQL->toPlainText().split('\n'); + QStringList commands = d->ui->textSQL->toPlainText().split('\n'); QStringList::ConstIterator cit; for (cit = commands.constBegin(); cit != commands.constEnd(); ++cit) { if (!(*cit).isEmpty()) { @@ -185,51 +232,43 @@ } QSqlDatabase::removeDatabase("creation"); - QPushButton* okButton = m_buttonBox->button(QDialogButtonBox::Ok); + auto okButton = d->ui->buttonBox->button(QDialogButtonBox::Ok); Q_ASSERT(okButton); okButton->setEnabled(true); } void KGenerateSqlDlg::slotsaveSQL() { - QString fileName = QFileDialog::getSaveFileName( - this, - i18n("Select output file"), - QString(), - QString()); + Q_D(KGenerateSqlDlg); + auto fileName = QFileDialog::getSaveFileName( + this, + i18n("Select output file"), + QString(), + QString()); if (fileName.isEmpty()) return; QFile out(fileName); if (!out.open(QIODevice::WriteOnly)) return; QTextStream s(&out); MyMoneyDbDef db; - s << m_widget->textSQL->toPlainText(); + s << d->ui->textSQL->toPlainText(); out.close(); - QPushButton* okButton = m_buttonBox->button(QDialogButtonBox::Ok); + auto okButton = d->ui->buttonBox->button(QDialogButtonBox::Ok); Q_ASSERT(okButton); okButton->setEnabled(true); } -QString KGenerateSqlDlg::selectedDriver() -{ - QList drivers = m_widget->listDrivers->selectedItems(); - if (drivers.count() != 1) { - return QString(); - } - - return drivers[0]->text().section(' ', 0, 0); -} - void KGenerateSqlDlg::slotdriverSelected() { - const QString driverName = selectedDriver(); + Q_D(KGenerateSqlDlg); + const auto driverName = d->selectedDriver(); if (driverName.isEmpty()) { - initializeForm(); + d->initializeForm(); return; } - m_dbDriver = MyMoneyDbDriver::create(driverName); - if (!m_dbDriver->isTested()) { + d->m_dbDriver = MyMoneyDbDriver::create(driverName); + if (!d->m_dbDriver->isTested()) { int rc = KMessageBox::warningContinueCancel(0, i18n("Database type %1 has not been fully tested in a KMyMoney environment.\n" "Please make sure you have adequate backups of your data.\n" @@ -237,62 +276,62 @@ "kmymoney-devel@kde.org", driverName), ""); if (rc == KMessageBox::Cancel) { - m_widget->listDrivers->clearSelection(); - initializeForm(); + d->ui->listDrivers->clearSelection(); + d->initializeForm(); return; } } - m_requiredFields.reset(new kMandatoryFieldGroup(this)); + d->m_requiredFields.reset(new kMandatoryFieldGroup(this)); // currently, only sqlite need an external file - if (m_dbDriver->requiresExternalFile()) { - m_sqliteSelected = true; - m_widget->urlSqlite->setMode(KFile::Mode::File); - m_widget->urlSqlite->setEnabled(true); - m_requiredFields->add(m_widget->urlSqlite); - - m_widget->textDbName->setEnabled(false); - m_widget->textHostName->setEnabled(false); - m_widget->textUserName->setEnabled(false); + if (d->m_dbDriver->requiresExternalFile()) { + d->m_sqliteSelected = true; + d->ui->urlSqlite->setMode(KFile::Mode::File); + d->ui->urlSqlite->setEnabled(true); + d->m_requiredFields->add(d->ui->urlSqlite); + + d->ui->textDbName->setEnabled(false); + d->ui->textHostName->setEnabled(false); + d->ui->textUserName->setEnabled(false); } else { // not sqlite3 - m_sqliteSelected = false; - m_widget->urlSqlite->setEnabled(false); - m_widget->textDbName->setEnabled(true); - m_widget->textHostName->setEnabled(true); - m_widget->textUserName->setEnabled(true); - m_requiredFields->add(m_widget->textDbName); - m_requiredFields->add(m_widget->textHostName); - m_requiredFields->add(m_widget->textUserName); - m_widget->textDbName->setText("KMyMoney"); - m_widget->textHostName->setText("localhost"); - m_widget->textUserName->setText(""); - m_widget->textUserName->setText(platformTools::osUsername()); - m_widget->textPassword->setText(""); + d->m_sqliteSelected = false; + d->ui->urlSqlite->setEnabled(false); + d->ui->textDbName->setEnabled(true); + d->ui->textHostName->setEnabled(true); + d->ui->textUserName->setEnabled(true); + d->m_requiredFields->add(d->ui->textDbName); + d->m_requiredFields->add(d->ui->textHostName); + d->m_requiredFields->add(d->ui->textUserName); + d->ui->textDbName->setText("KMyMoney"); + d->ui->textHostName->setText("localhost"); + d->ui->textUserName->setText(""); + d->ui->textUserName->setText(platformTools::osUsername()); + d->ui->textPassword->setText(""); } - m_widget->textPassword->setEnabled(m_dbDriver->isPasswordSupported()); - m_requiredFields->setOkButton(m_createTablesButton); - m_widget->textSQL->setEnabled(true); + d->ui->textPassword->setEnabled(d->m_dbDriver->isPasswordSupported()); + d->m_requiredFields->setOkButton(d->m_createTablesButton); + d->ui->textSQL->setEnabled(true); // check if we have a storage; if not, create a skeleton one // we need a storage for MyMoneyDbDef to generate standard accounts - m_storage = new MyMoneySeqAccessMgr; - m_mustDetachStorage = true; + d->m_storage = new MyMoneySeqAccessMgr; + d->m_mustDetachStorage = true; try { - MyMoneyFile::instance()->attachStorage(m_storage); + MyMoneyFile::instance()->attachStorage(d->m_storage); } catch (const MyMoneyException &) { - m_mustDetachStorage = false; // there is already a storage attached + d->m_mustDetachStorage = false; // there is already a storage attached } MyMoneyDbDef db; - m_widget->textSQL->setText - (db.generateSQL(m_dbDriver)); - if (m_mustDetachStorage) { + d->ui->textSQL->setText + (db.generateSQL(d->m_dbDriver)); + if (d->m_mustDetachStorage) { MyMoneyFile::instance()->detachStorage(); } - delete m_storage; + delete d->m_storage; - m_saveSqlButton->setEnabled(true); - connect(m_saveSqlButton, &QPushButton::clicked, this, &KGenerateSqlDlg::slotsaveSQL); - connect(m_createTablesButton, &QPushButton::clicked, this, &KGenerateSqlDlg::slotcreateTables); + d->m_saveSqlButton->setEnabled(true); + connect(d->m_saveSqlButton, &QPushButton::clicked, this, &KGenerateSqlDlg::slotsaveSQL); + connect(d->m_createTablesButton, &QPushButton::clicked, this, &KGenerateSqlDlg::slotcreateTables); } void KGenerateSqlDlg::slotHelp() diff --git a/kmymoney/dialogs/kgeneratesqldlgdecl.ui b/kmymoney/dialogs/kgeneratesqldlg.ui rename from kmymoney/dialogs/kgeneratesqldlgdecl.ui rename to kmymoney/dialogs/kgeneratesqldlg.ui --- a/kmymoney/dialogs/kgeneratesqldlgdecl.ui +++ b/kmymoney/dialogs/kgeneratesqldlg.ui @@ -1,13 +1,13 @@ - KGenerateSqlDlgDecl - + KGenerateSqlDlg + 0 0 800 - 501 + 528 @@ -141,19 +141,24 @@ + + + + QDialogButtonBox::Cancel|QDialogButtonBox::Help|QDialogButtonBox::Ok + + + false + + + - KUrlRequester - QFrame -
kurlrequester.h
-
- - QListWidget - QListWidget -
klistwidget.h
+ KTextEdit + QTextEdit +
ktextedit.h
KLineEdit @@ -161,9 +166,9 @@
klineedit.h
- KTextEdit - QTextEdit -
ktextedit.h
+ KUrlRequester + QWidget +
kurlrequester.h
diff --git a/kmymoney/dialogs/kgncimportoptionsdlg.h b/kmymoney/dialogs/kgncimportoptionsdlg.h --- a/kmymoney/dialogs/kgncimportoptionsdlg.h +++ b/kmymoney/dialogs/kgncimportoptionsdlg.h @@ -2,6 +2,7 @@ kgncimportoptions.h ------------------- copyright : (C) 2005 by Tony Bloomfield + (C) 2017 by Łukasz Wojniłowicz ***************************************************************************/ @@ -20,8 +21,6 @@ // ---------------------------------------------------------------------------- // QT Includes -#include -#include #include // ---------------------------------------------------------------------------- @@ -29,56 +28,35 @@ // ---------------------------------------------------------------------------- // Project Includes -#include "ui_kgncimportoptionsdlgdecl.h" class QTextCodec; -class KGncImportOptionsDlgDecl : public QWidget, public Ui::KGncImportOptionsDlgDecl -{ -public: - KGncImportOptionsDlgDecl() { - setupUi(this); - } -}; +class KGncImportOptionsDlgPrivate; class KGncImportOptionsDlg : public QDialog { Q_OBJECT + Q_DISABLE_COPY(KGncImportOptionsDlg) + public: - KGncImportOptionsDlg(QWidget *parent = 0); + explicit KGncImportOptionsDlg(QWidget *parent = nullptr); ~KGncImportOptionsDlg(); - int investmentOption() const { - return (m_widget->buttonInvestGroup->checkedId()); - }; - bool quoteOption() const { - return (m_widget->checkFinanceQuote->isChecked()); - }; - bool scheduleOption() const { - return (m_widget->checkSchedules->isChecked()); - }; + int investmentOption() const; + bool quoteOption() const; + bool scheduleOption() const; QTextCodec* decodeOption(); - bool txNotesOption() const { - return (m_widget->checkTxNotes->isChecked()); - }; - bool generalDebugOption() const { - return (m_widget->checkDebugGeneral->isChecked()); - }; - bool xmlDebugOption() const { - return (m_widget->checkDebugXML->isChecked()); - }; - bool anonymizeOption() const { - return (m_widget->checkAnonymize->isChecked()); - }; + bool txNotesOption() const; + bool generalDebugOption() const; + bool xmlDebugOption() const; + bool anonymizeOption() const; public slots: void slotDecodeOptionChanged(bool); void slotHelp(); private: - void buildCodecList(); - - QTextCodec* m_localeCodec; - KGncImportOptionsDlgDecl* m_widget; + KGncImportOptionsDlgPrivate * const d_ptr; + Q_DECLARE_PRIVATE(KGncImportOptionsDlg) }; #endif diff --git a/kmymoney/dialogs/kgncimportoptionsdlg.cpp b/kmymoney/dialogs/kgncimportoptionsdlg.cpp --- a/kmymoney/dialogs/kgncimportoptionsdlg.cpp +++ b/kmymoney/dialogs/kgncimportoptionsdlg.cpp @@ -2,6 +2,7 @@ kgncimportoptions.cpp ------------------- copyright : (C) 2005 by Tony Bloomfield + (C) 2017 by Łukasz Wojniłowicz ***************************************************************************/ @@ -29,93 +30,160 @@ #include #include -#include -#include // ---------------------------------------------------------------------------- // Project Includes -// dialog constructor -KGncImportOptionsDlg::KGncImportOptionsDlg(QWidget *) +#include "ui_kgncimportoptionsdlg.h" + +class KGncImportOptionsDlgPrivate +{ + Q_DISABLE_COPY(KGncImportOptionsDlgPrivate) + Q_DECLARE_PUBLIC(KGncImportOptionsDlg) + +public: + KGncImportOptionsDlgPrivate(KGncImportOptionsDlg *qq) : + q_ptr(qq), + ui(new Ui::KGncImportOptionsDlg), + m_localeCodec(nullptr) + { + } + + ~KGncImportOptionsDlgPrivate() + { + delete ui; + } + + void init() + { + Q_Q(KGncImportOptionsDlg); + ui->setupUi(q); + + ui->buttonInvestGroup->setId(ui->radioInvest1, 0); // one invest acct per stock + ui->buttonInvestGroup->setId(ui->radioInvest2, 1); // one invest acct for all stocks + ui->buttonInvestGroup->setId(ui->radioInvest3, 2); // prompt for each stock + + ui->buttonGroup5->setExclusive(false); + ui->checkFinanceQuote->setChecked(true); + + ui->buttonGroup2->setExclusive(false); + ui->checkSchedules->setChecked(false); + + buildCodecList(); // build list of codecs and insert into combo box + + ui->buttonGroup4->setExclusive(false); + ui->checkDecode->setChecked(false); + ui->comboDecode->setEnabled(false); + + ui->buttonGroup18->setExclusive(false); + ui->checkTxNotes->setChecked(false); + + ui->buttonGroup3->setExclusive(false); + ui->checkDebugGeneral->setChecked(false); + ui->checkDebugXML->setChecked(false); + ui->checkAnonymize->setChecked(false); + + q->connect(ui->checkDecode, &QAbstractButton::toggled, q, &KGncImportOptionsDlg::slotDecodeOptionChanged); + q->connect(ui->buttonBox, &QDialogButtonBox::helpRequested, q, &KGncImportOptionsDlg::slotHelp); + } + + void buildCodecList() + { + m_localeCodec = QTextCodec::codecForLocale(); + auto codecList = QTextCodec::availableCodecs(); + QList::ConstIterator itc; + for (itc = codecList.constBegin(); itc != codecList.constEnd(); ++itc) { + if (*itc == m_localeCodec) + ui->comboDecode->insertItem(0, QString(*itc)); + else + ui->comboDecode->insertItem(9999, QString(*itc)); + } + } + + KGncImportOptionsDlg *q_ptr; + Ui::KGncImportOptionsDlg *ui; + QTextCodec *m_localeCodec; +}; + +KGncImportOptionsDlg::KGncImportOptionsDlg(QWidget *parent) : + QDialog(parent), + d_ptr(new KGncImportOptionsDlgPrivate(this)) { - QDialogButtonBox *buttonBox = new QDialogButtonBox(QDialogButtonBox::Ok|QDialogButtonBox::Help); - QWidget *mainWidget = new QWidget(this); - QVBoxLayout *mainLayout = new QVBoxLayout; - setLayout(mainLayout); - mainLayout->addWidget(mainWidget); - QPushButton *okButton = buttonBox->button(QDialogButtonBox::Ok); - okButton->setDefault(true); - okButton->setShortcut(Qt::CTRL | Qt::Key_Return); - connect(buttonBox, SIGNAL(accepted()), this, SLOT(accept())); - connect(buttonBox, SIGNAL(rejected()), this, SLOT(reject())); - m_widget = new KGncImportOptionsDlgDecl(); - mainLayout->addWidget(m_widget); - - m_widget->buttonInvestGroup->setId(m_widget->radioInvest1, 0); // one invest acct per stock - m_widget->buttonInvestGroup->setId(m_widget->radioInvest2, 1); // one invest acct for all stocks - m_widget->buttonInvestGroup->setId(m_widget->radioInvest3, 2); // prompt for each stock - - m_widget->buttonGroup5->setExclusive(false); - m_widget->checkFinanceQuote->setChecked(true); - - m_widget->buttonGroup2->setExclusive(false); - m_widget->checkSchedules->setChecked(false); - - buildCodecList(); // build list of codecs and insert into combo box - - m_widget->buttonGroup4->setExclusive(false); - m_widget->checkDecode->setChecked(false); - m_widget->comboDecode->setEnabled(false); - - m_widget->buttonGroup18->setExclusive(false); - m_widget->checkTxNotes->setChecked(false); - - m_widget->buttonGroup3->setExclusive(false); - m_widget->checkDebugGeneral->setChecked(false); - m_widget->checkDebugXML->setChecked(false); - m_widget->checkAnonymize->setChecked(false); - - connect(m_widget->checkDecode, SIGNAL(toggled(bool)), this, SLOT(slotDecodeOptionChanged(bool))); - connect(this, SIGNAL(helpClicked()), this, SLOT(slotHelp())); - - mainLayout->addWidget(buttonBox); + Q_D(KGncImportOptionsDlg); + d->init(); } -KGncImportOptionsDlg::~KGncImportOptionsDlg() {} +KGncImportOptionsDlg::~KGncImportOptionsDlg() +{ + Q_D(KGncImportOptionsDlg); + delete d; +} // enable the combo box for selection if required void KGncImportOptionsDlg::slotDecodeOptionChanged(bool isOn) { + Q_D(KGncImportOptionsDlg); if (isOn) { - m_widget->comboDecode->setEnabled(true); - m_widget->comboDecode->setCurrentItem(0); + d->ui->comboDecode->setEnabled(true); + d->ui->comboDecode->setCurrentItem(0); } else { - m_widget->comboDecode->setEnabled(false); + d->ui->comboDecode->setEnabled(false); } } -void KGncImportOptionsDlg::buildCodecList() + +int KGncImportOptionsDlg::investmentOption() const { - m_localeCodec = QTextCodec::codecForLocale(); - QList codecList = QTextCodec::availableCodecs(); - QList::ConstIterator itc; - for (itc = codecList.constBegin(); itc != codecList.constEnd(); ++itc) { - if (*itc == m_localeCodec) - m_widget->comboDecode->insertItem(0, QString(*itc)); - else - m_widget->comboDecode->insertItem(9999, QString(*itc)); - } -} + Q_D(const KGncImportOptionsDlg); + return (d->ui->buttonInvestGroup->checkedId()); +}; + +bool KGncImportOptionsDlg::quoteOption() const +{ + Q_D(const KGncImportOptionsDlg); + return (d->ui->checkFinanceQuote->isChecked()); +}; + +bool KGncImportOptionsDlg::scheduleOption() const +{ + Q_D(const KGncImportOptionsDlg); + return (d->ui->checkSchedules->isChecked()); +}; // return selected codec or 0 QTextCodec* KGncImportOptionsDlg::decodeOption() { - if (!m_widget->checkDecode->isChecked()) { - return (0); + Q_D(const KGncImportOptionsDlg); + if (!d->ui->checkDecode->isChecked()) { + return nullptr; } else { - return (QTextCodec::codecForName(m_widget->comboDecode->currentText().toUtf8())); + return (QTextCodec::codecForName(d->ui->comboDecode->currentText().toUtf8())); } } +bool KGncImportOptionsDlg::txNotesOption() const +{ + Q_D(const KGncImportOptionsDlg); + return (d->ui->checkTxNotes->isChecked()); +} + +bool KGncImportOptionsDlg::generalDebugOption() const +{ + Q_D(const KGncImportOptionsDlg); + return (d->ui->checkDebugGeneral->isChecked()); +} + +bool KGncImportOptionsDlg::xmlDebugOption() const +{ + Q_D(const KGncImportOptionsDlg); + return (d->ui->checkDebugXML->isChecked()); +} + +bool KGncImportOptionsDlg::anonymizeOption() const +{ + Q_D(const KGncImportOptionsDlg); + return (d->ui->checkAnonymize->isChecked()); +} + void KGncImportOptionsDlg::slotHelp() { KHelpClient::invokeHelp("details.impexp.gncoptions"); diff --git a/kmymoney/dialogs/kgncimportoptionsdlgdecl.ui b/kmymoney/dialogs/kgncimportoptionsdlg.ui rename from kmymoney/dialogs/kgncimportoptionsdlgdecl.ui rename to kmymoney/dialogs/kgncimportoptionsdlg.ui --- a/kmymoney/dialogs/kgncimportoptionsdlgdecl.ui +++ b/kmymoney/dialogs/kgncimportoptionsdlg.ui @@ -1,7 +1,7 @@ - KGncImportOptionsDlgDecl - + KGncImportOptionsDlg + 0 @@ -42,33 +42,33 @@ - One investment account for each stock + O&ne investment account for each stock true - buttonInvestGroup + buttonInvestGroup - One investment account for all stocks + One in&vestment account for all stocks - buttonInvestGroup + buttonInvestGroup - Prompt for an investment account for each stock + P&rompt for an investment account for each stock - buttonInvestGroup + buttonInvestGroup @@ -87,7 +87,7 @@ Use Finance::Quote for share price quotes - buttonGroup5 + buttonGroup5 @@ -106,7 +106,7 @@ Drop suspect scheduled transactions
- buttonGroup2 + buttonGroup2
@@ -124,7 +124,16 @@ 0 - + + 0 + + + 0 + + + 0 + + 0 @@ -133,7 +142,7 @@ Decode using - buttonGroup4 + buttonGroup4
@@ -173,7 +182,7 @@ Use transaction notes on non-split transactions
- buttonGroup18 + buttonGroup18
@@ -202,7 +211,7 @@ General debug data
- buttonGroup3 + buttonGroup3
@@ -212,7 +221,7 @@ Display XML data
- buttonGroup3 + buttonGroup3
@@ -222,7 +231,7 @@ Anonymize data
- buttonGroup3 + buttonGroup3
@@ -230,6 +239,13 @@
+ + + QDialogButtonBox::Cancel|QDialogButtonBox::Help|QDialogButtonBox::Ok + + + + Qt::Vertical @@ -253,13 +269,46 @@ - + + + buttonBox + accepted() + KGncImportOptionsDlg + accept() + + + 262 + 599 + + + 262 + 339 + + + + + buttonBox + rejected() + KGncImportOptionsDlg + reject() + + + 262 + 599 + + + 262 + 339 + + + + + + + - - -
diff --git a/kmymoney/dialogs/kgncpricesourcedlg.h b/kmymoney/dialogs/kgncpricesourcedlg.h --- a/kmymoney/dialogs/kgncpricesourcedlg.h +++ b/kmymoney/dialogs/kgncpricesourcedlg.h @@ -2,6 +2,7 @@ kgncpricesourcedlg.h ------------------- copyright : (C) 2005 by Tony Bloomfield + (C) 2017 by Łukasz Wojniłowicz ***************************************************************************/ @@ -28,12 +29,14 @@ // ---------------------------------------------------------------------------- // Project Includes +class KGncPriceSourceDlgPrivate; class KGncPriceSourceDlg : public QDialog { Q_OBJECT + Q_DISABLE_COPY(KGncPriceSourceDlg) + public: - KGncPriceSourceDlg(QWidget *parent = 0); - KGncPriceSourceDlg(const QString &stockName, const QString &gncSource , QWidget * parent = 0); + explicit KGncPriceSourceDlg(const QString &stockName, const QString &gncSource , QWidget * parent = nullptr); ~KGncPriceSourceDlg(); QString selectedSource() const; @@ -44,10 +47,8 @@ void slotHelp(); private: - /// \internal d-pointer class. - struct Private; - /// \internal d-pointer instance. - Private* const d; + KGncPriceSourceDlgPrivate * const d_ptr; + Q_DECLARE_PRIVATE(KGncPriceSourceDlg) }; #endif diff --git a/kmymoney/dialogs/kgncpricesourcedlg.cpp b/kmymoney/dialogs/kgncpricesourcedlg.cpp --- a/kmymoney/dialogs/kgncpricesourcedlg.cpp +++ b/kmymoney/dialogs/kgncpricesourcedlg.cpp @@ -2,6 +2,7 @@ kgncpricesourcedlg.cpp ------------------- copyright : (C) 2005 by Tony Bloomfield + (C) 2017 by Łukasz Wojniłowicz ***************************************************************************/ @@ -23,8 +24,6 @@ #include #include #include -#include -#include // ---------------------------------------------------------------------------- // KDE Includes @@ -36,63 +35,55 @@ // Project Includes #include "webpricequote.h" -#include "ui_kgncpricesourcedlgdecl.h" +#include "ui_kgncpricesourcedlg.h" - -class KGncPriceSourceDlgDecl : public QWidget, public Ui::KGncPriceSourceDlgDecl +class KGncPriceSourceDlgPrivate { + Q_DISABLE_COPY(KGncPriceSourceDlgPrivate) + public: - KGncPriceSourceDlgDecl() { - setupUi(this); + KGncPriceSourceDlgPrivate() : + ui(new Ui::KGncPriceSourceDlg), + currentButton(0) + { } -}; + ~KGncPriceSourceDlgPrivate() + { + delete ui; + } -struct KGncPriceSourceDlg::Private { - Private() : currentButton(0), widget(0) {} + Ui::KGncPriceSourceDlg *ui; int currentButton; - KGncPriceSourceDlgDecl* widget; }; -KGncPriceSourceDlg::KGncPriceSourceDlg(QWidget *parent) : QDialog(parent), d(new Private) -{ -} -KGncPriceSourceDlg::KGncPriceSourceDlg(const QString &stockName, const QString& gncSource, QWidget * parent) : QDialog(parent), d(new Private) +KGncPriceSourceDlg::KGncPriceSourceDlg(const QString &stockName, const QString& gncSource, QWidget * parent) : + QDialog(parent), + d_ptr(new KGncPriceSourceDlgPrivate) { - QDialogButtonBox *buttonBox = new QDialogButtonBox(QDialogButtonBox::Ok|QDialogButtonBox::Help); - QWidget *mainWidget = new QWidget(this); - QVBoxLayout *mainLayout = new QVBoxLayout; - setLayout(mainLayout); - mainLayout->addWidget(mainWidget); - QPushButton *okButton = buttonBox->button(QDialogButtonBox::Ok); - okButton->setDefault(true); - okButton->setShortcut(Qt::CTRL | Qt::Key_Return); - connect(buttonBox, SIGNAL(accepted()), this, SLOT(accept())); - connect(buttonBox, SIGNAL(rejected()), this, SLOT(reject())); - d->widget = new KGncPriceSourceDlgDecl(); - mainLayout->addWidget(d->widget); + Q_D(KGncPriceSourceDlg); + d->ui->setupUi(this); // signals and slots connections - connect(d->widget->buttonsSource, SIGNAL(buttonClicked(int)), this, SLOT(buttonPressed(int))); - connect(this, SIGNAL(helpClicked()), this, SLOT(slotHelp())); + connect(d->ui->buttonsSource, static_cast(&QButtonGroup::buttonClicked), this, &KGncPriceSourceDlg::buttonPressed); + connect(d->ui->buttonBox, &QDialogButtonBox::helpRequested, this, &KGncPriceSourceDlg::slotHelp); // initialize data fields - d->widget->textStockName->setText(i18n("Investment: %1", stockName)); - d->widget->textGncSource->setText(i18n("Quote source: %1", gncSource)); - d->widget->listKnownSource->clear(); - d->widget->listKnownSource->insertItems(0, WebPriceQuote::quoteSources()); - d->widget->lineUserSource->setText(gncSource); - d->widget->checkAlwaysUse->setChecked(true); - d->widget->buttonsSource->setId(d->widget->buttonNoSource, 0); - d->widget->buttonsSource->setId(d->widget->buttonSelectSource, 1); - d->widget->buttonsSource->setId(d->widget->buttonUserSource, 2); - d->widget->buttonsSource->button(0)->setChecked(true); - mainLayout->addWidget(buttonBox); + d->ui->textStockName->setText(i18n("Investment: %1", stockName)); + d->ui->textGncSource->setText(i18n("Quote source: %1", gncSource)); + d->ui->listKnownSource->clear(); + d->ui->listKnownSource->insertItems(0, WebPriceQuote::quoteSources()); + d->ui->lineUserSource->setText(gncSource); + d->ui->checkAlwaysUse->setChecked(true); + d->ui->buttonsSource->setId(d->ui->buttonNoSource, 0); + d->ui->buttonsSource->setId(d->ui->buttonSelectSource, 1); + d->ui->buttonsSource->setId(d->ui->buttonUserSource, 2); + d->ui->buttonsSource->button(0)->setChecked(true); buttonPressed(0); - return; } KGncPriceSourceDlg::~KGncPriceSourceDlg() { + Q_D(KGncPriceSourceDlg); delete d; } @@ -100,51 +91,50 @@ void KGncPriceSourceDlg::buttonPressed(int buttonId) { + Q_D(KGncPriceSourceDlg); d->currentButton = buttonId; switch (d->currentButton) { case NOSOURCE: - d->widget->listKnownSource->clearSelection(); - d->widget->listKnownSource->setEnabled(false); - d->widget->lineUserSource->deselect(); - d->widget->lineUserSource->setEnabled(false); + d->ui->listKnownSource->clearSelection(); + d->ui->listKnownSource->setEnabled(false); + d->ui->lineUserSource->deselect(); + d->ui->lineUserSource->setEnabled(false); break; case KMMSOURCE: - d->widget->lineUserSource->deselect(); - d->widget->lineUserSource->setEnabled(false); - d->widget->listKnownSource->setEnabled(true); - d->widget->listKnownSource->setFocus(); - d->widget->listKnownSource->setCurrentRow(0); + d->ui->lineUserSource->deselect(); + d->ui->lineUserSource->setEnabled(false); + d->ui->listKnownSource->setEnabled(true); + d->ui->listKnownSource->setFocus(); + d->ui->listKnownSource->setCurrentRow(0); break; case USERSOURCE: - d->widget->listKnownSource->clearSelection(); - d->widget->listKnownSource->setEnabled(false); - d->widget->lineUserSource->setEnabled(true); - d->widget->lineUserSource->selectAll(); - d->widget->lineUserSource->setFocus(); + d->ui->listKnownSource->clearSelection(); + d->ui->listKnownSource->setEnabled(false); + d->ui->lineUserSource->setEnabled(true); + d->ui->lineUserSource->selectAll(); + d->ui->lineUserSource->setFocus(); break; } } QString KGncPriceSourceDlg::selectedSource() const { - QString s; + Q_D(const KGncPriceSourceDlg); switch (d->currentButton) { - case NOSOURCE: - s = ""; - break; case KMMSOURCE: - s = d->widget->listKnownSource->currentItem()->text(); - break; + return d->ui->listKnownSource->currentItem()->text(); case USERSOURCE: - s = d->widget->lineUserSource->text(); - break; + return d->ui->lineUserSource->text(); + case NOSOURCE: + default: + return QString(); } - return (s); } bool KGncPriceSourceDlg::alwaysUse() const { - return d->widget->checkAlwaysUse->isChecked(); + Q_D(const KGncPriceSourceDlg); + return d->ui->checkAlwaysUse->isChecked(); } void KGncPriceSourceDlg::slotHelp() diff --git a/kmymoney/dialogs/kgncpricesourcedlgdecl.ui b/kmymoney/dialogs/kgncpricesourcedlg.ui rename from kmymoney/dialogs/kgncpricesourcedlgdecl.ui rename to kmymoney/dialogs/kgncpricesourcedlg.ui --- a/kmymoney/dialogs/kgncpricesourcedlgdecl.ui +++ b/kmymoney/dialogs/kgncpricesourcedlg.ui @@ -1,7 +1,7 @@ - KGncPriceSourceDlgDecl - + KGncPriceSourceDlg + 0 @@ -59,20 +59,20 @@ - Do not perform online quotes for this investment + Do &not perform online quotes for this investment - buttonsSource + buttonsSource - Select a known KMyMoney source from the list below + Select a &known KMyMoney source from the list below - buttonsSource + buttonsSource @@ -82,11 +82,11 @@ - Use the following name for the price source. + Use the fo&llowing name for the price source. (Click Help for further information.) - buttonsSource + buttonsSource @@ -103,23 +103,58 @@ + + + + QDialogButtonBox::Cancel|QDialogButtonBox::Help|QDialogButtonBox::Ok + + + - QListWidget - QListWidget -
klistwidget.h
-
- KLineEdit QLineEdit
klineedit.h
- + + + buttonBox + accepted() + KGncPriceSourceDlg + accept() + + + 309 + 456 + + + 309 + 239 + + + + + buttonBox + rejected() + KGncPriceSourceDlg + reject() + + + 309 + 456 + + + 309 + 239 + + + + diff --git a/kmymoney/dialogs/kgpgkeyselectiondlg.h b/kmymoney/dialogs/kgpgkeyselectiondlg.h --- a/kmymoney/dialogs/kgpgkeyselectiondlg.h +++ b/kmymoney/dialogs/kgpgkeyselectiondlg.h @@ -3,6 +3,7 @@ ------------------- copyright : (C) 2008 by Thomas Baumgart email : ipwizard@users.sourceforge.net + (C) 2017 by Łukasz Wojniłowicz ***************************************************************************/ /*************************************************************************** @@ -25,23 +26,22 @@ // ---------------------------------------------------------------------------- // KDE Includes -#include - -class KLed; - // ---------------------------------------------------------------------------- // Project Includes /** * @author Thomas Baumgart */ +class KGpgKeySelectionDlgPrivate; class KGpgKeySelectionDlg : public QDialog { Q_OBJECT + Q_DISABLE_COPY(KGpgKeySelectionDlg) + public: - explicit KGpgKeySelectionDlg(QWidget* parent = 0); - virtual ~KGpgKeySelectionDlg() {} + explicit KGpgKeySelectionDlg(QWidget* parent = nullptr); + ~KGpgKeySelectionDlg(); /** * preset the key list with the given key ids in @a list @@ -51,20 +51,15 @@ /** * Returns the list of keys currently listed in the KEditListWidget */ - const QStringList keys() const { - return m_listWidget->items(); - } + QStringList keys() const; protected slots: void slotIdChanged(); void slotKeyListChanged(); private: - KEditListWidget* m_listWidget; - KLed* m_keyLed; - bool m_needCheckList; - bool m_listOk; - int m_checkCount; + KGpgKeySelectionDlgPrivate * const d_ptr; + Q_DECLARE_PRIVATE(KGpgKeySelectionDlg) }; #endif diff --git a/kmymoney/dialogs/kgpgkeyselectiondlg.cpp b/kmymoney/dialogs/kgpgkeyselectiondlg.cpp --- a/kmymoney/dialogs/kgpgkeyselectiondlg.cpp +++ b/kmymoney/dialogs/kgpgkeyselectiondlg.cpp @@ -3,6 +3,7 @@ ------------------- copyright : (C) 2008 by Thomas Baumgart email : ipwizard@users.sourceforge.net + (C) 2017 by Łukasz Wojniłowicz ***************************************************************************/ /*************************************************************************** @@ -38,12 +39,35 @@ #include #include +class KGpgKeySelectionDlgPrivate +{ + Q_DISABLE_COPY(KGpgKeySelectionDlgPrivate) + +public: + KGpgKeySelectionDlgPrivate() + { + } + + ~KGpgKeySelectionDlgPrivate() + { + } + + KEditListWidget* m_listWidget; + KLed* m_keyLed; + bool m_needCheckList; + bool m_listOk; + int m_checkCount; +}; + + KGpgKeySelectionDlg::KGpgKeySelectionDlg(QWidget *parent) : QDialog(parent), - m_needCheckList(true), - m_listOk(false), - m_checkCount(0) + d_ptr(new KGpgKeySelectionDlgPrivate) { + Q_D(KGpgKeySelectionDlg); + d->m_needCheckList = true; + d->m_listOk = false; + d->m_checkCount = 0; // TODO: check port to kf5 setWindowTitle(i18n("Select additional keys")); QDialogButtonBox *buttonBox = new QDialogButtonBox(QDialogButtonBox::Ok|QDialogButtonBox::Cancel); @@ -54,8 +78,8 @@ QPushButton *okButton = buttonBox->button(QDialogButtonBox::Ok); okButton->setDefault(true); okButton->setShortcut(Qt::CTRL | Qt::Key_Return); - connect(buttonBox, SIGNAL(accepted()), this, SLOT(accept())); - connect(buttonBox, SIGNAL(rejected()), this, SLOT(reject())); + connect(buttonBox, &QDialogButtonBox::accepted, this, &QDialog::accept); + connect(buttonBox, &QDialogButtonBox::rejected, this, &QDialog::reject); buttonBox->button(QDialogButtonBox::Ok)->setDefault(true); setModal(true); QWidget* page = new QWidget(this); @@ -66,11 +90,11 @@ QVBoxLayout *verticalLayout = new QVBoxLayout(listBox); verticalLayout->setSpacing(6); verticalLayout->setContentsMargins(0, 0, 0, 0); - m_listWidget = new KEditListWidget(listBox); - m_listWidget->connect(buttonBox, SIGNAL(accepted()), this, SLOT(accept())); - m_listWidget->connect(buttonBox, SIGNAL(rejected()), this, SLOT(reject())); - m_listWidget->setWhatsThis(i18n("Enter the id of the key you want to use for data encryption. This can either be an e-mail address or the hexadecimal key id. In case of the key id, do not forget the leading 0x.")); - verticalLayout->addWidget(m_listWidget); + d->m_listWidget = new KEditListWidget(listBox); + d->m_listWidget->connect(buttonBox, &QDialogButtonBox::accepted, this, &QDialog::accept); + d->m_listWidget->connect(buttonBox, &QDialogButtonBox::rejected, this, &QDialog::reject); + d->m_listWidget->setWhatsThis(i18n("Enter the id of the key you want to use for data encryption. This can either be an e-mail address or the hexadecimal key id. In case of the key id, do not forget the leading 0x.")); + verticalLayout->addWidget(d->m_listWidget); // add a LED for the availability of all keys QHBoxLayout* ledBox = new QHBoxLayout(); @@ -78,29 +102,42 @@ ledBox->setSpacing(6); ledBox->setObjectName("ledBoxLayout"); - m_keyLed = new KLed(page); - mainLayout->addWidget(m_keyLed); - m_keyLed->setShape(KLed::Circular); - m_keyLed->setLook(KLed::Sunken); + d->m_keyLed = new KLed(page); + mainLayout->addWidget(d->m_keyLed); + d->m_keyLed->setShape(KLed::Circular); + d->m_keyLed->setLook(KLed::Sunken); - ledBox->addWidget(m_keyLed); + ledBox->addWidget(d->m_keyLed); ledBox->addWidget(new QLabel(i18n("Keys for all of the above user ids found"), page)); ledBox->addItem(new QSpacerItem(50, 20, QSizePolicy::Expanding, QSizePolicy::Minimum)); verticalLayout->addLayout(ledBox); - connect(m_listWidget, SIGNAL(changed()), this, SLOT(slotIdChanged())); - connect(m_listWidget, SIGNAL(added(QString)), this, SLOT(slotKeyListChanged())); - connect(m_listWidget, SIGNAL(removed(QString)), this, SLOT(slotKeyListChanged())); + connect(d->m_listWidget, &KEditListWidget::changed, this, &KGpgKeySelectionDlg::slotIdChanged); + connect(d->m_listWidget, &KEditListWidget::added, this, &KGpgKeySelectionDlg::slotKeyListChanged); + connect(d->m_listWidget, &KEditListWidget::removed, this, &KGpgKeySelectionDlg::slotKeyListChanged); +} + +KGpgKeySelectionDlg::~KGpgKeySelectionDlg() +{ + Q_D(KGpgKeySelectionDlg); + delete d; } void KGpgKeySelectionDlg::setKeys(const QStringList& list) { - m_listWidget->clear(); - m_listWidget->insertStringList(list); + Q_D(KGpgKeySelectionDlg); + d->m_listWidget->clear(); + d->m_listWidget->insertStringList(list); slotKeyListChanged(); } +QStringList KGpgKeySelectionDlg::keys() const +{ + Q_D(const KGpgKeySelectionDlg); + return d->m_listWidget->items(); +} + #if 0 void KGpgKeySelectionDlg::slotShowHelp() { @@ -114,12 +151,14 @@ void KGpgKeySelectionDlg::slotKeyListChanged() { - m_needCheckList = true; + Q_D(KGpgKeySelectionDlg); + d->m_needCheckList = true; slotIdChanged(); } void KGpgKeySelectionDlg::slotIdChanged() { + Q_D(KGpgKeySelectionDlg); // this looks a bit awkward. Here's why: KGPGFile::keyAvailable() starts // an external task and processes UI events while it waits for the external // process to finish. Thus, the first time we get here, the external process @@ -129,43 +168,43 @@ // The second invocation is counted, but the check is not started until the // first one finishes. Once the external process finishes, we check if we // were called in the meantime and restart the check. - if (++m_checkCount == 1) { + if (++d->m_checkCount == 1) { while (1) { // first we check the current edit field if filled bool keysOk = true; - if (!m_listWidget->currentText().isEmpty()) { - keysOk = KGPGFile::keyAvailable(m_listWidget->currentText()); + if (!d->m_listWidget->currentText().isEmpty()) { + keysOk = KGPGFile::keyAvailable(d->m_listWidget->currentText()); } // if it is available, then scan the current list if we need to if (keysOk) { - if (m_needCheckList) { - QStringList keys = m_listWidget->items(); + if (d->m_needCheckList) { + QStringList keys = d->m_listWidget->items(); QStringList::const_iterator it_s; for (it_s = keys.constBegin(); keysOk && it_s != keys.constEnd(); ++it_s) { if (!KGPGFile::keyAvailable(*it_s)) keysOk = false; } - m_listOk = keysOk; - m_needCheckList = false; + d->m_listOk = keysOk; + d->m_needCheckList = false; } else { - keysOk = m_listOk; + keysOk = d->m_listOk; } } // did we receive some more requests to check? - if (m_checkCount > 1) { - m_checkCount = 1; + if (d->m_checkCount > 1) { + d->m_checkCount = 1; continue; } - m_keyLed->setState(static_cast(keysOk && (m_listWidget->items().count() != 0) ? KLed::On : KLed::Off)); + d->m_keyLed->setState(static_cast(keysOk && (d->m_listWidget->items().count() != 0) ? KLed::On : KLed::Off)); // TODO: port to kf5 // okButton->setEnabled((m_listWidget->items().count() == 0) || (m_keyLed->state() == KLed::On)); break; } - --m_checkCount; + --d->m_checkCount; } } diff --git a/kmymoney/dialogs/kimportverifydlgdecl.ui b/kmymoney/dialogs/kimportverifydlg.ui rename from kmymoney/dialogs/kimportverifydlgdecl.ui rename to kmymoney/dialogs/kimportverifydlg.ui --- a/kmymoney/dialogs/kimportverifydlgdecl.ui +++ b/kmymoney/dialogs/kimportverifydlg.ui @@ -3,8 +3,8 @@ - KImportVerifyDlgDecl - + KImportVerifyDlg + 0 diff --git a/kmymoney/dialogs/kloadtemplatedlg.h b/kmymoney/dialogs/kloadtemplatedlg.h --- a/kmymoney/dialogs/kloadtemplatedlg.h +++ b/kmymoney/dialogs/kloadtemplatedlg.h @@ -3,6 +3,7 @@ ------------------- copyright : (C) 2008 by Thomas Baumgart email : ipwizard@users.sourceforge.net + (C) 2017 by Łukasz Wojniłowicz ***************************************************************************/ /*************************************************************************** @@ -20,36 +21,37 @@ // ---------------------------------------------------------------------------- // QT Includes +#include + // ---------------------------------------------------------------------------- // KDE Includes // ---------------------------------------------------------------------------- // Project Includes -#include "ui_kloadtemplatedlgdecl.h" -#include +template class QList; + +namespace Ui { class KLoadTemplateDlg; } class MyMoneyTemplate; -class KLoadTemplateDlgDecl : public QDialog, public Ui::KLoadTemplateDlgDecl -{ -public: - KLoadTemplateDlgDecl(QWidget *parent) : QDialog(parent) { - setupUi(this); - } -}; /// This dialog lets the user load more account templates -class KLoadTemplateDlg : public KLoadTemplateDlgDecl +class KLoadTemplateDlg : public QDialog { Q_OBJECT + Q_DISABLE_COPY(KLoadTemplateDlg) public: - KLoadTemplateDlg(QWidget *parent = 0); + explicit KLoadTemplateDlg(QWidget *parent = nullptr); + ~KLoadTemplateDlg(); QList templates() const; private slots: void slotHelp(); + +private: + Ui::KLoadTemplateDlg *ui; }; #endif diff --git a/kmymoney/dialogs/kloadtemplatedlg.cpp b/kmymoney/dialogs/kloadtemplatedlg.cpp --- a/kmymoney/dialogs/kloadtemplatedlg.cpp +++ b/kmymoney/dialogs/kloadtemplatedlg.cpp @@ -3,6 +3,7 @@ ------------------- copyright : (C) 2008 by Thomas Baumgart email : ipwizard@users.sourceforge.net + (C) 2017 by Łukasz Wojniłowicz ***************************************************************************/ /*************************************************************************** @@ -27,18 +28,27 @@ // ---------------------------------------------------------------------------- // Project Includes -#include "kaccounttemplateselector.h" +#include "ui_kloadtemplatedlg.h" + #include "mymoneytemplate.h" +#include "kaccounttemplateselector.h" KLoadTemplateDlg::KLoadTemplateDlg(QWidget* parent) : - KLoadTemplateDlgDecl(parent) + QDialog(parent), + ui(new Ui::KLoadTemplateDlg) +{ + ui->setupUi(this); + connect(ui->buttonBox, &QDialogButtonBox::helpRequested, this, &KLoadTemplateDlg::slotHelp); +} + +KLoadTemplateDlg::~KLoadTemplateDlg() { - connect(buttonBox, SIGNAL(helpRequested()), this, SLOT(slotHelp())); + delete ui; } QList KLoadTemplateDlg::templates() const { - return m_templateSelector->selectedTemplates(); + return ui->m_templateSelector->selectedTemplates(); } void KLoadTemplateDlg::slotHelp() diff --git a/kmymoney/dialogs/kloadtemplatedlgdecl.ui b/kmymoney/dialogs/kloadtemplatedlg.ui rename from kmymoney/dialogs/kloadtemplatedlgdecl.ui rename to kmymoney/dialogs/kloadtemplatedlg.ui --- a/kmymoney/dialogs/kloadtemplatedlgdecl.ui +++ b/kmymoney/dialogs/kloadtemplatedlg.ui @@ -1,7 +1,7 @@ - KLoadTemplateDlgDecl - + KLoadTemplateDlg + 0 @@ -42,7 +42,7 @@ buttonBox accepted() - KLoadTemplateDlgDecl + KLoadTemplateDlg accept() @@ -58,7 +58,7 @@ buttonBox rejected() - KLoadTemplateDlgDecl + KLoadTemplateDlg reject() diff --git a/kmymoney/dialogs/kmergetransactionsdlg.h b/kmymoney/dialogs/kmergetransactionsdlg.h --- a/kmymoney/dialogs/kmergetransactionsdlg.h +++ b/kmymoney/dialogs/kmergetransactionsdlg.h @@ -4,6 +4,7 @@ begin : Sun Aug 20 2006 copyright : (C) 2006 by Ace Jones email : + (C) 2017 by Łukasz Wojniłowicz ***************************************************************************/ /*************************************************************************** @@ -34,14 +35,12 @@ { Q_OBJECT public: - explicit KMergeTransactionsDlg(const MyMoneyAccount& account, QWidget* parent = 0); + explicit KMergeTransactionsDlg(const MyMoneyAccount& account, QWidget* parent = nullptr); - bool eventFilter(QObject* , QEvent*) { - return false; - } + bool eventFilter(QObject* , QEvent*) override; public slots: - void slotHelp(); + void slotHelp() override; }; #endif // KMERGETRANSACTIONSDLG_H diff --git a/kmymoney/dialogs/kmergetransactionsdlg.cpp b/kmymoney/dialogs/kmergetransactionsdlg.cpp --- a/kmymoney/dialogs/kmergetransactionsdlg.cpp +++ b/kmymoney/dialogs/kmergetransactionsdlg.cpp @@ -4,6 +4,7 @@ begin : Sun Aug 20 2006 copyright : (C) 2006 by Ace Jones email : + (C) 2017 by Łukasz Wojniłowicz ***************************************************************************/ /*************************************************************************** @@ -16,6 +17,7 @@ ***************************************************************************/ #include "kmergetransactionsdlg.h" +#include "kselecttransactionsdlg_p.h" // ---------------------------------------------------------------------------- // QT Includes @@ -31,22 +33,27 @@ // ---------------------------------------------------------------------------- // Project Includes +#include "ui_kselecttransactionsdlg.h" + #include "register.h" -#include "mymoneyaccount.h" KMergeTransactionsDlg::KMergeTransactionsDlg(const MyMoneyAccount& account, QWidget* parent) : KSelectTransactionsDlg(account, parent) { - // setup descriptive texts setWindowTitle(i18n("Merge Transactions")); - m_description->setText(i18n("Are you sure you wish to merge these transactions?")); + d_ptr->ui->m_description->setText(i18n("Are you sure you wish to merge these transactions?")); // no selection possible - m_register->setSelectionMode(QTableWidget::NoSelection); + d_ptr->ui->m_register->setSelectionMode(QTableWidget::NoSelection); // override default and enable ok button right away - buttonOk->setEnabled(true); + d_ptr->ui->buttonBox->button(QDialogButtonBox::Ok)->setEnabled(true); +} + +bool KMergeTransactionsDlg::eventFilter(QObject* , QEvent*) +{ + return false; } void KMergeTransactionsDlg::slotHelp() diff --git a/kmymoney/dialogs/kmymoneyfileinfodlg.h b/kmymoney/dialogs/kmymoneyfileinfodlg.h --- a/kmymoney/dialogs/kmymoneyfileinfodlg.h +++ b/kmymoney/dialogs/kmymoneyfileinfodlg.h @@ -4,6 +4,7 @@ begin : Sun Oct 9 2005 copyright : (C) 2005 by Thomas Baumgart email : Thomas Baumgart + (C) 2017 by Łukasz Wojniłowicz ***************************************************************************/ /*************************************************************************** @@ -21,31 +22,31 @@ // ---------------------------------------------------------------------------- // QT Includes +#include + // ---------------------------------------------------------------------------- // KDE Includes // ---------------------------------------------------------------------------- // Project Includes -#include "ui_kmymoneyfileinfodlgdecl.h" +namespace Ui { class KMyMoneyFileInfoDlg; } /** * @author Thomas Baumgart */ -class KMyMoneyFileInfoDlgDecl : public QDialog, public Ui::KMyMoneyFileInfoDlgDecl -{ -public: - KMyMoneyFileInfoDlgDecl(QWidget *parent) : QDialog(parent) { - setupUi(this); - } -}; -class KMyMoneyFileInfoDlg : public KMyMoneyFileInfoDlgDecl +class KMyMoneyFileInfoDlg : public QDialog { Q_OBJECT + Q_DISABLE_COPY(KMyMoneyFileInfoDlg) + public: - KMyMoneyFileInfoDlg(QWidget *parent = 0); - virtual ~KMyMoneyFileInfoDlg(); + explicit KMyMoneyFileInfoDlg(QWidget *parent = nullptr); + ~KMyMoneyFileInfoDlg(); + +private: + Ui::KMyMoneyFileInfoDlg *ui; }; #endif diff --git a/kmymoney/dialogs/kmymoneyfileinfodlg.cpp b/kmymoney/dialogs/kmymoneyfileinfodlg.cpp --- a/kmymoney/dialogs/kmymoneyfileinfodlg.cpp +++ b/kmymoney/dialogs/kmymoneyfileinfodlg.cpp @@ -4,6 +4,7 @@ begin : Sun Oct 9 2005 copyright : (C) 2005 by Thomas Baumgart email : Thomas Baumgart + (C) 2017 by Łukasz Wojniłowicz ***************************************************************************/ /*************************************************************************** @@ -29,33 +30,37 @@ // ---------------------------------------------------------------------------- // Project Includes +#include "ui_kmymoneyfileinfodlg.h" + #include #include "mymoneyfile.h" #include "mymoneyinstitution.h" #include "mymoneyaccount.h" -#include "mymoneyprice.h" #include "mymoneypayee.h" +#include "mymoneyprice.h" #include "mymoneyschedule.h" #include "mymoneytransaction.h" #include "mymoneytransactionfilter.h" #include "mymoneyenums.h" -KMyMoneyFileInfoDlg::KMyMoneyFileInfoDlg(QWidget *parent) - : KMyMoneyFileInfoDlgDecl(parent) +KMyMoneyFileInfoDlg::KMyMoneyFileInfoDlg(QWidget *parent) : + QDialog(parent), + ui(new Ui::KMyMoneyFileInfoDlg) { + ui->setupUi(this); // Now fill the fields with data - IMyMoneyStorage* storage = MyMoneyFile::instance()->storage(); + auto storage = MyMoneyFile::instance()->storage(); - m_creationDate->setText(storage->creationDate().toString(Qt::ISODate)); - m_lastModificationDate->setText(storage->lastModificationDate().toString(Qt::ISODate)); - m_baseCurrency->setText(storage->value("kmm-baseCurrency")); + ui->m_creationDate->setText(storage->creationDate().toString(Qt::ISODate)); + ui->m_lastModificationDate->setText(storage->lastModificationDate().toString(Qt::ISODate)); + ui->m_baseCurrency->setText(storage->value("kmm-baseCurrency")); - m_payeeCount->setText(QString("%1").arg(storage->payeeList().count())); - m_institutionCount->setText(QString("%1").arg(storage->institutionList().count())); + ui->m_payeeCount->setText(QString::fromLatin1("%1").arg(storage->payeeList().count())); + ui->m_institutionCount->setText(QString::fromLatin1("%1").arg(storage->institutionList().count())); QList a_list; storage->accountList(a_list); - m_accountCount->setText(QString("%1").arg(a_list.count())); + ui->m_accountCount->setText(QString::fromLatin1("%1").arg(a_list.count())); QMap accountMap; QMap accountMapClosed; @@ -71,25 +76,26 @@ for (it_m = accountMap.constBegin(); it_m != accountMap.constEnd(); ++it_m) { QTreeWidgetItem *item = new QTreeWidgetItem(); item->setText(0, MyMoneyAccount::accountTypeToString(it_m.key())); - item->setText(1, QString("%1").arg(*it_m)); - item->setText(2, QString("%1").arg(accountMapClosed[it_m.key()])); - m_accountView->invisibleRootItem()->addChild(item); + item->setText(1, QString::fromLatin1("%1").arg(*it_m)); + item->setText(2, QString::fromLatin1("%1").arg(accountMapClosed[it_m.key()])); + ui->m_accountView->invisibleRootItem()->addChild(item); } MyMoneyTransactionFilter filter; filter.setReportAllSplits(false); - m_transactionCount->setText(QString("%1").arg(storage->transactionList(filter).count())); + ui->m_transactionCount->setText(QString::fromLatin1("%1").arg(storage->transactionList(filter).count())); filter.setReportAllSplits(true); - m_splitCount->setText(QString("%1").arg(storage->transactionList(filter).count())); - m_scheduleCount->setText(QString("%1").arg(storage->scheduleList().count())); + ui->m_splitCount->setText(QString::fromLatin1("%1").arg(storage->transactionList(filter).count())); + ui->m_scheduleCount->setText(QString::fromLatin1("%1").arg(storage->scheduleList().count())); MyMoneyPriceList list = storage->priceList(); MyMoneyPriceList::const_iterator it_p; int pCount = 0; for (it_p = list.constBegin(); it_p != list.constEnd(); ++it_p) pCount += (*it_p).count(); - m_priceCount->setText(QString("%1").arg(pCount)); + ui->m_priceCount->setText(QString::fromLatin1("%1").arg(pCount)); } KMyMoneyFileInfoDlg::~KMyMoneyFileInfoDlg() { + delete ui; } diff --git a/kmymoney/dialogs/kmymoneyfileinfodlgdecl.ui b/kmymoney/dialogs/kmymoneyfileinfodlg.ui rename from kmymoney/dialogs/kmymoneyfileinfodlgdecl.ui rename to kmymoney/dialogs/kmymoneyfileinfodlg.ui --- a/kmymoney/dialogs/kmymoneyfileinfodlgdecl.ui +++ b/kmymoney/dialogs/kmymoneyfileinfodlg.ui @@ -1,7 +1,7 @@ - KMyMoneyFileInfoDlgDecl - + KMyMoneyFileInfoDlg + 0 @@ -291,7 +291,7 @@ buttonBox rejected() - KMyMoneyFileInfoDlgDecl + KMyMoneyFileInfoDlg reject() @@ -307,7 +307,7 @@ buttonBox accepted() - KMyMoneyFileInfoDlgDecl + KMyMoneyFileInfoDlg accept() diff --git a/kmymoney/dialogs/kmymoneypricedlg.h b/kmymoney/dialogs/kmymoneypricedlg.h --- a/kmymoney/dialogs/kmymoneypricedlg.h +++ b/kmymoney/dialogs/kmymoneypricedlg.h @@ -9,6 +9,7 @@ John C Thomas Baumgart Kevin Tambascio + (C) 2017 by Łukasz Wojniłowicz ***************************************************************************/ /*************************************************************************** @@ -26,6 +27,7 @@ // ---------------------------------------------------------------------------- // QT Includes +#include // ---------------------------------------------------------------------------- // KDE Includes @@ -33,24 +35,17 @@ // ---------------------------------------------------------------------------- // Project Includes -#include "ui_kmymoneypricedlgdecl.h" - class MyMoneyPrice; -class KTreeWidgetSearchLineWidget; class QTreeWidgetItem; -class KMyMoneyPriceDlgDecl : public QDialog, public Ui::KMyMoneyPriceDlgDecl -{ -public: - KMyMoneyPriceDlgDecl(QWidget *parent) : QDialog(parent) { - setupUi(this); - } -}; -class KMyMoneyPriceDlg : public KMyMoneyPriceDlgDecl +class KMyMoneyPriceDlgPrivate; +class KMyMoneyPriceDlg : public QDialog { Q_OBJECT + Q_DISABLE_COPY(KMyMoneyPriceDlg) + public: - KMyMoneyPriceDlg(QWidget* parent); + explicit KMyMoneyPriceDlg(QWidget* parent); ~KMyMoneyPriceDlg(); private: @@ -70,12 +65,8 @@ void selectObject(const MyMoneyPrice& price); private: - QTreeWidgetItem* m_currentItem; - /** - * Search widget for the list - */ - KTreeWidgetSearchLineWidget* m_searchWidget; - QMap m_stockNameMap; + KMyMoneyPriceDlgPrivate * const d_ptr; + Q_DECLARE_PRIVATE(KMyMoneyPriceDlg) }; #endif // KMYMONEYPRICEDLG_H diff --git a/kmymoney/dialogs/kmymoneypricedlg.cpp b/kmymoney/dialogs/kmymoneypricedlg.cpp --- a/kmymoney/dialogs/kmymoneypricedlg.cpp +++ b/kmymoney/dialogs/kmymoneypricedlg.cpp @@ -9,6 +9,7 @@ John C Thomas Baumgart Kevin Tambascio + (C) 2017 by Łukasz Wojniłowicz ***************************************************************************/ /*************************************************************************** @@ -28,13 +29,11 @@ #include #include #include -#include #include // ---------------------------------------------------------------------------- // KDE Includes -#include #include #include #include @@ -43,6 +42,9 @@ // ---------------------------------------------------------------------------- // Project Includes +#include "ui_kmymoneypricedlg.h" +#include "ui_kupdatestockpricedlg.h" + #include "kupdatestockpricedlg.h" #include "kcurrencycalculator.h" #include "mymoneyprice.h" @@ -58,56 +60,67 @@ using namespace Icons; +class KMyMoneyPriceDlgPrivate +{ + Q_DISABLE_COPY(KMyMoneyPriceDlgPrivate) + Q_DECLARE_PUBLIC(KMyMoneyPriceDlg) + +public: + KMyMoneyPriceDlgPrivate(KMyMoneyPriceDlg *qq) : + q_ptr(qq), + ui(new Ui::KMyMoneyPriceDlg), + m_searchWidget(nullptr) + { + } + + ~KMyMoneyPriceDlgPrivate() + { + delete ui; + } + + KMyMoneyPriceDlg *q_ptr; + Ui::KMyMoneyPriceDlg *ui; + QTreeWidgetItem* m_currentItem; + /** + * Search widget for the list + */ + KTreeWidgetSearchLineWidget* m_searchWidget; + QMap m_stockNameMap; +}; + KMyMoneyPriceDlg::KMyMoneyPriceDlg(QWidget* parent) : - KMyMoneyPriceDlgDecl(parent) + QDialog(parent), + d_ptr(new KMyMoneyPriceDlgPrivate(this)) { - QVBoxLayout *mainLayout = new QVBoxLayout; - setLayout(mainLayout); - mainLayout->addWidget(m_layoutWidget); - QDialogButtonBox *buttonBox = new QDialogButtonBox(QDialogButtonBox::Close); - connect(buttonBox, SIGNAL(accepted()), this, SLOT(accept())); - connect(buttonBox, SIGNAL(rejected()), this, SLOT(reject())); - mainLayout->addWidget(buttonBox); + Q_D(KMyMoneyPriceDlg); + d->ui->setupUi(this); // create the searchline widget // and insert it into the existing layout - m_searchWidget = new KTreeWidgetSearchLineWidget(this, m_priceList); - m_searchWidget->setSizePolicy(QSizePolicy(QSizePolicy::Preferred, QSizePolicy::Fixed)); - m_listLayout->insertWidget(0, m_searchWidget); - - m_priceList->header()->setSortIndicator(0, Qt::AscendingOrder); - m_priceList->header()->setStretchLastSection(true); - m_priceList->setContextMenuPolicy(Qt::CustomContextMenu); - - KGuiItem removeButtonItem(i18n("&Delete"), - QIcon::fromTheme(g_Icons[Icon::EditDelete]), - i18n("Delete this entry"), - i18n("Remove this price item from the file")); - KGuiItem::assign(m_deleteButton, removeButtonItem); - - KGuiItem newButtonItem(i18nc("New price entry", "&New"), - QIcon::fromTheme(g_Icons[Icon::DocumentNew]), - i18n("Add a new entry"), - i18n("Create a new price entry.")); - KGuiItem::assign(m_newButton, newButtonItem); - - KGuiItem editButtonItem(i18n("&Edit"), - QIcon::fromTheme(g_Icons[Icon::DocumentEdit]), - i18n("Modify the selected entry"), - i18n("Change the details of selected price information.")); - KGuiItem::assign(m_editButton, editButtonItem); - - m_onlineQuoteButton->setIcon(KMyMoneyUtils::overlayIcon(g_Icons[Icon::ViewInvestment], g_Icons[Icon::Download])); - - connect(m_editButton, SIGNAL(clicked()), this, SLOT(slotEditPrice())); - connect(m_deleteButton, SIGNAL(clicked()), this, SLOT(slotDeletePrice())); - connect(m_newButton, SIGNAL(clicked()), this, SLOT(slotNewPrice())); - connect(m_priceList, SIGNAL(itemSelectionChanged()), this, SLOT(slotSelectPrice())); - connect(m_onlineQuoteButton, SIGNAL(clicked()), this, SLOT(slotOnlinePriceUpdate())); - connect(m_priceList, SIGNAL(customContextMenuRequested(QPoint)), this, SLOT(slotOpenContextMenu(QPoint))); - - connect(m_showAllPrices, SIGNAL(toggled(bool)), this, SLOT(slotLoadWidgets())); - connect(MyMoneyFile::instance(), SIGNAL(dataChanged()), this, SLOT(slotLoadWidgets())); + d->m_searchWidget = new KTreeWidgetSearchLineWidget(this, d->ui->m_priceList); + d->m_searchWidget->setSizePolicy(QSizePolicy(QSizePolicy::Preferred, QSizePolicy::Fixed)); + + d->ui->m_listLayout->insertWidget(0, d->m_searchWidget); + + d->ui->m_priceList->header()->setSortIndicator(0, Qt::AscendingOrder); + d->ui->m_priceList->header()->setStretchLastSection(true); + d->ui->m_priceList->setContextMenuPolicy(Qt::CustomContextMenu); + + d->ui->m_deleteButton->setIcon(QIcon::fromTheme(g_Icons[Icon::EditDelete])); + d->ui->m_newButton->setIcon(QIcon::fromTheme(g_Icons[Icon::DocumentNew])); + d->ui->m_editButton->setIcon(QIcon::fromTheme(g_Icons[Icon::DocumentEdit])); + + d->ui->m_onlineQuoteButton->setIcon(KMyMoneyUtils::overlayIcon(g_Icons[Icon::ViewInvestment], g_Icons[Icon::Download])); + + connect(d->ui->m_editButton, &QAbstractButton::clicked, this, &KMyMoneyPriceDlg::slotEditPrice); + connect(d->ui->m_deleteButton, &QAbstractButton::clicked, this, &KMyMoneyPriceDlg::slotDeletePrice); + connect(d->ui->m_newButton, &QAbstractButton::clicked, this, &KMyMoneyPriceDlg::slotNewPrice); + connect(d->ui->m_priceList, &QTreeWidget::itemSelectionChanged, this, &KMyMoneyPriceDlg::slotSelectPrice); + connect(d->ui->m_onlineQuoteButton, &QAbstractButton::clicked, this, &KMyMoneyPriceDlg::slotOnlinePriceUpdate); + connect(d->ui->m_priceList, &QWidget::customContextMenuRequested, this, &KMyMoneyPriceDlg::slotOpenContextMenu); + + connect(d->ui->m_showAllPrices, &QAbstractButton::toggled, this, &KMyMoneyPriceDlg::slotLoadWidgets); + connect(MyMoneyFile::instance(), &MyMoneyFile::dataChanged, this, &KMyMoneyPriceDlg::slotLoadWidgets); slotLoadWidgets(); slotSelectPrice(); @@ -115,16 +128,19 @@ KMyMoneyPriceDlg::~KMyMoneyPriceDlg() { + Q_D(KMyMoneyPriceDlg); + delete d; } void KMyMoneyPriceDlg::slotLoadWidgets() { - MyMoneyFile* file = MyMoneyFile::instance(); + Q_D(KMyMoneyPriceDlg); + auto file = MyMoneyFile::instance(); //clear the list and disable the sorting while it loads the widgets, for performance - m_priceList->setSortingEnabled(false); - m_priceList->clear(); - m_stockNameMap.clear(); + d->ui->m_priceList->setSortingEnabled(false); + d->ui->m_priceList->clear(); + d->m_stockNameMap.clear(); //load the currencies for investments, which we'll need later QList accList; @@ -132,10 +148,10 @@ QList::const_iterator acc_it; for (acc_it = accList.constBegin(); acc_it != accList.constEnd(); ++acc_it) { if ((*acc_it).isInvest()) { - if (m_stockNameMap.contains((*acc_it).currencyId())) { - m_stockNameMap[(*acc_it).currencyId()] = QString(m_stockNameMap.value((*acc_it).currencyId()) + ", " + (*acc_it).name()); + if (d->m_stockNameMap.contains((*acc_it).currencyId())) { + d->m_stockNameMap[(*acc_it).currencyId()] = QString(d->m_stockNameMap.value((*acc_it).currencyId()) + ", " + (*acc_it).name()); } else { - m_stockNameMap[(*acc_it).currencyId()] = (*acc_it).name(); + d->m_stockNameMap[(*acc_it).currencyId()] = (*acc_it).name(); } } } @@ -145,7 +161,7 @@ MyMoneyPriceList::ConstIterator it_allPrices; for (it_allPrices = list.constBegin(); it_allPrices != list.constEnd(); ++it_allPrices) { MyMoneyPriceEntries::ConstIterator it_priceItem; - if (m_showAllPrices->isChecked()) { + if (d->ui->m_showAllPrices->isChecked()) { for (it_priceItem = (*it_allPrices).constBegin(); it_priceItem != (*it_allPrices).constEnd(); ++it_priceItem) { loadPriceItem(*it_priceItem); } @@ -161,20 +177,21 @@ } } //reenable sorting and sort by the commodity column - m_priceList->setSortingEnabled(true); - m_priceList->sortByColumn(KPriceTreeItem::ePriceCommodity); + d->ui->m_priceList->setSortingEnabled(true); + d->ui->m_priceList->sortByColumn(KPriceTreeItem::ePriceCommodity); //update the search widget so the list gets refreshed correctly if it was being filtered - if (!m_searchWidget->searchLine()->text().isEmpty()) - m_searchWidget->searchLine()->updateSearch(m_searchWidget->searchLine()->text()); + if (!d->m_searchWidget->searchLine()->text().isEmpty()) + d->m_searchWidget->searchLine()->updateSearch(d->m_searchWidget->searchLine()->text()); } QTreeWidgetItem* KMyMoneyPriceDlg::loadPriceItem(const MyMoneyPrice& basePrice) { + Q_D(KMyMoneyPriceDlg); MyMoneySecurity from, to; - MyMoneyPrice price = MyMoneyPrice(basePrice); + auto price = MyMoneyPrice(basePrice); - KPriceTreeItem* priceTreeItem = new KPriceTreeItem(m_priceList); + auto priceTreeItem = new KPriceTreeItem(d->ui->m_priceList); if (!price.isValid()) price = MyMoneyFile::instance()->price(price.from(), price.to(), price.date()); @@ -191,8 +208,8 @@ priceTreeItem->setData(KPriceTreeItem::ePriceCommodity, Qt::UserRole, QVariant::fromValue(price)); priceTreeItem->setText(KPriceTreeItem::ePriceCommodity, (from.isCurrency()) ? from.id() : from.tradingSymbol()); - priceTreeItem->setText(KPriceTreeItem::ePriceStockName, (from.isCurrency()) ? QString() : m_stockNameMap.value(from.id())); - priceTreeItem->setToolTip(KPriceTreeItem::ePriceStockName, (from.isCurrency()) ? QString() : m_stockNameMap.value(from.id())); + priceTreeItem->setText(KPriceTreeItem::ePriceStockName, (from.isCurrency()) ? QString() : d->m_stockNameMap.value(from.id())); + priceTreeItem->setToolTip(KPriceTreeItem::ePriceStockName, (from.isCurrency()) ? QString() : d->m_stockNameMap.value(from.id())); priceTreeItem->setText(KPriceTreeItem::ePriceCurrency, to.id()); priceTreeItem->setText(KPriceTreeItem::ePriceDate, QLocale().toString(price.date(), QLocale::ShortFormat)); priceTreeItem->setData(KPriceTreeItem::ePriceDate, KPriceTreeItem::OrderRole, QVariant(price.date())); @@ -206,57 +223,59 @@ void KMyMoneyPriceDlg::slotSelectPrice() { + Q_D(KMyMoneyPriceDlg); QTreeWidgetItem* item = 0; - if (m_priceList->selectedItems().count() > 0) { - item = m_priceList->selectedItems().at(0); + if (d->ui->m_priceList->selectedItems().count() > 0) { + item = d->ui->m_priceList->selectedItems().at(0); } - m_currentItem = item; - m_editButton->setEnabled(item != 0); + d->m_currentItem = item; + d->ui->m_editButton->setEnabled(item != 0); bool deleteEnabled = (item != 0); //if one of the selected entries is a default, then deleting is disabled - QList itemsList = m_priceList->selectedItems(); + QList itemsList = d->ui->m_priceList->selectedItems(); QList::const_iterator item_it; for (item_it = itemsList.constBegin(); item_it != itemsList.constEnd(); ++item_it) { MyMoneyPrice price = (*item_it)->data(0, Qt::UserRole).value(); if (price.source() == "KMyMoney") deleteEnabled = false; } - m_deleteButton->setEnabled(deleteEnabled); + d->ui->m_deleteButton->setEnabled(deleteEnabled); // Modification of automatically added entries is not allowed // Multiple entries cannot be edited at once if (item) { MyMoneyPrice price = item->data(0, Qt::UserRole).value(); if (price.source() == "KMyMoney" || itemsList.count() > 1) - m_editButton->setEnabled(false); + d->ui->m_editButton->setEnabled(false); emit selectObject(price); } } void KMyMoneyPriceDlg::slotNewPrice() { + Q_D(KMyMoneyPriceDlg); QPointer dlg = new KUpdateStockPriceDlg(this); try { - QTreeWidgetItem* item = m_priceList->currentItem(); + auto item = d->ui->m_priceList->currentItem(); if (item) { MyMoneySecurity security; security = MyMoneyFile::instance()->security(item->data(0, Qt::UserRole).value().from()); - dlg->m_security->setSecurity(security); + dlg->ui->m_security->setSecurity(security); security = MyMoneyFile::instance()->security(item->data(0, Qt::UserRole).value().to()); - dlg->m_currency->setSecurity(security); + dlg->ui->m_currency->setSecurity(security); } if (dlg->exec()) { - MyMoneyPrice price(dlg->m_security->security().id(), dlg->m_currency->security().id(), dlg->date(), MyMoneyMoney::ONE); + MyMoneyPrice price(dlg->ui->m_security->security().id(), dlg->ui->m_currency->security().id(), dlg->date(), MyMoneyMoney::ONE); QTreeWidgetItem* p = loadPriceItem(price); - m_priceList->setCurrentItem(p, true); + d->ui->m_priceList->setCurrentItem(p, true); // If the user cancels the following operation, we delete the new item // and re-select any previously selected one if (slotEditPrice() == Rejected) { delete p; if (item) - m_priceList->setCurrentItem(item, true); + d->ui->m_priceList->setCurrentItem(item, true); } } } catch (...) { @@ -268,8 +287,9 @@ int KMyMoneyPriceDlg::slotEditPrice() { + Q_D(KMyMoneyPriceDlg); int rc = Rejected; - QTreeWidgetItem* item = m_priceList->currentItem(); + auto item = d->ui->m_priceList->currentItem(); if (item) { MyMoneySecurity from(MyMoneyFile::instance()->security(item->data(0, Qt::UserRole).value().from())); MyMoneySecurity to(MyMoneyFile::instance()->security(item->data(0, Qt::UserRole).value().to())); @@ -294,7 +314,8 @@ void KMyMoneyPriceDlg::slotDeletePrice() { - QList listItems = m_priceList->selectedItems(); + Q_D(KMyMoneyPriceDlg); + QList listItems = d->ui->m_priceList->selectedItems(); if (listItems.count() > 0) { if (KMessageBox::questionYesNo(this, i18np("Do you really want to delete the selected price entry?", "Do you really want to delete the selected price entries?", listItems.count()), i18n("Delete price information"), KStandardGuiItem::yes(), KStandardGuiItem::no(), "DeletePrice") == KMessageBox::Yes) { MyMoneyFileTransaction ft; @@ -321,9 +342,10 @@ void KMyMoneyPriceDlg::slotOpenContextMenu(const QPoint& p) { - QTreeWidgetItem* item = m_priceList->itemAt(p); + Q_D(KMyMoneyPriceDlg); + auto item = d->ui->m_priceList->itemAt(p); if (item) { - m_priceList->setCurrentItem(item, QItemSelectionModel::ClearAndSelect); + d->ui->m_priceList->setCurrentItem(item, QItemSelectionModel::ClearAndSelect); emit openContextMenu(item->data(0, Qt::UserRole).value()); } } diff --git a/kmymoney/dialogs/kmymoneypricedlg.ui b/kmymoney/dialogs/kmymoneypricedlg.ui new file mode 100644 --- /dev/null +++ b/kmymoney/dialogs/kmymoneypricedlg.ui @@ -0,0 +1,212 @@ + + + KMyMoneyPriceDlg + + + + 0 + 0 + 806 + 440 + + + + Price Editor + + + + + + + + + + + + + 1 + 1 + + + + Remove this price item from the file + + + QAbstractItemView::ExtendedSelection + + + false + + + true + + + + Commodity + + + + + Stock Name + + + + + Currency + + + + + Date + + + + + Price + + + + + Source + + + + + + + + Show all stored prices + + + + + + + + + + + Add a new entry + + + Create a new price entry. + + + New + + + + + + + Modify the selected entry + + + Change the details of selected price information. + + + Modify + + + + + + + Online Quotes + + + + + + + Delete this entry + + + Delete + + + + + + + Qt::Vertical + + + QSizePolicy::Expanding + + + + 21 + 150 + + + + + + + + + + + + QDialogButtonBox::Close|QDialogButtonBox::Ok + + + + + + + QFrame::HLine + + + QFrame::Sunken + + + + + + + + + + m_newButton + m_editButton + m_deleteButton + m_onlineQuoteButton + + + + + buttonBox + accepted() + KMyMoneyPriceDlg + accept() + + + 186 + 297 + + + 402 + 219 + + + + + buttonBox + rejected() + KMyMoneyPriceDlg + reject() + + + 186 + 297 + + + 402 + 219 + + + + + diff --git a/kmymoney/dialogs/kmymoneypricedlgdecl.ui b/kmymoney/dialogs/kmymoneypricedlgdecl.ui deleted file mode 100644 --- a/kmymoney/dialogs/kmymoneypricedlgdecl.ui +++ /dev/null @@ -1,165 +0,0 @@ - - - - - - KMyMoneyPriceDlgDecl - - - - 0 - 0 - 806 - 440 - - - - Price Editor - - - - - - - - - - - - 1 - 1 - - - - false - - - true - - - QAbstractItemView::ExtendedSelection - - - - Commodity - - - - - Stock Name - - - - - Currency - - - - - Date - - - - - Price - - - - - Source - - - - - - - - Show all stored prices - - - - - - - - - - - New - - - - - - - Modify - - - - - - - Online Quotes - - - - - - - Delete - - - - - - - - 21 - 150 - - - - QSizePolicy::Expanding - - - Qt::Vertical - - - - - - - - - - - QFrame::HLine - - - QFrame::Sunken - - - - - - - - - - QDialog - QDialog -
kdialog.h
-
-
- - m_newButton - m_editButton - m_deleteButton - m_onlineQuoteButton - - - - 89504e470d0a1a0a0000000d4948445200000016000000160806000000c4b46c3b0000030149444154789cb59531681b5718c77f0e377c070e3c810a3a70e0041eac51852e0a19e45134830a1d9a4c69a04bc8928e990a693a640e1d0c8642b08742321894c1507991b484c890902bb8701a047760c3bd21701fe4201dde49b6a41a32b8df72dcbbeffdbefffbbfefbd5b1b0c07cce266ebe667ae2006c3c1dada0cdc3be87d6e6c35b0d692a409d9c7ec8b20d65ae29398d19b1114e7e3de4ce98b3f5e10dc0053cf0951b4506496e1b964bf7ce6c585d9054c62d01d617ca48be0596553cf496d8f2c8b01c5f795fc93904e85ec4c01a152857a5d9175d0b2805c872080f18595ccc1499a10a225d4e2fbc2877786fe81253ab6c04c8d106e09db5d43ab0d146e5c64d1a23938fb98a185cea1c33eecfd9eba49eb427dcb201e245365f2b7b2fb5b4a3a31dcb927178afe07d86901df870fefa4842aed6f6b74ba42e52b4014d580e1eb9cbd9d94de7e4aad16d2f9be02d805f0b5e532f927a1ffcacea1777f122a8105b164a7c25faf323a5d9f1f1fd600e1e5bec59e2d4b5c7ef5209d0ad17b8b31864e57c0b3e0815ac3ee33253ab664a770ff5185d1a1cb8d2267d3e58aa1dc7d2508cbe597d0e74fdd269aaaf0f52d414c4ea3e9762c996869e42560d7a72e41c4799a2586e74f95e8d8151481fa86efbe7b3398ac58b1a2b8527589f15451ad303ac2293542ad6648a796278f13a27185e4c4754310facb98c53a79e19a3fdc1426ff28c3d7399d1f7cb25343eb96106cf83c790ce9c4f2eb831855c55485663327992eb6dc8a6259874ed700b0b793323cccb9ffa842b30d6133e3e75fea989ac15a8b16ca76b746b0b92278d919774c5b6d48a78697fb29bbcf52468742a32120909c24e899ce67beed5be2db01e22d1e9485bb620e47f9ee9e606a21bd3f5d3744c7e7c54d55e87443867d8b554515ac5db4620e8e4f62263170fd1cdee90aad7640141992891b0f367c9adfe4049bb07d3b7022bd8c687c0978f46684ee084150b65ac1fcca94591b7a90a496e4c095164fb016a2b192a497795cc0f84817aebe25f7bf70ccc54a575c555c03f78ffa5fc0570d1f0c076bff0232285a0901e2257b0000000049454e44ae426082 - - -
diff --git a/kmymoney/dialogs/kmymoneysplittable.h b/kmymoney/dialogs/kmymoneysplittable.h --- a/kmymoney/dialogs/kmymoneysplittable.h +++ b/kmymoney/dialogs/kmymoneysplittable.h @@ -9,6 +9,7 @@ John C Thomas Baumgart Kevin Tambascio + (C) 2017 by Łukasz Wojniłowicz ***************************************************************************/ /*************************************************************************** @@ -27,35 +28,32 @@ // QT Includes #include -#include -#include // ---------------------------------------------------------------------------- // KDE Includes -class QMenu; -class QPushButton; -class QFrame; // ---------------------------------------------------------------------------- // Project Includes -#include "mymoneysplit.h" -#include "mymoneytransaction.h" -#include "mymoneyaccount.h" - class KMyMoneyCategory; -class kMyMoneyLineEdit; -class kMyMoneyEdit; +class MyMoneyMoney; +class MyMoneySplit; +class MyMoneyTransaction; +class MyMoneyAccount; + +template class QMap; /** * @author Thomas Baumgart */ -class kMyMoneySplitTable : public QTableWidget +class KMyMoneySplitTablePrivate; +class KMyMoneySplitTable : public QTableWidget { Q_OBJECT + Q_DISABLE_COPY(KMyMoneySplitTable) public: - explicit kMyMoneySplitTable(QWidget *parent = 0); - virtual ~kMyMoneySplitTable(); + explicit KMyMoneySplitTable(QWidget *parent = nullptr); + ~KMyMoneySplitTable(); /** * This method is used to load the widget with the information about @@ -71,9 +69,7 @@ /** * This method is used to retrieve the transaction from the widget. */ - const MyMoneyTransaction& transaction() const { - return m_transaction; - } + MyMoneyTransaction transaction() const; /** * Returns a list of MyMoneySplit objects. It contains all but the one @@ -82,19 +78,19 @@ * @param t reference to transaction * @return list of splits */ - const QList getSplits(const MyMoneyTransaction& t) const; + QList getSplits(const MyMoneyTransaction& t) const; void setup(const QMap& priceInfo, int precision); int currentRow() const; protected: - void mousePressEvent(QMouseEvent* e); - void mouseReleaseEvent(QMouseEvent* e); - void mouseDoubleClickEvent(QMouseEvent* e); - bool eventFilter(QObject *o, QEvent *e); + void mousePressEvent(QMouseEvent* e) override; + void mouseReleaseEvent(QMouseEvent* e) override; + void mouseDoubleClickEvent(QMouseEvent* e) override; + bool eventFilter(QObject *o, QEvent *e) override; - void resizeEvent(QResizeEvent*); + void resizeEvent(QResizeEvent*) override; KMyMoneyCategory* createEditWidgets(bool setFocus); void destroyEditWidgets(); void destroyEditWidget(int r, int c); @@ -108,7 +104,7 @@ * @param next true if forward-tab, false if backward-tab was * pressed by the user */ - virtual bool focusNextPrevChild(bool next); + bool focusNextPrevChild(bool next) override; void addToTabOrder(QWidget* w); void updateTransactionTableSize(); @@ -145,7 +141,8 @@ protected slots: /// move the focus to the selected @p row. - void slotSetFocus(const QModelIndex& index, int button = Qt::LeftButton); + void slotSetFocus(const QModelIndex& index); + void slotSetFocus(const QModelIndex& index, int button); /** * Calling this slot refills the widget with the data @@ -205,64 +202,8 @@ void objectCreation(bool state); private: - /// the currently selected row (will be printed as selected) - int m_currentRow; - - /// the number of rows filled with data - int m_maxRows; - - MyMoneyTransaction m_transaction; - MyMoneyAccount m_account; - MyMoneySplit m_split; - MyMoneySplit m_hiddenSplit; - - /** - * This member keeps the precision for the values - */ - int m_precision; - - /** - * This member keeps a pointer to the context menu - */ - QMenu* m_contextMenu; - - /// keeps the QAction of the delete entry in the context menu - QAction* m_contextMenuDelete; - - /// keeps the QAction of the duplicate entry in the context menu - QAction* m_contextMenuDuplicate; - - /** - * This member contains a pointer to the input widget for the category. - * The widget will be created and destroyed dynamically in createInputWidgets() - * and destroyInputWidgets(). - */ - QPointer m_editCategory; - - /** - * This member contains a pointer to the input widget for the memo. - * The widget will be created and destroyed dynamically in createInputWidgets() - * and destroyInputWidgets(). - */ - QPointer m_editMemo; - - /** - * This member contains a pointer to the input widget for the amount. - * The widget will be created and destroyed dynamically in createInputWidgets() - * and destroyInputWidgets(). - */ - QPointer m_editAmount; - - /** - * This member keeps the tab order for the above widgets - */ - QWidgetList m_tabOrderWidgets; - - QPointer m_registerButtonFrame; - QPointer m_registerEnterButton; - QPointer m_registerCancelButton; - - QMap m_priceInfo; + KMyMoneySplitTablePrivate * const d_ptr; + Q_DECLARE_PRIVATE(KMyMoneySplitTable) }; #endif diff --git a/kmymoney/dialogs/kmymoneysplittable.cpp b/kmymoney/dialogs/kmymoneysplittable.cpp --- a/kmymoney/dialogs/kmymoneysplittable.cpp +++ b/kmymoney/dialogs/kmymoneysplittable.cpp @@ -9,6 +9,7 @@ John C Thomas Baumgart Kevin Tambascio + (C) 2017 by Łukasz Wojniłowicz ***************************************************************************/ /*************************************************************************** @@ -36,6 +37,9 @@ #include #include #include +#include +#include +#include // ---------------------------------------------------------------------------- // KDE Includes @@ -48,6 +52,9 @@ // ---------------------------------------------------------------------------- // Project Includes +#include "mymoneysplit.h" +#include "mymoneytransaction.h" +#include "mymoneyaccount.h" #include "mymoneyfile.h" #include "mymoneyprice.h" #include "kmymoneyedit.h" @@ -62,15 +69,90 @@ using namespace Icons; -kMyMoneySplitTable::kMyMoneySplitTable(QWidget *parent) : - QTableWidget(parent), +class KMyMoneySplitTablePrivate +{ + Q_DISABLE_COPY(KMyMoneySplitTablePrivate) + +public: + KMyMoneySplitTablePrivate() : m_currentRow(0), m_maxRows(0), m_precision(2), m_editCategory(0), m_editMemo(0), m_editAmount(0) + { + } + + ~KMyMoneySplitTablePrivate() + { + } + + /// the currently selected row (will be printed as selected) + int m_currentRow; + + /// the number of rows filled with data + int m_maxRows; + + MyMoneyTransaction m_transaction; + MyMoneyAccount m_account; + MyMoneySplit m_split; + MyMoneySplit m_hiddenSplit; + + /** + * This member keeps the precision for the values + */ + int m_precision; + + /** + * This member keeps a pointer to the context menu + */ + QMenu* m_contextMenu; + + /// keeps the QAction of the delete entry in the context menu + QAction* m_contextMenuDelete; + + /// keeps the QAction of the duplicate entry in the context menu + QAction* m_contextMenuDuplicate; + + /** + * This member contains a pointer to the input widget for the category. + * The widget will be created and destroyed dynamically in createInputWidgets() + * and destroyInputWidgets(). + */ + QPointer m_editCategory; + + /** + * This member contains a pointer to the input widget for the memo. + * The widget will be created and destroyed dynamically in createInputWidgets() + * and destroyInputWidgets(). + */ + QPointer m_editMemo; + + /** + * This member contains a pointer to the input widget for the amount. + * The widget will be created and destroyed dynamically in createInputWidgets() + * and destroyInputWidgets(). + */ + QPointer m_editAmount; + + /** + * This member keeps the tab order for the above widgets + */ + QWidgetList m_tabOrderWidgets; + + QPointer m_registerButtonFrame; + QPointer m_registerEnterButton; + QPointer m_registerCancelButton; + + QMap m_priceInfo; +}; + +KMyMoneySplitTable::KMyMoneySplitTable(QWidget *parent) : + QTableWidget(parent), + d_ptr(new KMyMoneySplitTablePrivate) { + Q_D(KMyMoneySplitTable); // used for custom coloring with the help of the application's stylesheet setObjectName(QLatin1String("splittable")); @@ -105,45 +187,50 @@ setEditTriggers(QAbstractItemView::NoEditTriggers); // setup the context menu - m_contextMenu = new QMenu(this); - m_contextMenu->setTitle(i18n("Split Options")); - m_contextMenu->setIcon(QIcon::fromTheme(g_Icons[Icon::ViewFinancialTransfer])); - m_contextMenu->addAction(QIcon::fromTheme(g_Icons[Icon::DocumentEdit]), i18n("Edit..."), this, SLOT(slotStartEdit())); - m_contextMenuDuplicate = m_contextMenu->addAction(QIcon::fromTheme(g_Icons[Icon::EditCopy]), i18nc("To duplicate a split", "Duplicate"), this, SLOT(slotDuplicateSplit())); - m_contextMenuDelete = m_contextMenu->addAction(QIcon::fromTheme(g_Icons[Icon::EditDelete]), + d->m_contextMenu = new QMenu(this); + d->m_contextMenu->setTitle(i18n("Split Options")); + d->m_contextMenu->setIcon(QIcon::fromTheme(g_Icons[Icon::ViewFinancialTransfer])); + d->m_contextMenu->addAction(QIcon::fromTheme(g_Icons[Icon::DocumentEdit]), i18n("Edit..."), this, SLOT(slotStartEdit())); + d->m_contextMenuDuplicate = d->m_contextMenu->addAction(QIcon::fromTheme(g_Icons[Icon::EditCopy]), i18nc("To duplicate a split", "Duplicate"), this, SLOT(slotDuplicateSplit())); + d->m_contextMenuDelete = d->m_contextMenu->addAction(QIcon::fromTheme(g_Icons[Icon::EditDelete]), i18n("Delete..."), this, SLOT(slotDeleteSplit())); - connect(this, SIGNAL(clicked(QModelIndex)), - this, SLOT(slotSetFocus(QModelIndex))); + connect(this, &QAbstractItemView::clicked, + this, static_cast(&KMyMoneySplitTable::slotSetFocus)); - connect(this, SIGNAL(transactionChanged(MyMoneyTransaction)), - this, SLOT(slotUpdateData(MyMoneyTransaction))); + connect(this, &KMyMoneySplitTable::transactionChanged, + this, &KMyMoneySplitTable::slotUpdateData); installEventFilter(this); } -kMyMoneySplitTable::~kMyMoneySplitTable() +KMyMoneySplitTable::~KMyMoneySplitTable() { - KConfigGroup grp = KSharedConfig::openConfig()->group("SplitTable"); + Q_D(KMyMoneySplitTable); + auto grp = KSharedConfig::openConfig()->group("SplitTable"); QByteArray columns = horizontalHeader()->saveState(); grp.writeEntry("HeaderState", columns); grp.sync(); + delete d; } -int kMyMoneySplitTable::currentRow() const +int KMyMoneySplitTable::currentRow() const { - return m_currentRow; + Q_D(const KMyMoneySplitTable); + return d->m_currentRow; } -void kMyMoneySplitTable::setup(const QMap& priceInfo, int precision) +void KMyMoneySplitTable::setup(const QMap& priceInfo, int precision) { - m_priceInfo = priceInfo; - m_precision = precision; + Q_D(KMyMoneySplitTable); + d->m_priceInfo = priceInfo; + d->m_precision = precision; } -bool kMyMoneySplitTable::eventFilter(QObject *o, QEvent *e) +bool KMyMoneySplitTable::eventFilter(QObject *o, QEvent *e) { + Q_D(KMyMoneySplitTable); // MYMONEYTRACER(tracer); QKeyEvent *k = static_cast(e); bool rc = false; @@ -159,7 +246,7 @@ break; case Qt::Key_Down: - if (row < m_transaction.splits().count() - 1) + if (row < d->m_transaction.splits().count() - 1) slotSetFocus(model()->index(row + 1, 0)); break; @@ -168,7 +255,7 @@ break; case Qt::Key_End: - slotSetFocus(model()->index(m_transaction.splits().count() - 1, 0)); + slotSetFocus(model()->index(d->m_transaction.splits().count() - 1, 0)); break; case Qt::Key_PageUp: @@ -180,8 +267,8 @@ break; case Qt::Key_PageDown: - if (row < m_transaction.splits().count() - 1) { - while (lines-- > 0 && row < m_transaction.splits().count() - 1) + if (row < d->m_transaction.splits().count() - 1) { + while (lines-- > 0 && row < d->m_transaction.splits().count() - 1) ++row; slotSetFocus(model()->index(row, 0)); } @@ -193,7 +280,7 @@ case Qt::Key_Return: case Qt::Key_Enter: - if (row < m_transaction.splits().count() - 1 + if (row < d->m_transaction.splits().count() - 1 && KMyMoneyGlobalSettings::enterMovesBetweenFields()) { slotStartEdit(); } else @@ -217,7 +304,7 @@ // new split } else if (Qt::Key_Insert == k->key() && Qt::ControlModifier == k->modifiers()) { - slotSetFocus(model()->index(m_transaction.splits().count() - 1, 0)); + slotSetFocus(model()->index(d->m_transaction.splits().count() - 1, 0)); slotStartEdit(); } else if (k->text()[ 0 ].isPrint()) { @@ -271,7 +358,7 @@ // in case we have the 'enter moves focus between fields', we need to simulate // a TAB key when the object 'o' points to the category or memo field. if (KMyMoneyGlobalSettings::enterMovesBetweenFields()) { - if (o == m_editCategory->lineEdit() || o == m_editMemo) { + if (o == d->m_editCategory->lineEdit() || o == d->m_editMemo) { terminate = false; QKeyEvent evt(e->type(), Qt::Key_Tab, k->modifiers(), QString(), @@ -305,12 +392,12 @@ case Qt::Key_Menu: // if the very last entry is selected, the delete // operation is not available otherwise it is - m_contextMenuDelete->setEnabled( - row < m_transaction.splits().count() - 1); - m_contextMenuDuplicate->setEnabled( - row < m_transaction.splits().count() - 1); + d->m_contextMenuDelete->setEnabled( + row < d->m_transaction.splits().count() - 1); + d->m_contextMenuDuplicate->setEnabled( + row < d->m_transaction.splits().count() - 1); - m_contextMenu->exec(QCursor::pos()); + d->m_contextMenu->exec(QCursor::pos()); rc = true; break; default: @@ -330,14 +417,20 @@ return rc; } -void kMyMoneySplitTable::slotSetFocus(const QModelIndex& index, int button) +void KMyMoneySplitTable::slotSetFocus(const QModelIndex& index) +{ + slotSetFocus(index, Qt::LeftButton); +} + +void KMyMoneySplitTable::slotSetFocus(const QModelIndex& index, int button) { + Q_D(KMyMoneySplitTable); MYMONEYTRACER(tracer); - int row = index.row(); + auto row = index.row(); // adjust row to used area - if (row > m_transaction.splits().count() - 1) - row = m_transaction.splits().count() - 1; + if (row > d->m_transaction.splits().count() - 1) + row = d->m_transaction.splits().count() - 1; if (row < 0) row = 0; @@ -355,7 +448,7 @@ if (row != currentRow()) { // setup new current row and update visible selection selectRow(row); - slotUpdateData(m_transaction); + slotUpdateData(d->m_transaction); } } else if (button == Qt::RightButton) { // context menu is only available when cursor is on @@ -363,32 +456,33 @@ if (row == index.row()) { // setup new current row and update visible selection selectRow(row); - slotUpdateData(m_transaction); + slotUpdateData(d->m_transaction); // if the very last entry is selected, the delete // operation is not available otherwise it is - m_contextMenuDelete->setEnabled( - row < m_transaction.splits().count() - 1); - m_contextMenuDuplicate->setEnabled( - row < m_transaction.splits().count() - 1); + d->m_contextMenuDelete->setEnabled( + row < d->m_transaction.splits().count() - 1); + d->m_contextMenuDuplicate->setEnabled( + row < d->m_transaction.splits().count() - 1); - m_contextMenu->exec(QCursor::pos()); + d->m_contextMenu->exec(QCursor::pos()); } } } -void kMyMoneySplitTable::mousePressEvent(QMouseEvent* e) +void KMyMoneySplitTable::mousePressEvent(QMouseEvent* e) { slotSetFocus(indexAt(e->pos()), e->button()); } /* turn off QTable behaviour */ -void kMyMoneySplitTable::mouseReleaseEvent(QMouseEvent* /* e */) +void KMyMoneySplitTable::mouseReleaseEvent(QMouseEvent* /* e */) { } -void kMyMoneySplitTable::mouseDoubleClickEvent(QMouseEvent *e) +void KMyMoneySplitTable::mouseDoubleClickEvent(QMouseEvent *e) { + Q_D(KMyMoneySplitTable); MYMONEYTRACER(tracer); int col = columnAt(e->pos().x()); @@ -398,15 +492,15 @@ QLineEdit* editWidget = 0; //krazy:exclude=qmethods switch (col) { case 0: - editWidget = m_editCategory->lineEdit(); + editWidget = d->m_editCategory->lineEdit(); break; case 1: - editWidget = m_editMemo; + editWidget = d->m_editMemo; break; case 2: - editWidget = m_editAmount->lineedit(); + editWidget = d->m_editAmount->lineedit(); break; default: @@ -418,22 +512,23 @@ } } -void kMyMoneySplitTable::selectRow(int row) +void KMyMoneySplitTable::selectRow(int row) { + Q_D(KMyMoneySplitTable); MYMONEYTRACER(tracer); - if (row > m_maxRows) - row = m_maxRows; - m_currentRow = row; + if (row > d->m_maxRows) + row = d->m_maxRows; + d->m_currentRow = row; QTableWidget::selectRow(row); - QList list = getSplits(m_transaction); + QList list = getSplits(d->m_transaction); if (row < list.count()) - m_split = list[row]; + d->m_split = list[row]; else - m_split = MyMoneySplit(); + d->m_split = MyMoneySplit(); } -void kMyMoneySplitTable::setRowCount(int irows) +void KMyMoneySplitTable::setRowCount(int irows) { QTableWidget::setRowCount(irows); @@ -449,31 +544,39 @@ verticalHeader()->setUpdatesEnabled(false); - for (int i = 0; i < irows; ++i) + for (auto i = 0; i < irows; ++i) verticalHeader()->resizeSection(i, height); verticalHeader()->setUpdatesEnabled(true); } -void kMyMoneySplitTable::setTransaction(const MyMoneyTransaction& t, const MyMoneySplit& s, const MyMoneyAccount& acc) +void KMyMoneySplitTable::setTransaction(const MyMoneyTransaction& t, const MyMoneySplit& s, const MyMoneyAccount& acc) { + Q_D(KMyMoneySplitTable); MYMONEYTRACER(tracer); - m_transaction = t; - m_account = acc; - m_hiddenSplit = s; + d->m_transaction = t; + d->m_account = acc; + d->m_hiddenSplit = s; selectRow(0); - slotUpdateData(m_transaction); + slotUpdateData(d->m_transaction); +} + +MyMoneyTransaction KMyMoneySplitTable::transaction() const +{ + Q_D(const KMyMoneySplitTable); + return d->m_transaction; } -const QList kMyMoneySplitTable::getSplits(const MyMoneyTransaction& t) const +QList KMyMoneySplitTable::getSplits(const MyMoneyTransaction& t) const { + Q_D(const KMyMoneySplitTable); // get list of splits QList list = t.splits(); // and ignore the one that should be hidden QList::Iterator it; for (it = list.begin(); it != list.end(); ++it) { - if ((*it).id() == m_hiddenSplit.id()) { + if ((*it).id() == d->m_hiddenSplit.id()) { list.erase(it); break; } @@ -481,8 +584,9 @@ return list; } -void kMyMoneySplitTable::slotUpdateData(const MyMoneyTransaction& t) +void KMyMoneySplitTable::slotUpdateData(const MyMoneyTransaction& t) { + Q_D(KMyMoneySplitTable); MYMONEYTRACER(tracer); unsigned long numRows = 0; QTableWidgetItem* textItem; @@ -499,10 +603,10 @@ try { colText = MyMoneyFile::instance()->accountToCategory((*it).accountId()); } catch (const MyMoneyException &) { - qDebug("Unexpected exception in kMyMoneySplitTable::slotUpdateData()"); + qDebug("Unexpected exception in KMyMoneySplitTable::slotUpdateData()"); } } - QString amountTxt = value.formatMoney(m_account.fraction()); + QString amountTxt = value.formatMoney(d->m_account.fraction()); if (value == MyMoneyMoney::autoCalc) { amountTxt = i18n("will be calculated"); } @@ -541,7 +645,7 @@ // now clean out the remainder of the table while (numRows < static_cast(rowCount())) { - for (int i = 0 ; i < 3; ++i) { + for (auto i = 0 ; i < 3; ++i) { textItem = item(numRows, i); if (textItem) textItem->setText(""); @@ -553,11 +657,12 @@ } } -void kMyMoneySplitTable::updateTransactionTableSize() +void KMyMoneySplitTable::updateTransactionTableSize() { + Q_D(KMyMoneySplitTable); // get current size of transactions table int tableHeight = height(); - int splitCount = m_transaction.splits().count() - 1; + int splitCount = d->m_transaction.splits().count() - 1; if (splitCount < 0) splitCount = 0; @@ -568,10 +673,10 @@ numExtraLines = 2; setRowCount(splitCount + numExtraLines); - m_maxRows = splitCount; + d->m_maxRows = splitCount; } -void kMyMoneySplitTable::resizeEvent(QResizeEvent* ev) +void KMyMoneySplitTable::resizeEvent(QResizeEvent* ev) { QTableWidget::resizeEvent(ev); if (!isEditMode()) { @@ -581,41 +686,42 @@ } } -void kMyMoneySplitTable::slotDuplicateSplit() +void KMyMoneySplitTable::slotDuplicateSplit() { + Q_D(KMyMoneySplitTable); MYMONEYTRACER(tracer); - QList list = getSplits(m_transaction); - if (m_currentRow < list.count()) { - MyMoneySplit split = list[m_currentRow]; + QList list = getSplits(d->m_transaction); + if (d->m_currentRow < list.count()) { + MyMoneySplit split = list[d->m_currentRow]; split.clearId(); try { - m_transaction.addSplit(split); - emit transactionChanged(m_transaction); + d->m_transaction.addSplit(split); + emit transactionChanged(d->m_transaction); } catch (const MyMoneyException &e) { qDebug("Cannot duplicate split: %s", qPrintable(e.what())); } } } -void kMyMoneySplitTable::slotDeleteSplit() +void KMyMoneySplitTable::slotDeleteSplit() { + Q_D(KMyMoneySplitTable); MYMONEYTRACER(tracer); - QList list = getSplits(m_transaction); - if (m_currentRow < list.count()) { + QList list = getSplits(d->m_transaction); + if (d->m_currentRow < list.count()) { if (KMessageBox::warningContinueCancel(this, i18n("You are about to delete the selected split. " "Do you really want to continue?"), - i18n("KMyMoney"), - KGuiItem(i18n("Continue")) + i18n("KMyMoney") ) == KMessageBox::Continue) { try { - m_transaction.removeSplit(list[m_currentRow]); + d->m_transaction.removeSplit(list[d->m_currentRow]); // if we removed the last split, select the previous - if (m_currentRow && m_currentRow == list.count() - 1) - selectRow(m_currentRow - 1); + if (d->m_currentRow && d->m_currentRow == list.count() - 1) + selectRow(d->m_currentRow - 1); else - selectRow(m_currentRow); - emit transactionChanged(m_transaction); + selectRow(d->m_currentRow); + emit transactionChanged(d->m_transaction); } catch (const MyMoneyException &e) { qDebug("Cannot remove split: %s", qPrintable(e.what())); } @@ -623,57 +729,58 @@ } } -KMyMoneyCategory* kMyMoneySplitTable::slotStartEdit() +KMyMoneyCategory* KMyMoneySplitTable::slotStartEdit() { MYMONEYTRACER(tracer); return createEditWidgets(true); } -void kMyMoneySplitTable::slotEndEdit() +void KMyMoneySplitTable::slotEndEdit() { endEdit(false); } -void kMyMoneySplitTable::slotEndEditKeyboard() +void KMyMoneySplitTable::slotEndEditKeyboard() { endEdit(true); } -void kMyMoneySplitTable::endEdit(bool keyboardDriven, bool setFocusToNextRow) +void KMyMoneySplitTable::endEdit(bool keyboardDriven, bool setFocusToNextRow) { - MyMoneyFile* file = MyMoneyFile::instance(); + Q_D(KMyMoneySplitTable); + auto file = MyMoneyFile::instance(); MYMONEYTRACER(tracer); - MyMoneySplit s1 = m_split; + MyMoneySplit s1 = d->m_split; if (!isEditSplitValid()) { KMessageBox::information(this, i18n("You need to assign a category to this split before it can be entered."), i18n("Enter split"), "EnterSplitWithEmptyCategory"); - m_editCategory->setFocus(); + d->m_editCategory->setFocus(); return; } bool needUpdate = false; - if (m_editCategory->selectedItem() != m_split.accountId()) { - s1.setAccountId(m_editCategory->selectedItem()); + if (d->m_editCategory->selectedItem() != d->m_split.accountId()) { + s1.setAccountId(d->m_editCategory->selectedItem()); needUpdate = true; } - if (m_editMemo->text() != m_split.memo()) { - s1.setMemo(m_editMemo->text()); + if (d->m_editMemo->text() != d->m_split.memo()) { + s1.setMemo(d->m_editMemo->text()); needUpdate = true; } - if (m_editAmount->value() != m_split.value()) { - s1.setValue(m_editAmount->value()); + if (d->m_editAmount->value() != d->m_split.value()) { + s1.setValue(d->m_editAmount->value()); needUpdate = true; } if (needUpdate) { if (!s1.value().isZero()) { MyMoneyAccount cat = file->account(s1.accountId()); - if (cat.currencyId() != m_transaction.commodity()) { + if (cat.currencyId() != d->m_transaction.commodity()) { MyMoneySecurity fromCurrency, toCurrency; MyMoneyMoney fromValue, toValue; - fromCurrency = file->security(m_transaction.commodity()); + fromCurrency = file->security(d->m_transaction.commodity()); toCurrency = file->security(cat.currencyId()); // determine the fraction required for this category @@ -685,8 +792,8 @@ fromValue = s1.value().abs(); // if we had a price info in the beginning, we use it here - if (m_priceInfo.find(cat.currencyId()) != m_priceInfo.end()) { - toValue = (fromValue * m_priceInfo[cat.currencyId()]).convert(fract); + if (d->m_priceInfo.find(cat.currencyId()) != d->m_priceInfo.end()) { + toValue = (fromValue * d->m_priceInfo[cat.currencyId()]).convert(fract); } // if the shares are still 0, we need to change that @@ -707,7 +814,7 @@ toCurrency, fromValue, toValue, - m_transaction.postDate(), + d->m_transaction.postDate(), fract, this); @@ -725,14 +832,14 @@ } else s1.setShares(s1.value()); - m_split = s1; + d->m_split = s1; try { - if (m_split.id().isEmpty()) { - m_transaction.addSplit(m_split); + if (d->m_split.id().isEmpty()) { + d->m_transaction.addSplit(d->m_split); } else { - m_transaction.modifySplit(m_split); + d->m_transaction.modifySplit(d->m_split); } - emit transactionChanged(m_transaction); + emit transactionChanged(d->m_transaction); } catch (const MyMoneyException &e) { qDebug("Cannot add/modify split: %s", qPrintable(e.what())); } @@ -746,14 +853,14 @@ // if we still have more splits, we start editing right away // in case we have selected 'enter moves between fields' if (keyboardDriven - && currentRow() < m_transaction.splits().count() - 1 + && currentRow() < d->m_transaction.splits().count() - 1 && KMyMoneyGlobalSettings::enterMovesBetweenFields()) { slotStartEdit(); } } -void kMyMoneySplitTable::slotCancelEdit() +void KMyMoneySplitTable::slotCancelEdit() { MYMONEYTRACER(tracer); if (isEditMode()) { @@ -762,143 +869,148 @@ } } -bool kMyMoneySplitTable::isEditMode() const +bool KMyMoneySplitTable::isEditMode() const { + Q_D(const KMyMoneySplitTable); // while the edit widgets exist we're in edit mode - return m_editAmount || m_editMemo || m_editCategory; + return d->m_editAmount || d->m_editMemo || d->m_editCategory; } -bool kMyMoneySplitTable::isEditSplitValid() const +bool KMyMoneySplitTable::isEditSplitValid() const { - return isEditMode() && !m_editCategory->selectedItem().isEmpty(); + Q_D(const KMyMoneySplitTable); + return isEditMode() && !d->m_editCategory->selectedItem().isEmpty(); } -void kMyMoneySplitTable::destroyEditWidgets() +void KMyMoneySplitTable::destroyEditWidgets() { MYMONEYTRACER(tracer); + Q_D(KMyMoneySplitTable); emit editFinished(); - disconnect(MyMoneyFile::instance(), SIGNAL(dataChanged()), this, SLOT(slotLoadEditWidgets())); + disconnect(MyMoneyFile::instance(), &MyMoneyFile::dataChanged, this, &KMyMoneySplitTable::slotLoadEditWidgets); - destroyEditWidget(m_currentRow, 0); - destroyEditWidget(m_currentRow, 1); - destroyEditWidget(m_currentRow, 2); - destroyEditWidget(m_currentRow + 1, 0); + destroyEditWidget(d->m_currentRow, 0); + destroyEditWidget(d->m_currentRow, 1); + destroyEditWidget(d->m_currentRow, 2); + destroyEditWidget(d->m_currentRow + 1, 0); } -void kMyMoneySplitTable::destroyEditWidget(int r, int c) +void KMyMoneySplitTable::destroyEditWidget(int r, int c) { if (QWidget* cw = cellWidget(r, c)) cw->hide(); removeCellWidget(r, c); } -KMyMoneyCategory* kMyMoneySplitTable::createEditWidgets(bool setFocus) +KMyMoneyCategory* KMyMoneySplitTable::createEditWidgets(bool setFocus) { MYMONEYTRACER(tracer); emit editStarted(); - QFont cellFont = KMyMoneyGlobalSettings::listCellFont(); - m_tabOrderWidgets.clear(); + Q_D(KMyMoneySplitTable); + auto cellFont = KMyMoneyGlobalSettings::listCellFont(); + d->m_tabOrderWidgets.clear(); // create the widgets - m_editAmount = new kMyMoneyEdit(0); - m_editAmount->setFont(cellFont); - m_editAmount->setResetButtonVisible(false); - m_editAmount->setPrecision(m_precision); + d->m_editAmount = new kMyMoneyEdit(0); + d->m_editAmount->setFont(cellFont); + d->m_editAmount->setResetButtonVisible(false); + d->m_editAmount->setPrecision(d->m_precision); - m_editCategory = new KMyMoneyCategory(); - m_editCategory->setPlaceholderText(i18n("Category")); - m_editCategory->setFont(cellFont); - connect(m_editCategory, SIGNAL(createItem(QString,QString&)), this, SIGNAL(createCategory(QString,QString&))); - connect(m_editCategory, SIGNAL(objectCreation(bool)), this, SIGNAL(objectCreation(bool))); + d->m_editCategory = new KMyMoneyCategory(); + d->m_editCategory->setPlaceholderText(i18n("Category")); + d->m_editCategory->setFont(cellFont); + connect(d->m_editCategory, SIGNAL(createItem(QString,QString&)), this, SIGNAL(createCategory(QString,QString&))); + connect(d->m_editCategory, SIGNAL(objectCreation(bool)), this, SIGNAL(objectCreation(bool))); - m_editMemo = new kMyMoneyLineEdit(0, false, Qt::AlignLeft | Qt::AlignVCenter); - m_editMemo->setPlaceholderText(i18n("Memo")); - m_editMemo->setFont(cellFont); + d->m_editMemo = new kMyMoneyLineEdit(0, false, Qt::AlignLeft | Qt::AlignVCenter); + d->m_editMemo->setPlaceholderText(i18n("Memo")); + d->m_editMemo->setFont(cellFont); // create buttons for the mouse users - m_registerButtonFrame = new QFrame(this); - m_registerButtonFrame->setContentsMargins(0, 0, 0, 0); - m_registerButtonFrame->setAutoFillBackground(true); + d->m_registerButtonFrame = new QFrame(this); + d->m_registerButtonFrame->setContentsMargins(0, 0, 0, 0); + d->m_registerButtonFrame->setAutoFillBackground(true); - QHBoxLayout* l = new QHBoxLayout(m_registerButtonFrame); + QHBoxLayout* l = new QHBoxLayout(d->m_registerButtonFrame); l->setContentsMargins(0, 0, 0, 0); l->setSpacing(0); - m_registerEnterButton = new QPushButton(QIcon::fromTheme(g_Icons[Icon::DialogOK]) - , QString(), m_registerButtonFrame); - m_registerCancelButton = new QPushButton(QIcon::fromTheme(g_Icons[Icon::DialogCancel]) - , QString(), m_registerButtonFrame); + d->m_registerEnterButton = new QPushButton(QIcon::fromTheme(g_Icons[Icon::DialogOK]) + , QString(), d->m_registerButtonFrame); + d->m_registerCancelButton = new QPushButton(QIcon::fromTheme(g_Icons[Icon::DialogCancel]) + , QString(), d->m_registerButtonFrame); - l->addWidget(m_registerEnterButton); - l->addWidget(m_registerCancelButton); + l->addWidget(d->m_registerEnterButton); + l->addWidget(d->m_registerCancelButton); l->addStretch(2); - connect(m_registerEnterButton, SIGNAL(clicked()), this, SLOT(slotEndEdit())); - connect(m_registerCancelButton, SIGNAL(clicked()), this, SLOT(slotCancelEdit())); + connect(d->m_registerEnterButton.data(), &QAbstractButton::clicked, this, &KMyMoneySplitTable::slotEndEdit); + connect(d->m_registerCancelButton.data(), &QAbstractButton::clicked, this, &KMyMoneySplitTable::slotCancelEdit); // setup tab order - addToTabOrder(m_editCategory); - addToTabOrder(m_editMemo); - addToTabOrder(m_editAmount); - addToTabOrder(m_registerEnterButton); - addToTabOrder(m_registerCancelButton); - - if (!m_split.accountId().isEmpty()) { - m_editCategory->setSelectedItem(m_split.accountId()); + addToTabOrder(d->m_editCategory); + addToTabOrder(d->m_editMemo); + addToTabOrder(d->m_editAmount); + addToTabOrder(d->m_registerEnterButton); + addToTabOrder(d->m_registerCancelButton); + + if (!d->m_split.accountId().isEmpty()) { + d->m_editCategory->setSelectedItem(d->m_split.accountId()); } else { // check if the transaction is balanced or not. If not, // assign the remainder to the amount. MyMoneyMoney diff; - QList list = m_transaction.splits(); + QList list = d->m_transaction.splits(); QList::ConstIterator it_s; for (it_s = list.constBegin(); it_s != list.constEnd(); ++it_s) { if (!(*it_s).accountId().isEmpty()) diff += (*it_s).value(); } - m_split.setValue(-diff); + d->m_split.setValue(-diff); } - m_editMemo->loadText(m_split.memo()); + d->m_editMemo->loadText(d->m_split.memo()); // don't allow automatically calculated values to be modified - if (m_split.value() == MyMoneyMoney::autoCalc) { - m_editAmount->setEnabled(false); - m_editAmount->loadText("will be calculated"); + if (d->m_split.value() == MyMoneyMoney::autoCalc) { + d->m_editAmount->setEnabled(false); + d->m_editAmount->loadText("will be calculated"); } else - m_editAmount->setValue(m_split.value()); + d->m_editAmount->setValue(d->m_split.value()); - setCellWidget(m_currentRow, 0, m_editCategory); - setCellWidget(m_currentRow, 1, m_editMemo); - setCellWidget(m_currentRow, 2, m_editAmount); - setCellWidget(m_currentRow + 1, 0, m_registerButtonFrame); + setCellWidget(d->m_currentRow, 0, d->m_editCategory); + setCellWidget(d->m_currentRow, 1, d->m_editMemo); + setCellWidget(d->m_currentRow, 2, d->m_editAmount); + setCellWidget(d->m_currentRow + 1, 0, d->m_registerButtonFrame); // load e.g. the category widget with the account list slotLoadEditWidgets(); - connect(MyMoneyFile::instance(), SIGNAL(dataChanged()), this, SLOT(slotLoadEditWidgets())); + connect(MyMoneyFile::instance(), &MyMoneyFile::dataChanged, this, &KMyMoneySplitTable::slotLoadEditWidgets); - foreach (QWidget* w, m_tabOrderWidgets) { + foreach (QWidget* w, d->m_tabOrderWidgets) { if (w) { w->installEventFilter(this); } } if (setFocus) { - m_editCategory->lineEdit()->setFocus(); - m_editCategory->lineEdit()->selectAll(); + d->m_editCategory->lineEdit()->setFocus(); + d->m_editCategory->lineEdit()->selectAll(); } // resize the rows so the added edit widgets would fit appropriately resizeRowsToContents(); - return m_editCategory; + return d->m_editCategory; } -void kMyMoneySplitTable::slotLoadEditWidgets() +void KMyMoneySplitTable::slotLoadEditWidgets() { + Q_D(KMyMoneySplitTable); // reload category widget - QString categoryId = m_editCategory->selectedItem(); + auto categoryId = d->m_editCategory->selectedItem(); AccountSet aSet; aSet.addAccountGroup(eMyMoney::Account::Asset); @@ -914,50 +1026,52 @@ aSet.removeAccountType(eMyMoney::Account::Stock); aSet.removeAccountType(eMyMoney::Account::MoneyMarket); - aSet.load(m_editCategory->selector()); + aSet.load(d->m_editCategory->selector()); // if an account is specified then remove it from the widget so that the user // cannot create a transfer with from and to account being the same account - if (!m_account.id().isEmpty()) - m_editCategory->selector()->removeItem(m_account.id()); + if (!d->m_account.id().isEmpty()) + d->m_editCategory->selector()->removeItem(d->m_account.id()); if (!categoryId.isEmpty()) - m_editCategory->setSelectedItem(categoryId); + d->m_editCategory->setSelectedItem(categoryId); } -void kMyMoneySplitTable::addToTabOrder(QWidget* w) +void KMyMoneySplitTable::addToTabOrder(QWidget* w) { + Q_D(KMyMoneySplitTable); if (w) { while (w->focusProxy()) w = w->focusProxy(); - m_tabOrderWidgets.append(w); + d->m_tabOrderWidgets.append(w); } } -bool kMyMoneySplitTable::focusNextPrevChild(bool next) +bool KMyMoneySplitTable::focusNextPrevChild(bool next) { MYMONEYTRACER(tracer); - bool rc = false; + Q_D(KMyMoneySplitTable); + auto rc = false; if (isEditMode()) { QWidget *w = 0; w = qApp->focusWidget(); - int currentWidgetIndex = m_tabOrderWidgets.indexOf(w); + int currentWidgetIndex = d->m_tabOrderWidgets.indexOf(w); while (w && currentWidgetIndex == -1) { // qDebug("'%s' not in list, use parent", w->className()); w = w->parentWidget(); - currentWidgetIndex = m_tabOrderWidgets.indexOf(w); + currentWidgetIndex = d->m_tabOrderWidgets.indexOf(w); } if (currentWidgetIndex != -1) { // if(w) qDebug("tab order is at '%s'", w->className()); currentWidgetIndex += next ? 1 : -1; if (currentWidgetIndex < 0) - currentWidgetIndex = m_tabOrderWidgets.size() - 1; - else if (currentWidgetIndex >= m_tabOrderWidgets.size()) + currentWidgetIndex = d->m_tabOrderWidgets.size() - 1; + else if (currentWidgetIndex >= d->m_tabOrderWidgets.size()) currentWidgetIndex = 0; - w = m_tabOrderWidgets[currentWidgetIndex]; + w = d->m_tabOrderWidgets[currentWidgetIndex]; if (((w->focusPolicy() & Qt::TabFocus) == Qt::TabFocus) && w->isVisible() && w->isEnabled()) { // qDebug("Selecting '%s' as focus", w->className()); diff --git a/kmymoney/dialogs/knewaccountdlg.h b/kmymoney/dialogs/knewaccountdlg.h --- a/kmymoney/dialogs/knewaccountdlg.h +++ b/kmymoney/dialogs/knewaccountdlg.h @@ -32,7 +32,6 @@ class QString; class QItemSelection; -class HierarchyFilterProxyModel; class MyMoneyMoney; class MyMoneyAccount; diff --git a/kmymoney/dialogs/knewaccountdlg.cpp b/kmymoney/dialogs/knewaccountdlg.cpp --- a/kmymoney/dialogs/knewaccountdlg.cpp +++ b/kmymoney/dialogs/knewaccountdlg.cpp @@ -34,7 +34,6 @@ #include #include -#include #include #include @@ -47,17 +46,15 @@ #include "kmymoneydateinput.h" #include #include "mymoneyfile.h" +#include "mymoneyinstitution.h" #include "mymoneyaccount.h" #include "kmymoneyglobalsettings.h" #include "kmymoneycurrencyselector.h" #include "knewbankdlg.h" -#include "kmymoneyutils.h" #include "models.h" #include "accountsmodel.h" #include "hierarchyfilterproxymodel.h" -namespace Ui { class KNewAccountDlg; } - using namespace eMyMoney; class KNewAccountDlgPrivate @@ -605,7 +602,7 @@ void KNewAccountDlg::okClicked() { Q_D(KNewAccountDlg); - MyMoneyFile* file = MyMoneyFile::instance(); + auto file = MyMoneyFile::instance(); QString accountNameText = d->ui->accountNameEdit->text(); if (accountNameText.isEmpty()) { diff --git a/kmymoney/dialogs/knewbankdlg.h b/kmymoney/dialogs/knewbankdlg.h --- a/kmymoney/dialogs/knewbankdlg.h +++ b/kmymoney/dialogs/knewbankdlg.h @@ -3,6 +3,7 @@ ------------------- copyright : (C) 2000 by Michael Edwardes email : mte@users.sourceforge.net + (C) 2017 by Łukasz Wojniłowicz ***************************************************************************/ /*************************************************************************** @@ -28,26 +29,17 @@ // ---------------------------------------------------------------------------- // Project Includes -#include "mymoneyinstitution.h" - -#include "ui_knewbankdlgdecl.h" - - -class KNewBankDlgDecl : public QDialog, public Ui::KNewBankDlgDecl -{ -public: - explicit KNewBankDlgDecl(QWidget *parent) : QDialog(parent) { - setupUi(this); - } -}; +class MyMoneyInstitution; /// This dialog lets the user create or edit an institution -class KNewBankDlg : public KNewBankDlgDecl +class KNewBankDlgPrivate; +class KNewBankDlg : public QDialog { Q_OBJECT + Q_DISABLE_COPY(KNewBankDlg) public: - explicit KNewBankDlg(MyMoneyInstitution& institution, QWidget *parent = 0); + explicit KNewBankDlg(MyMoneyInstitution& institution, QWidget *parent = nullptr); ~KNewBankDlg(); const MyMoneyInstitution& institution(); @@ -56,8 +48,8 @@ void institutionNameChanged(const QString &); private: - MyMoneyInstitution m_institution; - + KNewBankDlgPrivate * const d_ptr; + Q_DECLARE_PRIVATE(KNewBankDlg) }; #endif diff --git a/kmymoney/dialogs/knewbankdlg.cpp b/kmymoney/dialogs/knewbankdlg.cpp --- a/kmymoney/dialogs/knewbankdlg.cpp +++ b/kmymoney/dialogs/knewbankdlg.cpp @@ -3,6 +3,7 @@ ------------------- copyright : (C) 2000 by Michael Edwardes email : mte@users.sourceforge.net + (C) 2017 by Łukasz Wojniłowicz ***************************************************************************/ /*************************************************************************** @@ -32,61 +33,91 @@ // ---------------------------------------------------------------------------- // Project Includes +#include "ui_knewbankdlg.h" + #include "mymoneyinstitution.h" -KNewBankDlg::KNewBankDlg(MyMoneyInstitution& institution, QWidget *parent) - : KNewBankDlgDecl(parent), m_institution(institution) +class KNewBankDlgPrivate +{ + Q_DISABLE_COPY(KNewBankDlgPrivate) + +public: + KNewBankDlgPrivate() : + ui(new Ui::KNewBankDlg) + { + } + + ~KNewBankDlgPrivate() + { + delete ui; + } + + Ui::KNewBankDlg *ui; + MyMoneyInstitution m_institution; +}; + +KNewBankDlg::KNewBankDlg(MyMoneyInstitution& institution, QWidget *parent) : + QDialog(parent), + d_ptr(new KNewBankDlgPrivate) { + Q_D(KNewBankDlg); + d->ui->setupUi(this); + d->m_institution = institution; setModal(true); - nameEdit->setFocus(); - nameEdit->setText(institution.name()); - cityEdit->setText(institution.city()); - streetEdit->setText(institution.street()); - postcodeEdit->setText(institution.postcode()); - telephoneEdit->setText(institution.telephone()); - bicEdit->setText(institution.value("bic")); - sortCodeEdit->setText(institution.sortcode()); - - connect(buttonBox, SIGNAL(accepted()), SLOT(okClicked())); - connect(buttonBox, SIGNAL(rejected()), SLOT(reject())); - connect(nameEdit, SIGNAL(textChanged(QString)), SLOT(institutionNameChanged(QString))); - institutionNameChanged(nameEdit->text()); - - kMandatoryFieldGroup* requiredFields = new kMandatoryFieldGroup(this); - requiredFields->setOkButton(buttonBox->button(QDialogButtonBox::Ok)); // button to be enabled when all fields present - requiredFields->add(nameEdit); + d->ui->nameEdit->setFocus(); + d->ui->nameEdit->setText(institution.name()); + d->ui->cityEdit->setText(institution.city()); + d->ui->streetEdit->setText(institution.street()); + d->ui->postcodeEdit->setText(institution.postcode()); + d->ui->telephoneEdit->setText(institution.telephone()); + d->ui->bicEdit->setText(institution.value("bic")); + d->ui->sortCodeEdit->setText(institution.sortcode()); + + connect(d->ui->buttonBox, &QDialogButtonBox::accepted, this, &KNewBankDlg::okClicked); + connect(d->ui->buttonBox, &QDialogButtonBox::rejected, this, &QDialog::reject); + connect(d->ui->nameEdit, &QLineEdit::textChanged, this, &KNewBankDlg::institutionNameChanged); + institutionNameChanged(d->ui->nameEdit->text()); + + auto requiredFields = new kMandatoryFieldGroup(this); + requiredFields->setOkButton(d->ui->buttonBox->button(QDialogButtonBox::Ok)); // button to be enabled when all fields present + requiredFields->add(d->ui->nameEdit); } void KNewBankDlg::institutionNameChanged(const QString &_text) { - buttonBox->button(QDialogButtonBox::Ok)->setEnabled(!_text.isEmpty()); + Q_D(KNewBankDlg); + d->ui->buttonBox->button(QDialogButtonBox::Ok)->setEnabled(!_text.isEmpty()); } KNewBankDlg::~KNewBankDlg() { + Q_D(KNewBankDlg); + delete d; } void KNewBankDlg::okClicked() { - if (nameEdit->text().isEmpty()) { + Q_D(KNewBankDlg); + if (d->ui->nameEdit->text().isEmpty()) { KMessageBox::information(this, i18n("The institution name field is empty. Please enter the name."), i18n("Adding New Institution")); - nameEdit->setFocus(); + d->ui->nameEdit->setFocus(); return; } - m_institution.setName(nameEdit->text()); - m_institution.setTown(cityEdit->text()); - m_institution.setStreet(streetEdit->text()); - m_institution.setPostcode(postcodeEdit->text()); - m_institution.setTelephone(telephoneEdit->text()); - m_institution.setValue("bic", bicEdit->text()); - m_institution.setSortcode(sortCodeEdit->text()); + d->m_institution.setName(d->ui->nameEdit->text()); + d->m_institution.setTown(d->ui->cityEdit->text()); + d->m_institution.setStreet(d->ui->streetEdit->text()); + d->m_institution.setPostcode(d->ui->postcodeEdit->text()); + d->m_institution.setTelephone(d->ui->telephoneEdit->text()); + d->m_institution.setValue("bic", d->ui->bicEdit->text()); + d->m_institution.setSortcode(d->ui->sortCodeEdit->text()); accept(); } const MyMoneyInstitution& KNewBankDlg::institution() { - return m_institution; + Q_D(KNewBankDlg); + return d->m_institution; } diff --git a/kmymoney/dialogs/knewbankdlgdecl.ui b/kmymoney/dialogs/knewbankdlg.ui rename from kmymoney/dialogs/knewbankdlgdecl.ui rename to kmymoney/dialogs/knewbankdlg.ui --- a/kmymoney/dialogs/knewbankdlgdecl.ui +++ b/kmymoney/dialogs/knewbankdlg.ui @@ -1,7 +1,7 @@ - KNewBankDlgDecl - + KNewBankDlg + 0 diff --git a/kmymoney/dialogs/knewbudgetdlg.h b/kmymoney/dialogs/knewbudgetdlg.h --- a/kmymoney/dialogs/knewbudgetdlg.h +++ b/kmymoney/dialogs/knewbudgetdlg.h @@ -4,6 +4,7 @@ begin : Wed Jan 18 2006 copyright : (C) 2000-2004 by Darren Gould email : darren_gould@gmx.de + (C) 2017 by Łukasz Wojniłowicz ***************************************************************************/ /*************************************************************************** @@ -29,24 +30,26 @@ // ---------------------------------------------------------------------------- // Project Includes +class KNewBudgetDlgPrivate; class KNewBudgetDlg : public QDialog { Q_OBJECT + Q_DISABLE_COPY(KNewBudgetDlg) public: - KNewBudgetDlg(QWidget* parent); + explicit KNewBudgetDlg(QWidget* parent = nullptr); ~KNewBudgetDlg(); - QString& getYear(); - QString& getName(); + QString getYear() const; + QString getName() const; public slots: - virtual void m_pbCancel_clicked(); - virtual void m_pbOk_clicked(); + void m_pbCancel_clicked(); + void m_pbOk_clicked(); private: - struct Private; - Private* const d; + KNewBudgetDlgPrivate * const d_ptr; + Q_DECLARE_PRIVATE(KNewBudgetDlg) }; #endif // KNEWBUDGETDLG_H diff --git a/kmymoney/dialogs/knewbudgetdlg.cpp b/kmymoney/dialogs/knewbudgetdlg.cpp --- a/kmymoney/dialogs/knewbudgetdlg.cpp +++ b/kmymoney/dialogs/knewbudgetdlg.cpp @@ -4,6 +4,7 @@ begin : Wed Jan 18 2006 copyright : (C) 2000-2004 by Darren Gould email : darren_gould@gmx.de + (C) 2017 by Łukasz Wojniłowicz ***************************************************************************/ /*************************************************************************** @@ -32,13 +33,26 @@ // ---------------------------------------------------------------------------- // Project Includes -#include "ui_knewbudgetdlgdecl.h" +#include "ui_knewbudgetdlg.h" -struct KNewBudgetDlg::Private { +class KNewBudgetDlgPrivate +{ + Q_DISABLE_COPY(KNewBudgetDlgPrivate) + +public: + KNewBudgetDlgPrivate() : + ui(new Ui::KNewBudgetDlg) + { + } + + ~KNewBudgetDlgPrivate() + { + delete ui; + } + + Ui::KNewBudgetDlg *ui; QString m_year; QString m_name; - - Ui::KNewBudgetDlgDecl ui; }; // the combobox should look m_icNextYears into the future @@ -46,26 +60,29 @@ static const int icPastYears = 2; KNewBudgetDlg::KNewBudgetDlg(QWidget* parent) : - QDialog(parent), d(new Private) + QDialog(parent), + d_ptr(new KNewBudgetDlgPrivate) { - d->ui.setupUi(this); + Q_D(KNewBudgetDlg); + d->ui->setupUi(this); QStringList slYear; - QDate dToday = QDate::currentDate(); - int iYear = dToday.year(); + auto dToday = QDate::currentDate(); + auto iYear = dToday.year(); - for (int i = 0; i <= icFutureYears; i++) - d->ui.m_cbYear->addItem(QString::number(iYear++)); + for (auto i = 0; i <= icFutureYears; i++) + d->ui->m_cbYear->addItem(QString::number(iYear++)); iYear = dToday.year(); - for (int i = 0; i <= icPastYears; i++) - d->ui.m_cbYear->addItem(QString::number(--iYear)); + for (auto i = 0; i <= icPastYears; i++) + d->ui->m_cbYear->addItem(QString::number(--iYear)); - connect(d->ui.buttonBox, SIGNAL(accepted()), this, SLOT(m_pbOk_clicked())); - connect(d->ui.buttonBox, SIGNAL(rejected()), this, SLOT(m_pbCancel_clicked())); + connect(d->ui->buttonBox, &QDialogButtonBox::accepted, this, &KNewBudgetDlg::m_pbOk_clicked); + connect(d->ui->buttonBox, &QDialogButtonBox::rejected, this, &KNewBudgetDlg::m_pbCancel_clicked); } KNewBudgetDlg::~KNewBudgetDlg() { + Q_D(KNewBudgetDlg); delete d; } @@ -76,27 +93,30 @@ void KNewBudgetDlg::m_pbOk_clicked() { + Q_D(KNewBudgetDlg); // force focus change to update all data - d->ui.buttonBox->button(QDialogButtonBox::Ok)->setFocus(); + d->ui->buttonBox->button(QDialogButtonBox::Ok)->setFocus(); - if (d->ui.m_leBudgetName->displayText().isEmpty()) { + if (d->ui->m_leBudgetName->displayText().isEmpty()) { KMessageBox::information(this, i18n("Please specify a budget name")); - d->ui.m_leBudgetName->setFocus(); + d->ui->m_leBudgetName->setFocus(); return; } - d->m_year = d->ui.m_cbYear->currentText(); - d->m_name = d->ui.m_leBudgetName->displayText(); + d->m_year = d->ui->m_cbYear->currentText(); + d->m_name = d->ui->m_leBudgetName->displayText(); accept(); } -QString& KNewBudgetDlg::getYear() +QString KNewBudgetDlg::getYear() const { + Q_D(const KNewBudgetDlg); return d->m_year; } -QString& KNewBudgetDlg::getName() +QString KNewBudgetDlg::getName() const { + Q_D(const KNewBudgetDlg); return d->m_name; } diff --git a/kmymoney/dialogs/knewbudgetdlgdecl.ui b/kmymoney/dialogs/knewbudgetdlg.ui rename from kmymoney/dialogs/knewbudgetdlgdecl.ui rename to kmymoney/dialogs/knewbudgetdlg.ui --- a/kmymoney/dialogs/knewbudgetdlgdecl.ui +++ b/kmymoney/dialogs/knewbudgetdlg.ui @@ -1,7 +1,7 @@ - KNewBudgetDlgDecl - + KNewBudgetDlg + 0 diff --git a/kmymoney/dialogs/knewequityentrydecl.ui b/kmymoney/dialogs/knewequityentrydecl.ui deleted file mode 100644 --- a/kmymoney/dialogs/knewequityentrydecl.ui +++ /dev/null @@ -1,221 +0,0 @@ - - - - - - kNewEquityEntryDecl - - - - 0 - 0 - 417 - 208 - - - - New Equity - - - true - - - - - - - - Equity Name: - - - false - - - - - - - Investment Type: - - - false - - - - - - - Trading Symbol of the stock or mutual fund, not required. - - - Trading Symbol of the stock or mutual fund, not required. - - - - - - - - - - 1 - 5 - 0 - 0 - - - - 1 / - - - Qt::AlignVCenter|Qt::AlignRight - - - false - - - - - - - - - - - - Market Symbol: - - - false - - - - - - - Smallest fraction: - - - false - - - - - - - - Stock - - - - - Mutual Fund - - - - - Bond - - - - - - - - Name of the company, or mutual fund. - - - Name of the company, or mutual fund. - - - - - - - - - - 20 - 16 - - - - QSizePolicy::Expanding - - - Qt::Vertical - - - - - - - - - - 81 - 20 - - - - QSizePolicy::Expanding - - - Qt::Horizontal - - - - - - - OK - - - - - - - Cancel - - - - - - - - - - - kMyMoneyEdit - QWidget -
../widgets/kmymoneyedit.h
- - 90 - 25 - - 0 - - 1 - 1 - - image0 -
- - KComboBox - QComboBox -
kcombobox.h
-
-
- - edtEquityName - edtMarketSymbol - cmbInvestmentType - btnOK - btnCancel - - - - 89504e470d0a1a0a0000000d4948445200000016000000160806000000c4b46c3b000000c749444154789cad55db1184200c4c180bb005eab1cd6b8112b40d4bf1bee2486ef3006fbf1c93ece605f07eece4e1a4ed42ff2b35f6e2961132e46309941952ed8f628a761a21f56217cb20b04a45fe276d97f8ffb422431ad96e62a4ee057a83131bcc38431a6d057f8eb5cb36438afcb5cded719614011e9088308374c61aa9adb0e0651b5552b4b29efaacb099312ad5da5b2d50a93124463b2adf516fbb8cbd1354a9b1b667c8a787674144f9f982bcb93635ba8cb3fd1b2616f251013403fee763fabce8bff0aa6c989d7e67440000000049454e44ae426082 - - -
diff --git a/kmymoney/dialogs/knewequityentrydlg.h b/kmymoney/dialogs/knewequityentrydlg.h --- a/kmymoney/dialogs/knewequityentrydlg.h +++ b/kmymoney/dialogs/knewequityentrydlg.h @@ -9,6 +9,7 @@ John C Thomas Baumgart Kevin Tambascio + (C) 2017 by Łukasz Wojniłowicz ***************************************************************************/ /*************************************************************************** @@ -20,13 +21,11 @@ * * ***************************************************************************/ -#ifndef KNEWEQUITYENTRY_H -#define KNEWEQUITYENTRY_H +#ifndef KNEWEQUITYENTRYDLG_H +#define KNEWEQUITYENTRYDLG_H #include -#include "ui_knewequityentrydecl.h" - /** * * Dialog to allow user to enter all data for a stock or mutual fund investment type. @@ -35,43 +34,31 @@ * */ -class kNewEquityEntryDecl : public QDialog, public Ui::kNewEquityEntryDecl -{ -public: - kNewEquityEntryDecl(QWidget *parent) : QDialog(parent) { - setupUi(this); - } -}; - -class KNewEquityEntryDlg : public kNewEquityEntryDecl +class KNewEquityEntryDlgPrivate; +class KNewEquityEntryDlg : public QDialog { Q_OBJECT + Q_DISABLE_COPY(KNewEquityEntryDlg) + public: - KNewEquityEntryDlg(QWidget *parent = 0); + explicit KNewEquityEntryDlg(QWidget *parent = nullptr); virtual ~KNewEquityEntryDlg(); void setSymbolName(const QString& str); - QString symbolName() const { - return m_strSymbolName; - } + QString symbolName() const; void setName(const QString& str); - QString name() const { - return m_strName; - } + QString name() const; - int fraction() const { - return m_fraction; - } + int fraction() const; protected slots: void onOKClicked(); void slotDataChanged(); private: - QString m_strSymbolName; - QString m_strName; - int m_fraction; + KNewEquityEntryDlgPrivate * const d_ptr; + Q_DECLARE_PRIVATE(KNewEquityEntryDlg) }; #endif diff --git a/kmymoney/dialogs/knewequityentrydlg.cpp b/kmymoney/dialogs/knewequityentrydlg.cpp --- a/kmymoney/dialogs/knewequityentrydlg.cpp +++ b/kmymoney/dialogs/knewequityentrydlg.cpp @@ -9,6 +9,7 @@ John C Thomas Baumgart Kevin Tambascio + (C) 2017 by Łukasz Wojniłowicz ***************************************************************************/ /*************************************************************************** @@ -30,73 +31,119 @@ // ---------------------------------------------------------------------------- // KDE Includes -#include -#include - // ---------------------------------------------------------------------------- // Project Includes +#include "ui_knewequityentrydlg.h" + #include "kmymoneyedit.h" #include "mymoneymoney.h" -KNewEquityEntryDlg::KNewEquityEntryDlg(QWidget *parent) - : kNewEquityEntryDecl(parent), - m_fraction(0) +class KNewEquityEntryDlgPrivate +{ + Q_DISABLE_COPY(KNewEquityEntryDlgPrivate) + Q_DECLARE_PUBLIC(KNewEquityEntryDlg) + +public: + KNewEquityEntryDlgPrivate() : + ui(new Ui::KNewEquityEntryDlg) + { + } + + ~KNewEquityEntryDlgPrivate() + { + delete ui; + } + + KNewEquityEntryDlg *q_ptr; + Ui::KNewEquityEntryDlg *ui; + QString m_strSymbolName; + QString m_strName; + int m_fraction; +}; + +KNewEquityEntryDlg::KNewEquityEntryDlg(QWidget *parent) : + QDialog(parent), + d_ptr(new KNewEquityEntryDlgPrivate) { + Q_D(KNewEquityEntryDlg); + d->m_fraction = 0; + d->ui->setupUi(this); setModal(true); - edtFraction->setCalculatorButtonVisible(false); - edtFraction->setPrecision(0); - edtFraction->loadText("100"); + d->ui->edtFraction->setCalculatorButtonVisible(false); + d->ui->edtFraction->setPrecision(0); + d->ui->edtFraction->loadText("100"); - connect(btnOK, SIGNAL(clicked()), this, SLOT(onOKClicked())); - connect(btnCancel, SIGNAL(clicked()), this, SLOT(reject())); + connect(d->ui->buttonBox->button(QDialogButtonBox::Ok), &QAbstractButton::clicked, this, &KNewEquityEntryDlg::onOKClicked); - connect(edtFraction, SIGNAL(textChanged(QString)), this, SLOT(slotDataChanged())); - connect(edtMarketSymbol, SIGNAL(textChanged(QString)), this, SLOT(slotDataChanged())); - connect(edtEquityName, SIGNAL(textChanged(QString)), this, SLOT(slotDataChanged())); + connect(d->ui->edtFraction, &kMyMoneyEdit::textChanged, this, &KNewEquityEntryDlg::slotDataChanged); + connect(d->ui->edtMarketSymbol, &QLineEdit::textChanged, this, &KNewEquityEntryDlg::slotDataChanged); + connect(d->ui->edtEquityName, &QLineEdit::textChanged, this, &KNewEquityEntryDlg::slotDataChanged); // add icons to buttons - KGuiItem::assign(btnOK, KStandardGuiItem::ok()); - KGuiItem::assign(btnCancel, KStandardGuiItem::cancel()); slotDataChanged(); - edtEquityName->setFocus(); + d->ui->edtEquityName->setFocus(); } KNewEquityEntryDlg::~KNewEquityEntryDlg() { + Q_D(KNewEquityEntryDlg); + delete d; } /** No descriptions */ void KNewEquityEntryDlg::onOKClicked() { - m_strSymbolName = edtMarketSymbol->text(); - m_strName = edtEquityName->text(); - m_fraction = edtFraction->value().abs().formatMoney("", 0, false).toUInt(); + Q_D(KNewEquityEntryDlg); + d->m_strSymbolName = d->ui->edtMarketSymbol->text(); + d->m_strName = d->ui->edtEquityName->text(); + d->m_fraction = d->ui->edtFraction->value().abs().formatMoney("", 0, false).toUInt(); accept(); } void KNewEquityEntryDlg::setSymbolName(const QString& str) { - m_strSymbolName = str; - edtMarketSymbol->setText(m_strSymbolName); + Q_D(KNewEquityEntryDlg); + d->m_strSymbolName = str; + d->ui->edtMarketSymbol->setText(d->m_strSymbolName); +} + +QString KNewEquityEntryDlg::symbolName() const +{ + Q_D(const KNewEquityEntryDlg); + return d->m_strSymbolName; } void KNewEquityEntryDlg::setName(const QString& str) { - m_strName = str; - edtEquityName->setText(m_strName); + Q_D(KNewEquityEntryDlg); + d->m_strName = str; + d->ui->edtEquityName->setText(d->m_strName); +} + +QString KNewEquityEntryDlg::name() const +{ + Q_D(const KNewEquityEntryDlg); + return d->m_strName; +} + +int KNewEquityEntryDlg::fraction() const +{ + Q_D(const KNewEquityEntryDlg); + return d->m_fraction; } void KNewEquityEntryDlg::slotDataChanged() { - bool okEnabled = true; + Q_D(KNewEquityEntryDlg); + auto okEnabled = true; - if (!edtFraction->value().isPositive() - || edtMarketSymbol->text().isEmpty() - || edtEquityName->text().isEmpty()) + if (!d->ui->edtFraction->value().isPositive() + || d->ui->edtMarketSymbol->text().isEmpty() + || d->ui->edtEquityName->text().isEmpty()) okEnabled = false; - btnOK->setEnabled(okEnabled); + d->ui->buttonBox->button(QDialogButtonBox::Ok)->setEnabled(okEnabled); } diff --git a/kmymoney/dialogs/knewequityentrydlg.ui b/kmymoney/dialogs/knewequityentrydlg.ui new file mode 100644 --- /dev/null +++ b/kmymoney/dialogs/knewequityentrydlg.ui @@ -0,0 +1,197 @@ + + + KNewEquityEntryDlg + + + + 0 + 0 + 417 + 208 + + + + New Equity + + + true + + + + + + + + Equity Name: + + + false + + + + + + + Investment Type: + + + false + + + + + + + Trading Symbol of the stock or mutual fund, not required. + + + Trading Symbol of the stock or mutual fund, not required. + + + + + + + + + + 0 + 0 + + + + 1 / + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + false + + + + + + + + + + + + Market Symbol: + + + false + + + + + + + Smallest fraction: + + + false + + + + + + + + Stock + + + + + Mutual Fund + + + + + Bond + + + + + + + + Name of the company, or mutual fund. + + + Name of the company, or mutual fund. + + + + + + + + + Qt::Vertical + + + QSizePolicy::Expanding + + + + 20 + 16 + + + + + + + + QDialogButtonBox::Cancel|QDialogButtonBox::Ok + + + + + + + + + KComboBox + QComboBox +
kcombobox.h
+
+ + KLineEdit + QLineEdit +
klineedit.h
+
+ + kMyMoneyEdit + QWidget +
kmymoneyedit.h
+ 1 +
+
+ + edtEquityName + edtMarketSymbol + cmbInvestmentType + + + + + buttonBox + rejected() + KNewEquityEntryDlg + reject() + + + 208 + 184 + + + 208 + 103 + + + + +
diff --git a/kmymoney/dialogs/konlinetransferform.h b/kmymoney/dialogs/konlinetransferform.h --- a/kmymoney/dialogs/konlinetransferform.h +++ b/kmymoney/dialogs/konlinetransferform.h @@ -1,6 +1,7 @@ /* * This file is part of KMyMoney, A Personal Finance Manager by KDE * Copyright (C) 2014 Christian Dávid + * (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 @@ -34,10 +35,7 @@ class IonlineJobEdit; class kMandatoryFieldGroup; -namespace Ui -{ -class kOnlineTransferFormDecl; -} +namespace Ui { class kOnlineTransferForm; } /** * @brief The kOnlineTransferForm class @@ -51,7 +49,7 @@ Q_OBJECT public: - kOnlineTransferForm(QWidget *parent = 0); + kOnlineTransferForm(QWidget *parent = nullptr); virtual ~kOnlineTransferForm(); signals: @@ -118,7 +116,7 @@ */ onlineJob activeOnlineJob() const; - Ui::kOnlineTransferFormDecl* ui; + Ui::kOnlineTransferForm* ui; QList m_onlineJobEditWidgets; kMandatoryFieldGroup* m_requiredFields; QAction* m_duplicateJob; diff --git a/kmymoney/dialogs/konlinetransferform.cpp b/kmymoney/dialogs/konlinetransferform.cpp --- a/kmymoney/dialogs/konlinetransferform.cpp +++ b/kmymoney/dialogs/konlinetransferform.cpp @@ -1,6 +1,7 @@ /* * This file is part of KMyMoney, A Personal Finance Manager by KDE * Copyright (C) 2014 Christian Dávid + * (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 @@ -17,13 +18,12 @@ */ #include "konlinetransferform.h" -#include "ui_konlinetransferformdecl.h" +#include "ui_konlinetransferform.h" #include -#include -#include -#include +#include +#include #include #include @@ -31,11 +31,9 @@ #include #include "kguiutils.h" -#include "kmymoneylineedit.h" #include "onlinetasks/interfaces/ui/ionlinejobedit.h" -#include "mymoney/mymoneyfile.h" -#include "mymoney/mymoneyaccount.h" +#include "mymoneyfile.h" #include "mymoney/onlinejobadministration.h" #include "onlinejob.h" #include "tasks/onlinetask.h" @@ -47,7 +45,7 @@ kOnlineTransferForm::kOnlineTransferForm(QWidget *parent) : QDialog(parent), - ui(new Ui::kOnlineTransferFormDecl), + ui(new Ui::kOnlineTransferForm), m_onlineJobEditWidgets(QList()), m_requiredFields(new kMandatoryFieldGroup(this)) { @@ -70,21 +68,21 @@ // Message Widget for read only jobs m_duplicateJob = KStandardAction::copy(this); - connect(m_duplicateJob, SIGNAL(triggered(bool)), SLOT(duplicateCurrentJob())); + connect(m_duplicateJob, &QAction::triggered, this, &kOnlineTransferForm::duplicateCurrentJob); ui->headMessage->hide(); ui->headMessage->setWordWrap(true); ui->headMessage->setCloseButtonVisible(false); ui->headMessage->addAction(m_duplicateJob); - connect(ui->transferTypeSelection, SIGNAL(currentIndexChanged(int)), this, SLOT(convertCurrentJob(int))); + connect(ui->transferTypeSelection, static_cast(&QComboBox::currentIndexChanged), this, &kOnlineTransferForm::convertCurrentJob); - connect(ui->buttonAbort, SIGNAL(clicked(bool)), this, SLOT(reject())); - connect(ui->buttonSend, SIGNAL(clicked(bool)), this, SLOT(sendJob())); - connect(ui->buttonEnque, SIGNAL(clicked(bool)), this, SLOT(accept())); - connect(m_requiredFields, SIGNAL(stateChanged(bool)), ui->buttonEnque, SLOT(setEnabled(bool))); + connect(ui->buttonAbort, &QAbstractButton::clicked, this, &kOnlineTransferForm::reject); + connect(ui->buttonSend, &QAbstractButton::clicked, this, &kOnlineTransferForm::sendJob); + connect(ui->buttonEnque, &QAbstractButton::clicked, this, &kOnlineTransferForm::accept); + connect(m_requiredFields, static_cast(&kMandatoryFieldGroup::stateChanged), ui->buttonEnque, &QPushButton::setEnabled); - connect(ui->originAccount, SIGNAL(accountSelected(QString)), this, SLOT(accountChanged())); + connect(ui->originAccount, &KMyMoneyAccountCombo::accountSelected, this, &kOnlineTransferForm::accountChanged); accountChanged(); setJobReadOnly(false); @@ -310,7 +308,7 @@ QWidget* oldWidget = ui->creditTransferEdit->takeWidget(); if (oldWidget != 0) { // This is true at the first call of showEditWidget() and if there are no widgets. oldWidget->setEnabled(false); - disconnect(oldWidget, SIGNAL(readOnlyChanged(bool)), this, SLOT(setJobReadOnly(bool))); + disconnect(qobject_cast(oldWidget), &IonlineJobEdit::readOnlyChanged, this, &kOnlineTransferForm::setJobReadOnly); } widget->setEnabled(true); @@ -318,7 +316,7 @@ setJobReadOnly(widget->isReadOnly()); widget->show(); - connect(widget, SIGNAL(readOnlyChanged(bool)), SLOT(setJobReadOnly(bool))); + connect(widget, &IonlineJobEdit::readOnlyChanged, this, &kOnlineTransferForm::setJobReadOnly); checkNotSupportedWidget(); m_requiredFields->changed(); } diff --git a/kmymoney/dialogs/konlinetransferformdecl.ui b/kmymoney/dialogs/konlinetransferform.ui rename from kmymoney/dialogs/konlinetransferformdecl.ui rename to kmymoney/dialogs/konlinetransferform.ui --- a/kmymoney/dialogs/konlinetransferformdecl.ui +++ b/kmymoney/dialogs/konlinetransferform.ui @@ -1,7 +1,7 @@ - kOnlineTransferFormDecl - + kOnlineTransferForm + 0 diff --git a/kmymoney/dialogs/kpayeereassigndlg.h b/kmymoney/dialogs/kpayeereassigndlg.h --- a/kmymoney/dialogs/kpayeereassigndlg.h +++ b/kmymoney/dialogs/kpayeereassigndlg.h @@ -3,6 +3,7 @@ ------------------- copyright : (C) 2005 by Andreas Nicolai (C) 2007 by Thomas Baumgart + (C) 2017 by Łukasz Wojniłowicz ***************************************************************************/ @@ -21,7 +22,7 @@ // ---------------------------------------------------------------------------- // QT Includes -#include +#include // ---------------------------------------------------------------------------- // KDE Includes @@ -29,25 +30,19 @@ // ---------------------------------------------------------------------------- // Project Includes -#include "ui_kpayeereassigndlgdecl.h" - /** * Implementation of the dialog that lets the user select a payee in order * to re-assign transactions (for instance, if payees are deleted). */ class MyMoneyPayee; -class KPayeeReassignDlgDecl : public QDialog, public Ui::KPayeeReassignDlgDecl -{ -public: - KPayeeReassignDlgDecl(QWidget *parent) : QDialog(parent) { - setupUi(this); - } -}; -class KPayeeReassignDlg : public KPayeeReassignDlgDecl +class KPayeeReassignDlgPrivate; +class KPayeeReassignDlg : public QDialog { Q_OBJECT + Q_DISABLE_COPY(KPayeeReassignDlg) + public: /** Change behavior based on type of operation */ enum OperationType { @@ -57,7 +52,7 @@ }; /** Default constructor */ - KPayeeReassignDlg(OperationType type, QWidget* parent = 0); + KPayeeReassignDlg(OperationType type, QWidget* parent = nullptr); /** Destructor */ ~KPayeeReassignDlg(); @@ -77,16 +72,14 @@ * Returns true, if the names of the payees to be deleted should be copied * to the selected payee's match list. */ - bool addToMatchList() const { - return m_copyToMatchList->isChecked(); - } + bool addToMatchList() const; protected: - void accept(); - -private: - OperationType m_type; + void accept() override; +private: + KPayeeReassignDlgPrivate * const d_ptr; + Q_DECLARE_PRIVATE(KPayeeReassignDlg) }; #endif // KPAYEEREASSIGNDLG_H diff --git a/kmymoney/dialogs/kpayeereassigndlg.cpp b/kmymoney/dialogs/kpayeereassigndlg.cpp --- a/kmymoney/dialogs/kpayeereassigndlg.cpp +++ b/kmymoney/dialogs/kpayeereassigndlg.cpp @@ -3,6 +3,7 @@ ------------------- copyright : (C) 2005 by Andreas Nicolai (C) 2007 by Thomas Baumgart + (C) 2017 by Łukasz Wojniłowicz ***************************************************************************/ @@ -34,6 +35,8 @@ // ---------------------------------------------------------------------------- // Project Includes +#include "ui_kpayeereassigndlg.h" + #include /** This lookup table needs to be in sync with KPayeeReassignDlg::OperationType enum */ @@ -42,48 +45,80 @@ I18N_NOOP("The transactions associated with the selected payees need to be re-assigned to a different payee before the selected payees can be deleted. Please select a payee from the list below."), }; +class KPayeeReassignDlgPrivate +{ + Q_DISABLE_COPY(KPayeeReassignDlgPrivate) + +public: + KPayeeReassignDlgPrivate() : + ui(new Ui::KPayeeReassignDlg) + { + } + + ~KPayeeReassignDlgPrivate() + { + delete ui; + } + + Ui::KPayeeReassignDlg *ui; + KPayeeReassignDlg::OperationType m_type; +}; + KPayeeReassignDlg::KPayeeReassignDlg(KPayeeReassignDlg::OperationType type, QWidget* parent) : - KPayeeReassignDlgDecl(parent), - m_type(type) + QDialog(parent), + d_ptr(new KPayeeReassignDlgPrivate) { - kMandatoryFieldGroup* mandatory = new kMandatoryFieldGroup(this); - mandatory->add(payeeCombo); - mandatory->setOkButton(buttonBox->button(QDialogButtonBox::Ok)); - textLabel1->setText(i18n(labelText[m_type])); + Q_D(KPayeeReassignDlg); + d->ui->setupUi(this); + d->m_type = type; + auto mandatory = new kMandatoryFieldGroup(this); + mandatory->add(d->ui->payeeCombo); + mandatory->setOkButton(d->ui->buttonBox->button(QDialogButtonBox::Ok)); + d->ui->textLabel1->setText(i18n(labelText[d->m_type])); } KPayeeReassignDlg::~KPayeeReassignDlg() { + Q_D(KPayeeReassignDlg); + delete d; } QString KPayeeReassignDlg::show(const QList& payeeslist) { + Q_D(KPayeeReassignDlg); if (payeeslist.isEmpty()) return QString(); // no payee available? nothing can be selected... - payeeCombo->loadPayees(payeeslist); + d->ui->payeeCombo->loadPayees(payeeslist); // execute dialog and if aborted, return empty string if (this->exec() == QDialog::Rejected) return QString(); // allow to return the text (new payee) if type is Merge - if (m_type == TypeMerge && payeeCombo->selectedItem().isEmpty()) - return payeeCombo->lineEdit()->text(); + if (d->m_type == TypeMerge && d->ui->payeeCombo->selectedItem().isEmpty()) + return d->ui->payeeCombo->lineEdit()->text(); // otherwise return index of selected payee - return payeeCombo->selectedItem(); + return d->ui->payeeCombo->selectedItem(); } +bool KPayeeReassignDlg::addToMatchList() const +{ + Q_D(const KPayeeReassignDlg); + return d->ui->m_copyToMatchList->isChecked(); +} + void KPayeeReassignDlg::accept() { - // force update of payeeCombo - buttonBox->button(QDialogButtonBox::Ok)->setFocus(); + Q_D(KPayeeReassignDlg); + // force update of d->ui->payeeCombo + d->ui->buttonBox->button(QDialogButtonBox::Ok)->setFocus(); - if (m_type == TypeDelete && payeeCombo->selectedItem().isEmpty()) { + if (d->m_type == TypeDelete && d->ui->payeeCombo->selectedItem().isEmpty()) { KMessageBox::information(this, i18n("This dialog does not allow new payees to be created. Please pick a payee from the list."), i18n("Payee creation")); } else { - KPayeeReassignDlgDecl::accept(); + QDialog::accept(); } } diff --git a/kmymoney/dialogs/kpayeereassigndlgdecl.ui b/kmymoney/dialogs/kpayeereassigndlg.ui rename from kmymoney/dialogs/kpayeereassigndlgdecl.ui rename to kmymoney/dialogs/kpayeereassigndlg.ui --- a/kmymoney/dialogs/kpayeereassigndlgdecl.ui +++ b/kmymoney/dialogs/kpayeereassigndlg.ui @@ -1,7 +1,7 @@ - KPayeeReassignDlgDecl - + KPayeeReassignDlg + 0 @@ -124,7 +124,7 @@ buttonBox accepted() - KPayeeReassignDlgDecl + KPayeeReassignDlg accept() @@ -140,7 +140,7 @@ buttonBox rejected() - KPayeeReassignDlgDecl + KPayeeReassignDlg reject() diff --git a/kmymoney/dialogs/kreportconfigurationfilterdlg.h b/kmymoney/dialogs/kreportconfigurationfilterdlg.h --- a/kmymoney/dialogs/kreportconfigurationfilterdlg.h +++ b/kmymoney/dialogs/kreportconfigurationfilterdlg.h @@ -10,6 +10,7 @@ Thomas Baumgart Kevin Tambascio Ace Jones + (C) 2017 by Łukasz Wojniłowicz ***************************************************************************/ /*************************************************************************** @@ -27,9 +28,6 @@ // ---------------------------------------------------------------------------- // QT Includes -#include -#include - // ---------------------------------------------------------------------------- // KDE Includes @@ -37,42 +35,23 @@ // Project Includes #include "kfindtransactiondlg.h" -#include "mymoneyreport.h" -#include "mymoneybudget.h" -class ReportTabCapitalGain; -class ReportTabChart; -class ReportTabGeneral; -class ReportTabPerformance; -class ReportTabRange; -class ReportTabRowColPivot; -class ReportTabRowColQuery; +class MyMoneyReport; /** * @author Ace Jones */ +class KReportConfigurationFilterDlgPrivate; class KReportConfigurationFilterDlg : public KFindTransactionDlg { Q_OBJECT + Q_DISABLE_COPY(KReportConfigurationFilterDlg) + public: - explicit KReportConfigurationFilterDlg(MyMoneyReport report, QWidget *parent = 0); + explicit KReportConfigurationFilterDlg(MyMoneyReport report, QWidget *parent = nullptr); ~KReportConfigurationFilterDlg(); - const MyMoneyReport& getConfig() const { - return m_currentState; - } - -protected: - QPointer m_tabGeneral; - QPointer m_tabRowColPivot; - QPointer m_tabRowColQuery; - QPointer m_tabChart; - QPointer m_tabRange; - QPointer m_tabCapitalGain; - QPointer m_tabPerformance; - - MyMoneyReport m_initialState; - MyMoneyReport m_currentState; + MyMoneyReport getConfig() const; protected slots: void slotRowTypeChanged(int); @@ -82,9 +61,10 @@ void slotShowHelp(); void slotUpdateCheckTransfers(); void slotUpdateColumnsCombo(); + void slotUpdateColumnsCombo(int idx); void slotLogAxisChanged(int state); private: - QVector m_budgets; + Q_DECLARE_PRIVATE(KReportConfigurationFilterDlg) }; #endif diff --git a/kmymoney/dialogs/kreportconfigurationfilterdlg.cpp b/kmymoney/dialogs/kreportconfigurationfilterdlg.cpp --- a/kmymoney/dialogs/kreportconfigurationfilterdlg.cpp +++ b/kmymoney/dialogs/kreportconfigurationfilterdlg.cpp @@ -10,6 +10,7 @@ Thomas Baumgart Kevin Tambascio Ace Jones + (C) 2017 by Łukasz Wojniłowicz ***************************************************************************/ /*************************************************************************** @@ -22,6 +23,7 @@ ***************************************************************************/ #include "kreportconfigurationfilterdlg.h" +#include "kfindtransactiondlg_p.h" // ---------------------------------------------------------------------------- // QT Includes @@ -40,8 +42,6 @@ #include #include -#include -#include #include #include @@ -51,11 +51,12 @@ #include "kmymoneydateinput.h" #include "kmymoneyedit.h" #include "mymoneyfile.h" +#include "mymoneybudget.h" #include "mymoneyreport.h" #include "daterangedlg.h" #include "reporttabimpl.h" -#include "ui_kfindtransactiondlgdecl.h" +#include "ui_kfindtransactiondlg.h" #include #include #include @@ -64,94 +65,119 @@ #include #include -KReportConfigurationFilterDlg::KReportConfigurationFilterDlg(MyMoneyReport report, QWidget *parent) - : KFindTransactionDlg(parent, (report.rowType() == MyMoneyReport::eAccount)) - , m_tabRowColPivot(0) - , m_tabRowColQuery(0) - , m_tabChart(0) - , m_tabRange(0) - , m_initialState(report) - , m_currentState(report) +class KReportConfigurationFilterDlgPrivate : public KFindTransactionDlgPrivate { + Q_DISABLE_COPY(KReportConfigurationFilterDlgPrivate) + +public: + KReportConfigurationFilterDlgPrivate(KReportConfigurationFilterDlg *qq) : + KFindTransactionDlgPrivate(qq), + m_tabRowColPivot(nullptr), + m_tabRowColQuery(nullptr), + m_tabChart(nullptr), + m_tabRange(nullptr) + { + } + + QPointer m_tabGeneral; + QPointer m_tabRowColPivot; + QPointer m_tabRowColQuery; + QPointer m_tabChart; + QPointer m_tabRange; + QPointer m_tabCapitalGain; + QPointer m_tabPerformance; + + MyMoneyReport m_initialState; + MyMoneyReport m_currentState; + QVector m_budgets; +}; + +KReportConfigurationFilterDlg::KReportConfigurationFilterDlg(MyMoneyReport report, QWidget *parent) : + KFindTransactionDlg(*new KReportConfigurationFilterDlgPrivate(this), parent, (report.rowType() == MyMoneyReport::eAccount)) +{ + Q_D(KReportConfigurationFilterDlg); + + d->m_initialState = report; + d->m_currentState = report; + // // Rework labeling // setWindowTitle(i18n("Report Configuration")); - delete m_ui->TextLabel1; + delete d->ui->TextLabel1; // // Rework the buttons // // the Apply button is always enabled disconnect(SIGNAL(selectionNotEmpty(bool))); - m_ui->buttonBox->button(QDialogButtonBox::Apply)->setEnabled(true); - KGuiItem::assign(m_ui->buttonBox->button(QDialogButtonBox::Apply), KStandardGuiItem::ok()); - m_ui->buttonBox->button(QDialogButtonBox::Apply)->setToolTip(i18nc("@info:tooltip for report configuration apply button", "Apply the configuration changes to the report")); + d->ui->buttonBox->button(QDialogButtonBox::Apply)->setEnabled(true); + d->ui->buttonBox->button(QDialogButtonBox::Apply)->setToolTip(i18nc("@info:tooltip for report configuration apply button", "Apply the configuration changes to the report")); // // Add new tabs // - m_tabGeneral = new ReportTabGeneral(m_ui->m_criteriaTab); - m_ui->m_criteriaTab->insertTab(0, m_tabGeneral, i18nc("General tab", "General")); + d->m_tabGeneral = new ReportTabGeneral(d->ui->m_criteriaTab); + d->ui->m_criteriaTab->insertTab(0, d->m_tabGeneral, i18nc("General tab", "General")); - if (m_initialState.reportType() == MyMoneyReport::ePivotTable) { + if (d->m_initialState.reportType() == MyMoneyReport::ePivotTable) { int tabNr = 1; - if (!(m_initialState.isIncludingPrice() || m_initialState.isIncludingAveragePrice())) { - m_tabRowColPivot = new ReportTabRowColPivot(m_ui->m_criteriaTab); - m_ui->m_criteriaTab->insertTab(tabNr++, m_tabRowColPivot, i18n("Rows/Columns")); - connect(m_tabRowColPivot->ui->m_comboRows, SIGNAL(activated(int)), this, SLOT(slotRowTypeChanged(int))); - connect(m_tabRowColPivot->ui->m_comboRows, SIGNAL(activated(int)), this, SLOT(slotUpdateColumnsCombo())); + if (!(d->m_initialState.isIncludingPrice() || d->m_initialState.isIncludingAveragePrice())) { + d->m_tabRowColPivot = new ReportTabRowColPivot(d->ui->m_criteriaTab); + d->ui->m_criteriaTab->insertTab(tabNr++, d->m_tabRowColPivot, i18n("Rows/Columns")); + connect(d->m_tabRowColPivot->ui->m_comboRows, static_cast(&QComboBox::activated), this, static_cast(&KReportConfigurationFilterDlg::slotRowTypeChanged)); + connect(d->m_tabRowColPivot->ui->m_comboRows, static_cast(&QComboBox::activated), this, static_cast(&KReportConfigurationFilterDlg::slotUpdateColumnsCombo)); //control the state of the includeTransfer check - connect(m_ui->m_categoriesView, SIGNAL(stateChanged()), this, SLOT(slotUpdateCheckTransfers())); + connect(d->ui->m_categoriesView, &KMyMoneySelector::stateChanged, this, &KReportConfigurationFilterDlg::slotUpdateCheckTransfers); } - m_tabChart = new ReportTabChart(m_ui->m_criteriaTab); - m_ui->m_criteriaTab->insertTab(tabNr++, m_tabChart, i18n("Chart")); + d->m_tabChart = new ReportTabChart(d->ui->m_criteriaTab); + d->ui->m_criteriaTab->insertTab(tabNr++, d->m_tabChart, i18n("Chart")); - m_tabRange = new ReportTabRange(m_ui->m_criteriaTab); - m_ui->m_criteriaTab->insertTab(tabNr++, m_tabRange, i18n("Range")); + d->m_tabRange = new ReportTabRange(d->ui->m_criteriaTab); + d->ui->m_criteriaTab->insertTab(tabNr++, d->m_tabRange, i18n("Range")); // date tab is going to be replaced by range tab, so delete it - m_ui->dateRangeLayout->removeWidget(m_dateRange); - m_dateRange->deleteLater(); - m_ui->m_criteriaTab->removeTab(m_ui->m_criteriaTab->indexOf(m_ui->m_dateTab)); - m_ui->m_dateTab->deleteLater(); + d->ui->dateRangeLayout->removeWidget(d->m_dateRange); + d->m_dateRange->deleteLater(); + d->ui->m_criteriaTab->removeTab(d->ui->m_criteriaTab->indexOf(d->ui->m_dateTab)); + d->ui->m_dateTab->deleteLater(); - m_dateRange = m_tabRange->m_dateRange; + d->m_dateRange = d->m_tabRange->m_dateRange; // reconnect signal - connect(m_dateRange, SIGNAL(rangeChanged()), this, SLOT(slotUpdateSelections())); + connect(d->m_dateRange, &DateRangeDlg::rangeChanged, this, &KReportConfigurationFilterDlg::slotUpdateSelections); - if (!(m_initialState.isIncludingPrice() || m_initialState.isIncludingAveragePrice())) { - connect(m_tabRange->ui->m_comboColumns, SIGNAL(activated(int)), this, SLOT(slotColumnTypeChanged(int))); - connect(m_tabRange->ui->m_comboColumns, SIGNAL(activated(int)), this, SLOT(slotUpdateColumnsCombo())); + if (!(d->m_initialState.isIncludingPrice() || d->m_initialState.isIncludingAveragePrice())) { + connect(d->m_tabRange->ui->m_comboColumns, static_cast(&QComboBox::activated), this, &KReportConfigurationFilterDlg::slotColumnTypeChanged); + connect(d->m_tabRange->ui->m_comboColumns, static_cast(&QComboBox::activated), this, static_cast(&KReportConfigurationFilterDlg::slotUpdateColumnsCombo)); } - connect(m_tabChart->ui->m_logYaxis, SIGNAL(stateChanged(int)), this, SLOT(slotLogAxisChanged(int))); - } else if (m_initialState.reportType() == MyMoneyReport::eQueryTable) { + connect(d->m_tabChart->ui->m_logYaxis, &QCheckBox::stateChanged, this, &KReportConfigurationFilterDlg::slotLogAxisChanged); + } else if (d->m_initialState.reportType() == MyMoneyReport::eQueryTable) { // eInvestmentHoldings is a special-case report, and you cannot configure the // rows & columns of that report. - if (m_initialState.rowType() < MyMoneyReport::eAccountByTopAccount) { - m_tabRowColQuery = new ReportTabRowColQuery(m_ui->m_criteriaTab); - m_ui->m_criteriaTab->insertTab(1, m_tabRowColQuery, i18n("Rows/Columns")); + if (d->m_initialState.rowType() < MyMoneyReport::eAccountByTopAccount) { + d->m_tabRowColQuery = new ReportTabRowColQuery(d->ui->m_criteriaTab); + d->ui->m_criteriaTab->insertTab(1, d->m_tabRowColQuery, i18n("Rows/Columns")); } - if (m_initialState.queryColumns() & MyMoneyReport::eQCcapitalgain) { - m_tabCapitalGain = new ReportTabCapitalGain(m_ui->m_criteriaTab); - m_ui->m_criteriaTab->insertTab(1, m_tabCapitalGain, i18n("Report")); + if (d->m_initialState.queryColumns() & MyMoneyReport::eQCcapitalgain) { + d->m_tabCapitalGain = new ReportTabCapitalGain(d->ui->m_criteriaTab); + d->ui->m_criteriaTab->insertTab(1, d->m_tabCapitalGain, i18n("Report")); } - if (m_initialState.queryColumns() & MyMoneyReport::eQCperformance) { - m_tabPerformance = new ReportTabPerformance(m_ui->m_criteriaTab); - m_ui->m_criteriaTab->insertTab(1, m_tabPerformance, i18n("Report")); + if (d->m_initialState.queryColumns() & MyMoneyReport::eQCperformance) { + d->m_tabPerformance = new ReportTabPerformance(d->ui->m_criteriaTab); + d->ui->m_criteriaTab->insertTab(1, d->m_tabPerformance, i18n("Report")); } } - m_ui->m_criteriaTab->setCurrentIndex(m_ui->m_criteriaTab->indexOf(m_tabGeneral)); - m_ui->m_criteriaTab->setMinimumSize(500, 200); + d->ui->m_criteriaTab->setCurrentIndex(d->ui->m_criteriaTab->indexOf(d->m_tabGeneral)); + d->ui->m_criteriaTab->setMinimumSize(500, 200); QList list = MyMoneyFile::instance()->budgetList(); QList::const_iterator it_b; for (it_b = list.constBegin(); it_b != list.constEnd(); ++it_b) { - m_budgets.push_back(*it_b); + d->m_budgets.push_back(*it_b); } // @@ -164,141 +190,148 @@ { } +MyMoneyReport KReportConfigurationFilterDlg::getConfig() const +{ + Q_D(const KReportConfigurationFilterDlg); + return d->m_currentState; +} + void KReportConfigurationFilterDlg::slotSearch() { + Q_D(KReportConfigurationFilterDlg); // setup the filter from the dialog widgets - setupFilter(); + d->setupFilter(); // Copy the m_filter over to the filter part of m_currentConfig. - m_currentState.assignFilter(m_filter); + d->m_currentState.assignFilter(d->m_filter); // Then extract the report properties - m_currentState.setName(m_tabGeneral->ui->m_editName->text()); - m_currentState.setComment(m_tabGeneral->ui->m_editComment->text()); - m_currentState.setConvertCurrency(m_tabGeneral->ui->m_checkCurrency->isChecked()); - m_currentState.setFavorite(m_tabGeneral->ui->m_checkFavorite->isChecked()); - m_currentState.setSkipZero(m_tabGeneral->ui->m_skipZero->isChecked()); + d->m_currentState.setName(d->m_tabGeneral->ui->m_editName->text()); + d->m_currentState.setComment(d->m_tabGeneral->ui->m_editComment->text()); + d->m_currentState.setConvertCurrency(d->m_tabGeneral->ui->m_checkCurrency->isChecked()); + d->m_currentState.setFavorite(d->m_tabGeneral->ui->m_checkFavorite->isChecked()); + d->m_currentState.setSkipZero(d->m_tabGeneral->ui->m_skipZero->isChecked()); - if (m_tabRowColPivot) { + if (d->m_tabRowColPivot) { MyMoneyReport::EDetailLevel dl[4] = { MyMoneyReport::eDetailAll, MyMoneyReport::eDetailTop, MyMoneyReport::eDetailGroup, MyMoneyReport::eDetailTotal }; - m_currentState.setDetailLevel(dl[m_tabRowColPivot->ui->m_comboDetail->currentIndex()]); + d->m_currentState.setDetailLevel(dl[d->m_tabRowColPivot->ui->m_comboDetail->currentIndex()]); // modify the rowtype only if the widget is enabled - if (m_tabRowColPivot->ui->m_comboRows->isEnabled()) { + if (d->m_tabRowColPivot->ui->m_comboRows->isEnabled()) { MyMoneyReport::ERowType rt[2] = { MyMoneyReport::eExpenseIncome, MyMoneyReport::eAssetLiability }; - m_currentState.setRowType(rt[m_tabRowColPivot->ui->m_comboRows->currentIndex()]); + d->m_currentState.setRowType(rt[d->m_tabRowColPivot->ui->m_comboRows->currentIndex()]); } - m_currentState.setShowingRowTotals(false); - if (m_tabRowColPivot->ui->m_comboRows->currentIndex() == 0) - m_currentState.setShowingRowTotals(m_tabRowColPivot->ui->m_checkTotalColumn->isChecked()); + d->m_currentState.setShowingRowTotals(false); + if (d->m_tabRowColPivot->ui->m_comboRows->currentIndex() == 0) + d->m_currentState.setShowingRowTotals(d->m_tabRowColPivot->ui->m_checkTotalColumn->isChecked()); - m_currentState.setShowingColumnTotals(m_tabRowColPivot->ui->m_checkTotalRow->isChecked()); - m_currentState.setIncludingSchedules(m_tabRowColPivot->ui->m_checkScheduled->isChecked()); + d->m_currentState.setShowingColumnTotals(d->m_tabRowColPivot->ui->m_checkTotalRow->isChecked()); + d->m_currentState.setIncludingSchedules(d->m_tabRowColPivot->ui->m_checkScheduled->isChecked()); - m_currentState.setIncludingTransfers(m_tabRowColPivot->ui->m_checkTransfers->isChecked()); + d->m_currentState.setIncludingTransfers(d->m_tabRowColPivot->ui->m_checkTransfers->isChecked()); - m_currentState.setIncludingUnusedAccounts(m_tabRowColPivot->ui->m_checkUnused->isChecked()); + d->m_currentState.setIncludingUnusedAccounts(d->m_tabRowColPivot->ui->m_checkUnused->isChecked()); - if (m_tabRowColPivot->ui->m_comboBudget->isEnabled()) { - m_currentState.setBudget(m_budgets[m_tabRowColPivot->ui->m_comboBudget->currentItem()].id(), m_initialState.rowType() == MyMoneyReport::eBudgetActual); + if (d->m_tabRowColPivot->ui->m_comboBudget->isEnabled()) { + d->m_currentState.setBudget(d->m_budgets[d->m_tabRowColPivot->ui->m_comboBudget->currentItem()].id(), d->m_initialState.rowType() == MyMoneyReport::eBudgetActual); } else { - m_currentState.setBudget(QString(), false); + d->m_currentState.setBudget(QString(), false); } //set moving average days - if (m_tabRowColPivot->ui->m_movingAverageDays->isEnabled()) { - m_currentState.setMovingAverageDays(m_tabRowColPivot->ui->m_movingAverageDays->value()); + if (d->m_tabRowColPivot->ui->m_movingAverageDays->isEnabled()) { + d->m_currentState.setMovingAverageDays(d->m_tabRowColPivot->ui->m_movingAverageDays->value()); } - } else if (m_tabRowColQuery) { + } else if (d->m_tabRowColQuery) { MyMoneyReport::ERowType rtq[8] = { MyMoneyReport::eCategory, MyMoneyReport::eTopCategory, MyMoneyReport::eTag, MyMoneyReport::ePayee, MyMoneyReport::eAccount, MyMoneyReport::eTopAccount, MyMoneyReport::eMonth, MyMoneyReport::eWeek }; - m_currentState.setRowType(rtq[m_tabRowColQuery->ui->m_comboOrganizeBy->currentIndex()]); + d->m_currentState.setRowType(rtq[d->m_tabRowColQuery->ui->m_comboOrganizeBy->currentIndex()]); unsigned qc = MyMoneyReport::eQCnone; - if (m_currentState.queryColumns() & MyMoneyReport::eQCloan) + if (d->m_currentState.queryColumns() & MyMoneyReport::eQCloan) // once a loan report, always a loan report qc = MyMoneyReport::eQCloan; - if (m_tabRowColQuery->ui->m_checkNumber->isChecked()) + if (d->m_tabRowColQuery->ui->m_checkNumber->isChecked()) qc |= MyMoneyReport::eQCnumber; - if (m_tabRowColQuery->ui->m_checkPayee->isChecked()) + if (d->m_tabRowColQuery->ui->m_checkPayee->isChecked()) qc |= MyMoneyReport::eQCpayee; - if (m_tabRowColQuery->ui->m_checkTag->isChecked()) + if (d->m_tabRowColQuery->ui->m_checkTag->isChecked()) qc |= MyMoneyReport::eQCtag; - if (m_tabRowColQuery->ui->m_checkCategory->isChecked()) + if (d->m_tabRowColQuery->ui->m_checkCategory->isChecked()) qc |= MyMoneyReport::eQCcategory; - if (m_tabRowColQuery->ui->m_checkMemo->isChecked()) + if (d->m_tabRowColQuery->ui->m_checkMemo->isChecked()) qc |= MyMoneyReport::eQCmemo; - if (m_tabRowColQuery->ui->m_checkAccount->isChecked()) + if (d->m_tabRowColQuery->ui->m_checkAccount->isChecked()) qc |= MyMoneyReport::eQCaccount; - if (m_tabRowColQuery->ui->m_checkReconciled->isChecked()) + if (d->m_tabRowColQuery->ui->m_checkReconciled->isChecked()) qc |= MyMoneyReport::eQCreconciled; - if (m_tabRowColQuery->ui->m_checkAction->isChecked()) + if (d->m_tabRowColQuery->ui->m_checkAction->isChecked()) qc |= MyMoneyReport::eQCaction; - if (m_tabRowColQuery->ui->m_checkShares->isChecked()) + if (d->m_tabRowColQuery->ui->m_checkShares->isChecked()) qc |= MyMoneyReport::eQCshares; - if (m_tabRowColQuery->ui->m_checkPrice->isChecked()) + if (d->m_tabRowColQuery->ui->m_checkPrice->isChecked()) qc |= MyMoneyReport::eQCprice; - if (m_tabRowColQuery->ui->m_checkBalance->isChecked()) + if (d->m_tabRowColQuery->ui->m_checkBalance->isChecked()) qc |= MyMoneyReport::eQCbalance; - m_currentState.setQueryColumns(static_cast(qc)); + d->m_currentState.setQueryColumns(static_cast(qc)); - m_currentState.setTax(m_tabRowColQuery->ui->m_checkTax->isChecked()); - m_currentState.setInvestmentsOnly(m_tabRowColQuery->ui->m_checkInvestments->isChecked()); - m_currentState.setLoansOnly(m_tabRowColQuery->ui->m_checkLoans->isChecked()); + d->m_currentState.setTax(d->m_tabRowColQuery->ui->m_checkTax->isChecked()); + d->m_currentState.setInvestmentsOnly(d->m_tabRowColQuery->ui->m_checkInvestments->isChecked()); + d->m_currentState.setLoansOnly(d->m_tabRowColQuery->ui->m_checkLoans->isChecked()); - m_currentState.setDetailLevel(m_tabRowColQuery->ui->m_checkHideSplitDetails->isChecked() ? + d->m_currentState.setDetailLevel(d->m_tabRowColQuery->ui->m_checkHideSplitDetails->isChecked() ? MyMoneyReport::eDetailNone : MyMoneyReport::eDetailAll); - m_currentState.setHideTransactions(m_tabRowColQuery->ui->m_checkHideTransactions->isChecked()); - m_currentState.setShowingColumnTotals(!m_tabRowColQuery->ui->m_checkHideTotals->isChecked()); + d->m_currentState.setHideTransactions(d->m_tabRowColQuery->ui->m_checkHideTransactions->isChecked()); + d->m_currentState.setShowingColumnTotals(!d->m_tabRowColQuery->ui->m_checkHideTotals->isChecked()); } - if (m_tabChart) { + if (d->m_tabChart) { MyMoneyReport::EChartType ct[5] = { MyMoneyReport::eChartLine, MyMoneyReport::eChartBar, MyMoneyReport::eChartStackedBar, MyMoneyReport::eChartPie, MyMoneyReport::eChartRing }; - m_currentState.setChartType(ct[m_tabChart->ui->m_comboType->currentIndex()]); - - m_currentState.setChartCHGridLines(m_tabChart->ui->m_checkCHGridLines->isChecked()); - m_currentState.setChartSVGridLines(m_tabChart->ui->m_checkSVGridLines->isChecked()); - m_currentState.setChartDataLabels(m_tabChart->ui->m_checkValues->isChecked()); - m_currentState.setChartByDefault(m_tabChart->ui->m_checkShowChart->isChecked()); - m_currentState.setChartLineWidth(m_tabChart->ui->m_lineWidth->value()); - m_currentState.setLogYAxis(m_tabChart->ui->m_logYaxis->isChecked()); + d->m_currentState.setChartType(ct[d->m_tabChart->ui->m_comboType->currentIndex()]); + + d->m_currentState.setChartCHGridLines(d->m_tabChart->ui->m_checkCHGridLines->isChecked()); + d->m_currentState.setChartSVGridLines(d->m_tabChart->ui->m_checkSVGridLines->isChecked()); + d->m_currentState.setChartDataLabels(d->m_tabChart->ui->m_checkValues->isChecked()); + d->m_currentState.setChartByDefault(d->m_tabChart->ui->m_checkShowChart->isChecked()); + d->m_currentState.setChartLineWidth(d->m_tabChart->ui->m_lineWidth->value()); + d->m_currentState.setLogYAxis(d->m_tabChart->ui->m_logYaxis->isChecked()); } - if (m_tabRange) { - m_currentState.setDataRangeStart(m_tabRange->ui->m_dataRangeStart->text()); - m_currentState.setDataRangeEnd(m_tabRange->ui->m_dataRangeEnd->text()); - m_currentState.setDataMajorTick(m_tabRange->ui->m_dataMajorTick->text()); - m_currentState.setDataMinorTick(m_tabRange->ui->m_dataMinorTick->text()); - m_currentState.setYLabelsPrecision(m_tabRange->ui->m_yLabelsPrecision->value()); - m_currentState.setDataFilter((MyMoneyReport::dataOptionE)m_tabRange->ui->m_dataLock->currentIndex()); + if (d->m_tabRange) { + d->m_currentState.setDataRangeStart(d->m_tabRange->ui->m_dataRangeStart->text()); + d->m_currentState.setDataRangeEnd(d->m_tabRange->ui->m_dataRangeEnd->text()); + d->m_currentState.setDataMajorTick(d->m_tabRange->ui->m_dataMajorTick->text()); + d->m_currentState.setDataMinorTick(d->m_tabRange->ui->m_dataMinorTick->text()); + d->m_currentState.setYLabelsPrecision(d->m_tabRange->ui->m_yLabelsPrecision->value()); + d->m_currentState.setDataFilter((MyMoneyReport::dataOptionE)d->m_tabRange->ui->m_dataLock->currentIndex()); MyMoneyReport::EColumnType ct[6] = { MyMoneyReport::eDays, MyMoneyReport::eWeeks, MyMoneyReport::eMonths, MyMoneyReport::eBiMonths, MyMoneyReport::eQuarters, MyMoneyReport::eYears }; bool dy[6] = { true, true, false, false, false, false }; - m_currentState.setColumnType(ct[m_tabRange->ui->m_comboColumns->currentIndex()]); + d->m_currentState.setColumnType(ct[d->m_tabRange->ui->m_comboColumns->currentIndex()]); //TODO (Ace) This should be implicit in the call above. MMReport needs fixin' - m_currentState.setColumnsAreDays(dy[m_tabRange->ui->m_comboColumns->currentIndex()]); + d->m_currentState.setColumnsAreDays(dy[d->m_tabRange->ui->m_comboColumns->currentIndex()]); } // setup the date lock - eMyMoney::TransactionFilter::Date range = m_dateRange->dateRange(); - m_currentState.setDateFilter(range); - - if (m_tabCapitalGain) { - m_currentState.setTermSeparator(m_tabCapitalGain->ui->m_termSeparator->date()); - m_currentState.setShowSTLTCapitalGains(m_tabCapitalGain->ui->m_showSTLTCapitalGains->isChecked()); - m_currentState.setSettlementPeriod(m_tabCapitalGain->ui->m_settlementPeriod->value()); - m_currentState.setShowingColumnTotals(!m_tabCapitalGain->ui->m_checkHideTotals->isChecked()); - m_currentState.setInvestmentSum(static_cast(m_tabCapitalGain->ui->m_investmentSum->currentData().toInt())); + eMyMoney::TransactionFilter::Date range = d->m_dateRange->dateRange(); + d->m_currentState.setDateFilter(range); + + if (d->m_tabCapitalGain) { + d->m_currentState.setTermSeparator(d->m_tabCapitalGain->ui->m_termSeparator->date()); + d->m_currentState.setShowSTLTCapitalGains(d->m_tabCapitalGain->ui->m_showSTLTCapitalGains->isChecked()); + d->m_currentState.setSettlementPeriod(d->m_tabCapitalGain->ui->m_settlementPeriod->value()); + d->m_currentState.setShowingColumnTotals(!d->m_tabCapitalGain->ui->m_checkHideTotals->isChecked()); + d->m_currentState.setInvestmentSum(static_cast(d->m_tabCapitalGain->ui->m_investmentSum->currentData().toInt())); } - if (m_tabPerformance) { - m_currentState.setShowingColumnTotals(!m_tabPerformance->ui->m_checkHideTotals->isChecked()); - m_currentState.setInvestmentSum(static_cast(m_tabPerformance->ui->m_investmentSum->currentData().toInt())); + if (d->m_tabPerformance) { + d->m_currentState.setShowingColumnTotals(!d->m_tabPerformance->ui->m_checkHideTotals->isChecked()); + d->m_currentState.setInvestmentSum(static_cast(d->m_tabPerformance->ui->m_investmentSum->currentData().toInt())); } done(true); @@ -306,59 +339,69 @@ void KReportConfigurationFilterDlg::slotRowTypeChanged(int row) { - m_tabRowColPivot->ui->m_checkTotalColumn->setEnabled(row == 0); + Q_D(KReportConfigurationFilterDlg); + d->m_tabRowColPivot->ui->m_checkTotalColumn->setEnabled(row == 0); } void KReportConfigurationFilterDlg::slotColumnTypeChanged(int row) { - if ((m_tabRowColPivot->ui->m_comboBudget->isEnabled() && row < 2)) { - m_tabRange->ui->m_comboColumns->setCurrentItem(i18nc("@item the columns will display monthly data", "Monthly"), false); + Q_D(KReportConfigurationFilterDlg); + if ((d->m_tabRowColPivot->ui->m_comboBudget->isEnabled() && row < 2)) { + d->m_tabRange->ui->m_comboColumns->setCurrentItem(i18nc("@item the columns will display monthly data", "Monthly"), false); } } void KReportConfigurationFilterDlg::slotUpdateColumnsCombo() { + Q_D(KReportConfigurationFilterDlg); const int monthlyIndex = 2; const int incomeExpenseIndex = 0; - const bool isIncomeExpenseForecast = m_currentState.isIncludingForecast() && m_tabRowColPivot->ui->m_comboRows->currentIndex() == incomeExpenseIndex; - if (isIncomeExpenseForecast && m_tabRange->ui->m_comboColumns->currentIndex() != monthlyIndex) { - m_tabRange->ui->m_comboColumns->setCurrentItem(i18nc("@item the columns will display monthly data", "Monthly"), false); + const bool isIncomeExpenseForecast = d->m_currentState.isIncludingForecast() && d->m_tabRowColPivot->ui->m_comboRows->currentIndex() == incomeExpenseIndex; + if (isIncomeExpenseForecast && d->m_tabRange->ui->m_comboColumns->currentIndex() != monthlyIndex) { + d->m_tabRange->ui->m_comboColumns->setCurrentItem(i18nc("@item the columns will display monthly data", "Monthly"), false); } } +void KReportConfigurationFilterDlg::slotUpdateColumnsCombo(int) +{ + slotUpdateColumnsCombo(); +} + void KReportConfigurationFilterDlg::slotLogAxisChanged(int state) { + Q_D(KReportConfigurationFilterDlg); if (state == Qt::Checked) - m_tabRange->setRangeLogarythmic(true); + d->m_tabRange->setRangeLogarythmic(true); else - m_tabRange->setRangeLogarythmic(false); + d->m_tabRange->setRangeLogarythmic(false); } void KReportConfigurationFilterDlg::slotReset() { + Q_D(KReportConfigurationFilterDlg); // // Set up the widget from the initial filter // - m_currentState = m_initialState; + d->m_currentState = d->m_initialState; // // Report Properties // - m_tabGeneral->ui->m_editName->setText(m_initialState.name()); - m_tabGeneral->ui->m_editComment->setText(m_initialState.comment()); - m_tabGeneral->ui->m_checkCurrency->setChecked(m_initialState.isConvertCurrency()); - m_tabGeneral->ui->m_checkFavorite->setChecked(m_initialState.isFavorite()); + d->m_tabGeneral->ui->m_editName->setText(d->m_initialState.name()); + d->m_tabGeneral->ui->m_editComment->setText(d->m_initialState.comment()); + d->m_tabGeneral->ui->m_checkCurrency->setChecked(d->m_initialState.isConvertCurrency()); + d->m_tabGeneral->ui->m_checkFavorite->setChecked(d->m_initialState.isFavorite()); - if (m_initialState.isIncludingPrice() || m_initialState.isSkippingZero()) { - m_tabGeneral->ui->m_skipZero->setChecked(m_initialState.isSkippingZero()); + if (d->m_initialState.isIncludingPrice() || d->m_initialState.isSkippingZero()) { + d->m_tabGeneral->ui->m_skipZero->setChecked(d->m_initialState.isSkippingZero()); } else { - m_tabGeneral->ui->m_skipZero->setEnabled(false); + d->m_tabGeneral->ui->m_skipZero->setEnabled(false); } - if (m_tabRowColPivot) { - KComboBox *combo = m_tabRowColPivot->ui->m_comboDetail; - switch (m_initialState.detailLevel()) { + if (d->m_tabRowColPivot) { + KComboBox *combo = d->m_tabRowColPivot->ui->m_comboDetail; + switch (d->m_initialState.detailLevel()) { case MyMoneyReport::eDetailNone: case MyMoneyReport::eDetailEnd: case MyMoneyReport::eDetailAll: @@ -375,8 +418,8 @@ break; } - combo = m_tabRowColPivot->ui->m_comboRows; - switch (m_initialState.rowType()) { + combo = d->m_tabRowColPivot->ui->m_comboRows; + switch (d->m_initialState.rowType()) { case MyMoneyReport::eExpenseIncome: case MyMoneyReport::eBudget: case MyMoneyReport::eBudgetActual: @@ -386,40 +429,40 @@ combo->setCurrentItem(i18n("Assets & Liabilities"), false); // asset / liability break; } - m_tabRowColPivot->ui->m_checkTotalColumn->setChecked(m_initialState.isShowingRowTotals()); - m_tabRowColPivot->ui->m_checkTotalRow->setChecked(m_initialState.isShowingColumnTotals()); + d->m_tabRowColPivot->ui->m_checkTotalColumn->setChecked(d->m_initialState.isShowingRowTotals()); + d->m_tabRowColPivot->ui->m_checkTotalRow->setChecked(d->m_initialState.isShowingColumnTotals()); slotRowTypeChanged(combo->currentIndex()); //load budgets combo - if (m_initialState.rowType() == MyMoneyReport::eBudget - || m_initialState.rowType() == MyMoneyReport::eBudgetActual) { - m_tabRowColPivot->ui->m_comboRows->setEnabled(false); - m_tabRowColPivot->ui->m_budgetFrame->setEnabled(!m_budgets.empty()); - int i = 0; - for (QVector::const_iterator it_b = m_budgets.constBegin(); it_b != m_budgets.constEnd(); ++it_b) { - m_tabRowColPivot->ui->m_comboBudget->insertItem((*it_b).name(), i); + if (d->m_initialState.rowType() == MyMoneyReport::eBudget + || d->m_initialState.rowType() == MyMoneyReport::eBudgetActual) { + d->m_tabRowColPivot->ui->m_comboRows->setEnabled(false); + d->m_tabRowColPivot->ui->m_budgetFrame->setEnabled(!d->m_budgets.empty()); + auto i = 0; + for (QVector::const_iterator it_b = d->m_budgets.constBegin(); it_b != d->m_budgets.constEnd(); ++it_b) { + d->m_tabRowColPivot->ui->m_comboBudget->insertItem((*it_b).name(), i); //set the current selected item - if ((m_initialState.budget() == "Any" && (*it_b).budgetStart().year() == QDate::currentDate().year()) - || m_initialState.budget() == (*it_b).id()) - m_tabRowColPivot->ui->m_comboBudget->setCurrentItem(i); + if ((d->m_initialState.budget() == "Any" && (*it_b).budgetStart().year() == QDate::currentDate().year()) + || d->m_initialState.budget() == (*it_b).id()) + d->m_tabRowColPivot->ui->m_comboBudget->setCurrentItem(i); i++; } } //set moving average days spinbox - QSpinBox *spinbox = m_tabRowColPivot->ui->m_movingAverageDays; - spinbox->setEnabled(m_initialState.isIncludingMovingAverage()); - if (m_initialState.isIncludingMovingAverage()) { - spinbox->setValue(m_initialState.movingAverageDays()); + QSpinBox *spinbox = d->m_tabRowColPivot->ui->m_movingAverageDays; + spinbox->setEnabled(d->m_initialState.isIncludingMovingAverage()); + if (d->m_initialState.isIncludingMovingAverage()) { + spinbox->setValue(d->m_initialState.movingAverageDays()); } - m_tabRowColPivot->ui->m_checkScheduled->setChecked(m_initialState.isIncludingSchedules()); - m_tabRowColPivot->ui->m_checkTransfers->setChecked(m_initialState.isIncludingTransfers()); - m_tabRowColPivot->ui->m_checkUnused->setChecked(m_initialState.isIncludingUnusedAccounts()); - } else if (m_tabRowColQuery) { - KComboBox *combo = m_tabRowColQuery->ui->m_comboOrganizeBy; - switch (m_initialState.rowType()) { + d->m_tabRowColPivot->ui->m_checkScheduled->setChecked(d->m_initialState.isIncludingSchedules()); + d->m_tabRowColPivot->ui->m_checkTransfers->setChecked(d->m_initialState.isIncludingTransfers()); + d->m_tabRowColPivot->ui->m_checkUnused->setChecked(d->m_initialState.isIncludingUnusedAccounts()); + } else if (d->m_tabRowColQuery) { + KComboBox *combo = d->m_tabRowColQuery->ui->m_comboOrganizeBy; + switch (d->m_initialState.rowType()) { case MyMoneyReport::eNoColumns: case MyMoneyReport::eCategory: combo->setCurrentItem(i18n("Categories"), false); @@ -449,34 +492,34 @@ throw MYMONEYEXCEPTION("KReportConfigurationFilterDlg::slotReset(): QueryTable report has invalid rowtype"); } - unsigned qc = m_initialState.queryColumns(); - m_tabRowColQuery->ui->m_checkNumber->setChecked(qc & MyMoneyReport::eQCnumber); - m_tabRowColQuery->ui->m_checkPayee->setChecked(qc & MyMoneyReport::eQCpayee); - m_tabRowColQuery->ui->m_checkTag->setChecked(qc & MyMoneyReport::eQCtag); - m_tabRowColQuery->ui->m_checkCategory->setChecked(qc & MyMoneyReport::eQCcategory); - m_tabRowColQuery->ui->m_checkMemo->setChecked(qc & MyMoneyReport::eQCmemo); - m_tabRowColQuery->ui->m_checkAccount->setChecked(qc & MyMoneyReport::eQCaccount); - m_tabRowColQuery->ui->m_checkReconciled->setChecked(qc & MyMoneyReport::eQCreconciled); - m_tabRowColQuery->ui->m_checkAction->setChecked(qc & MyMoneyReport::eQCaction); - m_tabRowColQuery->ui->m_checkShares->setChecked(qc & MyMoneyReport::eQCshares); - m_tabRowColQuery->ui->m_checkPrice->setChecked(qc & MyMoneyReport::eQCprice); - m_tabRowColQuery->ui->m_checkBalance->setChecked(qc & MyMoneyReport::eQCbalance); - - m_tabRowColQuery->ui->m_checkTax->setChecked(m_initialState.isTax()); - m_tabRowColQuery->ui->m_checkInvestments->setChecked(m_initialState.isInvestmentsOnly()); - m_tabRowColQuery->ui->m_checkLoans->setChecked(m_initialState.isLoansOnly()); - - m_tabRowColQuery->ui->m_checkHideTransactions->setChecked(m_initialState.isHideTransactions()); - m_tabRowColQuery->ui->m_checkHideTotals->setChecked(!m_initialState.isShowingColumnTotals()); - m_tabRowColQuery->ui->m_checkHideSplitDetails->setEnabled(!m_initialState.isHideTransactions()); - - m_tabRowColQuery->ui->m_checkHideSplitDetails->setChecked - (m_initialState.detailLevel() == MyMoneyReport::eDetailNone || m_initialState.isHideTransactions()); + unsigned qc = d->m_initialState.queryColumns(); + d->m_tabRowColQuery->ui->m_checkNumber->setChecked(qc & MyMoneyReport::eQCnumber); + d->m_tabRowColQuery->ui->m_checkPayee->setChecked(qc & MyMoneyReport::eQCpayee); + d->m_tabRowColQuery->ui->m_checkTag->setChecked(qc & MyMoneyReport::eQCtag); + d->m_tabRowColQuery->ui->m_checkCategory->setChecked(qc & MyMoneyReport::eQCcategory); + d->m_tabRowColQuery->ui->m_checkMemo->setChecked(qc & MyMoneyReport::eQCmemo); + d->m_tabRowColQuery->ui->m_checkAccount->setChecked(qc & MyMoneyReport::eQCaccount); + d->m_tabRowColQuery->ui->m_checkReconciled->setChecked(qc & MyMoneyReport::eQCreconciled); + d->m_tabRowColQuery->ui->m_checkAction->setChecked(qc & MyMoneyReport::eQCaction); + d->m_tabRowColQuery->ui->m_checkShares->setChecked(qc & MyMoneyReport::eQCshares); + d->m_tabRowColQuery->ui->m_checkPrice->setChecked(qc & MyMoneyReport::eQCprice); + d->m_tabRowColQuery->ui->m_checkBalance->setChecked(qc & MyMoneyReport::eQCbalance); + + d->m_tabRowColQuery->ui->m_checkTax->setChecked(d->m_initialState.isTax()); + d->m_tabRowColQuery->ui->m_checkInvestments->setChecked(d->m_initialState.isInvestmentsOnly()); + d->m_tabRowColQuery->ui->m_checkLoans->setChecked(d->m_initialState.isLoansOnly()); + + d->m_tabRowColQuery->ui->m_checkHideTransactions->setChecked(d->m_initialState.isHideTransactions()); + d->m_tabRowColQuery->ui->m_checkHideTotals->setChecked(!d->m_initialState.isShowingColumnTotals()); + d->m_tabRowColQuery->ui->m_checkHideSplitDetails->setEnabled(!d->m_initialState.isHideTransactions()); + + d->m_tabRowColQuery->ui->m_checkHideSplitDetails->setChecked + (d->m_initialState.detailLevel() == MyMoneyReport::eDetailNone || d->m_initialState.isHideTransactions()); } - if (m_tabChart) { - KMyMoneyGeneralCombo* combo = m_tabChart->ui->m_comboType; - switch (m_initialState.chartType()) { + if (d->m_tabChart) { + KMyMoneyGeneralCombo* combo = d->m_tabChart->ui->m_comboType; + switch (d->m_initialState.chartType()) { case MyMoneyReport::eChartNone: combo->setCurrentItem(MyMoneyReport::eChartLine); break; @@ -485,30 +528,30 @@ case MyMoneyReport::eChartStackedBar: case MyMoneyReport::eChartPie: case MyMoneyReport::eChartRing: - combo->setCurrentItem(m_initialState.chartType()); + combo->setCurrentItem(d->m_initialState.chartType()); break; default: throw MYMONEYEXCEPTION("KReportConfigurationFilterDlg::slotReset(): Report has invalid charttype"); } - m_tabChart->ui->m_checkCHGridLines->setChecked(m_initialState.isChartCHGridLines()); - m_tabChart->ui->m_checkSVGridLines->setChecked(m_initialState.isChartSVGridLines()); - m_tabChart->ui->m_checkValues->setChecked(m_initialState.isChartDataLabels()); - m_tabChart->ui->m_checkShowChart->setChecked(m_initialState.isChartByDefault()); - m_tabChart->ui->m_lineWidth->setValue(m_initialState.chartLineWidth()); - m_tabChart->ui->m_logYaxis->setChecked(m_initialState.isLogYAxis()); + d->m_tabChart->ui->m_checkCHGridLines->setChecked(d->m_initialState.isChartCHGridLines()); + d->m_tabChart->ui->m_checkSVGridLines->setChecked(d->m_initialState.isChartSVGridLines()); + d->m_tabChart->ui->m_checkValues->setChecked(d->m_initialState.isChartDataLabels()); + d->m_tabChart->ui->m_checkShowChart->setChecked(d->m_initialState.isChartByDefault()); + d->m_tabChart->ui->m_lineWidth->setValue(d->m_initialState.chartLineWidth()); + d->m_tabChart->ui->m_logYaxis->setChecked(d->m_initialState.isLogYAxis()); } - if (m_tabRange) { - m_tabRange->ui->m_dataRangeStart->setText(m_initialState.dataRangeStart()); - m_tabRange->ui->m_dataRangeEnd->setText(m_initialState.dataRangeEnd()); - m_tabRange->ui->m_dataMajorTick->setText(m_initialState.dataMajorTick()); - m_tabRange->ui->m_dataMinorTick->setText(m_initialState.dataMinorTick()); - m_tabRange->ui->m_yLabelsPrecision->setValue(m_initialState.yLabelsPrecision()); - m_tabRange->ui->m_dataLock->setCurrentIndex((int)m_initialState.dataFilter()); - - KComboBox *combo = m_tabRange->ui->m_comboColumns; - if (m_initialState.isColumnsAreDays()) { - switch (m_initialState.columnType()) { + if (d->m_tabRange) { + d->m_tabRange->ui->m_dataRangeStart->setText(d->m_initialState.dataRangeStart()); + d->m_tabRange->ui->m_dataRangeEnd->setText(d->m_initialState.dataRangeEnd()); + d->m_tabRange->ui->m_dataMajorTick->setText(d->m_initialState.dataMajorTick()); + d->m_tabRange->ui->m_dataMinorTick->setText(d->m_initialState.dataMinorTick()); + d->m_tabRange->ui->m_yLabelsPrecision->setValue(d->m_initialState.yLabelsPrecision()); + d->m_tabRange->ui->m_dataLock->setCurrentIndex((int)d->m_initialState.dataFilter()); + + KComboBox *combo = d->m_tabRange->ui->m_comboColumns; + if (d->m_initialState.isColumnsAreDays()) { + switch (d->m_initialState.columnType()) { case MyMoneyReport::eNoColumns: case MyMoneyReport::eDays: combo->setCurrentItem(i18nc("@item the columns will display daily data", "Daily"), false); @@ -520,7 +563,7 @@ break; } } else { - switch (m_initialState.columnType()) { + switch (d->m_initialState.columnType()) { case MyMoneyReport::eNoColumns: case MyMoneyReport::eMonths: combo->setCurrentItem(i18nc("@item the columns will display monthly data", "Monthly"), false); @@ -540,29 +583,29 @@ } } - if (m_tabCapitalGain) { - m_tabCapitalGain->ui->m_termSeparator->setDate(m_initialState.termSeparator()); - m_tabCapitalGain->ui->m_showSTLTCapitalGains->setChecked(m_initialState.isShowingSTLTCapitalGains()); - m_tabCapitalGain->ui->m_settlementPeriod->setValue(m_initialState.settlementPeriod()); - m_tabCapitalGain->ui->m_checkHideTotals->setChecked(!m_initialState.isShowingColumnTotals()); - m_tabCapitalGain->ui->m_investmentSum->blockSignals(true); - m_tabCapitalGain->ui->m_investmentSum->clear(); - m_tabCapitalGain->ui->m_investmentSum->addItem(i18n("Only owned"), MyMoneyReport::eSumOwned); - m_tabCapitalGain->ui->m_investmentSum->addItem(i18n("Only sold"), MyMoneyReport::eSumSold); - m_tabCapitalGain->ui->m_investmentSum->blockSignals(false); - m_tabCapitalGain->ui->m_investmentSum->setCurrentIndex(m_tabCapitalGain->ui->m_investmentSum->findData(m_initialState.investmentSum())); + if (d->m_tabCapitalGain) { + d->m_tabCapitalGain->ui->m_termSeparator->setDate(d->m_initialState.termSeparator()); + d->m_tabCapitalGain->ui->m_showSTLTCapitalGains->setChecked(d->m_initialState.isShowingSTLTCapitalGains()); + d->m_tabCapitalGain->ui->m_settlementPeriod->setValue(d->m_initialState.settlementPeriod()); + d->m_tabCapitalGain->ui->m_checkHideTotals->setChecked(!d->m_initialState.isShowingColumnTotals()); + d->m_tabCapitalGain->ui->m_investmentSum->blockSignals(true); + d->m_tabCapitalGain->ui->m_investmentSum->clear(); + d->m_tabCapitalGain->ui->m_investmentSum->addItem(i18n("Only owned"), MyMoneyReport::eSumOwned); + d->m_tabCapitalGain->ui->m_investmentSum->addItem(i18n("Only sold"), MyMoneyReport::eSumSold); + d->m_tabCapitalGain->ui->m_investmentSum->blockSignals(false); + d->m_tabCapitalGain->ui->m_investmentSum->setCurrentIndex(d->m_tabCapitalGain->ui->m_investmentSum->findData(d->m_initialState.investmentSum())); } - if (m_tabPerformance) { - m_tabPerformance->ui->m_checkHideTotals->setChecked(!m_initialState.isShowingColumnTotals()); - m_tabPerformance->ui->m_investmentSum->blockSignals(true); - m_tabPerformance->ui->m_investmentSum->clear(); - m_tabPerformance->ui->m_investmentSum->addItem(i18n("From period"), MyMoneyReport::eSumPeriod); - m_tabPerformance->ui->m_investmentSum->addItem(i18n("Owned and sold"), MyMoneyReport::eSumOwnedAndSold); - m_tabPerformance->ui->m_investmentSum->addItem(i18n("Only owned"), MyMoneyReport::eSumOwned); - m_tabPerformance->ui->m_investmentSum->addItem(i18n("Only sold"), MyMoneyReport::eSumSold); - m_tabPerformance->ui->m_investmentSum->blockSignals(false); - m_tabPerformance->ui->m_investmentSum->setCurrentIndex(m_tabPerformance->ui->m_investmentSum->findData(m_initialState.investmentSum())); + if (d->m_tabPerformance) { + d->m_tabPerformance->ui->m_checkHideTotals->setChecked(!d->m_initialState.isShowingColumnTotals()); + d->m_tabPerformance->ui->m_investmentSum->blockSignals(true); + d->m_tabPerformance->ui->m_investmentSum->clear(); + d->m_tabPerformance->ui->m_investmentSum->addItem(i18n("From period"), MyMoneyReport::eSumPeriod); + d->m_tabPerformance->ui->m_investmentSum->addItem(i18n("Owned and sold"), MyMoneyReport::eSumOwnedAndSold); + d->m_tabPerformance->ui->m_investmentSum->addItem(i18n("Only owned"), MyMoneyReport::eSumOwned); + d->m_tabPerformance->ui->m_investmentSum->addItem(i18n("Only sold"), MyMoneyReport::eSumSold); + d->m_tabPerformance->ui->m_investmentSum->blockSignals(false); + d->m_tabPerformance->ui->m_investmentSum->setCurrentIndex(d->m_tabPerformance->ui->m_investmentSum->findData(d->m_initialState.investmentSum())); } // @@ -570,11 +613,11 @@ // QRegExp textfilter; - if (m_initialState.textFilter(textfilter)) { - m_ui->m_textEdit->setText(textfilter.pattern()); - m_ui->m_caseSensitive->setChecked(Qt::CaseSensitive == textfilter.caseSensitivity()); - m_ui->m_regExp->setChecked(QRegExp::RegExp == textfilter.patternSyntax()); - m_ui->m_textNegate->setCurrentIndex(m_initialState.isInvertingText()); + if (d->m_initialState.textFilter(textfilter)) { + d->ui->m_textEdit->setText(textfilter.pattern()); + d->ui->m_caseSensitive->setChecked(Qt::CaseSensitive == textfilter.caseSensitivity()); + d->ui->m_regExp->setChecked(QRegExp::RegExp == textfilter.patternSyntax()); + d->ui->m_textNegate->setCurrentIndex(d->m_initialState.isInvertingText()); } // @@ -582,47 +625,47 @@ // int type; - if (m_initialState.firstType(type)) - m_ui->m_typeBox->setCurrentIndex(type); + if (d->m_initialState.firstType(type)) + d->ui->m_typeBox->setCurrentIndex(type); int state; - if (m_initialState.firstState(state)) - m_ui->m_stateBox->setCurrentIndex(state); + if (d->m_initialState.firstState(state)) + d->ui->m_stateBox->setCurrentIndex(state); // // Number Filter // QString nrFrom, nrTo; - if (m_initialState.numberFilter(nrFrom, nrTo)) { + if (d->m_initialState.numberFilter(nrFrom, nrTo)) { if (nrFrom == nrTo) { - m_ui->m_nrEdit->setEnabled(true); - m_ui->m_nrFromEdit->setEnabled(false); - m_ui->m_nrToEdit->setEnabled(false); - m_ui->m_nrEdit->setText(nrFrom); - m_ui->m_nrFromEdit->setText(QString()); - m_ui->m_nrToEdit->setText(QString()); - m_ui->m_nrButton->setChecked(true); - m_ui->m_nrRangeButton->setChecked(false); + d->ui->m_nrEdit->setEnabled(true); + d->ui->m_nrFromEdit->setEnabled(false); + d->ui->m_nrToEdit->setEnabled(false); + d->ui->m_nrEdit->setText(nrFrom); + d->ui->m_nrFromEdit->setText(QString()); + d->ui->m_nrToEdit->setText(QString()); + d->ui->m_nrButton->setChecked(true); + d->ui->m_nrRangeButton->setChecked(false); } else { - m_ui->m_nrEdit->setEnabled(false); - m_ui->m_nrFromEdit->setEnabled(true); - m_ui->m_nrToEdit->setEnabled(false); - m_ui->m_nrEdit->setText(QString()); - m_ui->m_nrFromEdit->setText(nrFrom); - m_ui->m_nrToEdit->setText(nrTo); - m_ui->m_nrButton->setChecked(false); - m_ui->m_nrRangeButton->setChecked(true); + d->ui->m_nrEdit->setEnabled(false); + d->ui->m_nrFromEdit->setEnabled(true); + d->ui->m_nrToEdit->setEnabled(false); + d->ui->m_nrEdit->setText(QString()); + d->ui->m_nrFromEdit->setText(nrFrom); + d->ui->m_nrToEdit->setText(nrTo); + d->ui->m_nrButton->setChecked(false); + d->ui->m_nrRangeButton->setChecked(true); } } else { - m_ui->m_nrEdit->setEnabled(true); - m_ui->m_nrFromEdit->setEnabled(false); - m_ui->m_nrToEdit->setEnabled(false); - m_ui->m_nrEdit->setText(QString()); - m_ui->m_nrFromEdit->setText(QString()); - m_ui->m_nrToEdit->setText(QString()); - m_ui->m_nrButton->setChecked(true); - m_ui->m_nrRangeButton->setChecked(false); + d->ui->m_nrEdit->setEnabled(true); + d->ui->m_nrFromEdit->setEnabled(false); + d->ui->m_nrToEdit->setEnabled(false); + d->ui->m_nrEdit->setText(QString()); + d->ui->m_nrFromEdit->setText(QString()); + d->ui->m_nrToEdit->setText(QString()); + d->ui->m_nrButton->setChecked(true); + d->ui->m_nrRangeButton->setChecked(false); } // @@ -630,35 +673,35 @@ // MyMoneyMoney from, to; - if (m_initialState.amountFilter(from, to)) { // bool getAmountFilter(MyMoneyMoney&,MyMoneyMoney&); + if (d->m_initialState.amountFilter(from, to)) { // bool getAmountFilter(MyMoneyMoney&,MyMoneyMoney&); if (from == to) { - m_ui->m_amountEdit->setEnabled(true); - m_ui->m_amountFromEdit->setEnabled(false); - m_ui->m_amountToEdit->setEnabled(false); - m_ui->m_amountEdit->loadText(QString::number(from.toDouble())); - m_ui->m_amountFromEdit->loadText(QString()); - m_ui->m_amountToEdit->loadText(QString()); - m_ui->m_amountButton->setChecked(true); - m_ui->m_amountRangeButton->setChecked(false); + d->ui->m_amountEdit->setEnabled(true); + d->ui->m_amountFromEdit->setEnabled(false); + d->ui->m_amountToEdit->setEnabled(false); + d->ui->m_amountEdit->loadText(QString::number(from.toDouble())); + d->ui->m_amountFromEdit->loadText(QString()); + d->ui->m_amountToEdit->loadText(QString()); + d->ui->m_amountButton->setChecked(true); + d->ui->m_amountRangeButton->setChecked(false); } else { - m_ui->m_amountEdit->setEnabled(false); - m_ui->m_amountFromEdit->setEnabled(true); - m_ui->m_amountToEdit->setEnabled(true); - m_ui->m_amountEdit->loadText(QString()); - m_ui->m_amountFromEdit->loadText(QString::number(from.toDouble())); - m_ui->m_amountToEdit->loadText(QString::number(to.toDouble())); - m_ui->m_amountButton->setChecked(false); - m_ui->m_amountRangeButton->setChecked(true); + d->ui->m_amountEdit->setEnabled(false); + d->ui->m_amountFromEdit->setEnabled(true); + d->ui->m_amountToEdit->setEnabled(true); + d->ui->m_amountEdit->loadText(QString()); + d->ui->m_amountFromEdit->loadText(QString::number(from.toDouble())); + d->ui->m_amountToEdit->loadText(QString::number(to.toDouble())); + d->ui->m_amountButton->setChecked(false); + d->ui->m_amountRangeButton->setChecked(true); } } else { - m_ui->m_amountEdit->setEnabled(true); - m_ui->m_amountFromEdit->setEnabled(false); - m_ui->m_amountToEdit->setEnabled(false); - m_ui->m_amountEdit->loadText(QString()); - m_ui->m_amountFromEdit->loadText(QString()); - m_ui->m_amountToEdit->loadText(QString()); - m_ui->m_amountButton->setChecked(true); - m_ui->m_amountRangeButton->setChecked(false); + d->ui->m_amountEdit->setEnabled(true); + d->ui->m_amountFromEdit->setEnabled(false); + d->ui->m_amountToEdit->setEnabled(false); + d->ui->m_amountEdit->loadText(QString()); + d->ui->m_amountFromEdit->loadText(QString()); + d->ui->m_amountToEdit->loadText(QString()); + d->ui->m_amountButton->setChecked(true); + d->ui->m_amountRangeButton->setChecked(false); } // @@ -666,15 +709,15 @@ // QStringList payees; - if (m_initialState.payees(payees)) { + if (d->m_initialState.payees(payees)) { if (payees.empty()) { - m_ui->m_emptyPayeesButton->setChecked(true); + d->ui->m_emptyPayeesButton->setChecked(true); } else { - selectAllItems(m_ui->m_payeesView, false); - selectItems(m_ui->m_payeesView, payees, true); + d->selectAllItems(d->ui->m_payeesView, false); + d->selectItems(d->ui->m_payeesView, payees, true); } } else { - selectAllItems(m_ui->m_payeesView, true); + d->selectAllItems(d->ui->m_payeesView, true); } // @@ -682,15 +725,15 @@ // QStringList tags; - if (m_initialState.tags(tags)) { + if (d->m_initialState.tags(tags)) { if (tags.empty()) { - m_ui->m_emptyTagsButton->setChecked(true); + d->ui->m_emptyTagsButton->setChecked(true); } else { - selectAllItems(m_ui->m_tagsView, false); - selectItems(m_ui->m_tagsView, tags, true); + d->selectAllItems(d->ui->m_tagsView, false); + d->selectItems(d->ui->m_tagsView, tags, true); } } else { - selectAllItems(m_ui->m_tagsView, true); + d->selectAllItems(d->ui->m_tagsView, true); } // @@ -698,21 +741,21 @@ // QStringList accounts; - if (m_initialState.accounts(accounts)) { - m_ui->m_accountsView->selectAllItems(false); - m_ui->m_accountsView->selectItems(accounts, true); + if (d->m_initialState.accounts(accounts)) { + d->ui->m_accountsView->selectAllItems(false); + d->ui->m_accountsView->selectItems(accounts, true); } else - m_ui->m_accountsView->selectAllItems(true); + d->ui->m_accountsView->selectAllItems(true); // // Categories Filter // - if (m_initialState.categories(accounts)) { - m_ui->m_categoriesView->selectAllItems(false); - m_ui->m_categoriesView->selectItems(accounts, true); + if (d->m_initialState.categories(accounts)) { + d->ui->m_categoriesView->selectAllItems(false); + d->ui->m_categoriesView->selectItems(accounts, true); } else - m_ui->m_categoriesView->selectAllItems(true); + d->ui->m_categoriesView->selectAllItems(true); // // Date Filter @@ -721,16 +764,16 @@ // the following call implies a call to slotUpdateSelections, // that's why we call it last - m_initialState.updateDateFilter(); + d->m_initialState.updateDateFilter(); QDate dateFrom, dateTo; - if (m_initialState.dateFilter(dateFrom, dateTo)) { - if (m_initialState.isDateUserDefined()) { - m_dateRange->setDateRange(dateFrom, dateTo); + if (d->m_initialState.dateFilter(dateFrom, dateTo)) { + if (d->m_initialState.isDateUserDefined()) { + d->m_dateRange->setDateRange(dateFrom, dateTo); } else { - m_dateRange->setDateRange(m_initialState.dateRange()); + d->m_dateRange->setDateRange(d->m_initialState.dateRange()); } } else { - m_dateRange->setDateRange(eMyMoney::TransactionFilter::Date::All); + d->m_dateRange->setDateRange(eMyMoney::TransactionFilter::Date::All); } slotRightSize(); @@ -744,8 +787,9 @@ //TODO Fix the reports and engine to include transfers even if categories are filtered - bug #1523508 void KReportConfigurationFilterDlg::slotUpdateCheckTransfers() { - QCheckBox* cb = m_tabRowColPivot->ui->m_checkTransfers; - if (!m_ui->m_categoriesView->allItemsSelected()) { + Q_D(KReportConfigurationFilterDlg); + auto cb = d->m_tabRowColPivot->ui->m_checkTransfers; + if (!d->ui->m_categoriesView->allItemsSelected()) { cb->setChecked(false); cb->setDisabled(true); } else { diff --git a/kmymoney/dialogs/kselectdatabasedlg.h b/kmymoney/dialogs/kselectdatabasedlg.h --- a/kmymoney/dialogs/kselectdatabasedlg.h +++ b/kmymoney/dialogs/kselectdatabasedlg.h @@ -2,6 +2,7 @@ kselectdatabase.h ------------------- copyright : (C) 2005 by Tony Bloomfield + (C) 2017 by Łukasz Wojniłowicz ***************************************************************************/ @@ -37,7 +38,7 @@ { Q_OBJECT public: - explicit KSelectDatabaseDlg(int openMode, QUrl openURL = QUrl(), QWidget *parent = 0); + explicit KSelectDatabaseDlg(int openMode, QUrl openURL = QUrl(), QWidget *parent = nullptr); ~KSelectDatabaseDlg(); /** @@ -56,7 +57,7 @@ * Execute the database selection dialog * @return - as QDialog::exec() */ - int exec(); + int exec() override; public slots: void slotDriverSelected(int idx); diff --git a/kmymoney/dialogs/kselectdatabasedlg.cpp b/kmymoney/dialogs/kselectdatabasedlg.cpp --- a/kmymoney/dialogs/kselectdatabasedlg.cpp +++ b/kmymoney/dialogs/kselectdatabasedlg.cpp @@ -3,6 +3,7 @@ ------------------- copyright : (C) 2005 by Tony Bloomfield (C) 2017 by Thomas Baumgart + (C) 2017 by Łukasz Wojniłowicz ***************************************************************************/ @@ -119,7 +120,7 @@ m_widget->textUserName->setText(QString()); m_widget->textUserName->setText(platformTools::osUsername()); m_widget->textPassword->setText(QString()); - connect(m_widget->databaseTypeCombo, SIGNAL(currentIndexChanged(int)), this, SLOT(slotDriverSelected(int))); + connect(m_widget->databaseTypeCombo, static_cast(&QComboBox::currentIndexChanged), this, &KSelectDatabaseDlg::slotDriverSelected); m_widget->checkPreLoad->setChecked(false); // ensure a driver gets selected; pre-select the first one if (m_widget->databaseTypeCombo->count() != 0) { diff --git a/kmymoney/dialogs/kselecttransactionsdlg.h b/kmymoney/dialogs/kselecttransactionsdlg.h --- a/kmymoney/dialogs/kselecttransactionsdlg.h +++ b/kmymoney/dialogs/kselecttransactionsdlg.h @@ -4,6 +4,7 @@ begin : Wed May 16 2007 copyright : (C) 2007 by Thomas Baumgart email : ipwizard@users.sourceforge.net + (C) 2017 by Łukasz Wojniłowicz ***************************************************************************/ /*************************************************************************** @@ -21,41 +22,39 @@ // ---------------------------------------------------------------------------- // QT Includes +#include + // ---------------------------------------------------------------------------- // KDE Includes // ---------------------------------------------------------------------------- // Project Includes -#include "mymoneyaccount.h" -#include "selectedtransaction.h" - -#include "ui_kselecttransactionsdlgdecl.h" - class MyMoneyTransaction; +class MyMoneyAccount; -class KSelectTransactionsDlgDecl : public QDialog, public Ui::KSelectTransactionsDlgDecl -{ -public: - KSelectTransactionsDlgDecl(QWidget *parent) : QDialog(parent) { - setupUi(this); - } -}; -class KSelectTransactionsDlg: public KSelectTransactionsDlgDecl +namespace KMyMoneyRegister { class SelectedTransactions; class Register;} + +class KSelectTransactionsDlgPrivate; +class KSelectTransactionsDlg: public QDialog { Q_OBJECT + Q_DISABLE_COPY(KSelectTransactionsDlg) + public: - explicit KSelectTransactionsDlg(const MyMoneyAccount& account, QWidget* parent = 0); + explicit KSelectTransactionsDlg(const MyMoneyAccount& account, QWidget* parent = nullptr); + ~KSelectTransactionsDlg(); /** * Adds the transaction @a t to the dialog */ void addTransaction(const MyMoneyTransaction& t); - int exec(); + int exec() override; MyMoneyTransaction transaction() const; + KMyMoneyRegister::Register *getRegister(); - bool eventFilter(QObject* o, QEvent* e); + bool eventFilter(QObject* o, QEvent* e) override; public slots: virtual void slotHelp(); @@ -64,14 +63,12 @@ void slotEnableOk(const KMyMoneyRegister::SelectedTransactions& list); protected: - void resizeEvent(QResizeEvent* ev); - void showEvent(QShowEvent* event); + void resizeEvent(QResizeEvent* ev) override; + void showEvent(QShowEvent* event) override; + KSelectTransactionsDlgPrivate * const d_ptr; private: - /** - * The account in which the transactions are displayed - */ - MyMoneyAccount m_account; + Q_DECLARE_PRIVATE(KSelectTransactionsDlg) }; #endif // KMERGETRANSACTIONSDLG_H diff --git a/kmymoney/dialogs/kselecttransactionsdlg.cpp b/kmymoney/dialogs/kselecttransactionsdlg.cpp --- a/kmymoney/dialogs/kselecttransactionsdlg.cpp +++ b/kmymoney/dialogs/kselecttransactionsdlg.cpp @@ -4,6 +4,7 @@ begin : Wed May 16 2007 copyright : (C) 2007 by Thomas Baumgart email : ipwizard@users.sourceforge.net + (C) 2017 by Łukasz Wojniłowicz ***************************************************************************/ /*************************************************************************** @@ -16,6 +17,7 @@ ***************************************************************************/ #include "kselecttransactionsdlg.h" +#include "kselecttransactionsdlg_p.h" // ---------------------------------------------------------------------------- // QT Includes @@ -34,68 +36,78 @@ // ---------------------------------------------------------------------------- // Project Includes +#include "ui_kselecttransactionsdlg.h" + +#include "mymoneyaccount.h" +#include "selectedtransaction.h" #include "mymoneytransaction.h" #include "kmymoneyglobalsettings.h" -#include -#include KSelectTransactionsDlg::KSelectTransactionsDlg(const MyMoneyAccount& _account, QWidget* parent) : - KSelectTransactionsDlgDecl(parent), - m_account(_account) + QDialog(parent), + d_ptr(new KSelectTransactionsDlgPrivate) { + Q_D(KSelectTransactionsDlg); + d->m_account = _account; + d->ui->setupUi(this); // setup descriptive texts setWindowTitle(i18n("Select Transaction")); - m_description->setText(i18n("Select a transaction and press the OK button or use Cancel to select none.")); + d->ui->m_description->setText(i18n("Select a transaction and press the OK button or use Cancel to select none.")); // clear current register contents - m_register->clear(); + d->ui->m_register->clear(); // no selection possible - m_register->setSelectionMode(QTableWidget::SingleSelection); + d->ui->m_register->setSelectionMode(QTableWidget::SingleSelection); // setup header font - QFont font = KMyMoneyGlobalSettings::listHeaderFont(); + auto font = KMyMoneyGlobalSettings::listHeaderFont(); QFontMetrics fm(font); - int height = fm.lineSpacing() + 6; - m_register->horizontalHeader()->setMinimumHeight(height); - m_register->horizontalHeader()->setMaximumHeight(height); - m_register->horizontalHeader()->setFont(font); + auto height = fm.lineSpacing() + 6; + d->ui->m_register->horizontalHeader()->setMinimumHeight(height); + d->ui->m_register->horizontalHeader()->setMaximumHeight(height); + d->ui->m_register->horizontalHeader()->setFont(font); // setup cell font font = KMyMoneyGlobalSettings::listCellFont(); - m_register->setFont(font); + d->ui->m_register->setFont(font); // ... setup the register columns ... - m_register->setupRegister(m_account); + d->ui->m_register->setupRegister(d->m_account); // setup buttons - KGuiItem::assign(m_helpButton, KStandardGuiItem::help()); - KGuiItem::assign(buttonOk, KStandardGuiItem::ok()); - KGuiItem::assign(buttonCancel, KStandardGuiItem::cancel()); // default is to need at least one transaction selected - buttonOk->setDisabled(true); + d->ui->buttonBox->button(QDialogButtonBox::Ok)->setDisabled(true); // catch some events from the register - m_register->installEventFilter(this); + d->ui->m_register->installEventFilter(this); - connect(m_register, SIGNAL(transactionsSelected(KMyMoneyRegister::SelectedTransactions)), this, SLOT(slotEnableOk(KMyMoneyRegister::SelectedTransactions))); - connect(m_register, SIGNAL(editTransaction()), this, SLOT(accept())); + connect(d->ui->m_register, &KMyMoneyRegister::Register::transactionsSelected, this, &KSelectTransactionsDlg::slotEnableOk); + connect(d->ui->m_register, &KMyMoneyRegister::Register::editTransaction, this, &QDialog::accept); + + connect(d->ui->buttonBox, &QDialogButtonBox::helpRequested, this, &KSelectTransactionsDlg::slotHelp); +} - connect(m_helpButton, SIGNAL(clicked()), this, SLOT(slotHelp())); +KSelectTransactionsDlg::~KSelectTransactionsDlg() +{ + Q_D(KSelectTransactionsDlg); + delete d; } void KSelectTransactionsDlg::slotEnableOk(const KMyMoneyRegister::SelectedTransactions& list) { - buttonOk->setEnabled(list.count() != 0); + Q_D(KSelectTransactionsDlg); + d->ui->buttonBox->button(QDialogButtonBox::Ok)->setEnabled(list.count() != 0); } void KSelectTransactionsDlg::addTransaction(const MyMoneyTransaction& t) { + Q_D(KSelectTransactionsDlg); QList::const_iterator it_s; for (it_s = t.splits().begin(); it_s != t.splits().end(); ++it_s) { - if ((*it_s).accountId() == m_account.id()) { - KMyMoneyRegister::Transaction* tr = KMyMoneyRegister::Register::transactionFactory(m_register, t, (*it_s), 0); + if ((*it_s).accountId() == d->m_account.id()) { + KMyMoneyRegister::Transaction* tr = KMyMoneyRegister::Register::transactionFactory(d->ui->m_register, t, (*it_s), 0); // force full detail display tr->setNumRowsRegister(tr->numRowsRegister(true)); break; @@ -105,12 +117,13 @@ int KSelectTransactionsDlg::exec() { - m_register->updateRegister(true); - m_register->update(); + Q_D(KSelectTransactionsDlg); + d->ui->m_register->updateRegister(true); + d->ui->m_register->update(); - m_register->setFocus(); + d->ui->m_register->setFocus(); - return KSelectTransactionsDlgDecl::exec(); + return QDialog::exec(); } void KSelectTransactionsDlg::slotHelp() @@ -120,25 +133,28 @@ void KSelectTransactionsDlg::showEvent(QShowEvent* event) { - KSelectTransactionsDlgDecl::showEvent(event); - m_register->resize(KMyMoneyRegister::DetailColumn, true); + Q_D(KSelectTransactionsDlg); + QDialog::showEvent(event); + d->ui->m_register->resize(KMyMoneyRegister::DetailColumn, true); } void KSelectTransactionsDlg::resizeEvent(QResizeEvent* ev) { + Q_D(KSelectTransactionsDlg); // don't forget the resizer - KSelectTransactionsDlgDecl::resizeEvent(ev); + QDialog::resizeEvent(ev); // resize the register - m_register->resize(KMyMoneyRegister::DetailColumn, true); + d->ui->m_register->resize(KMyMoneyRegister::DetailColumn, true); } MyMoneyTransaction KSelectTransactionsDlg::transaction() const { + Q_D(const KSelectTransactionsDlg); MyMoneyTransaction t; QList list; - list = m_register->selectedItems(); + list = d->ui->m_register->selectedItems(); if (list.count()) { KMyMoneyRegister::Transaction* _t = dynamic_cast(list[0]); if (_t) @@ -147,12 +163,19 @@ return t; } +KMyMoneyRegister::Register* KSelectTransactionsDlg::getRegister() +{ + Q_D(KSelectTransactionsDlg); + return d->ui->m_register; +} + bool KSelectTransactionsDlg::eventFilter(QObject* o, QEvent* e) { - bool rc = false; + Q_D(KSelectTransactionsDlg); + auto rc = false; QKeyEvent* k; - if (o == m_register) { + if (o == d->ui->m_register) { switch (e->type()) { case QEvent::KeyPress: k = dynamic_cast(e); @@ -161,7 +184,7 @@ switch (k->key()) { case Qt::Key_Return: case Qt::Key_Enter: - if (buttonOk->isEnabled()) { + if (d->ui->buttonBox->button(QDialogButtonBox::Ok)->isEnabled()) { accept(); rc = true; } diff --git a/kmymoney/dialogs/kselecttransactionsdlg.ui b/kmymoney/dialogs/kselecttransactionsdlg.ui new file mode 100644 --- /dev/null +++ b/kmymoney/dialogs/kselecttransactionsdlg.ui @@ -0,0 +1,101 @@ + + + KSelectTransactionsDlg + + + + 0 + 0 + 794 + 456 + + + + xxx + + + true + + + + + + Qt::NoFocus + + + xxx + + + true + + + + + + + + 0 + 3 + + + + 0 + + + 12 + + + + + + + QDialogButtonBox::Cancel|QDialogButtonBox::Help|QDialogButtonBox::Ok + + + + + + + + + KMyMoneyRegister::Register + QWidget +
register.h
+
+
+ + + + buttonBox + accepted() + KSelectTransactionsDlg + accept() + + + 396 + 432 + + + 396 + 227 + + + + + buttonBox + rejected() + KSelectTransactionsDlg + reject() + + + 396 + 432 + + + 396 + 227 + + + + +
diff --git a/kmymoney/dialogs/kselecttransactionsdlg_p.h b/kmymoney/dialogs/kselecttransactionsdlg_p.h new file mode 100644 --- /dev/null +++ b/kmymoney/dialogs/kselecttransactionsdlg_p.h @@ -0,0 +1,57 @@ +/*************************************************************************** + kselecttransactionsdlg_p.h + ------------------- + begin : Wed May 16 2007 + copyright : (C) 2007 by Thomas Baumgart + email : ipwizard@users.sourceforge.net + (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 KSELECTTRANSACTIONSDLG_P_H +#define KSELECTTRANSACTIONSDLG_P_H + +// ---------------------------------------------------------------------------- +// QT Includes + +// ---------------------------------------------------------------------------- +// KDE Includes + +// ---------------------------------------------------------------------------- +// Project Includes + +#include "ui_kselecttransactionsdlg.h" + +#include "mymoneyaccount.h" + +class KSelectTransactionsDlgPrivate +{ + Q_DISABLE_COPY(KSelectTransactionsDlgPrivate) + +public: + KSelectTransactionsDlgPrivate() : + ui(new Ui::KSelectTransactionsDlg) + { + } + + ~KSelectTransactionsDlgPrivate() + { + delete ui; + } + + Ui::KSelectTransactionsDlg *ui; + /** + * The account in which the transactions are displayed + */ + MyMoneyAccount m_account; +}; + +#endif // KMERGETRANSACTIONSDLG_H diff --git a/kmymoney/dialogs/kselecttransactionsdlgdecl.ui b/kmymoney/dialogs/kselecttransactionsdlgdecl.ui deleted file mode 100644 --- a/kmymoney/dialogs/kselecttransactionsdlgdecl.ui +++ /dev/null @@ -1,163 +0,0 @@ - - - - - - KSelectTransactionsDlgDecl - - - - 0 - 0 - 794 - 456 - - - - xxx - - - true - - - - - - Qt::NoFocus - - - xxx - - - true - - - - - - - - 7 - 7 - 0 - 3 - - - - 0 - - - 12 - - - - Security - - - - - Details - - - - - C - - - - - Payment - - - - - Deposit - - - - - Quantity - - - - - Price - - - - - Value - - - - - Balance - - - - - - - - - - Help - - - - - - - - 430 - 20 - - - - QSizePolicy::Expanding - - - Qt::Horizontal - - - - - - - OK - - - true - - - true - - - - - - - Cancel - - - - - - - - - - - buttonOk - clicked() - KSelectTransactionsDlgDecl - accept() - - - buttonCancel - clicked() - KSelectTransactionsDlgDecl - reject() - - - diff --git a/kmymoney/dialogs/ksplitcorrectiondlg.ui b/kmymoney/dialogs/ksplitcorrectiondlg.ui --- a/kmymoney/dialogs/ksplitcorrectiondlg.ui +++ b/kmymoney/dialogs/ksplitcorrectiondlg.ui @@ -1,163 +1,219 @@ - - - - - KSplitCorrectionDlgDecl - - - - 0 - 0 - 462 - 292 - - - - - 80 - 0 - - - - Correct splits - - - - - 0 - 0 - - + + KSplitCorrectionDlg + + + Qt::ApplicationModal + + + + 0 + 0 + 462 + 292 + + + + + 80 + 0 + + + + Correct splits + + + - - 11 - - - 6 - - - + + 6 + + + 11 + + + 11 + + + 11 + + + 11 + + + + + + + Qt::NoFocus + + + xxx + + + true + + + + + + + true + + + How do you want to proceed? + + + false + + + + + + + QFrame::NoFrame + + + + 6 + + + 11 + + + 11 + + + 11 + + + 11 + - - - Qt::NoFocus - - - xxx - - - true - - + + + Co&ntinue to edit splits + + + true + + + buttonGroup + + - - - true - - - How do you want to proceed? - - - false - - + + + Chan&ge total amount of transaction to %1. + + + buttonGroup + + - - - QFrame::NoFrame - - - - 11 - - - 6 - - - - - Continue to edit splits - - - true - - - buttonGroup - - - - - - - Change total amount of transaction to %1. - - - buttonGroup - - - - - - - false - - - Distribute difference of %1 among all splits. - - - buttonGroup - - - - - - - Leave %1 unassigned. - - - buttonGroup - - - - - + + + false + + + Distrib&ute difference of %1 among all splits. + + + buttonGroup + + - - - - - - - 20 - 41 - - - - QSizePolicy::Expanding - - - Qt::Vertical - - - - - - - QFrame::HLine - - - QFrame::Sunken - + + + + Leave %&1 unassigned. + + + buttonGroup + + + + - + + + + + + + Qt::Vertical + + + QSizePolicy::Expanding + + + + 20 + 41 + + + + + + + + QDialogButtonBox::Cancel|QDialogButtonBox::Ok + + + + + + + QFrame::HLine + + + QFrame::Sunken + + + - - - - - - + + +
+ + + + + buttonBox + accepted() + KSplitCorrectionDlg + accept() + + + 230 + 248 + + + 230 + 145 + + + + + buttonBox + rejected() + KSplitCorrectionDlg + reject() + + + 230 + 248 + + + 230 + 145 + + + + + + +
diff --git a/kmymoney/dialogs/ksplittransactiondlg.h b/kmymoney/dialogs/ksplittransactiondlg.h --- a/kmymoney/dialogs/ksplittransactiondlg.h +++ b/kmymoney/dialogs/ksplittransactiondlg.h @@ -9,6 +9,7 @@ John C Thomas Baumgart Kevin Tambascio + (C) 2017 by Łukasz Wojniłowicz ***************************************************************************/ /*************************************************************************** @@ -26,60 +27,54 @@ // ---------------------------------------------------------------------------- // QT Includes +#include + // ---------------------------------------------------------------------------- // KDE Includes // ---------------------------------------------------------------------------- // Project Includes -#include "mymoneymoney.h" -#include "mymoneyaccount.h" -#include "mymoneytransaction.h" - - -#include "ui_ksplittransactiondlgdecl.h" -#include "ui_ksplitcorrectiondlg.h" +class MyMoneyMoney; +class MyMoneySplit; +class MyMoneyTransaction; +class MyMoneyAccount; -class QDialogButtonBox; +namespace Ui { class KSplitCorrectionDlg; } -class KSplitCorrectionDlgDecl : public QDialog, public Ui::KSplitCorrectionDlgDecl +class KSplitCorrectionDlg : public QDialog { + Q_OBJECT + Q_DISABLE_COPY(KSplitCorrectionDlg) + public: - KSplitCorrectionDlgDecl(QWidget *parent) : QDialog(parent) { - setupUi(this); - } + explicit KSplitCorrectionDlg(QWidget *parent = nullptr); + ~KSplitCorrectionDlg(); + + Ui::KSplitCorrectionDlg *ui; }; /** * @author Thomas Baumgart */ -class KSplitTransactionDlgDecl : public QDialog, public Ui::KSplitTransactionDlgDecl -{ -public: - KSplitTransactionDlgDecl(QWidget *parent) : QDialog(parent), m_buttonBox(0) { - setupUi(this); - } - -protected: - QDialogButtonBox *m_buttonBox; -}; - -class KSplitTransactionDlg : public KSplitTransactionDlgDecl +class KSplitTransactionDlgPrivate; +class KSplitTransactionDlg : public QDialog { Q_OBJECT + Q_DISABLE_COPY(KSplitTransactionDlg) public: - KSplitTransactionDlg(const MyMoneyTransaction& t, - const MyMoneySplit& s, - const MyMoneyAccount& acc, - const bool amountValid, - const bool deposit, - const MyMoneyMoney& calculatedValue, - const QMap& priceInfo, - QWidget* parent = 0); + explicit KSplitTransactionDlg(const MyMoneyTransaction& t, + const MyMoneySplit& s, + const MyMoneyAccount& acc, + const bool amountValid, + const bool deposit, + const MyMoneyMoney& calculatedValue, + const QMap& priceInfo, + QWidget* parent = nullptr); - virtual ~KSplitTransactionDlg(); + ~KSplitTransactionDlg(); /** * Using this method, an external object can retrieve the result @@ -89,9 +84,7 @@ * the construction of this object and modified using the * dialog. */ - const MyMoneyTransaction& transaction() const { - return m_transaction; - }; + MyMoneyTransaction transaction() const; /** * This method calculates the difference between the split that references @@ -110,18 +103,12 @@ */ MyMoneyMoney splitsValue(); -private: - /** - * This method updates the display of the sums below the register - */ - void updateSums(); - public slots: - int exec(); + int exec() override; protected slots: - void accept(); - void reject(); + void accept() override; + void reject() override; void slotClearAllSplits(); void slotClearUnusedSplits(); void slotSetTransaction(const MyMoneyTransaction& t); @@ -153,43 +140,8 @@ void objectCreation(bool state); private: - /** - * This member keeps a copy of the current selected transaction - */ - MyMoneyTransaction m_transaction; - - /** - * This member keeps a copy of the currently selected account - */ - MyMoneyAccount m_account; - - /** - * This member keeps a copy of the currently selected split - */ - MyMoneySplit m_split; - - /** - * This member keeps the precision for the values - */ - int m_precision; - - /** - * flag that shows that the amount specified in the constructor - * should be used as fix value (true) or if it can be changed (false) - */ - bool m_amountValid; - - /** - * This member keeps track if the current transaction is of type - * deposit (true) or withdrawal (false). - */ - bool m_isDeposit; - - /** - * This member keeps the amount that will be assigned to all the - * splits that are marked 'will be calculated'. - */ - MyMoneyMoney m_calculatedValue; + KSplitTransactionDlgPrivate * const d_ptr; + Q_DECLARE_PRIVATE(KSplitTransactionDlg) }; #endif diff --git a/kmymoney/dialogs/ksplittransactiondlg.cpp b/kmymoney/dialogs/ksplittransactiondlg.cpp --- a/kmymoney/dialogs/ksplittransactiondlg.cpp +++ b/kmymoney/dialogs/ksplittransactiondlg.cpp @@ -9,6 +9,7 @@ John C Thomas Baumgart Kevin Tambascio + (C) 2017 by Łukasz Wojniłowicz ***************************************************************************/ /*************************************************************************** @@ -29,19 +30,16 @@ #include #include #include -#include #include #include #include -#include -#include +#include // ---------------------------------------------------------------------------- // KDE Includes #include #include -#include #include #include #include @@ -49,15 +47,195 @@ // ---------------------------------------------------------------------------- // Project Includes -#include "kmymoneyedit.h" -#include "kmymoneylineedit.h" +#include "ui_ksplittransactiondlg.h" +#include "ui_ksplitcorrectiondlg.h" + #include "mymoneyfile.h" -#include "mymoneysecurity.h" #include "kmymoneysplittable.h" +#include "mymoneymoney.h" +#include "mymoneyaccount.h" +#include "mymoneysecurity.h" +#include "mymoneysplit.h" +#include "mymoneytransaction.h" #include "icons/icons.h" using namespace Icons; +KSplitCorrectionDlg::KSplitCorrectionDlg(QWidget *parent) : + QDialog(parent), + ui(new Ui::KSplitCorrectionDlg) +{ + ui->setupUi(this); +} + +KSplitCorrectionDlg::~KSplitCorrectionDlg() +{ + delete ui; +} + +class KSplitTransactionDlgPrivate +{ + Q_DISABLE_COPY(KSplitTransactionDlgPrivate) + Q_DECLARE_PUBLIC(KSplitTransactionDlg) + +public: + KSplitTransactionDlgPrivate(KSplitTransactionDlg *qq) : + q_ptr(qq), + ui(new Ui::KSplitTransactionDlg) + { + } + + ~KSplitTransactionDlgPrivate() + { + delete ui; + } + + void init(const MyMoneyTransaction& t, const QMap& priceInfo) + { + Q_Q(KSplitTransactionDlg); + ui->setupUi(q); + q->setModal(true); + + auto okButton = ui->buttonBox->button(QDialogButtonBox::Ok); + okButton->setDefault(true); + okButton->setShortcut(Qt::CTRL | Qt::Key_Return); + auto user1Button = new QPushButton; + ui->buttonBox->addButton(user1Button, QDialogButtonBox::ActionRole); + auto user2Button = new QPushButton; + ui->buttonBox->addButton(user2Button, QDialogButtonBox::ActionRole); + auto user3Button = new QPushButton; + ui->buttonBox->addButton(user3Button, QDialogButtonBox::ActionRole); + + //set custom buttons + //clearAll button + user1Button->setText(i18n("Clear &All")); + user1Button->setToolTip(i18n("Clear all splits")); + user1Button->setWhatsThis(i18n("Use this to clear all splits of this transaction")); + user1Button->setIcon(QIcon::fromTheme(g_Icons[Icon::EditClear])); + + //clearZero button + user2Button->setText(i18n("Clear &Zero")); + user2Button->setToolTip(i18n("Removes all splits that have a value of zero")); + user2Button->setIcon(QIcon::fromTheme(g_Icons[Icon::EditClear])); + + //merge button + user3Button->setText(i18n("&Merge")); + user3Button->setToolTip(i18n("Merges splits with the same category to one split")); + user3Button->setWhatsThis(i18n("In case you have multiple split entries to the same category and you like to keep them as a single split")); + + // make finish the default + ui->buttonBox->button(QDialogButtonBox::Cancel)->setDefault(true); + + // setup the focus + ui->buttonBox->button(QDialogButtonBox::Cancel)->setFocusPolicy(Qt::NoFocus); + okButton->setFocusPolicy(Qt::NoFocus); + user1Button->setFocusPolicy(Qt::NoFocus); + + // q->connect signals with slots + q->connect(ui->transactionsTable, &KMyMoneySplitTable::transactionChanged, + q, &KSplitTransactionDlg::slotSetTransaction); + q->connect(ui->transactionsTable, &KMyMoneySplitTable::createCategory, q, &KSplitTransactionDlg::slotCreateCategory); + q->connect(ui->transactionsTable, &KMyMoneySplitTable::objectCreation, q, &KSplitTransactionDlg::objectCreation); + + q->connect(ui->transactionsTable, &KMyMoneySplitTable::returnPressed, q, &KSplitTransactionDlg::accept); + q->connect(ui->transactionsTable, &KMyMoneySplitTable::escapePressed, q, &KSplitTransactionDlg::reject); + q->connect(ui->transactionsTable, &KMyMoneySplitTable::editStarted, q, &KSplitTransactionDlg::slotEditStarted); + q->connect(ui->transactionsTable, &KMyMoneySplitTable::editFinished, q, &KSplitTransactionDlg::slotUpdateButtons); + + q->connect(ui->buttonBox->button(QDialogButtonBox::Cancel), &QAbstractButton::clicked, q, &KSplitTransactionDlg::reject); + q->connect(ui->buttonBox->button(QDialogButtonBox::Ok), &QAbstractButton::clicked, q, &KSplitTransactionDlg::accept); + q->connect(user1Button, &QAbstractButton::clicked, q, &KSplitTransactionDlg::slotClearAllSplits); + q->connect(user3Button, &QAbstractButton::clicked, q, &KSplitTransactionDlg::slotMergeSplits); + q->connect(user2Button, &QAbstractButton::clicked, q, &KSplitTransactionDlg::slotClearUnusedSplits); + + // setup the precision + try { + auto currency = MyMoneyFile::instance()->currency(t.commodity()); + m_precision = MyMoneyMoney::denomToPrec(m_account.fraction(currency)); + } catch (const MyMoneyException &) { + } + + q->slotSetTransaction(t); + + // pass on those vars + ui->transactionsTable->setup(priceInfo, m_precision); + + QSize size(q->width(), q->height()); + KConfigGroup grp = KSharedConfig::openConfig()->group("SplitTransactionEditor"); + size = grp.readEntry("Geometry", size); + size.setHeight(size.height() - 1); + q->resize(size.expandedTo(q->minimumSizeHint())); + + // Trick: it seems, that the initial sizing of the dialog does + // not work correctly. At least, the columns do not get displayed + // correct. Reason: the return value of ui->transactionsTable->visibleWidth() + // is incorrect. If the widget is visible, resizing works correctly. + // So, we let the dialog show up and resize it then. It's not really + // clean, but the only way I got the damned thing working. + QTimer::singleShot(10, q, SLOT(initSize())); + + } + + /** + * This method updates the display of the sums below the register + */ + void updateSums() + { + Q_Q(KSplitTransactionDlg); + MyMoneyMoney splits(q->splitsValue()); + + if (m_amountValid == false) { + m_split.setValue(-splits); + m_transaction.modifySplit(m_split); + } + + ui->splitSum->setText("" + splits.formatMoney(QString(), m_precision) + ' '); + ui->splitUnassigned->setText("" + q->diffAmount().formatMoney(QString(), m_precision) + ' '); + ui->transactionAmount->setText("" + (-m_split.value()).formatMoney(QString(), m_precision) + ' '); + } + + KSplitTransactionDlg *q_ptr; + Ui::KSplitTransactionDlg *ui; + QDialogButtonBox *m_buttonBox; + /** + * This member keeps a copy of the current selected transaction + */ + MyMoneyTransaction m_transaction; + + /** + * This member keeps a copy of the currently selected account + */ + MyMoneyAccount m_account; + + /** + * This member keeps a copy of the currently selected split + */ + MyMoneySplit m_split; + + /** + * This member keeps the precision for the values + */ + int m_precision; + + /** + * flag that shows that the amount specified in the constructor + * should be used as fix value (true) or if it can be changed (false) + */ + bool m_amountValid; + + /** + * This member keeps track if the current transaction is of type + * deposit (true) or withdrawal (false). + */ + bool m_isDeposit; + + /** + * This member keeps the amount that will be assigned to all the + * splits that are marked 'will be calculated'. + */ + MyMoneyMoney m_calculatedValue; +}; + KSplitTransactionDlg::KSplitTransactionDlg(const MyMoneyTransaction& t, const MyMoneySplit& s, const MyMoneyAccount& acc, @@ -66,181 +244,93 @@ const MyMoneyMoney& calculatedValue, const QMap& priceInfo, QWidget* parent) : - KSplitTransactionDlgDecl(parent), - m_account(acc), - m_split(s), - m_precision(2), - m_amountValid(amountValid), - m_isDeposit(deposit), - m_calculatedValue(calculatedValue) + QDialog(parent), + d_ptr(new KSplitTransactionDlgPrivate(this)) { - setModal(true); - - QHBoxLayout *mainLayout = new QHBoxLayout; - setLayout(mainLayout); - mainLayout->addWidget(horizontalLayoutWidget); - - m_buttonBox = new QDialogButtonBox(QDialogButtonBox::Ok|QDialogButtonBox::Cancel); - QPushButton *okButton = m_buttonBox->button(QDialogButtonBox::Ok); - okButton->setDefault(true); - okButton->setShortcut(Qt::CTRL | Qt::Key_Return); - QPushButton *user1Button = new QPushButton; - m_buttonBox->addButton(user1Button, QDialogButtonBox::ActionRole); - QPushButton *user2Button = new QPushButton; - m_buttonBox->addButton(user2Button, QDialogButtonBox::ActionRole); - QPushButton *user3Button = new QPushButton; - m_buttonBox->addButton(user3Button, QDialogButtonBox::ActionRole); - connect(m_buttonBox, SIGNAL(accepted()), this, SLOT(accept())); - connect(m_buttonBox, SIGNAL(rejected()), this, SLOT(reject())); - m_buttonBox->setOrientation(Qt::Vertical); - mainLayout->addWidget(m_buttonBox); - - //set custom buttons - //clearAll button - user1Button->setText(i18n("Clear &All")); - user1Button->setToolTip(i18n("Clear all splits")); - user1Button->setWhatsThis(i18n("Use this to clear all splits of this transaction")); - user1Button->setIcon(QIcon::fromTheme(g_Icons[Icon::EditClear])); - - //clearZero button - user2Button->setText(i18n("Clear &Zero")); - user2Button->setToolTip(i18n("Removes all splits that have a value of zero")); - user2Button->setIcon(QIcon::fromTheme(g_Icons[Icon::EditClear])); - - //merge button - user3Button->setText(i18n("&Merge")); - user3Button->setToolTip(i18n("Merges splits with the same category to one split")); - user3Button->setWhatsThis(i18n("In case you have multiple split entries to the same category and you like to keep them as a single split")); - - // make finish the default - m_buttonBox->button(QDialogButtonBox::Cancel)->setDefault(true); - - // setup the focus - m_buttonBox->button(QDialogButtonBox::Cancel)->setFocusPolicy(Qt::NoFocus); - okButton->setFocusPolicy(Qt::NoFocus); - user1Button->setFocusPolicy(Qt::NoFocus); - - // connect signals with slots - connect(transactionsTable, SIGNAL(transactionChanged(MyMoneyTransaction)), - this, SLOT(slotSetTransaction(MyMoneyTransaction))); - connect(transactionsTable, SIGNAL(createCategory(QString,QString&)), this, SLOT(slotCreateCategory(QString,QString&))); - connect(transactionsTable, SIGNAL(objectCreation(bool)), this, SIGNAL(objectCreation(bool))); - - connect(transactionsTable, SIGNAL(returnPressed()), this, SLOT(accept())); - connect(transactionsTable, SIGNAL(escapePressed()), this, SLOT(reject())); - connect(transactionsTable, SIGNAL(editStarted()), this, SLOT(slotEditStarted())); - connect(transactionsTable, SIGNAL(editFinished()), this, SLOT(slotUpdateButtons())); - - connect(m_buttonBox->button(QDialogButtonBox::Cancel), SIGNAL(clicked()), this, SLOT(reject())); - connect(m_buttonBox->button(QDialogButtonBox::Ok), SIGNAL(clicked()), this, SLOT(accept())); - connect(user1Button, SIGNAL(clicked()), this, SLOT(slotClearAllSplits())); - connect(user3Button, SIGNAL(clicked()), this, SLOT(slotMergeSplits())); - connect(user2Button, SIGNAL(clicked()), this, SLOT(slotClearUnusedSplits())); - - // setup the precision - try { - MyMoneySecurity currency = MyMoneyFile::instance()->currency(t.commodity()); - m_precision = MyMoneyMoney::denomToPrec(m_account.fraction(currency)); - } catch (const MyMoneyException &) { - } - - slotSetTransaction(t); - - // pass on those vars - transactionsTable->setup(priceInfo, m_precision); - - QSize size(width(), height()); - KConfigGroup grp = KSharedConfig::openConfig()->group("SplitTransactionEditor"); - size = grp.readEntry("Geometry", size); - size.setHeight(size.height() - 1); - QDialog::resize(size.expandedTo(minimumSizeHint())); - - // Trick: it seems, that the initial sizing of the dialog does - // not work correctly. At least, the columns do not get displayed - // correct. Reason: the return value of transactionsTable->visibleWidth() - // is incorrect. If the widget is visible, resizing works correctly. - // So, we let the dialog show up and resize it then. It's not really - // clean, but the only way I got the damned thing working. - QTimer::singleShot(10, this, SLOT(initSize())); + Q_D(KSplitTransactionDlg); + d->ui->buttonBox = nullptr; + d->m_account = acc; + d->m_split = s; + d->m_precision = 2; + d->m_amountValid = amountValid; + d->m_isDeposit = deposit; + d->m_calculatedValue = calculatedValue; + d->init(t, priceInfo); } KSplitTransactionDlg::~KSplitTransactionDlg() { - KConfigGroup grp = KSharedConfig::openConfig()->group("SplitTransactionEditor"); + Q_D(KSplitTransactionDlg); + auto grp = KSharedConfig::openConfig()->group("SplitTransactionEditor"); grp.writeEntry("Geometry", size()); + delete d; } int KSplitTransactionDlg::exec() { + Q_D(KSplitTransactionDlg); // for deposits, we invert the sign of all splits. // don't forget to revert when we're done ;-) - if (m_isDeposit) { - for (int i = 0; i < m_transaction.splits().count(); ++i) { - MyMoneySplit split = m_transaction.splits()[i]; + if (d->m_isDeposit) { + for (auto i = 0; i < d->m_transaction.splits().count(); ++i) { + MyMoneySplit split = d->m_transaction.splits()[i]; split.setValue(-split.value()); split.setShares(-split.shares()); - m_transaction.modifySplit(split); + d->m_transaction.modifySplit(split); } } int rc; do { - transactionsTable->setFocus(); + d->ui->transactionsTable->setFocus(); // initialize the display - transactionsTable->setTransaction(m_transaction, m_split, m_account); - updateSums(); + d->ui->transactionsTable->setTransaction(d->m_transaction, d->m_split, d->m_account); + d->updateSums(); - rc = KSplitTransactionDlgDecl::exec(); + rc = QDialog::exec(); if (rc == Accepted) { if (!diffAmount().isZero()) { - KSplitCorrectionDlgDecl* corrDlg = new KSplitCorrectionDlgDecl(this); - QVBoxLayout *mainLayout = new QVBoxLayout; - corrDlg->setLayout(mainLayout); - mainLayout->addWidget(corrDlg->findChild("verticalLayout")); - QDialogButtonBox *buttonBox = new QDialogButtonBox(QDialogButtonBox::Ok|QDialogButtonBox::Cancel); - connect(buttonBox, SIGNAL(accepted()), corrDlg, SLOT(accept())); - connect(buttonBox, SIGNAL(rejected()), corrDlg, SLOT(reject())); - mainLayout->addWidget(buttonBox); - corrDlg->buttonGroup->setId(corrDlg->continueBtn, 0); - corrDlg->buttonGroup->setId(corrDlg->changeBtn, 1); - corrDlg->buttonGroup->setId(corrDlg->distributeBtn, 2); - corrDlg->buttonGroup->setId(corrDlg->leaveBtn, 3); - - corrDlg->setModal(true); - - MyMoneySplit split = m_transaction.splits()[0]; - QString total = (-split.value()).formatMoney("", m_precision); - QString sums = splitsValue().formatMoney("", m_precision); - QString diff = diffAmount().formatMoney("", m_precision); + QPointer corrDlg = new KSplitCorrectionDlg(this); + connect(corrDlg->ui->buttonBox, &QDialogButtonBox::accepted, corrDlg.data(), &QDialog::accept); + connect(corrDlg->ui->buttonBox, &QDialogButtonBox::rejected, corrDlg.data(), &QDialog::reject); + corrDlg->ui->buttonGroup->setId(corrDlg->ui->continueBtn, 0); + corrDlg->ui->buttonGroup->setId(corrDlg->ui->changeBtn, 1); + corrDlg->ui->buttonGroup->setId(corrDlg->ui->distributeBtn, 2); + corrDlg->ui->buttonGroup->setId(corrDlg->ui->leaveBtn, 3); + + MyMoneySplit split = d->m_transaction.splits()[0]; + QString total = (-split.value()).formatMoney(QString(), d->m_precision); + QString sums = splitsValue().formatMoney(QString(), d->m_precision); + QString diff = diffAmount().formatMoney(QString(), d->m_precision); // now modify the text items of the dialog to contain the correct values QString q = i18n("The total amount of this transaction is %1 while " "the sum of the splits is %2. The remaining %3 are " "unassigned.", total, sums, diff); - corrDlg->explanation->setText(q); + corrDlg->ui->explanation->setText(q); q = i18n("Change &total amount of transaction to %1.", sums); - corrDlg->changeBtn->setText(q); + corrDlg->ui->changeBtn->setText(q); q = i18n("&Distribute difference of %1 among all splits.", diff); - corrDlg->distributeBtn->setText(q); + corrDlg->ui->distributeBtn->setText(q); // FIXME remove the following line once distribution among // all splits is implemented - corrDlg->distributeBtn->hide(); + corrDlg->ui->distributeBtn->hide(); // if we have only two splits left, we don't allow leaving sth. unassigned. - if (m_transaction.splitCount() < 3) { + if (d->m_transaction.splitCount() < 3) { q = i18n("&Leave total amount of transaction at %1.", total); } else { q = i18n("&Leave %1 unassigned.", diff); } - corrDlg->leaveBtn->setText(q); + corrDlg->ui->leaveBtn->setText(q); if ((rc = corrDlg->exec()) == Accepted) { - switch (corrDlg->buttonGroup->checkedId()) { + switch (corrDlg->ui->buttonGroup->checkedId()) { case 0: // continue to edit rc = Rejected; break; @@ -248,7 +338,7 @@ case 1: // modify total split.setValue(-splitsValue()); split.setShares(-splitsValue()); - m_transaction.modifySplit(split); + d->m_transaction.modifySplit(split); break; case 2: // distribute difference @@ -268,12 +358,12 @@ // for deposits, we inverted the sign of all splits. // now we revert it back, so that things are left correct - if (m_isDeposit) { - for (int i = 0; i < m_transaction.splits().count(); ++i) { - MyMoneySplit split = m_transaction.splits()[i]; + if (d->m_isDeposit) { + for (auto i = 0; i < d->m_transaction.splits().count(); ++i) { + auto split = d->m_transaction.splits()[i]; split.setValue(-split.value()); split.setShares(-split.shares()); - m_transaction.modifySplit(split); + d->m_transaction.modifySplit(split); } } @@ -287,64 +377,67 @@ void KSplitTransactionDlg::accept() { - transactionsTable->slotCancelEdit(); - KSplitTransactionDlgDecl::accept(); + Q_D(KSplitTransactionDlg); + d->ui->transactionsTable->slotCancelEdit(); + QDialog::accept(); } void KSplitTransactionDlg::reject() { + Q_D(KSplitTransactionDlg); // cancel any edit activity in the split register - transactionsTable->slotCancelEdit(); - KSplitTransactionDlgDecl::reject(); + d->ui->transactionsTable->slotCancelEdit(); + QDialog::reject(); } void KSplitTransactionDlg::slotClearAllSplits() { + Q_D(KSplitTransactionDlg); int answer; answer = KMessageBox::warningContinueCancel(this, i18n("You are about to delete all splits of this transaction. " "Do you really want to continue?"), - i18n("KMyMoney"), - KGuiItem(i18n("Continue")) - ); + i18n("KMyMoney")); if (answer == KMessageBox::Continue) { - transactionsTable->slotCancelEdit(); - QList list = transactionsTable->getSplits(m_transaction); + d->ui->transactionsTable->slotCancelEdit(); + QList list = d->ui->transactionsTable->getSplits(d->m_transaction); QList::ConstIterator it; // clear all but the one referencing the account for (it = list.constBegin(); it != list.constEnd(); ++it) { - m_transaction.removeSplit(*it); + d->m_transaction.removeSplit(*it); } - transactionsTable->setTransaction(m_transaction, m_split, m_account); - slotSetTransaction(m_transaction); + d->ui->transactionsTable->setTransaction(d->m_transaction, d->m_split, d->m_account); + slotSetTransaction(d->m_transaction); } } void KSplitTransactionDlg::slotClearUnusedSplits() { - QList list = transactionsTable->getSplits(m_transaction); + Q_D(KSplitTransactionDlg); + QList list = d->ui->transactionsTable->getSplits(d->m_transaction); QList::ConstIterator it; try { // remove all splits that don't have a value assigned for (it = list.constBegin(); it != list.constEnd(); ++it) { if ((*it).shares().isZero()) { - m_transaction.removeSplit(*it); + d->m_transaction.removeSplit(*it); } } - transactionsTable->setTransaction(m_transaction, m_split, m_account); - slotSetTransaction(m_transaction); + d->ui->transactionsTable->setTransaction(d->m_transaction, d->m_split, d->m_account); + slotSetTransaction(d->m_transaction); } catch (const MyMoneyException &) { } } void KSplitTransactionDlg::slotMergeSplits() { - QList list = transactionsTable->getSplits(m_transaction); + Q_D(KSplitTransactionDlg); + QList list = d->ui->transactionsTable->getSplits(d->m_transaction); QList::ConstIterator it; try { @@ -363,38 +456,40 @@ } else { splits << *it; } - m_transaction.removeSplit(*it); + d->m_transaction.removeSplit(*it); } // now add them back to the transaction QList::iterator it_s; for (it_s = splits.begin(); it_s != splits.end(); ++it_s) { (*it_s).clearId(); - m_transaction.addSplit(*it_s); + d->m_transaction.addSplit(*it_s); } - transactionsTable->setTransaction(m_transaction, m_split, m_account); - slotSetTransaction(m_transaction); + d->ui->transactionsTable->setTransaction(d->m_transaction, d->m_split, d->m_account); + slotSetTransaction(d->m_transaction); } catch (const MyMoneyException &) { } } void KSplitTransactionDlg::slotSetTransaction(const MyMoneyTransaction& t) { - m_transaction = t; + Q_D(KSplitTransactionDlg); + d->m_transaction = t; slotUpdateButtons(); - updateSums(); + d->updateSums(); } void KSplitTransactionDlg::slotUpdateButtons() { - QList list = transactionsTable->getSplits(m_transaction); + Q_D(KSplitTransactionDlg); + QList list = d->ui->transactionsTable->getSplits(d->m_transaction); // check if we can merge splits or not, have zero splits or not QMap splits; bool haveZeroSplit = false; for (QList::const_iterator it = list.constBegin(); it != list.constEnd(); ++it) { splits[(*it).accountId()]++; - if (((*it).id() != m_split.id()) && ((*it).shares().isZero())) + if (((*it).id() != d->m_split.id()) && ((*it).shares().isZero())) haveZeroSplit = true; } QMap::const_iterator it_s; @@ -402,34 +497,22 @@ if ((*it_s) > 1) break; } - m_buttonBox->buttons().at(4)->setEnabled(it_s != splits.constEnd()); - m_buttonBox->buttons().at(3)->setEnabled(haveZeroSplit); + d->ui->buttonBox->buttons().at(4)->setEnabled(it_s != splits.constEnd()); + d->ui->buttonBox->buttons().at(3)->setEnabled(haveZeroSplit); } void KSplitTransactionDlg::slotEditStarted() { - m_buttonBox->buttons().at(4)->setEnabled(false); - m_buttonBox->buttons().at(3)->setEnabled(false); -} - -void KSplitTransactionDlg::updateSums() -{ - MyMoneyMoney splits(splitsValue()); - - if (m_amountValid == false) { - m_split.setValue(-splits); - m_transaction.modifySplit(m_split); - } - - splitSum->setText("" + splits.formatMoney("", m_precision) + ' '); - splitUnassigned->setText("" + diffAmount().formatMoney("", m_precision) + ' '); - transactionAmount->setText("" + (-m_split.value()).formatMoney("", m_precision) + ' '); + Q_D(KSplitTransactionDlg); + d->ui->buttonBox->buttons().at(4)->setEnabled(false); + d->ui->buttonBox->buttons().at(3)->setEnabled(false); } MyMoneyMoney KSplitTransactionDlg::splitsValue() { - MyMoneyMoney splitsValue(m_calculatedValue); - QList list = transactionsTable->getSplits(m_transaction); + Q_D(KSplitTransactionDlg); + MyMoneyMoney splitsValue(d->m_calculatedValue); + QList list = d->ui->transactionsTable->getSplits(d->m_transaction); QList::ConstIterator it; // calculate the current sum of all split parts @@ -441,14 +524,21 @@ return splitsValue; } +MyMoneyTransaction KSplitTransactionDlg::transaction() const +{ + Q_D(const KSplitTransactionDlg); + return d->m_transaction; +} + MyMoneyMoney KSplitTransactionDlg::diffAmount() { + Q_D(KSplitTransactionDlg); MyMoneyMoney diff; // if there is an amount specified in the transaction, we need to calculate the // difference, otherwise we display the difference as 0 and display the same sum. - if (m_amountValid) { - MyMoneySplit split = m_transaction.splits()[0]; + if (d->m_amountValid) { + MyMoneySplit split = d->m_transaction.splits()[0]; diff = -(splitsValue() + split.value()); } @@ -457,10 +547,11 @@ void KSplitTransactionDlg::slotCreateCategory(const QString& name, QString& id) { + Q_D(KSplitTransactionDlg); MyMoneyAccount acc, parent; acc.setName(name); - if (m_isDeposit) + if (d->m_isDeposit) parent = MyMoneyFile::instance()->income(); else parent = MyMoneyFile::instance()->expense(); diff --git a/kmymoney/dialogs/ksplittransactiondlg.ui b/kmymoney/dialogs/ksplittransactiondlg.ui new file mode 100644 --- /dev/null +++ b/kmymoney/dialogs/ksplittransactiondlg.ui @@ -0,0 +1,364 @@ + + + KSplitTransactionDlg + + + + 0 + 0 + 656 + 408 + + + + Split transaction + + + true + + + + + + 6 + + + 0 + + + 0 + + + 0 + + + 0 + + + + + 6 + + + 0 + + + 0 + + + 0 + + + 0 + + + + + ArrowCursor + + + + + + + + 0 + 0 + + + + QFrame::StyledPanel + + + QFrame::Raised + + + + 6 + + + 1 + + + 1 + + + 1 + + + 1 + + + + + Qt::Horizontal + + + QSizePolicy::Expanding + + + + 0 + 16 + + + + + + + + 0 + + + 0 + + + 0 + + + 0 + + + 1 + + + + + + 0 + 0 + + + + + 120 + 15 + + + + <b>11,00<b> + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + false + + + + + + + + 0 + 0 + + + + + 120 + 15 + + + + <b>111,00<b> + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + false + + + + + + + + 75 + true + + + + Unassigned + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + false + + + + + + + + 75 + true + + + + Sum of splits + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + false + + + + + + + + 0 + 0 + + + + + 120 + 15 + + + + 100,00 + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + false + + + + + + + + 150 + 0 + + + + + 75 + true + + + + Transaction amount + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + false + + + + + + + QFrame::HLine + + + QFrame::Sunken + + + + + + + + + + 0 + 0 + + + + + 15 + 0 + + + + + 32767 + 80 + + + + QFrame::NoFrame + + + QFrame::Raised + + + + + + + + + + + + + + Qt::Vertical + + + QDialogButtonBox::Cancel|QDialogButtonBox::Ok + + + + + + + + + kMyMoneySplitTable + QWidget +
../dialogs/kmymoneysplittable.h
+
+
+ + + + buttonBox + accepted() + KSplitTransactionDlg + accept() + + + 607 + 203 + + + 327 + 203 + + + + + buttonBox + rejected() + KSplitTransactionDlg + reject() + + + 607 + 203 + + + 327 + 203 + + + + +
diff --git a/kmymoney/dialogs/ksplittransactiondlgdecl.ui b/kmymoney/dialogs/ksplittransactiondlgdecl.ui deleted file mode 100644 --- a/kmymoney/dialogs/ksplittransactiondlgdecl.ui +++ /dev/null @@ -1,315 +0,0 @@ - - - - - - KSplitTransactionDlgDecl - - - - 0 - 0 - 656 - 408 - - - - Split transaction - - - true - - - - - 0 - 0 - - - - - 0 - - - 6 - - - - - 0 - - - 6 - - - - - 0 - - - - - - - - 0 - 0 - - - - QFrame::StyledPanel - - - QFrame::Raised - - - - 1 - - - 6 - - - - - - 0 - 16 - - - - QSizePolicy::Expanding - - - Qt::Horizontal - - - - - - - 0 - - - 1 - - - - - - 0 - 0 - 0 - 0 - - - - - 120 - 15 - - - - <b>11,00<b> - - - Qt::AlignVCenter|Qt::AlignRight - - - false - - - - - - - - 0 - 0 - 0 - 0 - - - - - 120 - 15 - - - - <b>111,00<b> - - - Qt::AlignVCenter|Qt::AlignRight - - - false - - - - - - - - true - - - - Unassigned - - - Qt::AlignVCenter|Qt::AlignRight - - - false - - - - - - - - true - - - - Sum of splits - - - Qt::AlignVCenter|Qt::AlignRight - - - false - - - - - - - - 0 - 0 - 0 - 0 - - - - - 120 - 15 - - - - 100,00 - - - Qt::AlignVCenter|Qt::AlignRight - - - false - - - - - - - - 150 - 0 - - - - - true - - - - Transaction amount - - - Qt::AlignVCenter|Qt::AlignRight - - - false - - - - - - - QFrame::HLine - - - QFrame::Sunken - - - - - - - - - - 5 - 3 - 0 - 0 - - - - - 15 - 0 - - - - - 32767 - 80 - - - - QFrame::NoFrame - - - QFrame::Raised - - - - - - - - - - - - - - - QDialog - QDialog -
kdialog.h
-
- - kMyMoneySplitTable - QWidget -
../dialogs/kmymoneysplittable.h
- - 330 - 390 - - 0 - - 5 - 5 - - image0 -
-
- - - 89504e470d0a1a0a0000000d4948445200000016000000160806000000c4b46c3b000000c749444154388dad55db1184200c4c180bb81a28c73aad811228c356f42b3792db3cc0db2fc724bb7901dc7b270f27ed17fa5fa9b117b7cd90211f4ba0ac906a7f1453b4d30ca917bb590681552af23f69bfc4ffa71519d2c8f62546ea5ea03738b1c18c33a4d156f0d13f43b61952e4af6d6e8fb3a408f080448419a433d6486d85052fdba892a295f5d45785cd8c51a9d6de6a814a8d2131da51f98e7a3b64ec9da04a8db53d43be3c3c0b22cacf17e4cdb5a931649ceddf34b190cf0aa019f03f1fd3e7457f03b5a66c9ed26e86130000000049454e44ae426082 - - -
diff --git a/kmymoney/dialogs/ktagreassigndlg.h b/kmymoney/dialogs/ktagreassigndlg.h --- a/kmymoney/dialogs/ktagreassigndlg.h +++ b/kmymoney/dialogs/ktagreassigndlg.h @@ -2,6 +2,7 @@ ktagreassigndlg.cpp ------------------- copyright : (C) 2012 by Alessandro Russo + (C) 2017 by Łukasz Wojniłowicz ***************************************************************************/ @@ -20,7 +21,7 @@ // ---------------------------------------------------------------------------- // QT Includes -#include +#include // ---------------------------------------------------------------------------- // KDE Includes @@ -28,7 +29,7 @@ // ---------------------------------------------------------------------------- // Project Includes -#include "ui_ktagreassigndlgdecl.h" +namespace Ui { class KTagReassignDlg; } /** * Implementation of the dialog that lets the user select a tag in order @@ -36,22 +37,14 @@ */ class MyMoneyTag; -class KTagReassignDlgDecl : public QDialog, public Ui::KTagReassignDlgDecl -{ -public: - KTagReassignDlgDecl(QWidget *parent) : QDialog(parent) { - setupUi(this); - } -}; -class KTagReassignDlg : public KTagReassignDlgDecl +class KTagReassignDlg : public QDialog { Q_OBJECT -public: - /** Default constructor */ - KTagReassignDlg(QWidget* parent = 0); + Q_DISABLE_COPY(KTagReassignDlg) - /** Destructor */ +public: + explicit KTagReassignDlg(QWidget* parent = nullptr); ~KTagReassignDlg(); /** @@ -66,8 +59,10 @@ QString show(const QList& tagslist); protected: - void accept(); + void accept() override; +private: + Ui::KTagReassignDlg *ui; }; #endif // KTAGREASSIGNDLG_H diff --git a/kmymoney/dialogs/ktagreassigndlg.cpp b/kmymoney/dialogs/ktagreassigndlg.cpp --- a/kmymoney/dialogs/ktagreassigndlg.cpp +++ b/kmymoney/dialogs/ktagreassigndlg.cpp @@ -2,6 +2,7 @@ ktagreassigndlg.cpp ------------------- copyright : (C) 2011 by Alessandro Russo + (C) 2017 by Łukasz Wojniłowicz ***************************************************************************/ @@ -32,18 +33,22 @@ // ---------------------------------------------------------------------------- // Project Includes +#include "ui_ktagreassigndlg.h" #include KTagReassignDlg::KTagReassignDlg(QWidget* parent) : - KTagReassignDlgDecl(parent) + QDialog(parent), + ui(new Ui::KTagReassignDlg) { - kMandatoryFieldGroup* mandatory = new kMandatoryFieldGroup(this); - mandatory->add(tagCombo); - mandatory->setOkButton(buttonBox->button(QDialogButtonBox::Ok)); + ui->setupUi(this); + auto mandatory = new kMandatoryFieldGroup(this); + mandatory->add(ui->tagCombo); + mandatory->setOkButton(ui->buttonBox->button(QDialogButtonBox::Ok)); } KTagReassignDlg::~KTagReassignDlg() { + delete ui; } QString KTagReassignDlg::show(const QList& tagslist) @@ -51,25 +56,24 @@ if (tagslist.isEmpty()) return QString(); // no tag available? nothing can be selected... - tagCombo->loadTags(tagslist); + ui->tagCombo->loadTags(tagslist); // execute dialog and if aborted, return empty string if (this->exec() == QDialog::Rejected) return QString(); // otherwise return index of selected tag - return tagCombo->selectedItem(); + return ui->tagCombo->selectedItem(); } - void KTagReassignDlg::accept() { - // force update of tagCombo - buttonBox->button(QDialogButtonBox::Ok)->setFocus(); + // force update of ui->tagCombo + ui->buttonBox->button(QDialogButtonBox::Ok)->setFocus(); - if (tagCombo->selectedItem().isEmpty()) { + if (ui->tagCombo->selectedItem().isEmpty()) { KMessageBox::information(this, i18n("This dialog does not allow new tags to be created. Please pick a tag from the list."), i18n("Tag creation")); } else { - KTagReassignDlgDecl::accept(); + QDialog::accept(); } } diff --git a/kmymoney/dialogs/ktagreassigndlgdecl.ui b/kmymoney/dialogs/ktagreassigndlg.ui rename from kmymoney/dialogs/ktagreassigndlgdecl.ui rename to kmymoney/dialogs/ktagreassigndlg.ui --- a/kmymoney/dialogs/ktagreassigndlgdecl.ui +++ b/kmymoney/dialogs/ktagreassigndlg.ui @@ -1,7 +1,7 @@ - KTagReassignDlgDecl - + KTagReassignDlg + 0 @@ -117,7 +117,7 @@ buttonBox accepted() - KTagReassignDlgDecl + KTagReassignDlg accept() @@ -133,7 +133,7 @@ buttonBox rejected() - KTagReassignDlgDecl + KTagReassignDlg reject() diff --git a/kmymoney/dialogs/ktemplateexportdlg.h b/kmymoney/dialogs/ktemplateexportdlg.h --- a/kmymoney/dialogs/ktemplateexportdlg.h +++ b/kmymoney/dialogs/ktemplateexportdlg.h @@ -2,6 +2,7 @@ ktemplateexportlg.cpp --------------------- copyright : (C) 2016 by Ralf Habacker + (C) 2017 by Łukasz Wojniłowicz ***************************************************************************/ @@ -28,7 +29,7 @@ Q_OBJECT public: - explicit KTemplateExportDlg(QWidget *parent = 0); + explicit KTemplateExportDlg(QWidget *parent = nullptr); ~KTemplateExportDlg(); QString title() const; diff --git a/kmymoney/dialogs/ktemplateexportdlg.cpp b/kmymoney/dialogs/ktemplateexportdlg.cpp --- a/kmymoney/dialogs/ktemplateexportdlg.cpp +++ b/kmymoney/dialogs/ktemplateexportdlg.cpp @@ -2,6 +2,7 @@ ktemplateexportlg.cpp --------------------- copyright : (C) 2016 by Ralf Habacker + (C) 2017 by Łukasz Wojniłowicz ***************************************************************************/ diff --git a/kmymoney/dialogs/ktemplateexportdlg.ui b/kmymoney/dialogs/ktemplateexportdlg.ui --- a/kmymoney/dialogs/ktemplateexportdlg.ui +++ b/kmymoney/dialogs/ktemplateexportdlg.ui @@ -7,13 +7,16 @@ 0 0 397 - 282 + 284 Template Export Attributes + + + @@ -51,15 +54,18 @@
- - -
+ + + KTextEdit + QTextEdit +
ktextedit.h
+
+
m_title m_shortDescription - m_longDescription buttonBox diff --git a/kmymoney/dialogs/kupdatestockpricedlg.h b/kmymoney/dialogs/kupdatestockpricedlg.h --- a/kmymoney/dialogs/kupdatestockpricedlg.h +++ b/kmymoney/dialogs/kupdatestockpricedlg.h @@ -9,6 +9,7 @@ John C Thomas Baumgart Kevin Tambascio + (C) 2017 by Łukasz Wojniłowicz ***************************************************************************/ /*************************************************************************** @@ -27,8 +28,7 @@ // ---------------------------------------------------------------------------- // QT Includes -#include -#include +#include // ---------------------------------------------------------------------------- // KDE Includes @@ -36,45 +36,36 @@ // ---------------------------------------------------------------------------- // Project Includes -#include "ui_kupdatestockpricedlgdecl.h" +namespace Ui { class KUpdateStockPriceDlg; } -#include "mymoneyprice.h" -#include "kmymoneydateinput.h" -#include "kmymoneyedit.h" +class QDate; + +class MyMoneyMoney; /** * @author Kevin Tambascio */ -class kUpdateStockPriceDecl : public QDialog, public Ui::kUpdateStockPriceDecl -{ -public: - kUpdateStockPriceDecl(QWidget *parent) : QDialog(parent) { - setupUi(this); - } -}; -class KUpdateStockPriceDlg : public kUpdateStockPriceDecl +class KUpdateStockPriceDlg : public QDialog { Q_OBJECT + Q_DISABLE_COPY(KUpdateStockPriceDlg) public: - KUpdateStockPriceDlg(QWidget* parent = 0); + explicit KUpdateStockPriceDlg(QWidget* parent = nullptr); ~KUpdateStockPriceDlg(); - const QDate date() const { - return m_date->date(); - }; - const MyMoneyMoney price() const; + QDate date() const; + MyMoneyMoney price() const; + + Ui::KUpdateStockPriceDlg *ui; public slots: - int exec(); + int exec() override; protected slots: void slotCheckData(); - -private: - void init(); - + void slotCheckData(int idx); }; #endif diff --git a/kmymoney/dialogs/kupdatestockpricedlg.cpp b/kmymoney/dialogs/kupdatestockpricedlg.cpp --- a/kmymoney/dialogs/kupdatestockpricedlg.cpp +++ b/kmymoney/dialogs/kupdatestockpricedlg.cpp @@ -9,6 +9,7 @@ John C Thomas Baumgart Kevin Tambascio + (C) 2017 by Łukasz Wojniłowicz ***************************************************************************/ /*************************************************************************** @@ -25,51 +26,63 @@ // ---------------------------------------------------------------------------- // QT Includes +#include +#include + // ---------------------------------------------------------------------------- // KDE Includes // ---------------------------------------------------------------------------- // Project Includes +#include "ui_kupdatestockpricedlg.h" + +#include "kmymoneydateinput.h" #include "kmymoneycurrencyselector.h" KUpdateStockPriceDlg::KUpdateStockPriceDlg(QWidget* parent) : - kUpdateStockPriceDecl(parent) + QDialog(parent), + ui(new Ui::KUpdateStockPriceDlg) { + ui->setupUi(this); setModal(true); - m_date->setDate(QDate::currentDate()); - init(); + ui->m_date->setDate(QDate::currentDate()); + + connect(ui->m_security, static_cast(&QComboBox::activated), this, static_cast(&KUpdateStockPriceDlg::slotCheckData)); + connect(ui->m_currency, static_cast(&QComboBox::activated), this, static_cast(&KUpdateStockPriceDlg::slotCheckData)); + + // load initial values into the selection widgets + ui->m_currency->update(QString()); + ui->m_security->update(QString()); + + slotCheckData(); } KUpdateStockPriceDlg::~KUpdateStockPriceDlg() { + delete ui; } -void KUpdateStockPriceDlg::init() +int KUpdateStockPriceDlg::exec() { - connect(m_buttonBox, SIGNAL(accepted()), this, SLOT(accept())); - connect(m_buttonBox, SIGNAL(rejected()), this, SLOT(reject())); - - connect(m_security, SIGNAL(activated(int)), this, SLOT(slotCheckData())); - connect(m_currency, SIGNAL(activated(int)), this, SLOT(slotCheckData())); - - // load initial values into the selection widgets - m_currency->update(QString()); - m_security->update(QString()); - slotCheckData(); + return QDialog::exec(); } -int KUpdateStockPriceDlg::exec() +QDate KUpdateStockPriceDlg::date() const { - slotCheckData(); - return kUpdateStockPriceDecl::exec(); + return ui->m_date->date(); } void KUpdateStockPriceDlg::slotCheckData() { - QString from = m_security->security().id(); - QString to = m_currency->security().id(); + auto from = ui->m_security->security().id(); + auto to = ui->m_currency->security().id(); - m_buttonBox->button(QDialogButtonBox::Ok)->setEnabled(!from.isEmpty() && !to.isEmpty() && from != to); + ui->m_buttonBox->button(QDialogButtonBox::Ok)->setEnabled(!from.isEmpty() && !to.isEmpty() && from != to); +} + +void KUpdateStockPriceDlg::slotCheckData(int) +{ + slotCheckData(); } diff --git a/kmymoney/dialogs/kupdatestockpricedlgdecl.ui b/kmymoney/dialogs/kupdatestockpricedlg.ui rename from kmymoney/dialogs/kupdatestockpricedlgdecl.ui rename to kmymoney/dialogs/kupdatestockpricedlg.ui --- a/kmymoney/dialogs/kupdatestockpricedlgdecl.ui +++ b/kmymoney/dialogs/kupdatestockpricedlg.ui @@ -1,7 +1,7 @@ - kUpdateStockPriceDecl - + KUpdateStockPriceDlg + 0 @@ -187,5 +187,38 @@ - + + + m_buttonBox + accepted() + KUpdateStockPriceDlg + accept() + + + 228 + 170 + + + 228 + 96 + + + + + m_buttonBox + rejected() + KUpdateStockPriceDlg + reject() + + + 228 + 170 + + + 228 + 96 + + + + diff --git a/kmymoney/dialogs/settings/CMakeLists.txt b/kmymoney/dialogs/settings/CMakeLists.txt --- a/kmymoney/dialogs/settings/CMakeLists.txt +++ b/kmymoney/dialogs/settings/CMakeLists.txt @@ -16,16 +16,16 @@ set (libsettings_a_UI ksettingscolors.ui - ksettingsfontsdecl.ui - ksettingsiconsdecl.ui - ksettingsforecastdecl.ui - ksettingsgeneraldecl.ui - ksettingsgpgdecl.ui - ksettingshomedecl.ui - ksettingsonlinequotesdecl.ui - ksettingsregisterdecl.ui - ksettingsschedulesdecl.ui - ksettingsreportsdecl.ui + ksettingsfonts.ui + ksettingsicons.ui + ksettingsforecast.ui + ksettingsgeneral.ui + ksettingsgpg.ui + ksettingshome.ui + ksettingsonlinequotes.ui + ksettingsregister.ui + ksettingsschedules.ui + ksettingsreports.ui ) ki18n_wrap_ui(libsettings_a_SOURCES ${libsettings_a_UI} ) diff --git a/kmymoney/dialogs/settings/ksettingscolors.h b/kmymoney/dialogs/settings/ksettingscolors.h --- a/kmymoney/dialogs/settings/ksettingscolors.h +++ b/kmymoney/dialogs/settings/ksettingscolors.h @@ -21,17 +21,20 @@ // ---------------------------------------------------------------------------- // QT Includes +#include + // ---------------------------------------------------------------------------- // KDE Includes // ---------------------------------------------------------------------------- // Project Includes -#include "ui_ksettingscolors.h" +namespace Ui { class KSettingsColors; } -class KSettingsColors : public QWidget, public Ui::KSettingsColors +class KSettingsColors : public QWidget { Q_OBJECT + Q_DISABLE_COPY(KSettingsColors) public: explicit KSettingsColors(QWidget* parent = nullptr); @@ -42,6 +45,9 @@ * This presets custom colors with system's color scheme */ void slotCustomColorsToggled(bool); + +private: + Ui::KSettingsColors *ui; }; #endif diff --git a/kmymoney/dialogs/settings/ksettingscolors.cpp b/kmymoney/dialogs/settings/ksettingscolors.cpp --- a/kmymoney/dialogs/settings/ksettingscolors.cpp +++ b/kmymoney/dialogs/settings/ksettingscolors.cpp @@ -27,23 +27,27 @@ // ---------------------------------------------------------------------------- // Project Includes +#include "ui_ksettingscolors.h" + KSettingsColors::KSettingsColors(QWidget* parent) : - QWidget(parent) + QWidget(parent), + ui(new Ui::KSettingsColors) { - setupUi(this); - connect(kcfg_useCustomColors, &QGroupBox::toggled, this, &KSettingsColors::slotCustomColorsToggled); + ui->setupUi(this); + connect(ui->kcfg_useCustomColors, &QGroupBox::toggled, this, &KSettingsColors::slotCustomColorsToggled); } KSettingsColors::~KSettingsColors() { + delete ui; } void KSettingsColors::slotCustomColorsToggled(bool) { - kcfg_transactionErroneousColor->setColor(KMyMoneyGlobalSettings::schemeColor(SchemeColor::TransactionErroneous)); - kcfg_missingConversionRateColor->setColor(KMyMoneyGlobalSettings::schemeColor(SchemeColor::MissingConversionRate)); - kcfg_groupMarkerColor->setColor(KMyMoneyGlobalSettings::schemeColor(SchemeColor::GroupMarker)); - kcfg_fieldRequiredColor->setColor(KMyMoneyGlobalSettings::schemeColor(SchemeColor::FieldRequired)); - kcfg_transactionImportedColor->setColor(KMyMoneyGlobalSettings::schemeColor(SchemeColor::TransactionImported)); - kcfg_transactionMatchedColor->setColor(KMyMoneyGlobalSettings::schemeColor(SchemeColor::TransactionMatched)); + ui->kcfg_transactionErroneousColor->setColor(KMyMoneyGlobalSettings::schemeColor(SchemeColor::TransactionErroneous)); + ui->kcfg_missingConversionRateColor->setColor(KMyMoneyGlobalSettings::schemeColor(SchemeColor::MissingConversionRate)); + ui->kcfg_groupMarkerColor->setColor(KMyMoneyGlobalSettings::schemeColor(SchemeColor::GroupMarker)); + ui->kcfg_fieldRequiredColor->setColor(KMyMoneyGlobalSettings::schemeColor(SchemeColor::FieldRequired)); + ui->kcfg_transactionImportedColor->setColor(KMyMoneyGlobalSettings::schemeColor(SchemeColor::TransactionImported)); + ui->kcfg_transactionMatchedColor->setColor(KMyMoneyGlobalSettings::schemeColor(SchemeColor::TransactionMatched)); } diff --git a/kmymoney/dialogs/settings/ksettingsfonts.h b/kmymoney/dialogs/settings/ksettingsfonts.h --- a/kmymoney/dialogs/settings/ksettingsfonts.h +++ b/kmymoney/dialogs/settings/ksettingsfonts.h @@ -3,6 +3,7 @@ ------------------- copyright : (C) 2005 by Thomas Baumgart email : ipwizard@users.sourceforge.net + (C) 2017 by Łukasz Wojniłowicz ***************************************************************************/ /*************************************************************************** @@ -20,29 +21,27 @@ // ---------------------------------------------------------------------------- // QT Includes +#include + // ---------------------------------------------------------------------------- // KDE Includes // ---------------------------------------------------------------------------- // Project Includes -#include "ui_ksettingsfontsdecl.h" - -class KSettingsFontsDecl : public QWidget, public Ui::KSettingsFontsDecl -{ -public: - KSettingsFontsDecl(QWidget *parent) : QWidget(parent) { - setupUi(this); - } -}; +namespace Ui { class KSettingsFonts; } -class KSettingsFonts : public KSettingsFontsDecl +class KSettingsFonts : public QWidget { Q_OBJECT + Q_DISABLE_COPY(KSettingsFonts) public: - KSettingsFonts(QWidget* parent = 0); + explicit KSettingsFonts(QWidget* parent = nullptr); ~KSettingsFonts(); + +private: + Ui::KSettingsFonts *ui; }; #endif diff --git a/kmymoney/dialogs/settings/ksettingsfonts.cpp b/kmymoney/dialogs/settings/ksettingsfonts.cpp --- a/kmymoney/dialogs/settings/ksettingsfonts.cpp +++ b/kmymoney/dialogs/settings/ksettingsfonts.cpp @@ -3,6 +3,7 @@ -------------------- copyright : (C) 2005 by Thomas Baumgart email : ipwizard@users.sourceforge.net + (C) 2017 by Łukasz Wojniłowicz ***************************************************************************/ /*************************************************************************** @@ -25,11 +26,16 @@ // ---------------------------------------------------------------------------- // Project Includes +#include "ui_ksettingsfonts.h" + KSettingsFonts::KSettingsFonts(QWidget* parent) : - KSettingsFontsDecl(parent) + QWidget(parent), + ui(new Ui::KSettingsFonts) { + ui->setupUi(this); } KSettingsFonts::~KSettingsFonts() { + delete ui; } diff --git a/kmymoney/dialogs/settings/ksettingsfontsdecl.ui b/kmymoney/dialogs/settings/ksettingsfonts.ui rename from kmymoney/dialogs/settings/ksettingsfontsdecl.ui rename to kmymoney/dialogs/settings/ksettingsfonts.ui --- a/kmymoney/dialogs/settings/ksettingsfontsdecl.ui +++ b/kmymoney/dialogs/settings/ksettingsfonts.ui @@ -3,8 +3,8 @@ - KSettingsFontsDecl - + KSettingsFonts + 0 diff --git a/kmymoney/dialogs/settings/ksettingsforecast.h b/kmymoney/dialogs/settings/ksettingsforecast.h --- a/kmymoney/dialogs/settings/ksettingsforecast.h +++ b/kmymoney/dialogs/settings/ksettingsforecast.h @@ -3,6 +3,7 @@ ------------------- copyright : (C) 2007 by Alvaro Soliverez email : asoliverez@gmail.com + (C) 2017 by Łukasz Wojniłowicz ***************************************************************************/ /*************************************************************************** @@ -20,31 +21,27 @@ // ---------------------------------------------------------------------------- // QT Includes +#include + // ---------------------------------------------------------------------------- // KDE Includes - // ---------------------------------------------------------------------------- // Project Includes -#include "ui_ksettingsforecastdecl.h" - -class KSettingsForecastDecl : public QWidget, public Ui::KSettingsForecastDecl -{ -public: - KSettingsForecastDecl(QWidget *parent) : QWidget(parent) { - setupUi(this); - } -}; - +namespace Ui { class KSettingsForecast; } -class KSettingsForecast : public KSettingsForecastDecl +class KSettingsForecast : public QWidget { Q_OBJECT + Q_DISABLE_COPY(KSettingsForecast) public: - KSettingsForecast(QWidget* parent = 0); + explicit KSettingsForecast(QWidget* parent = nullptr); ~KSettingsForecast(); + +private: + Ui::KSettingsForecast *ui; }; #endif diff --git a/kmymoney/dialogs/settings/ksettingsforecast.cpp b/kmymoney/dialogs/settings/ksettingsforecast.cpp --- a/kmymoney/dialogs/settings/ksettingsforecast.cpp +++ b/kmymoney/dialogs/settings/ksettingsforecast.cpp @@ -3,6 +3,7 @@ -------------------- copyright : (C) 2007 by Alvaro Soliverez email : asoliverez@gmail.com + (C) 2017 by Łukasz Wojniłowicz ***************************************************************************/ /*************************************************************************** @@ -25,11 +26,16 @@ // ---------------------------------------------------------------------------- // Project Includes +#include "ui_ksettingsforecast.h" + KSettingsForecast::KSettingsForecast(QWidget* parent) : - KSettingsForecastDecl(parent) + QWidget(parent), + ui(new Ui::KSettingsForecast) { + ui->setupUi(this); } KSettingsForecast::~KSettingsForecast() { + delete ui; } diff --git a/kmymoney/dialogs/settings/ksettingsforecastdecl.ui b/kmymoney/dialogs/settings/ksettingsforecast.ui rename from kmymoney/dialogs/settings/ksettingsforecastdecl.ui rename to kmymoney/dialogs/settings/ksettingsforecast.ui --- a/kmymoney/dialogs/settings/ksettingsforecastdecl.ui +++ b/kmymoney/dialogs/settings/ksettingsforecast.ui @@ -3,8 +3,8 @@ - KSettingsForecastDecl - + KSettingsForecast + 0 diff --git a/kmymoney/dialogs/settings/ksettingsgeneral.h b/kmymoney/dialogs/settings/ksettingsgeneral.h --- a/kmymoney/dialogs/settings/ksettingsgeneral.h +++ b/kmymoney/dialogs/settings/ksettingsgeneral.h @@ -3,6 +3,7 @@ ------------------- copyright : (C) 2005 by Thomas Baumgart email : ipwizard@users.sourceforge.net + (C) 2017 by Łukasz Wojniłowicz ***************************************************************************/ /*************************************************************************** @@ -20,29 +21,22 @@ // ---------------------------------------------------------------------------- // QT Includes +#include + // ---------------------------------------------------------------------------- // KDE Includes // ---------------------------------------------------------------------------- // Project Includes -#include "ui_ksettingsgeneraldecl.h" - -class KSettingsGeneralDecl : public QWidget, public Ui::KSettingsGeneralDecl -{ -public: - KSettingsGeneralDecl(QWidget *parent) : QWidget(parent) { - setupUi(this); - } -}; - -class KSettingsGeneral : public KSettingsGeneralDecl +class KSettingsGeneralPrivate; +class KSettingsGeneral : public QWidget { Q_OBJECT -private: - bool initialHideZeroBalanceEquities; + Q_DISABLE_COPY(KSettingsGeneral) + public: - KSettingsGeneral(QWidget* parent = 0); + explicit KSettingsGeneral(QWidget* parent = nullptr); ~KSettingsGeneral(); protected slots: @@ -51,10 +45,14 @@ void slotUpdateLogTypes(); protected: - void showEvent(QShowEvent* event); + void showEvent(QShowEvent* event) override; public slots: void slotUpdateEquitiesVisibility(); + +private: + KSettingsGeneralPrivate * const d_ptr; + Q_DECLARE_PRIVATE(KSettingsGeneral) }; #endif diff --git a/kmymoney/dialogs/settings/ksettingsgeneral.cpp b/kmymoney/dialogs/settings/ksettingsgeneral.cpp --- a/kmymoney/dialogs/settings/ksettingsgeneral.cpp +++ b/kmymoney/dialogs/settings/ksettingsgeneral.cpp @@ -3,6 +3,7 @@ -------------------- copyright : (C) 2005 by Thomas Baumgart email : ipwizard@users.sourceforge.net + (C) 2017 by Łukasz Wojniłowicz ***************************************************************************/ /*************************************************************************** @@ -19,9 +20,7 @@ // ---------------------------------------------------------------------------- // QT Includes -#include #include -#include // ---------------------------------------------------------------------------- // KDE Includes @@ -29,6 +28,8 @@ // ---------------------------------------------------------------------------- // Project Includes +#include "ui_ksettingsgeneral.h" + #include "kmymoneydateinput.h" #include "models.h" #include "accountsmodel.h" @@ -36,72 +37,101 @@ #include "mymoneyfile.h" #include "mymoneyaccount.h" +class KSettingsGeneralPrivate +{ + Q_DISABLE_COPY(KSettingsGeneralPrivate) + +public: + KSettingsGeneralPrivate() : + ui(new Ui::KSettingsGeneral) + { + } + + ~KSettingsGeneralPrivate() + { + delete ui; + } + + Ui::KSettingsGeneral *ui; + bool initialHideZeroBalanceEquities; +}; + KSettingsGeneral::KSettingsGeneral(QWidget* parent) : - KSettingsGeneralDecl(parent) + QWidget(parent), + d_ptr(new KSettingsGeneralPrivate) { + Q_D(KSettingsGeneral); + d->ui->setupUi(this); // hide the internally used date field - kcfg_StartDate->hide(); + d->ui->kcfg_StartDate->hide(); // setup connections, so that the sort optios get loaded once the edit fields are filled - connect(kcfg_StartDate, SIGNAL(dateChanged(QDate)), this, SLOT(slotLoadStartDate(QDate))); + connect(d->ui->kcfg_StartDate, &QDateTimeEdit::dateChanged, this, &KSettingsGeneral::slotLoadStartDate); // setup connections, so that changes by the user are forwarded to the (hidden) edit fields - connect(m_startDateEdit, SIGNAL(dateChanged(QDate)), kcfg_StartDate, SLOT(setDate(QDate))); + connect(d->ui->m_startDateEdit, &kMyMoneyDateInput::dateChanged, d->ui->kcfg_StartDate, &QDateTimeEdit::setDate); - connect(choosePath, SIGNAL(pressed()), this, SLOT(slotChooseLogPath())); - initialHideZeroBalanceEquities = kcfg_HideZeroBalanceEquities->isChecked(); + connect(d->ui->choosePath, &QAbstractButton::pressed, this, &KSettingsGeneral::slotChooseLogPath); + d->initialHideZeroBalanceEquities = d->ui->kcfg_HideZeroBalanceEquities->isChecked(); } KSettingsGeneral::~KSettingsGeneral() { + Q_D(KSettingsGeneral); + delete d; } void KSettingsGeneral::slotChooseLogPath() { + Q_D(KSettingsGeneral); QString filePath = QFileDialog::getExistingDirectory(this, i18n("Choose file path"), QDir::homePath()); - kcfg_logPath->setText(filePath); + d->ui->kcfg_logPath->setText(filePath); slotUpdateLogTypes(); } void KSettingsGeneral::slotLoadStartDate(const QDate&) { + Q_D(KSettingsGeneral); // only need this once - disconnect(kcfg_StartDate, SIGNAL(dateChanged(QDate)), this, SLOT(slotLoadStartDate(QDate))); - m_startDateEdit->setDate(kcfg_StartDate->date()); + disconnect(d->ui->kcfg_StartDate, &QDateTimeEdit::dateChanged, this, &KSettingsGeneral::slotLoadStartDate); + d->ui->m_startDateEdit->setDate(d->ui->kcfg_StartDate->date()); } void KSettingsGeneral::slotUpdateLogTypes() { - bool enable = kcfg_logPath->text().isEmpty() ? false : true; - kcfg_logImportedStatements->setEnabled(enable); - kcfg_logOfxTransactions->setEnabled(enable); + Q_D(KSettingsGeneral); + bool enable = d->ui->kcfg_logPath->text().isEmpty() ? false : true; + d->ui->kcfg_logImportedStatements->setEnabled(enable); + d->ui->kcfg_logOfxTransactions->setEnabled(enable); if (!enable) { - kcfg_logImportedStatements->setChecked(enable); - kcfg_logOfxTransactions->setChecked(enable); + d->ui->kcfg_logImportedStatements->setChecked(enable); + d->ui->kcfg_logOfxTransactions->setChecked(enable); } } void KSettingsGeneral::showEvent(QShowEvent *event) { - KSettingsGeneralDecl::showEvent(event); + Q_UNUSED(event) + QWidget::showEvent(event); slotUpdateLogTypes(); } void KSettingsGeneral::slotUpdateEquitiesVisibility() { - if (initialHideZeroBalanceEquities == kcfg_HideZeroBalanceEquities->isChecked()) // setting hasn't been changed, so return + Q_D(KSettingsGeneral); + if (d->initialHideZeroBalanceEquities == d->ui->kcfg_HideZeroBalanceEquities->isChecked()) // setting hasn't been changed, so return return; - initialHideZeroBalanceEquities = kcfg_HideZeroBalanceEquities->isChecked(); + d->initialHideZeroBalanceEquities = d->ui->kcfg_HideZeroBalanceEquities->isChecked(); AccountsModel* accountsModel = Models::instance()->accountsModel(); // items' model for accounts' page InstitutionsModel* institutionsModel = Models::instance()->institutionsModel(); // items' model for institutions' page - MyMoneyFile *file = MyMoneyFile::instance(); + auto file = MyMoneyFile::instance(); QList accountsList; file->accountList(accountsList); foreach (const auto account, accountsList) { if (account.isInvest() && account.balance().isZero()) { // search only for zero balance stocks - if (initialHideZeroBalanceEquities) { + if (d->initialHideZeroBalanceEquities) { accountsModel->slotObjectRemoved(eMyMoney::File::Object::Account, account.id()); // remove item from accounts' page institutionsModel->slotObjectRemoved(eMyMoney::File::Object::Account, account.id()); // remove item from institutions' page } else { diff --git a/kmymoney/dialogs/settings/ksettingsgeneraldecl.ui b/kmymoney/dialogs/settings/ksettingsgeneral.ui rename from kmymoney/dialogs/settings/ksettingsgeneraldecl.ui rename to kmymoney/dialogs/settings/ksettingsgeneral.ui --- a/kmymoney/dialogs/settings/ksettingsgeneraldecl.ui +++ b/kmymoney/dialogs/settings/ksettingsgeneral.ui @@ -1,7 +1,7 @@ - KSettingsGeneralDecl - + KSettingsGeneral + 0 diff --git a/kmymoney/dialogs/settings/ksettingsgpg.h b/kmymoney/dialogs/settings/ksettingsgpg.h --- a/kmymoney/dialogs/settings/ksettingsgpg.h +++ b/kmymoney/dialogs/settings/ksettingsgpg.h @@ -3,6 +3,7 @@ ------------------- copyright : (C) 2005 by Thomas Baumgart email : ipwizard@users.sourceforge.net + (C) 2017 by Łukasz Wojniłowicz ***************************************************************************/ /*************************************************************************** @@ -20,45 +21,38 @@ // ---------------------------------------------------------------------------- // QT Includes -class QShowEvent; +#include // ---------------------------------------------------------------------------- // KDE Includes - // ---------------------------------------------------------------------------- // Project Includes -#include "ui_ksettingsgpgdecl.h" - -class KSettingsGpgDecl : public QWidget, public Ui::KSettingsGpgDecl -{ -public: - KSettingsGpgDecl(QWidget *parent) : QWidget(parent) { - setupUi(this); - } -}; +class QShowEvent; -class KSettingsGpg : public KSettingsGpgDecl +class KSettingsGpgPrivate; +class KSettingsGpg : public QWidget { Q_OBJECT + Q_DISABLE_COPY(KSettingsGpg) public: - KSettingsGpg(QWidget* parent = 0); + explicit KSettingsGpg(QWidget* parent = nullptr); ~KSettingsGpg(); public slots: - void showEvent(QShowEvent * event); + void showEvent(QShowEvent * event) override; protected slots: void slotStatusChanged(bool state); void slotIdChanged(); + void slotIdChanged(int idx); void slotKeyListChanged(); private: - int m_checkCount; - bool m_needCheckList; - bool m_listOk; + KSettingsGpgPrivate * const d_ptr; + Q_DECLARE_PRIVATE(KSettingsGpg) }; #endif diff --git a/kmymoney/dialogs/settings/ksettingsgpg.cpp b/kmymoney/dialogs/settings/ksettingsgpg.cpp --- a/kmymoney/dialogs/settings/ksettingsgpg.cpp +++ b/kmymoney/dialogs/settings/ksettingsgpg.cpp @@ -3,6 +3,7 @@ -------------------- copyright : (C) 2005, 2008 by Thomas Baumgart email : ipwizard@users.sourceforge.net + (C) 2017 by Łukasz Wojniłowicz ***************************************************************************/ /*************************************************************************** @@ -34,44 +35,74 @@ // ---------------------------------------------------------------------------- // Project Includes +#include "ui_ksettingsgpg.h" + #include #define RECOVER_KEY_ID "0xD2B08440" #define RECOVER_KEY_ID_FULL "59B0F826D2B08440" -KSettingsGpg::KSettingsGpg(QWidget* parent) : - KSettingsGpgDecl(parent), +class KSettingsGpgPrivate +{ + Q_DISABLE_COPY(KSettingsGpgPrivate) + +public: + KSettingsGpgPrivate() : + ui(new Ui::KSettingsGpg), m_checkCount(0), m_needCheckList(true), m_listOk(false) + { + } + + ~KSettingsGpgPrivate() + { + delete ui; + } + + Ui::KSettingsGpg *ui; + int m_checkCount; + bool m_needCheckList; + bool m_listOk; +}; + +KSettingsGpg::KSettingsGpg(QWidget* parent) : + QWidget(parent), + d_ptr(new KSettingsGpgPrivate) { + Q_D(KSettingsGpg); + d->ui->setupUi(this); setEnabled(KGPGFile::GPGAvailable()); // don't show the widget in which the master key is actually kept - kcfg_GpgRecipient->hide(); + d->ui->kcfg_GpgRecipient->hide(); - connect(kcfg_WriteDataEncrypted, SIGNAL(toggled(bool)), this, SLOT(slotStatusChanged(bool))); - connect(m_masterKeyCombo, SIGNAL(activated(int)), this, SLOT(slotIdChanged())); - connect(kcfg_GpgRecipientList, SIGNAL(changed()), this, SLOT(slotIdChanged())); - connect(kcfg_GpgRecipientList, SIGNAL(added(QString)), this, SLOT(slotKeyListChanged())); - connect(kcfg_GpgRecipientList, SIGNAL(removed(QString)), this, SLOT(slotKeyListChanged())); + connect(d->ui->kcfg_WriteDataEncrypted, &QAbstractButton::toggled, this, &KSettingsGpg::slotStatusChanged); + connect(d->ui->m_masterKeyCombo, static_cast(&QComboBox::activated), this, static_cast(&KSettingsGpg::slotIdChanged)); + connect(d->ui->kcfg_GpgRecipientList, &KEditListWidget::changed, this, static_cast(&KSettingsGpg::slotIdChanged)); + connect(d->ui->kcfg_GpgRecipientList, &KEditListWidget::added, this, &KSettingsGpg::slotKeyListChanged); + connect(d->ui->kcfg_GpgRecipientList, &KEditListWidget::removed, this, &KSettingsGpg::slotKeyListChanged); // Initial state setup - slotStatusChanged(kcfg_WriteDataEncrypted->isChecked()); + slotStatusChanged(d->ui->kcfg_WriteDataEncrypted->isChecked()); } KSettingsGpg::~KSettingsGpg() { + Q_D(KSettingsGpg); + delete d; } void KSettingsGpg::slotKeyListChanged() { - m_needCheckList = true; + Q_D(KSettingsGpg); + d->m_needCheckList = true; slotIdChanged(); } void KSettingsGpg::slotIdChanged() { + Q_D(KSettingsGpg); // this looks a bit awkward. Here's why: KGPGFile::keyAvailable() starts // an external task and processes UI events while it waits for the external // process to finish. Thus, the first time we get here, the external process @@ -81,67 +112,73 @@ // The second invocation is counted, but the check is not started until the // first one finishes. Once the external process finishes, we check if we // were called in the meantime and restart the check. - if (++m_checkCount == 1) { + if (++d->m_checkCount == 1) { while (1) { // first we check the current edit field if filled bool keysOk = true; - if (!kcfg_GpgRecipientList->currentText().isEmpty()) { - keysOk = KGPGFile::keyAvailable(kcfg_GpgRecipientList->currentText()); + if (!d->ui->kcfg_GpgRecipientList->currentText().isEmpty()) { + keysOk = KGPGFile::keyAvailable(d->ui->kcfg_GpgRecipientList->currentText()); } // if it is available, then scan the current list if we need to if (keysOk) { - if (m_needCheckList) { - QStringList keys = kcfg_GpgRecipientList->items(); + if (d->m_needCheckList) { + QStringList keys = d->ui->kcfg_GpgRecipientList->items(); QStringList::const_iterator it_s; for (it_s = keys.constBegin(); keysOk && it_s != keys.constEnd(); ++it_s) { if (!KGPGFile::keyAvailable(*it_s)) keysOk = false; } - m_listOk = keysOk; - m_needCheckList = false; + d->m_listOk = keysOk; + d->m_needCheckList = false; } else { - keysOk = m_listOk; + keysOk = d->m_listOk; } } // did we receive some more requests to check? - if (m_checkCount > 1) { - m_checkCount = 1; + if (d->m_checkCount > 1) { + d->m_checkCount = 1; continue; } // if we have a master key, we store it in the hidden widget - if (m_masterKeyCombo->currentIndex() != 0) { + if (d->ui->m_masterKeyCombo->currentIndex() != 0) { QRegExp keyExp(".* \\((.*)\\)"); - if (keyExp.indexIn(m_masterKeyCombo->currentText()) != -1) { - kcfg_GpgRecipient->setText(keyExp.cap(1)); + if (keyExp.indexIn(d->ui->m_masterKeyCombo->currentText()) != -1) { + d->ui->kcfg_GpgRecipient->setText(keyExp.cap(1)); } } - m_userKeysFound->setState(static_cast(keysOk && (kcfg_GpgRecipientList->items().count() != 0) ? KLed::On : KLed::Off)); + d->ui->m_userKeysFound->setState(static_cast(keysOk && (d->ui->kcfg_GpgRecipientList->items().count() != 0) ? KLed::On : KLed::Off)); break; } - --m_checkCount; + --d->m_checkCount; } } +void KSettingsGpg::slotIdChanged(int) +{ + slotIdChanged(); +} + void KSettingsGpg::showEvent(QShowEvent * event) { + Q_D(KSettingsGpg); QString masterKey; - if (m_masterKeyCombo->currentIndex() != 0) { + if (d->ui->m_masterKeyCombo->currentIndex() != 0) { QRegExp keyExp(".* \\((.*)\\)"); - if (keyExp.indexIn(m_masterKeyCombo->currentText()) != -1) { + if (keyExp.indexIn(d->ui->m_masterKeyCombo->currentText()) != -1) { masterKey = keyExp.cap(1); } } else - masterKey = kcfg_GpgRecipient->text(); + masterKey = d->ui->kcfg_GpgRecipient->text(); // fill the secret key combobox with a fresh list - m_masterKeyCombo->clear(); + d->ui->m_masterKeyCombo->clear(); QStringList keyList; KGPGFile::secretKeyList(keyList); @@ -153,24 +190,25 @@ name.replace('(', "["); name.replace(')', "]"); name = QString("%1 (0x%2)").arg(name).arg(fields[0]); - m_masterKeyCombo->addItem(name); + d->ui->m_masterKeyCombo->addItem(name); if (name.contains(masterKey)) - m_masterKeyCombo->setCurrentItem(name); + d->ui->m_masterKeyCombo->setCurrentItem(name); } } // if we don't have at least one secret key, we turn off encryption if (keyList.isEmpty()) { setEnabled(false); - kcfg_WriteDataEncrypted->setChecked(false); + d->ui->kcfg_WriteDataEncrypted->setChecked(false); } - slotStatusChanged(kcfg_WriteDataEncrypted->isChecked()); - KSettingsGpgDecl::showEvent(event); + slotStatusChanged(d->ui->kcfg_WriteDataEncrypted->isChecked()); + QWidget::showEvent(event); } void KSettingsGpg::slotStatusChanged(bool state) { + Q_D(KSettingsGpg); static bool oncePerSession = true; if (state && !KGPGFile::GPGAvailable()) state = false; @@ -180,18 +218,18 @@ oncePerSession = false; } - m_idGroup->setEnabled(state); - kcfg_EncryptRecover->setEnabled(state); - m_masterKeyCombo->setEnabled(state); - kcfg_GpgRecipientList->setEnabled(state); + d->ui->m_recoverKeyFound->setEnabled(state); + d->ui->kcfg_EncryptRecover->setEnabled(state); + d->ui->m_masterKeyCombo->setEnabled(state); + d->ui->kcfg_GpgRecipientList->setEnabled(state); if (state) { - m_recoverKeyFound->setState((KLed::State)(KGPGFile::keyAvailable(RECOVER_KEY_ID) ? KLed::On : KLed::Off)); - kcfg_EncryptRecover->setEnabled(m_recoverKeyFound->state() == KLed::On); + d->ui->m_recoverKeyFound->setState((KLed::State)(KGPGFile::keyAvailable(RECOVER_KEY_ID) ? KLed::On : KLed::Off)); + d->ui->kcfg_EncryptRecover->setEnabled(d->ui->m_recoverKeyFound->state() == KLed::On); slotIdChanged(); } else { - m_recoverKeyFound->setState(KLed::Off); - m_userKeysFound->setState(KLed::Off); + d->ui->m_recoverKeyFound->setState(KLed::Off); + d->ui->m_userKeysFound->setState(KLed::Off); } } diff --git a/kmymoney/dialogs/settings/ksettingsgpgdecl.ui b/kmymoney/dialogs/settings/ksettingsgpg.ui rename from kmymoney/dialogs/settings/ksettingsgpgdecl.ui rename to kmymoney/dialogs/settings/ksettingsgpg.ui --- a/kmymoney/dialogs/settings/ksettingsgpgdecl.ui +++ b/kmymoney/dialogs/settings/ksettingsgpg.ui @@ -1,7 +1,7 @@ - KSettingsGpgDecl - + KSettingsGpg + 0 diff --git a/kmymoney/dialogs/settings/ksettingshome.h b/kmymoney/dialogs/settings/ksettingshome.h --- a/kmymoney/dialogs/settings/ksettingshome.h +++ b/kmymoney/dialogs/settings/ksettingshome.h @@ -3,6 +3,7 @@ ------------------- copyright : (C) 2005 by Thomas Baumgart email : ipwizard@users.sourceforge.net + (C) 2017 by Łukasz Wojniłowicz ***************************************************************************/ /*************************************************************************** @@ -20,29 +21,22 @@ // ---------------------------------------------------------------------------- // QT Includes +#include + // ---------------------------------------------------------------------------- // KDE Includes // ---------------------------------------------------------------------------- // Project Includes -#include "ui_ksettingshomedecl.h" - -class KSettingsHomeDecl : public QWidget, public Ui::KSettingsHomeDecl -{ -public: - KSettingsHomeDecl(QWidget *parent) : QWidget(parent) { - setupUi(this); - } -}; - - -class KSettingsHome : public KSettingsHomeDecl +class KSettingsHomePrivate; +class KSettingsHome : public QWidget { Q_OBJECT + Q_DISABLE_COPY(KSettingsHome) public: - KSettingsHome(QWidget* parent = 0); + explicit KSettingsHome(QWidget* parent = nullptr); ~KSettingsHome(); protected slots: @@ -53,7 +47,8 @@ void slotMoveDown(); private: - bool m_noNeedToUpdateList; + KSettingsHomePrivate * const d_ptr; + Q_DECLARE_PRIVATE(KSettingsHome) }; #endif diff --git a/kmymoney/dialogs/settings/ksettingshome.cpp b/kmymoney/dialogs/settings/ksettingshome.cpp --- a/kmymoney/dialogs/settings/ksettingshome.cpp +++ b/kmymoney/dialogs/settings/ksettingshome.cpp @@ -3,6 +3,7 @@ -------------------- copyright : (C) 2005 by Thomas Baumgart email : ipwizard@users.sourceforge.net + (C) 2017 by Łukasz Wojniłowicz ***************************************************************************/ /*************************************************************************** @@ -27,63 +28,81 @@ // KDE Includes #include -#include // ---------------------------------------------------------------------------- // Project Includes +#include "ui_ksettingshome.h" + #include "kmymoney/kmymoneyglobalsettings.h" #include "kmymoney/kmymoneyutils.h" #include "icons/icons.h" using namespace Icons; -KSettingsHome::KSettingsHome(QWidget* parent) : - KSettingsHomeDecl(parent), +class KSettingsHomePrivate +{ + Q_DISABLE_COPY(KSettingsHomePrivate) + +public: + KSettingsHomePrivate() : + ui(new Ui::KSettingsHome), m_noNeedToUpdateList(false) + { + } + + ~KSettingsHomePrivate() + { + delete ui; + } + + Ui::KSettingsHome *ui; + bool m_noNeedToUpdateList; +}; + +KSettingsHome::KSettingsHome(QWidget* parent) : + QWidget(parent), + d_ptr(new KSettingsHomePrivate) { - m_homePageList->setSortingEnabled(false); - - KGuiItem upButtonItem(i18nc("Move item up", "&Up"), - QIcon::fromTheme(g_Icons[Icon::ArrowUp]), - i18n("Move selected item up"), - i18n("Use this to move the selected item up by one position in the list.")); - KGuiItem downButtonItem(i18n("&Down"), - QIcon::fromTheme(g_Icons[Icon::ArrowDown]), - i18n("Move selected item down"), - i18n("Use this to move the selected item down by one position in the list.")); - - KGuiItem::assign(m_upButton, upButtonItem); - m_upButton->setEnabled(false); - KGuiItem::assign(m_downButton, downButtonItem); - m_downButton->setEnabled(false); + Q_D(KSettingsHome); + d->ui->setupUi(this); + d->ui->m_homePageList->setSortingEnabled(false); + + d->ui->m_upButton->setIcon(QIcon::fromTheme(g_Icons[Icon::ArrowUp])); + d->ui->m_downButton->setIcon(QIcon::fromTheme(g_Icons[Icon::ArrowDown])); + + d->ui->m_upButton->setEnabled(false); + d->ui->m_downButton->setEnabled(false); // connect this, so that the list gets loaded once the edit field is filled - connect(kcfg_ItemList, SIGNAL(textChanged(QString)), this, SLOT(slotLoadItems())); + connect(d->ui->kcfg_ItemList, &QLineEdit::textChanged, this, &KSettingsHome::slotLoadItems); - connect(m_homePageList, SIGNAL(itemSelectionChanged()), - this, SLOT(slotSelectHomePageItem())); - connect(m_homePageList, SIGNAL(clicked(QModelIndex)), this, SLOT(slotUpdateItemList())); + connect(d->ui->m_homePageList, &QListWidget::itemSelectionChanged, + this, &KSettingsHome::slotSelectHomePageItem); + connect(d->ui->m_homePageList, &QAbstractItemView::clicked, this, &KSettingsHome::slotUpdateItemList); - connect(m_upButton, SIGNAL(clicked()), this, SLOT(slotMoveUp())); - connect(m_downButton, SIGNAL(clicked()), this, SLOT(slotMoveDown())); + connect(d->ui->m_upButton, &QAbstractButton::clicked, this, &KSettingsHome::slotMoveUp); + connect(d->ui->m_downButton, &QAbstractButton::clicked, this, &KSettingsHome::slotMoveDown); // Don't show it to the user, we only need it to load and save the settings - kcfg_ItemList->hide(); + d->ui->kcfg_ItemList->hide(); } KSettingsHome::~KSettingsHome() { + Q_D(KSettingsHome); + delete d; } void KSettingsHome::slotLoadItems() { - if (m_noNeedToUpdateList) + Q_D(KSettingsHome); + if (d->m_noNeedToUpdateList) return; QStringList list = KMyMoneyGlobalSettings::itemList(); QStringList::ConstIterator it; - m_homePageList->clear(); + d->ui->m_homePageList->clear(); QListWidgetItem *sel = 0; for (it = list.constBegin(); it != list.constEnd(); ++it) { @@ -93,7 +112,7 @@ continue; bool enabled = idx > 0; if (!enabled) idx = -idx; - QListWidgetItem* item = new QListWidgetItem(m_homePageList); + QListWidgetItem* item = new QListWidgetItem(d->ui->m_homePageList); item->setText(KMyMoneyUtils::homePageItemToString(idx)); item->setFlags(item->flags() | Qt::ItemIsUserCheckable); @@ -109,23 +128,24 @@ } if (sel) { - m_homePageList->setCurrentItem(sel); + d->ui->m_homePageList->setCurrentItem(sel); slotSelectHomePageItem(); } } void KSettingsHome::slotUpdateItemList() { + Q_D(KSettingsHome); QString list; QListWidgetItem *it; - for (it = m_homePageList->item(0); it;) { + for (it = d->ui->m_homePageList->item(0); it;) { int item = KMyMoneyUtils::stringToHomePageItem(it->text()); if (it->checkState() == Qt::Unchecked) item = -item; list += QString::number(item); - if (m_homePageList->count() > (m_homePageList->row(it) + 1)) { - it = m_homePageList->item(m_homePageList->row(it) + 1); + if (d->ui->m_homePageList->count() > (d->ui->m_homePageList->row(it) + 1)) { + it = d->ui->m_homePageList->item(d->ui->m_homePageList->row(it) + 1); if (it) { list += ','; } @@ -135,27 +155,29 @@ } // don't update the list - m_noNeedToUpdateList = true; - kcfg_ItemList->setText(list); - m_noNeedToUpdateList = false; + d->m_noNeedToUpdateList = true; + d->ui->kcfg_ItemList->setText(list); + d->m_noNeedToUpdateList = false; } void KSettingsHome::slotSelectHomePageItem() { - QListWidgetItem* item = m_homePageList->currentItem(); - m_upButton->setEnabled(m_homePageList->item(0) != item); - m_downButton->setEnabled(m_homePageList->count() > (m_homePageList->row(item) + 1)); + Q_D(KSettingsHome); + auto item = d->ui->m_homePageList->currentItem(); + d->ui->m_upButton->setEnabled(d->ui->m_homePageList->item(0) != item); + d->ui->m_downButton->setEnabled(d->ui->m_homePageList->count() > (d->ui->m_homePageList->row(item) + 1)); } void KSettingsHome::slotMoveUp() { - QListWidgetItem *item = m_homePageList->currentItem(); - QListWidgetItem *prev = m_homePageList->item(m_homePageList->row(item) - 1); - int prevRow = m_homePageList->row(prev); + Q_D(KSettingsHome); + auto item = d->ui->m_homePageList->currentItem(); + auto prev = d->ui->m_homePageList->item(d->ui->m_homePageList->row(item) - 1); + int prevRow = d->ui->m_homePageList->row(prev); if (prev) { - m_homePageList->takeItem(m_homePageList->row(item)); - m_homePageList->insertItem(prevRow, item); - m_homePageList->setCurrentRow(m_homePageList->row(item)); + d->ui->m_homePageList->takeItem(d->ui->m_homePageList->row(item)); + d->ui->m_homePageList->insertItem(prevRow, item); + d->ui->m_homePageList->setCurrentRow(d->ui->m_homePageList->row(item)); slotSelectHomePageItem(); slotUpdateItemList(); } @@ -163,13 +185,14 @@ void KSettingsHome::slotMoveDown() { - QListWidgetItem *item = m_homePageList->currentItem(); - QListWidgetItem *next = m_homePageList->item(m_homePageList->row(item) + 1); - int nextRow = m_homePageList->row(next); + Q_D(KSettingsHome); + auto item = d->ui->m_homePageList->currentItem(); + auto next = d->ui->m_homePageList->item(d->ui->m_homePageList->row(item) + 1); + int nextRow = d->ui->m_homePageList->row(next); if (next) { - m_homePageList->takeItem(m_homePageList->row(item)); - m_homePageList->insertItem(nextRow, item); - m_homePageList->setCurrentRow(m_homePageList->row(item)); + d->ui->m_homePageList->takeItem(d->ui->m_homePageList->row(item)); + d->ui->m_homePageList->insertItem(nextRow, item); + d->ui->m_homePageList->setCurrentRow(d->ui->m_homePageList->row(item)); slotSelectHomePageItem(); slotUpdateItemList(); } diff --git a/kmymoney/dialogs/settings/ksettingshomedecl.ui b/kmymoney/dialogs/settings/ksettingshome.ui rename from kmymoney/dialogs/settings/ksettingshomedecl.ui rename to kmymoney/dialogs/settings/ksettingshome.ui --- a/kmymoney/dialogs/settings/ksettingshomedecl.ui +++ b/kmymoney/dialogs/settings/ksettingshome.ui @@ -1,7 +1,7 @@ - KSettingsHomeDecl - + KSettingsHome + 0 @@ -36,6 +36,12 @@ + + Move selected item up + + + Use this to move the selected item up by one position in the list. + Up @@ -43,6 +49,12 @@ + + Move selected item down + + + Use this to move the selected item down by one position in the list. + Down diff --git a/kmymoney/dialogs/settings/ksettingsicons.h b/kmymoney/dialogs/settings/ksettingsicons.h --- a/kmymoney/dialogs/settings/ksettingsicons.h +++ b/kmymoney/dialogs/settings/ksettingsicons.h @@ -20,28 +20,22 @@ // ---------------------------------------------------------------------------- // QT Includes +#include + // ---------------------------------------------------------------------------- // KDE Includes // ---------------------------------------------------------------------------- // Project Includes -#include "ui_ksettingsiconsdecl.h" - -class KSettingsIconsDecl : public QWidget, public Ui::KSettingsIconsDecl -{ -public: - KSettingsIconsDecl(QWidget *parent) : QWidget(parent) { - setupUi(this); - } -}; - -class KSettingsIcons : public KSettingsIconsDecl +class KSettingsIconsPrivate; +class KSettingsIcons : public QWidget { Q_OBJECT + Q_DISABLE_COPY(KSettingsIcons) public: - KSettingsIcons(QWidget* parent = 0); + explicit KSettingsIcons(QWidget* parent = nullptr); ~KSettingsIcons(); public slots: @@ -54,7 +48,8 @@ protected: void loadList(); private: - QMap m_themesMap; + KSettingsIconsPrivate * const d_ptr; + Q_DECLARE_PRIVATE(KSettingsIcons) }; #endif diff --git a/kmymoney/dialogs/settings/ksettingsicons.cpp b/kmymoney/dialogs/settings/ksettingsicons.cpp --- a/kmymoney/dialogs/settings/ksettingsicons.cpp +++ b/kmymoney/dialogs/settings/ksettingsicons.cpp @@ -21,7 +21,6 @@ #include #include -#include // ---------------------------------------------------------------------------- // KDE Includes @@ -29,33 +28,65 @@ // ---------------------------------------------------------------------------- // Project Includes +#include "ui_ksettingsicons.h" + +class KSettingsIconsPrivate +{ + Q_DISABLE_COPY(KSettingsIconsPrivate) + +public: + KSettingsIconsPrivate() : + ui(new Ui::KSettingsIcons) + { + } + + ~KSettingsIconsPrivate() + { + delete ui; + } + + Ui::KSettingsIcons *ui; + QMap m_themesMap; +}; + KSettingsIcons::KSettingsIcons(QWidget* parent) : - KSettingsIconsDecl(parent) + QWidget(parent), + d_ptr(new KSettingsIconsPrivate) { + Q_D(KSettingsIcons); + d->ui->setupUi(this); // hide the internally used holidayRegion field - kcfg_IconsTheme->hide(); + d->ui->kcfg_IconsTheme->hide(); loadList(); // setup connections so that region gets selected once field is filled - connect(kcfg_IconsTheme, SIGNAL(textChanged(QString)), this, SLOT(slotLoadTheme(QString))); + connect(d->ui->kcfg_IconsTheme, &QLineEdit::textChanged, this, &KSettingsIcons::slotLoadTheme); // setup connections so that changes are forwarded to the field - connect(m_IconsTheme, SIGNAL(currentIndexChanged(int)), this, SLOT(slotSetTheme(int))); + connect(d->ui->m_IconsTheme, + static_cast(&QComboBox::currentIndexChanged), this, &KSettingsIcons::slotSetTheme); +} + +KSettingsIcons::~KSettingsIcons() +{ + Q_D(KSettingsIcons); + delete d; } void KSettingsIcons::loadList() { + Q_D(KSettingsIcons); QStringList themes {QStringLiteral("oxygen"), QStringLiteral("Tango"), QStringLiteral("breeze"), QStringLiteral("breeze-dark")}; QStringList searchPaths = QIcon::themeSearchPaths(); - m_IconsTheme->addItem(QStringLiteral("system")); - m_themesMap.insert(0, QStringLiteral("system")); - for (int i = 0; i < searchPaths.count(); ++i) { + d->ui->m_IconsTheme->addItem(QStringLiteral("system")); + d->m_themesMap.insert(0, QStringLiteral("system")); + for (auto i = 0; i < searchPaths.count(); ++i) { for (int j = 0; j < themes.count(); ++j) { QDir themeDir = QDir(searchPaths.at(i)).filePath(themes.at(j)); if (themeDir.exists(QStringLiteral("index.theme"))) { - m_IconsTheme->addItem(themes.at(j)); - m_themesMap.insert(m_themesMap.count(), themes.at(j)); + d->ui->m_IconsTheme->addItem(themes.at(j)); + d->m_themesMap.insert(d->m_themesMap.count(), themes.at(j)); } } } @@ -63,28 +94,27 @@ void KSettingsIcons::slotSetTheme(const int &theme) { - kcfg_IconsTheme->setText(m_themesMap.value(theme)); + Q_D(KSettingsIcons); + d->ui->kcfg_IconsTheme->setText(d->m_themesMap.value(theme)); } void KSettingsIcons::slotLoadTheme(const QString &theme) { + Q_D(KSettingsIcons); // only need this once - disconnect(kcfg_IconsTheme, SIGNAL(textChanged(QString)), this, SLOT(slotLoadTheme(QString))); - int i = 0; + disconnect(d->ui->kcfg_IconsTheme, &QLineEdit::textChanged, this, &KSettingsIcons::slotLoadTheme); + auto i = 0; if (!theme.isEmpty()) - i = m_IconsTheme->findText(theme); - if ((i > -1) && (i != m_IconsTheme->currentIndex())) { - m_IconsTheme->blockSignals(true); - m_IconsTheme->setCurrentIndex(i); - m_IconsTheme->blockSignals(false); + i = d->ui->m_IconsTheme->findText(theme); + if ((i > -1) && (i != d->ui->m_IconsTheme->currentIndex())) { + d->ui->m_IconsTheme->blockSignals(true); + d->ui->m_IconsTheme->setCurrentIndex(i); + d->ui->m_IconsTheme->blockSignals(false); } } void KSettingsIcons::slotResetTheme() { - slotLoadTheme(kcfg_IconsTheme->text()); -} - -KSettingsIcons::~KSettingsIcons() -{ + Q_D(KSettingsIcons); + slotLoadTheme(d->ui->kcfg_IconsTheme->text()); } diff --git a/kmymoney/dialogs/settings/ksettingsiconsdecl.ui b/kmymoney/dialogs/settings/ksettingsicons.ui rename from kmymoney/dialogs/settings/ksettingsiconsdecl.ui rename to kmymoney/dialogs/settings/ksettingsicons.ui --- a/kmymoney/dialogs/settings/ksettingsiconsdecl.ui +++ b/kmymoney/dialogs/settings/ksettingsicons.ui @@ -1,7 +1,7 @@ - KSettingsIconsDecl - + KSettingsIcons + 0 diff --git a/kmymoney/dialogs/settings/ksettingskmymoney.h b/kmymoney/dialogs/settings/ksettingskmymoney.h --- a/kmymoney/dialogs/settings/ksettingskmymoney.h +++ b/kmymoney/dialogs/settings/ksettingskmymoney.h @@ -1,6 +1,7 @@ /* * This file is part of KMyMoney, A Personal Finance Manager by KDE * Copyright (C) 2016 Christian Dávid + * (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 @@ -27,7 +28,7 @@ class KSettingsKMyMoney : public KConfigDialog { public: - KSettingsKMyMoney(QWidget *parent, const QString &name, KCoreConfigSkeleton *config); + explicit KSettingsKMyMoney(QWidget *parent, const QString &name, KCoreConfigSkeleton *config); }; diff --git a/kmymoney/dialogs/settings/ksettingskmymoney.cpp b/kmymoney/dialogs/settings/ksettingskmymoney.cpp --- a/kmymoney/dialogs/settings/ksettingskmymoney.cpp +++ b/kmymoney/dialogs/settings/ksettingskmymoney.cpp @@ -1,6 +1,7 @@ /* * This file is part of KMyMoney, A Personal Finance Manager by KDE * Copyright (C) 2016 Christian Dávid + * (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 @@ -18,7 +19,10 @@ #include "ksettingskmymoney.h" +#include + #include +#include #include "ksettingsgeneral.h" #include "ksettingsregister.h" @@ -41,18 +45,18 @@ : KConfigDialog(parent, name, config) { // create the pages ... - KSettingsGeneral* generalPage = new KSettingsGeneral(); - KSettingsRegister* registerPage = new KSettingsRegister(); - KSettingsHome* homePage = new KSettingsHome(); - KSettingsSchedules* schedulesPage = new KSettingsSchedules(); - KSettingsGpg* encryptionPage = new KSettingsGpg(); - KSettingsColors* colorsPage = new KSettingsColors(); - KSettingsFonts* fontsPage = new KSettingsFonts(); - KSettingsIcons* iconsPage = new KSettingsIcons(); - KSettingsOnlineQuotes* onlineQuotesPage = new KSettingsOnlineQuotes(); - KSettingsForecast* forecastPage = new KSettingsForecast(); - KPluginSelector* pluginsPage = KMyMoneyPlugin::PluginLoader::instance()->pluginSelectorWidget(); - KSettingsReports* reportsPage = new KSettingsReports(); + const auto generalPage = new KSettingsGeneral(); + const auto registerPage = new KSettingsRegister(); + const auto homePage = new KSettingsHome(); + const auto schedulesPage = new KSettingsSchedules(); + const auto encryptionPage = new KSettingsGpg(); + const auto colorsPage = new KSettingsColors(); + const auto fontsPage = new KSettingsFonts(); + const auto iconsPage = new KSettingsIcons(); + const auto onlineQuotesPage = new KSettingsOnlineQuotes(); + const auto forecastPage = new KSettingsForecast(); + const auto pluginsPage = KMyMoneyPlugin::PluginLoader::instance()->pluginSelectorWidget(); + const auto reportsPage = new KSettingsReports(); addPage(generalPage, i18nc("General settings", "General"), g_Icons[Icon::SystemRun]); addPage(homePage, i18n("Home"), g_Icons[Icon::ViewHome]); @@ -69,11 +73,11 @@ setHelp("details.settings", "kmymoney"); - QAbstractButton* defaultButton = button(QDialogButtonBox::RestoreDefaults); + auto defaultButton = button(QDialogButtonBox::RestoreDefaults); connect(this, &KConfigDialog::rejected, schedulesPage, &KSettingsSchedules::slotResetRegion); connect(this, &KConfigDialog::rejected, iconsPage, &KSettingsIcons::slotResetTheme); connect(this, &KConfigDialog::settingsChanged, generalPage, &KSettingsGeneral::slotUpdateEquitiesVisibility); connect(this, &KConfigDialog::accepted, pluginsPage, &KPluginSelector::save); - connect(defaultButton, &QAbstractButton::clicked, pluginsPage, &KPluginSelector::defaults); + connect(defaultButton, &QPushButton::clicked, pluginsPage, &KPluginSelector::defaults); } diff --git a/kmymoney/dialogs/settings/ksettingsonlinequotes.h b/kmymoney/dialogs/settings/ksettingsonlinequotes.h --- a/kmymoney/dialogs/settings/ksettingsonlinequotes.h +++ b/kmymoney/dialogs/settings/ksettingsonlinequotes.h @@ -4,6 +4,7 @@ begin : Thu Dec 30 2004 copyright : (C) 2004 by Thomas Baumgart email : Thomas Baumgart + (C) 2017 by Łukasz Wojniłowicz ***************************************************************************/ /*************************************************************************** @@ -21,7 +22,7 @@ // ---------------------------------------------------------------------------- // QT Includes -#include +#include // ---------------------------------------------------------------------------- // KDE Includes @@ -29,24 +30,17 @@ // ---------------------------------------------------------------------------- // Project Includes -#include "ui_ksettingsonlinequotesdecl.h" -#include "kmymoney/converter/webpricequote.h" +class QListWidgetItem; - -class KSettingsOnlineQuotesDecl : public QWidget, public Ui::KSettingsOnlineQuotesDecl -{ -public: - KSettingsOnlineQuotesDecl(QWidget *parent) : QWidget(parent) { - setupUi(this); - } -}; - -class KSettingsOnlineQuotes : public KSettingsOnlineQuotesDecl +class KSettingsOnlineQuotesPrivate; +class KSettingsOnlineQuotes : public QWidget { Q_OBJECT + Q_DISABLE_COPY(KSettingsOnlineQuotes) + public: - KSettingsOnlineQuotes(QWidget* parent = 0); - virtual ~KSettingsOnlineQuotes() {} + explicit KSettingsOnlineQuotes(QWidget* parent = nullptr); + ~KSettingsOnlineQuotes(); void writeConfig() {} void readConfig() {} @@ -57,6 +51,9 @@ void slotUpdateEntry(); void slotLoadWidgets(); void slotEntryChanged(); + void slotEntryChanged(int idx); + void slotEntryChanged(const QString& str); + void slotEntryChanged(bool b); void slotNewEntry(); void slotDeleteEntry(); void slotEntryRenamed(QListWidgetItem* item); @@ -66,9 +63,8 @@ void loadList(const bool updateResetList = false); private: - QList m_resetList; - WebPriceQuoteSource m_currentItem; - bool m_quoteInEditing; + KSettingsOnlineQuotesPrivate * const d_ptr; + Q_DECLARE_PRIVATE(KSettingsOnlineQuotes) }; #endif diff --git a/kmymoney/dialogs/settings/ksettingsonlinequotes.cpp b/kmymoney/dialogs/settings/ksettingsonlinequotes.cpp --- a/kmymoney/dialogs/settings/ksettingsonlinequotes.cpp +++ b/kmymoney/dialogs/settings/ksettingsonlinequotes.cpp @@ -4,6 +4,7 @@ begin : Thu Dec 30 2004 copyright : (C) 2004 by Thomas Baumgart email : Thomas Baumgart + (C) 2017 by Łukasz Wojniłowicz ***************************************************************************/ /*************************************************************************** @@ -27,13 +28,14 @@ // KDE Includes #include -#include #include #include // ---------------------------------------------------------------------------- // Project Includes +#include "ui_ksettingsonlinequotes.h" + #include "kmymoney/converter/webpricequote.h" #include "mymoneyfile.h" #include "mymoneysecurity.h" @@ -41,88 +43,105 @@ using namespace Icons; -KSettingsOnlineQuotes::KSettingsOnlineQuotes(QWidget *parent) - : KSettingsOnlineQuotesDecl(parent), - m_quoteInEditing(false) +class KSettingsOnlineQuotesPrivate +{ + Q_DISABLE_COPY(KSettingsOnlineQuotesPrivate) + +public: + KSettingsOnlineQuotesPrivate() : + ui(new Ui::KSettingsOnlineQuotes) + { + } + + ~KSettingsOnlineQuotesPrivate() + { + delete ui; + } + + Ui::KSettingsOnlineQuotes *ui; + QList m_resetList; + WebPriceQuoteSource m_currentItem; + bool m_quoteInEditing; +}; + +KSettingsOnlineQuotes::KSettingsOnlineQuotes(QWidget *parent) : + QWidget(parent), + d_ptr(new KSettingsOnlineQuotesPrivate) { + Q_D(KSettingsOnlineQuotes); + d->ui->setupUi(this); QStringList groups = WebPriceQuote::quoteSources(); loadList(true /*updateResetList*/); - m_updateButton->setEnabled(false); - - KGuiItem updateButtenItem(i18nc("Accepts the entered data and stores it", "&Update"), - QIcon::fromTheme(g_Icons[Icon::DialogOK]), - i18n("Accepts the entered data and stores it"), - i18n("Use this to accept the modified data.")); - KGuiItem::assign(m_updateButton, updateButtenItem); - - KGuiItem deleteButtenItem(i18n("&Delete"), - QIcon::fromTheme(g_Icons[Icon::EditDelete]), - i18n("Delete the selected source entry"), - i18n("Use this to delete the selected online source entry")); - KGuiItem::assign(m_deleteButton, deleteButtenItem); - - KGuiItem newButtenItem(i18nc("Create a new source entry for online quotes", "&New..."), - QIcon::fromTheme(g_Icons[Icon::DocumentNew]), - i18n("Create a new source entry for online quotes"), - i18n("Use this to create a new entry for online quotes")); - KGuiItem::assign(m_newButton, newButtenItem); - - m_editIdentifyBy->addItem(i18n("Symbol"), WebPriceQuoteSource::identifyBy::Symbol); - m_editIdentifyBy->addItem(i18n("Identification number"), WebPriceQuoteSource::identifyBy::IdentificationNumber); - m_editIdentifyBy->addItem(i18n("Name"), WebPriceQuoteSource::identifyBy::Name); - - connect(m_dumpCSVProfile, SIGNAL(clicked()), this, SLOT(slotDumpCSVProfile())); - connect(m_updateButton, SIGNAL(clicked()), this, SLOT(slotUpdateEntry())); - connect(m_newButton, SIGNAL(clicked()), this, SLOT(slotNewEntry())); - connect(m_deleteButton, SIGNAL(clicked()), this, SLOT(slotDeleteEntry())); - - connect(m_quoteSourceList, SIGNAL(itemSelectionChanged()), this, SLOT(slotLoadWidgets())); - connect(m_quoteSourceList, SIGNAL(itemChanged(QListWidgetItem*)), this, SLOT(slotEntryRenamed(QListWidgetItem*))); - connect(m_quoteSourceList, SIGNAL(itemDoubleClicked(QListWidgetItem*)), this, SLOT(slotStartRename(QListWidgetItem*))); - - connect(m_editURL, SIGNAL(textChanged(QString)), this, SLOT(slotEntryChanged())); - connect(m_editCSVURL, SIGNAL(textChanged(QString)), this, SLOT(slotEntryChanged())); - connect(m_editIdentifier, SIGNAL(textChanged(QString)), this, SLOT(slotEntryChanged())); - connect(m_editIdentifyBy, SIGNAL(currentIndexChanged(QString)), this, SLOT(slotEntryChanged())); - connect(m_editDate, SIGNAL(textChanged(QString)), this, SLOT(slotEntryChanged())); - connect(m_editDateFormat, SIGNAL(textChanged(QString)), this, SLOT(slotEntryChanged())); - connect(m_editPrice, SIGNAL(textChanged(QString)), this, SLOT(slotEntryChanged())); - connect(m_skipStripping, SIGNAL(toggled(bool)), this, SLOT(slotEntryChanged())); + d->ui->m_updateButton->setEnabled(false); + + d->ui->m_updateButton->setIcon(QIcon::fromTheme(g_Icons[Icon::DialogOK])); + d->ui->m_deleteButton->setIcon(QIcon::fromTheme(g_Icons[Icon::EditDelete])); + d->ui->m_newButton->setIcon(QIcon::fromTheme(g_Icons[Icon::DocumentNew])); + + d->ui->m_editIdentifyBy->addItem(i18n("Symbol"), WebPriceQuoteSource::identifyBy::Symbol); + d->ui->m_editIdentifyBy->addItem(i18n("Identification number"), WebPriceQuoteSource::identifyBy::IdentificationNumber); + d->ui->m_editIdentifyBy->addItem(i18n("Name"), WebPriceQuoteSource::identifyBy::Name); + + connect(d->ui->m_dumpCSVProfile, &QAbstractButton::clicked, this, &KSettingsOnlineQuotes::slotDumpCSVProfile); + connect(d->ui->m_updateButton, &QAbstractButton::clicked, this, &KSettingsOnlineQuotes::slotUpdateEntry); + connect(d->ui->m_newButton, &QAbstractButton::clicked, this, &KSettingsOnlineQuotes::slotNewEntry); + connect(d->ui->m_deleteButton, &QAbstractButton::clicked, this, &KSettingsOnlineQuotes::slotDeleteEntry); + + connect(d->ui->m_quoteSourceList, &QListWidget::itemSelectionChanged, this, &KSettingsOnlineQuotes::slotLoadWidgets); + connect(d->ui->m_quoteSourceList, &QListWidget::itemChanged, this, &KSettingsOnlineQuotes::slotEntryRenamed); + connect(d->ui->m_quoteSourceList, &QListWidget::itemDoubleClicked, this, &KSettingsOnlineQuotes::slotStartRename); + + connect(d->ui->m_editURL, &QLineEdit::textChanged, this, static_cast(&KSettingsOnlineQuotes::slotEntryChanged)); + connect(d->ui->m_editCSVURL, &QLineEdit::textChanged, this, static_cast(&KSettingsOnlineQuotes::slotEntryChanged)); + connect(d->ui->m_editIdentifier, &QLineEdit::textChanged, this, static_cast(&KSettingsOnlineQuotes::slotEntryChanged)); + connect(d->ui->m_editIdentifyBy, static_cast(&QComboBox::currentIndexChanged), this, static_cast(&KSettingsOnlineQuotes::slotEntryChanged)); + connect(d->ui->m_editDate, &QLineEdit::textChanged, this, static_cast(&KSettingsOnlineQuotes::slotEntryChanged)); + connect(d->ui->m_editDateFormat, &QLineEdit::textChanged, this, static_cast(&KSettingsOnlineQuotes::slotEntryChanged)); + connect(d->ui->m_editPrice, &QLineEdit::textChanged, this, static_cast(&KSettingsOnlineQuotes::slotEntryChanged)); + connect(d->ui->m_skipStripping, &QAbstractButton::toggled, this, static_cast(&KSettingsOnlineQuotes::slotEntryChanged)); +} + +KSettingsOnlineQuotes::~KSettingsOnlineQuotes() +{ + Q_D(KSettingsOnlineQuotes); + delete d; } void KSettingsOnlineQuotes::loadList(const bool updateResetList) { + Q_D(KSettingsOnlineQuotes); //disconnect the slot while items are being loaded and reconnect at the end - disconnect(m_quoteSourceList, SIGNAL(itemChanged(QListWidgetItem*)), this, SLOT(slotEntryRenamed(QListWidgetItem*))); - m_quoteInEditing = false; + disconnect(d->ui->m_quoteSourceList, &QListWidget::itemChanged, this, &KSettingsOnlineQuotes::slotEntryRenamed); + d->m_quoteInEditing = false; QStringList groups = WebPriceQuote::quoteSources(); if (updateResetList) - m_resetList.clear(); - m_quoteSourceList->clear(); + d->m_resetList.clear(); + d->ui->m_quoteSourceList->clear(); QStringList::Iterator it; for (it = groups.begin(); it != groups.end(); ++it) { QListWidgetItem* item = new QListWidgetItem(*it); item->setFlags(Qt::ItemIsEditable | Qt::ItemIsSelectable | Qt::ItemIsEnabled); - m_quoteSourceList->addItem(item); + d->ui->m_quoteSourceList->addItem(item); if (updateResetList) - m_resetList += WebPriceQuoteSource(*it); + d->m_resetList += WebPriceQuoteSource(*it); } - m_quoteSourceList->sortItems(); + d->ui->m_quoteSourceList->sortItems(); - QListWidgetItem* first = m_quoteSourceList->item(0); + QListWidgetItem* first = d->ui->m_quoteSourceList->item(0); if (first) - m_quoteSourceList->setCurrentItem(first); + d->ui->m_quoteSourceList->setCurrentItem(first); slotLoadWidgets(); - m_newButton->setEnabled((m_quoteSourceList->findItems(i18n("New Quote Source"), Qt::MatchExactly)).count() == 0); - connect(m_quoteSourceList, SIGNAL(itemChanged(QListWidgetItem*)), this, SLOT(slotEntryRenamed(QListWidgetItem*))); + d->ui->m_newButton->setEnabled((d->ui->m_quoteSourceList->findItems(i18n("New Quote Source"), Qt::MatchExactly)).count() == 0); + connect(d->ui->m_quoteSourceList, &QListWidget::itemChanged, this, &KSettingsOnlineQuotes::slotEntryRenamed); } void KSettingsOnlineQuotes::resetConfig() { + Q_D(KSettingsOnlineQuotes); QStringList::ConstIterator it; QStringList groups = WebPriceQuote::quoteSources(); @@ -133,7 +152,7 @@ // and write back the one's from the reset list QList::ConstIterator itr; - for (itr = m_resetList.constBegin(); itr != m_resetList.constEnd(); ++itr) { + for (itr = d->m_resetList.constBegin(); itr != d->m_resetList.constEnd(); ++itr) { (*itr).write(); } @@ -142,73 +161,91 @@ void KSettingsOnlineQuotes::slotLoadWidgets() { - m_quoteInEditing = false; - QListWidgetItem* item = m_quoteSourceList->currentItem(); - - m_editURL->setEnabled(true); - m_editCSVURL->setEnabled(true); - m_editIdentifier->setEnabled(true); - m_editIdentifyBy->setEnabled(true); - m_editPrice->setEnabled(true); - m_editDate->setEnabled(true); - m_editDateFormat->setEnabled(true); - m_skipStripping->setEnabled(true); - m_dumpCSVProfile->setEnabled(true); - m_deleteButton->setEnabled(true); - m_editURL->setText(QString()); - m_editCSVURL->setText(QString()); - m_editIdentifier->setText(QString()); - m_editIdentifyBy->setCurrentIndex(WebPriceQuoteSource::identifyBy::Symbol); - m_editPrice->setText(QString()); - m_editDate->setText(QString()); - m_editDateFormat->setText(QString()); + Q_D(KSettingsOnlineQuotes); + d->m_quoteInEditing = false; + QListWidgetItem* item = d->ui->m_quoteSourceList->currentItem(); + + d->ui->m_editURL->setEnabled(true); + d->ui->m_editCSVURL->setEnabled(true); + d->ui->m_editIdentifier->setEnabled(true); + d->ui->m_editIdentifyBy->setEnabled(true); + d->ui->m_editPrice->setEnabled(true); + d->ui->m_editDate->setEnabled(true); + d->ui->m_editDateFormat->setEnabled(true); + d->ui->m_skipStripping->setEnabled(true); + d->ui->m_dumpCSVProfile->setEnabled(true); + d->ui->m_deleteButton->setEnabled(true); + d->ui->m_editURL->setText(QString()); + d->ui->m_editCSVURL->setText(QString()); + d->ui->m_editIdentifier->setText(QString()); + d->ui->m_editIdentifyBy->setCurrentIndex(WebPriceQuoteSource::identifyBy::Symbol); + d->ui->m_editPrice->setText(QString()); + d->ui->m_editDate->setText(QString()); + d->ui->m_editDateFormat->setText(QString()); if (item) { - m_currentItem = WebPriceQuoteSource(item->text()); - m_editURL->setText(m_currentItem.m_url); - m_editCSVURL->setText(m_currentItem.m_csvUrl); - m_editIdentifier->setText(m_currentItem.m_webID); - m_editIdentifyBy->setCurrentIndex(m_currentItem.m_webIDBy); - m_editPrice->setText(m_currentItem.m_price); - m_editDate->setText(m_currentItem.m_date); - m_editDateFormat->setText(m_currentItem.m_dateformat); - m_skipStripping->setChecked(m_currentItem.m_skipStripping); + d->m_currentItem = WebPriceQuoteSource(item->text()); + d->ui->m_editURL->setText(d->m_currentItem.m_url); + d->ui->m_editCSVURL->setText(d->m_currentItem.m_csvUrl); + d->ui->m_editIdentifier->setText(d->m_currentItem.m_webID); + d->ui->m_editIdentifyBy->setCurrentIndex(d->m_currentItem.m_webIDBy); + d->ui->m_editPrice->setText(d->m_currentItem.m_price); + d->ui->m_editDate->setText(d->m_currentItem.m_date); + d->ui->m_editDateFormat->setText(d->m_currentItem.m_dateformat); + d->ui->m_skipStripping->setChecked(d->m_currentItem.m_skipStripping); } else { - m_editURL->setEnabled(false); - m_editCSVURL->setEnabled(false); - m_editIdentifier->setEnabled(false); - m_editIdentifyBy->setEnabled(false); - m_editPrice->setEnabled(false); - m_editDate->setEnabled(false); - m_editDateFormat->setEnabled(false); - m_skipStripping->setEnabled(false); - m_dumpCSVProfile->setEnabled(false); - m_deleteButton->setEnabled(false); + d->ui->m_editURL->setEnabled(false); + d->ui->m_editCSVURL->setEnabled(false); + d->ui->m_editIdentifier->setEnabled(false); + d->ui->m_editIdentifyBy->setEnabled(false); + d->ui->m_editPrice->setEnabled(false); + d->ui->m_editDate->setEnabled(false); + d->ui->m_editDateFormat->setEnabled(false); + d->ui->m_skipStripping->setEnabled(false); + d->ui->m_dumpCSVProfile->setEnabled(false); + d->ui->m_deleteButton->setEnabled(false); } - m_updateButton->setEnabled(false); + d->ui->m_updateButton->setEnabled(false); } void KSettingsOnlineQuotes::slotEntryChanged() { - bool modified = m_editURL->text() != m_currentItem.m_url - || m_editCSVURL->text() != m_currentItem.m_csvUrl - || m_editIdentifier->text() != m_currentItem.m_webID - || m_editIdentifyBy->currentData().toInt() != static_cast(m_currentItem.m_webIDBy) - || m_editDate->text() != m_currentItem.m_date - || m_editDateFormat->text() != m_currentItem.m_dateformat - || m_editPrice->text() != m_currentItem.m_price - || m_skipStripping->isChecked() != m_currentItem.m_skipStripping; - - m_updateButton->setEnabled(modified); + Q_D(KSettingsOnlineQuotes); + bool modified = d->ui->m_editURL->text() != d->m_currentItem.m_url + || d->ui->m_editCSVURL->text() != d->m_currentItem.m_csvUrl + || d->ui->m_editIdentifier->text() != d->m_currentItem.m_webID + || d->ui->m_editIdentifyBy->currentData().toInt() != static_cast(d->m_currentItem.m_webIDBy) + || d->ui->m_editDate->text() != d->m_currentItem.m_date + || d->ui->m_editDateFormat->text() != d->m_currentItem.m_dateformat + || d->ui->m_editPrice->text() != d->m_currentItem.m_price + || d->ui->m_skipStripping->isChecked() != d->m_currentItem.m_skipStripping; + + d->ui->m_updateButton->setEnabled(modified); +} + +void KSettingsOnlineQuotes::slotEntryChanged(int) +{ + slotEntryChanged(); +} + +void KSettingsOnlineQuotes::slotEntryChanged(const QString&) +{ + slotEntryChanged(); +} + +void KSettingsOnlineQuotes::slotEntryChanged(bool) +{ + slotEntryChanged(); } void KSettingsOnlineQuotes::slotDumpCSVProfile() { + Q_D(KSettingsOnlineQuotes); KSharedConfigPtr config = CSVImporter::configFile(); PricesProfile profile; - profile.m_profileName = m_currentItem.m_name; + profile.m_profileName = d->m_currentItem.m_name; profile.m_profileType = Profile::StockPrices; bool profileExists = false; bool writeProfile = true; @@ -225,13 +262,13 @@ writeProfile = (KMessageBox::questionYesNoCancel(this, i18n("CSV profile %1 already exists.
" "Do you want to overwrite it?", - m_currentItem.m_name), + d->m_currentItem.m_name), i18n("CSV Profile Already Exists")) == KMessageBox::Yes ? true : false); if (writeProfile) { QMap quoteSources = WebPriceQuote::defaultCSVQuoteSources(); - profile = quoteSources.value(m_currentItem.m_name); - if (profile.m_profileName.compare(m_currentItem.m_name, Qt::CaseInsensitive) == 0) { + profile = quoteSources.value(d->m_currentItem.m_name); + if (profile.m_profileName.compare(d->m_currentItem.m_name, Qt::CaseInsensitive) == 0) { profile.writeSettings(config); CSVImporter::profilesAction(profile.type(), ProfileAction::Add, profile.m_profileName, profile.m_profileName); } @@ -241,36 +278,39 @@ void KSettingsOnlineQuotes::slotUpdateEntry() { - m_currentItem.m_url = m_editURL->text(); - m_currentItem.m_csvUrl = m_editCSVURL->text(); - m_currentItem.m_webID = m_editIdentifier->text(); - m_currentItem.m_webIDBy = static_cast(m_editIdentifyBy->currentData().toInt()); - m_currentItem.m_date = m_editDate->text(); - m_currentItem.m_dateformat = m_editDateFormat->text(); - m_currentItem.m_price = m_editPrice->text(); - m_currentItem.m_skipStripping = m_skipStripping->isChecked(); - m_currentItem.write(); + Q_D(KSettingsOnlineQuotes); + d->m_currentItem.m_url = d->ui->m_editURL->text(); + d->m_currentItem.m_csvUrl = d->ui->m_editCSVURL->text(); + d->m_currentItem.m_webID = d->ui->m_editIdentifier->text(); + d->m_currentItem.m_webIDBy = static_cast(d->ui->m_editIdentifyBy->currentData().toInt()); + d->m_currentItem.m_date = d->ui->m_editDate->text(); + d->m_currentItem.m_dateformat = d->ui->m_editDateFormat->text(); + d->m_currentItem.m_price = d->ui->m_editPrice->text(); + d->m_currentItem.m_skipStripping = d->ui->m_skipStripping->isChecked(); + d->m_currentItem.write(); slotEntryChanged(); } void KSettingsOnlineQuotes::slotNewEntry() { + Q_D(KSettingsOnlineQuotes); WebPriceQuoteSource newSource(i18n("New Quote Source")); newSource.write(); loadList(); - QListWidgetItem* item = m_quoteSourceList->findItems(i18n("New Quote Source"), Qt::MatchExactly).at(0); + QListWidgetItem* item = d->ui->m_quoteSourceList->findItems(i18n("New Quote Source"), Qt::MatchExactly).at(0); if (item) { - m_quoteSourceList->setCurrentItem(item); + d->ui->m_quoteSourceList->setCurrentItem(item); slotLoadWidgets(); } } void KSettingsOnlineQuotes::slotDeleteEntry() { + Q_D(KSettingsOnlineQuotes); // first check if no security is using this online source - QList securities = MyMoneyFile::instance()->securityList(); + auto securities = MyMoneyFile::instance()->securityList(); foreach(const auto security, securities) { - if (security.value(QStringLiteral("kmm-online-source")).compare(m_currentItem.m_name) == 0) { + if (security.value(QStringLiteral("kmm-online-source")).compare(d->m_currentItem.m_name) == 0) { if (KMessageBox::questionYesNo(this, i18n("Security %1 uses this quote source.
" "Do you really want to remove it?", security.name()), @@ -282,53 +322,55 @@ } // remove online source from webpricequote... - m_currentItem.remove(); + d->m_currentItem.remove(); // ...and from setting's list - int row = m_quoteSourceList->currentRow(); - QListWidgetItem *item = m_quoteSourceList->takeItem(row); + auto row = d->ui->m_quoteSourceList->currentRow(); + QListWidgetItem *item = d->ui->m_quoteSourceList->takeItem(row); if (item) delete item; item = nullptr; - int count = m_quoteSourceList->count(); + int count = d->ui->m_quoteSourceList->count(); if (row < count) // select next available entry... - item = m_quoteSourceList->item(row); + item = d->ui->m_quoteSourceList->item(row); else if (row >= count && count > 0) // ...or last entry if this was the last entry... - item = m_quoteSourceList->item(count - 1); + item = d->ui->m_quoteSourceList->item(count - 1); if (item) { - m_quoteSourceList->setCurrentItem(item); + d->ui->m_quoteSourceList->setCurrentItem(item); slotLoadWidgets(); } } void KSettingsOnlineQuotes::slotStartRename(QListWidgetItem* item) { - m_quoteInEditing = true; - m_quoteSourceList->editItem(item); + Q_D(KSettingsOnlineQuotes); + d->m_quoteInEditing = true; + d->ui->m_quoteSourceList->editItem(item); } void KSettingsOnlineQuotes::slotEntryRenamed(QListWidgetItem* item) { + Q_D(KSettingsOnlineQuotes); //if there is no current item selected, exit - if (m_quoteInEditing == false || !m_quoteSourceList->currentItem() || item != m_quoteSourceList->currentItem()) + if (d->m_quoteInEditing == false || !d->ui->m_quoteSourceList->currentItem() || item != d->ui->m_quoteSourceList->currentItem()) return; - m_quoteInEditing = false; + d->m_quoteInEditing = false; QString text = item->text(); int nameCount = 0; - for (int i = 0; i < m_quoteSourceList->count(); ++i) { - if (m_quoteSourceList->item(i)->text() == text) + for (auto i = 0; i < d->ui->m_quoteSourceList->count(); ++i) { + if (d->ui->m_quoteSourceList->item(i)->text() == text) ++nameCount; } // Make sure we get a non-empty and unique name if (text.length() > 0 && nameCount == 1) { - m_currentItem.rename(text); + d->m_currentItem.rename(text); } else { - item->setText(m_currentItem.m_name); + item->setText(d->m_currentItem.m_name); } - m_quoteSourceList->sortItems(); - m_newButton->setEnabled(m_quoteSourceList->findItems(i18n("New Quote Source"), Qt::MatchExactly).count() == 0); + d->ui->m_quoteSourceList->sortItems(); + d->ui->m_newButton->setEnabled(d->ui->m_quoteSourceList->findItems(i18n("New Quote Source"), Qt::MatchExactly).count() == 0); } diff --git a/kmymoney/dialogs/settings/ksettingsonlinequotesdecl.ui b/kmymoney/dialogs/settings/ksettingsonlinequotes.ui rename from kmymoney/dialogs/settings/ksettingsonlinequotesdecl.ui rename to kmymoney/dialogs/settings/ksettingsonlinequotes.ui --- a/kmymoney/dialogs/settings/ksettingsonlinequotesdecl.ui +++ b/kmymoney/dialogs/settings/ksettingsonlinequotes.ui @@ -1,7 +1,7 @@ - KSettingsOnlineQuotesDecl - + KSettingsOnlineQuotes + 0 @@ -173,6 +173,12 @@ + + Create a new source entry for online quotes + + + Use this to create a new entry for online quotes + New @@ -180,6 +186,12 @@ + + Delete the selected source entry + + + Use this to delete the selected online source entry + Delete @@ -213,6 +225,12 @@ + + Accepts the entered data and stores it + + + Use this to accept the modified data. + Update diff --git a/kmymoney/dialogs/settings/ksettingsregister.h b/kmymoney/dialogs/settings/ksettingsregister.h --- a/kmymoney/dialogs/settings/ksettingsregister.h +++ b/kmymoney/dialogs/settings/ksettingsregister.h @@ -3,6 +3,7 @@ ------------------- copyright : (C) 2005 by Thomas Baumgart email : ipwizard@users.sourceforge.net + (C) 2017 by Łukasz Wojniłowicz ***************************************************************************/ /*************************************************************************** @@ -20,35 +21,33 @@ // ---------------------------------------------------------------------------- // QT Includes +#include + // ---------------------------------------------------------------------------- // KDE Includes // ---------------------------------------------------------------------------- // Project Includes -#include "ui_ksettingsregisterdecl.h" - -class KSettingsRegisterDecl : public QWidget, public Ui::KSettingsRegisterDecl -{ -public: - KSettingsRegisterDecl(QWidget *parent) : QWidget(parent) { - setupUi(this); - } -}; - +namespace Ui { class KSettingsRegister; } -class KSettingsRegister : public KSettingsRegisterDecl +class KSettingsRegister : public QWidget { Q_OBJECT + Q_DISABLE_COPY(KSettingsRegister) public: - KSettingsRegister(QWidget* parent = 0); + explicit KSettingsRegister(QWidget* parent = nullptr); ~KSettingsRegister(); protected slots: void slotLoadNormal(const QString& text); void slotLoadReconcile(const QString& text); void slotLoadSearch(const QString& text); + +private: + Ui::KSettingsRegister *ui; + }; #endif diff --git a/kmymoney/dialogs/settings/ksettingsregister.cpp b/kmymoney/dialogs/settings/ksettingsregister.cpp --- a/kmymoney/dialogs/settings/ksettingsregister.cpp +++ b/kmymoney/dialogs/settings/ksettingsregister.cpp @@ -3,6 +3,7 @@ -------------------- copyright : (C) 2005 by Thomas Baumgart email : ipwizard@users.sourceforge.net + (C) 2017 by Łukasz Wojniłowicz ***************************************************************************/ /*************************************************************************** @@ -27,47 +28,51 @@ // ---------------------------------------------------------------------------- // Project Includes +#include "ui_ksettingsregister.h" + KSettingsRegister::KSettingsRegister(QWidget* parent) : - KSettingsRegisterDecl(parent) + QWidget(parent), + ui(new Ui::KSettingsRegister) { - + ui->setupUi(this); // hide the internally used text fields - kcfg_sortNormalView->hide(); - kcfg_sortReconcileView->hide(); - kcfg_sortSearchView->hide(); + ui->kcfg_sortNormalView->hide(); + ui->kcfg_sortReconcileView->hide(); + ui->kcfg_sortSearchView->hide(); // setup connections, so that the sort optios get loaded once the edit fields are filled - connect(kcfg_sortNormalView, SIGNAL(textChanged(QString)), this, SLOT(slotLoadNormal(QString))); - connect(kcfg_sortReconcileView, SIGNAL(textChanged(QString)), this, SLOT(slotLoadReconcile(QString))); - connect(kcfg_sortSearchView, SIGNAL(textChanged(QString)), this, SLOT(slotLoadSearch(QString))); + connect(ui->kcfg_sortNormalView, &QLineEdit::textChanged, this, &KSettingsRegister::slotLoadNormal); + connect(ui->kcfg_sortReconcileView, &QLineEdit::textChanged, this, &KSettingsRegister::slotLoadReconcile); + connect(ui->kcfg_sortSearchView, &QLineEdit::textChanged, this, &KSettingsRegister::slotLoadSearch); // setup connections, so that changes by the user are forwarded to the (hidden) edit fields - connect(m_sortNormalView, SIGNAL(settingsChanged(QString)), kcfg_sortNormalView, SLOT(setText(QString))); - connect(m_sortReconcileView, SIGNAL(settingsChanged(QString)), kcfg_sortReconcileView, SLOT(setText(QString))); - connect(m_sortSearchView, SIGNAL(settingsChanged(QString)), kcfg_sortSearchView, SLOT(setText(QString))); + connect(ui->m_sortNormalView, &TransactionSortOption::settingsChanged, ui->kcfg_sortNormalView, &KLineEdit::setText); + connect(ui->m_sortReconcileView, &TransactionSortOption::settingsChanged, ui->kcfg_sortReconcileView, &KLineEdit::setText); + connect(ui->m_sortSearchView, &TransactionSortOption::settingsChanged, ui->kcfg_sortSearchView, &KLineEdit::setText); } KSettingsRegister::~KSettingsRegister() { + delete ui; } void KSettingsRegister::slotLoadNormal(const QString& text) { // only need this once - disconnect(kcfg_sortNormalView, SIGNAL(textChanged(QString)), this, SLOT(slotLoadNormal(QString))); - m_sortNormalView->setSettings(text); + disconnect(ui->kcfg_sortNormalView, &QLineEdit::textChanged, this, &KSettingsRegister::slotLoadNormal); + ui->m_sortNormalView->setSettings(text); } void KSettingsRegister::slotLoadReconcile(const QString& text) { // only need this once - disconnect(kcfg_sortReconcileView, SIGNAL(textChanged(QString)), this, SLOT(slotLoadReconcile(QString))); - m_sortReconcileView->setSettings(text); + disconnect(ui->kcfg_sortReconcileView, &QLineEdit::textChanged, this, &KSettingsRegister::slotLoadReconcile); + ui->m_sortReconcileView->setSettings(text); } void KSettingsRegister::slotLoadSearch(const QString& text) { // only need this once - disconnect(kcfg_sortSearchView, SIGNAL(textChanged(QString)), this, SLOT(slotLoadSearch(QString))); - m_sortSearchView->setSettings(text); + disconnect(ui->kcfg_sortSearchView, &QLineEdit::textChanged, this, &KSettingsRegister::slotLoadSearch); + ui->m_sortSearchView->setSettings(text); } diff --git a/kmymoney/dialogs/settings/ksettingsregisterdecl.ui b/kmymoney/dialogs/settings/ksettingsregister.ui rename from kmymoney/dialogs/settings/ksettingsregisterdecl.ui rename to kmymoney/dialogs/settings/ksettingsregister.ui --- a/kmymoney/dialogs/settings/ksettingsregisterdecl.ui +++ b/kmymoney/dialogs/settings/ksettingsregister.ui @@ -3,8 +3,8 @@ - KSettingsRegisterDecl - + KSettingsRegister + 0 diff --git a/kmymoney/dialogs/settings/ksettingsreports.h b/kmymoney/dialogs/settings/ksettingsreports.h --- a/kmymoney/dialogs/settings/ksettingsreports.h +++ b/kmymoney/dialogs/settings/ksettingsreports.h @@ -3,6 +3,7 @@ ------------------- copyright : (C) 2010 by Bernd Gonsior email : bernd.gonsior@googlemail.com + (C) 2017 by Łukasz Wojniłowicz ***************************************************************************/ /*************************************************************************** @@ -28,22 +29,14 @@ // ---------------------------------------------------------------------------- // Project Includes -#include "ui_ksettingsreportsdecl.h" - -class KSettingsReportsDecl : public QWidget, public Ui::KSettingsReportsDecl -{ -public: - KSettingsReportsDecl(QWidget *parent) : QWidget(parent) { - setupUi(this); - } -}; - -class KSettingsReports : public KSettingsReportsDecl +class KSettingsReportsPrivate; +class KSettingsReports : public QWidget { Q_OBJECT + Q_DISABLE_COPY(KSettingsReports) public: - KSettingsReports(QWidget* parent = 0); + explicit KSettingsReports(QWidget* parent = nullptr); ~KSettingsReports(); protected slots: @@ -51,10 +44,7 @@ void slotEditingFinished(); private: - /// \internal d-pointer class. - class Private; - /// \internal d-pointer instance. - Private* const d; - + KSettingsReportsPrivate * const d_ptr; + Q_DECLARE_PRIVATE(KSettingsReports) }; #endif diff --git a/kmymoney/dialogs/settings/ksettingsreports.cpp b/kmymoney/dialogs/settings/ksettingsreports.cpp --- a/kmymoney/dialogs/settings/ksettingsreports.cpp +++ b/kmymoney/dialogs/settings/ksettingsreports.cpp @@ -3,6 +3,7 @@ -------------------- copyright : (C) 2010 by Bernd Gonsior email : bernd.gonsior@googlemail.com + (C) 2017 by Łukasz Wojniłowicz ***************************************************************************/ /*************************************************************************** @@ -32,15 +33,26 @@ // ---------------------------------------------------------------------------- // Project Includes +#include "ui_ksettingsreports.h" + #include "kmymoneyglobalsettings.h" -class KSettingsReports::Private +class KSettingsReportsPrivate { + Q_DISABLE_COPY(KSettingsReportsPrivate) + public: + KSettingsReportsPrivate() : + ui(new Ui::KSettingsReports), + m_fileKLineEdit(nullptr) + { + } - Private() : m_fileKLineEdit(0) {} + ~KSettingsReportsPrivate() + { + delete ui; + } - ~Private() {} /** * Collector for both signals @@ -101,6 +113,7 @@ KMessageBox::sorry(0, out); } + Ui::KSettingsReports *ui; /** * Old value of css file to avoid warnings * when a signal is emitted @@ -116,27 +129,30 @@ }; KSettingsReports::KSettingsReports(QWidget* parent) : - KSettingsReportsDecl(parent), - d(new Private) + QWidget(parent), + d_ptr(new KSettingsReportsPrivate) { + Q_D(KSettingsReports); + d->ui->setupUi(this); // keep initial (default) css file in mind d->m_cssFileOld = KMyMoneyGlobalSettings::cssFileDefault(); // set default css file in ksettingsreports dialog - kcfg_CssFileDefault->setUrl(QUrl::fromLocalFile(KMyMoneyGlobalSettings::cssFileDefault())); + d->ui->kcfg_CssFileDefault->setUrl(QUrl::fromLocalFile(KMyMoneyGlobalSettings::cssFileDefault())); - d->m_fileKLineEdit = kcfg_CssFileDefault->lineEdit(); + d->m_fileKLineEdit = d->ui->kcfg_CssFileDefault->lineEdit(); - connect(kcfg_CssFileDefault, SIGNAL(urlSelected(QUrl)), - this, SLOT(slotCssUrlSelected(QUrl))); + connect(d->ui->kcfg_CssFileDefault, &KUrlRequester::urlSelected, + this, &KSettingsReports::slotCssUrlSelected); - connect(d->m_fileKLineEdit, SIGNAL(editingFinished()), - this, SLOT(slotEditingFinished())); + connect(d->m_fileKLineEdit, &QLineEdit::editingFinished, + this, &KSettingsReports::slotEditingFinished); } KSettingsReports::~KSettingsReports() { + Q_D(KSettingsReports); delete d; } @@ -152,7 +168,8 @@ */ void KSettingsReports::slotCssUrlSelected(const QUrl &cssUrl) { - QString css = cssUrl.toLocalFile(); + Q_D(KSettingsReports); + auto css = cssUrl.toLocalFile(); d->checkCssFile(css); } @@ -167,6 +184,7 @@ */ void KSettingsReports::slotEditingFinished() { - QString txt = d->m_fileKLineEdit->text(); + Q_D(KSettingsReports); + auto txt = d->m_fileKLineEdit->text(); d->checkCssFile(txt); } diff --git a/kmymoney/dialogs/settings/ksettingsreportsdecl.ui b/kmymoney/dialogs/settings/ksettingsreports.ui rename from kmymoney/dialogs/settings/ksettingsreportsdecl.ui rename to kmymoney/dialogs/settings/ksettingsreports.ui --- a/kmymoney/dialogs/settings/ksettingsreportsdecl.ui +++ b/kmymoney/dialogs/settings/ksettingsreports.ui @@ -1,7 +1,7 @@ - KSettingsReportsDecl - + KSettingsReports + 0 diff --git a/kmymoney/dialogs/settings/ksettingsschedules.h b/kmymoney/dialogs/settings/ksettingsschedules.h --- a/kmymoney/dialogs/settings/ksettingsschedules.h +++ b/kmymoney/dialogs/settings/ksettingsschedules.h @@ -3,6 +3,7 @@ ------------------- copyright : (C) 2005 by Thomas Baumgart email : ipwizard@users.sourceforge.net + (C) 2017 by Łukasz Wojniłowicz ***************************************************************************/ /*************************************************************************** @@ -20,30 +21,22 @@ // ---------------------------------------------------------------------------- // QT Includes +#include + // ---------------------------------------------------------------------------- // KDE Includes - // ---------------------------------------------------------------------------- // Project Includes -#include "ui_ksettingsschedulesdecl.h" - -class KSettingsSchedulesDecl : public QWidget, public Ui::KSettingsSchedulesDecl -{ -public: - KSettingsSchedulesDecl(QWidget *parent) : QWidget(parent) { - setupUi(this); - } -}; - - -class KSettingsSchedules : public KSettingsSchedulesDecl +class KSettingsSchedulesPrivate; +class KSettingsSchedules : public QWidget { Q_OBJECT + Q_DISABLE_COPY(KSettingsSchedules) public: - KSettingsSchedules(QWidget* parent = 0); + explicit KSettingsSchedules(QWidget* parent = nullptr); ~KSettingsSchedules(); public slots: @@ -57,7 +50,8 @@ void loadList(); private: - QMap m_regionMap; + KSettingsSchedulesPrivate * const d_ptr; + Q_DECLARE_PRIVATE(KSettingsSchedules) }; #endif diff --git a/kmymoney/dialogs/settings/ksettingsschedules.cpp b/kmymoney/dialogs/settings/ksettingsschedules.cpp --- a/kmymoney/dialogs/settings/ksettingsschedules.cpp +++ b/kmymoney/dialogs/settings/ksettingsschedules.cpp @@ -3,6 +3,7 @@ -------------------- copyright : (C) 2005 by Thomas Baumgart email : ipwizard@users.sourceforge.net + (C) 2017 by Łukasz Wojniłowicz ***************************************************************************/ /*************************************************************************** @@ -34,25 +35,55 @@ // ---------------------------------------------------------------------------- // Project Includes -#include "kmymoney/kmymoneyglobalsettings.h" +#include "ui_ksettingsschedules.h" + + +class KSettingsSchedulesPrivate +{ + Q_DISABLE_COPY(KSettingsSchedulesPrivate) + +public: + KSettingsSchedulesPrivate() : + ui(new Ui::KSettingsSchedules) + { + } + + ~KSettingsSchedulesPrivate() + { + delete ui; + } + + Ui::KSettingsSchedules *ui; + QMap m_regionMap; +}; KSettingsSchedules::KSettingsSchedules(QWidget* parent) : - KSettingsSchedulesDecl(parent) + QWidget(parent), + d_ptr(new KSettingsSchedulesPrivate) { + Q_D(KSettingsSchedules); + d->ui->setupUi(this); // hide the internally used holidayRegion field - kcfg_HolidayRegion->hide(); + d->ui->kcfg_HolidayRegion->hide(); loadList(); // setup connections so that region gets selected once field is filled - connect(kcfg_HolidayRegion, SIGNAL(textChanged(QString)), this, SLOT(slotLoadRegion(QString))); + connect(d->ui->kcfg_HolidayRegion, &QLineEdit::textChanged, this, &KSettingsSchedules::slotLoadRegion); // setup connections so that changes are forwarded to the field - connect(m_holidayRegion, SIGNAL(currentIndexChanged(QString)), this, SLOT(slotSetRegion(QString))); + connect(d->ui->m_holidayRegion, static_cast(&QComboBox::currentIndexChanged), this, &KSettingsSchedules::slotSetRegion); +} + +KSettingsSchedules::~KSettingsSchedules() +{ + Q_D(KSettingsSchedules); + delete d; } void KSettingsSchedules::loadList() { + Q_D(KSettingsSchedules); QStringList regions; #ifdef KF5Holidays_FOUND QStringList regionCodes = HolidayRegion::regionCodes(); @@ -62,40 +93,39 @@ QLocale langLocale(HolidayRegion::languageCode(regionCode)); QString languageName = QLocale().languageToString(langLocale.language()); QString region = languageName.isEmpty() ? regionName : i18nc("Holiday region (region language)", "%1 (%2)", regionName, languageName); - m_regionMap[region] = regionCode; + d->m_regionMap[region] = regionCode; regions << region; } regions.sort(); #endif - m_regionMap[m_holidayRegion->itemText(0)] = ""; - m_holidayRegion->insertItems(1, regions); + d->m_regionMap[d->ui->m_holidayRegion->itemText(0)] = QString(); + d->ui->m_holidayRegion->insertItems(1, regions); } void KSettingsSchedules::slotSetRegion(const QString ®ion) { - kcfg_HolidayRegion->setText(m_regionMap[region]); + Q_D(KSettingsSchedules); + d->ui->kcfg_HolidayRegion->setText(d->m_regionMap[region]); } void KSettingsSchedules::slotLoadRegion(const QString ®ion) { + Q_D(KSettingsSchedules); // only need this once - disconnect(kcfg_HolidayRegion, &KLineEdit::textChanged, this, &KSettingsSchedules::slotLoadRegion); - int i = 0; + disconnect(d->ui->kcfg_HolidayRegion, &KLineEdit::textChanged, this, &KSettingsSchedules::slotLoadRegion); + auto i = 0; if (!region.isEmpty()) - i = m_holidayRegion->findText(m_regionMap.key(region)); - if ((i > -1) && (i != m_holidayRegion->currentIndex())) { - m_holidayRegion->blockSignals(true); - m_holidayRegion->setCurrentIndex(i); - m_holidayRegion->blockSignals(false); + i = d->ui->m_holidayRegion->findText(d->m_regionMap.key(region)); + if ((i > -1) && (i != d->ui->m_holidayRegion->currentIndex())) { + d->ui->m_holidayRegion->blockSignals(true); + d->ui->m_holidayRegion->setCurrentIndex(i); + d->ui->m_holidayRegion->blockSignals(false); } } void KSettingsSchedules::slotResetRegion() { - slotLoadRegion(kcfg_HolidayRegion->text()); -} - -KSettingsSchedules::~KSettingsSchedules() -{ + Q_D(KSettingsSchedules); + slotLoadRegion(d->ui->kcfg_HolidayRegion->text()); } diff --git a/kmymoney/dialogs/settings/ksettingsschedulesdecl.ui b/kmymoney/dialogs/settings/ksettingsschedules.ui rename from kmymoney/dialogs/settings/ksettingsschedulesdecl.ui rename to kmymoney/dialogs/settings/ksettingsschedules.ui --- a/kmymoney/dialogs/settings/ksettingsschedulesdecl.ui +++ b/kmymoney/dialogs/settings/ksettingsschedules.ui @@ -3,8 +3,8 @@ - KSettingsSchedulesDecl - + KSettingsSchedules + 0 diff --git a/kmymoney/dialogs/splitadjustdialog.h b/kmymoney/dialogs/splitadjustdialog.h --- a/kmymoney/dialogs/splitadjustdialog.h +++ b/kmymoney/dialogs/splitadjustdialog.h @@ -4,6 +4,7 @@ begin : Sat Jul 23 2016 copyright : (C) 2016 by Thomas Baumgart email : Thomas Baumgart + (C) 2017 by Łukasz Wojniłowicz ***************************************************************************/ /*************************************************************************** @@ -47,4 +48,4 @@ QScopedPointer d; }; -#endif // SPLITADJUSTDIALOG_H \ No newline at end of file +#endif // SPLITADJUSTDIALOG_H diff --git a/kmymoney/dialogs/splitadjustdialog.cpp b/kmymoney/dialogs/splitadjustdialog.cpp --- a/kmymoney/dialogs/splitadjustdialog.cpp +++ b/kmymoney/dialogs/splitadjustdialog.cpp @@ -4,6 +4,7 @@ begin : Sat Jul 23 2016 copyright : (C) 2016 by Thomas Baumgart email : Thomas Baumgart + (C) 2017 by Łukasz Wojniłowicz ***************************************************************************/ /*************************************************************************** diff --git a/kmymoney/dialogs/stdtransactioneditor.h b/kmymoney/dialogs/stdtransactioneditor.h new file mode 100644 --- /dev/null +++ b/kmymoney/dialogs/stdtransactioneditor.h @@ -0,0 +1,162 @@ +/*************************************************************************** + stdtransactioneditor.h + ---------- + begin : Wed Jun 07 2006 + copyright : (C) 2006 by Thomas Baumgart + email : Thomas Baumgart + (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 STDTRANSACTIONEDITOR_H +#define STDTRANSACTIONEDITOR_H + +// ---------------------------------------------------------------------------- +// QT Includes + +// ---------------------------------------------------------------------------- +// KDE Includes + +// ---------------------------------------------------------------------------- +// Project Includes + +#include "transactioneditor.h" + +class MyMoneyMoney; + +namespace KMyMoneyRegister { enum CashFlowDirection : int; } + +class StdTransactionEditorPrivate; +class StdTransactionEditor : public TransactionEditor +{ + Q_OBJECT +public: + StdTransactionEditor(); + explicit StdTransactionEditor(TransactionEditorContainer* regForm, + KMyMoneyRegister::Transaction* item, + const KMyMoneyRegister::SelectedTransactions& list, + const QDate& lastPostDate); + ~StdTransactionEditor() override; + + bool isComplete(QString& reason) const override; + QWidget* firstWidget() const override; + + /** + * This method creates a transaction based on the contents of the current widgets, + * the splits in m_split in single selection mode or an existing transaction/split + * and the contents of the widgets in multi selection mode. + * + * The split referencing the current account is returned as the first split in the + * transaction's split list. + * + * @param t reference to created transaction + * @param torig the original transaction + * @param sorig the original split + * @param skipPriceDialog if @p true the user will not be requested for price information + * (defaults to @p false) + * + * @return @p false if aborted by user, @p true otherwise + * + * @note Usually not used directly. If unsure, use enterTransactions() instead. + */ + bool createTransaction(MyMoneyTransaction& t, + const MyMoneyTransaction& torig, + const MyMoneySplit& sorig, + bool skipPriceDialog = false) override; + +public slots: + int slotEditSplits() override; + void slotUpdateAmount(const QString&); + +protected slots: + void slotReloadEditWidgets(); + void slotUpdatePayment(const QString&); + void slotUpdateDeposit(const QString&); + void slotUpdateCategory(const QString&); + void slotUpdatePayee(const QString&); + //void slotUpdateTag(const QString&); + void slotUpdateCashFlow(KMyMoneyRegister::CashFlowDirection); + void slotCreateCategory(const QString&, QString&); + void slotUpdateAction(int action); + void slotUpdateAccount(const QString& id) override; + +protected: + /** + * This method creates all necessary widgets for this transaction editor. + * All signals will be connected to the relevant slots. + */ + void createEditWidgets() override; + + /** + * This method (re-)loads the widgets with the transaction information + * contained in @a m_transaction and @a m_split. + * + * @param action preset the edit wigdets for @a action if no transaction + * is present + */ + void loadEditWidgets(KMyMoneyRegister::Action action) override; + void loadEditWidgets() override; + + void setupCategoryWidget(QString&); + void updateAmount(const MyMoneyMoney& value); + bool isTransfer(const QString& accId1, const QString& accId2) const; + + void checkPayeeInSplit(MyMoneySplit& s, const QString& payeeId); + + /** + * This method fills the editor widgets with the last transaction + * that can be found for payee @a payeeId in the account @a m_account. + */ + void autoFill(const QString& payeeId); + + /** + * Extracts the amount of the transaction from the widgets depending + * if form or register based input method is used. + * Returns if an amount has been found in @a update. + * + * @param update pointer to update information flag + * @return amount of transaction (deposit positive, payment negative) + */ + MyMoneyMoney amountFromWidget(bool* update = 0) const; + + /** + * Create or update a VAT split + */ + void updateVAT(bool amountChanged = true); + + MyMoneyMoney removeVatSplit(); + + /** + * This method adds a VAT split to transaction @a tr if necessary. + * + * @param tr transaction that the split should be added to + * @param amount Amount to be used for the calculation. Depending upon the + * setting of the resp. category, this value is treated as + * either gross or net value. + * @retval false VAT split has not been added + * @retval true VAT split has been added + */ + bool addVatSplit(MyMoneyTransaction& tr, const MyMoneyMoney& amount); + + void setupFinalWidgets() override; + + /** + * This method returns the sum of all splits of transaction @a t that + * reference account m_account. + */ + MyMoneyMoney shares(const MyMoneyTransaction& t) const; + +private: + Q_DECLARE_PRIVATE(StdTransactionEditor) +}; + + +#endif diff --git a/kmymoney/dialogs/stdtransactioneditor.cpp b/kmymoney/dialogs/stdtransactioneditor.cpp new file mode 100644 --- /dev/null +++ b/kmymoney/dialogs/stdtransactioneditor.cpp @@ -0,0 +1,1614 @@ +/*************************************************************************** + stdtransactioneditor.cpp + ---------- + begin : Wed Jun 07 2006 + copyright : (C) 2006 by Thomas Baumgart + email : Thomas Baumgart + (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. * + * * + ***************************************************************************/ + +#include "stdtransactioneditor.h" +#include "transactioneditor_p.h" + +// ---------------------------------------------------------------------------- +// QT Includes + +#include +#include +#include +#include + +// ---------------------------------------------------------------------------- +// KDE Includes + +#include +#include +#include +#include + +// ---------------------------------------------------------------------------- +// Project Includes + +#include "kmymoneycategory.h" +#include "kmymoneymvccombo.h" +#include "kmymoneydateinput.h" +#include "kmymoneyedit.h" +#include "kmymoneylineedit.h" +#include "kmymoneyaccountselector.h" +#include "mymoneyfile.h" +#include "mymoneypayee.h" +#include "mymoneytag.h" +#include "kmymoneyutils.h" +#include "kmymoneycompletion.h" +#include "transactionform.h" +#include "kmymoneyglobalsettings.h" +#include "transactioneditorcontainer.h" + +#include "ksplittransactiondlg.h" +#include "kcurrencycalculator.h" +#include "kselecttransactionsdlg.h" + +using namespace KMyMoneyRegister; +using namespace KMyMoneyTransactionForm; + +class StdTransactionEditorPrivate : public TransactionEditorPrivate +{ + Q_DISABLE_COPY(StdTransactionEditorPrivate) + +public: + StdTransactionEditorPrivate(StdTransactionEditor *qq) : + TransactionEditorPrivate(qq), + m_inUpdateVat(false) + { + } + + ~StdTransactionEditorPrivate() + { + } + + MyMoneyMoney m_shares; + bool m_inUpdateVat; +}; + +StdTransactionEditor::StdTransactionEditor() : + TransactionEditor(*new StdTransactionEditorPrivate(this)) +{ +} + +StdTransactionEditor::StdTransactionEditor(TransactionEditorContainer* regForm, + KMyMoneyRegister::Transaction* item, + const KMyMoneyRegister::SelectedTransactions& list, + const QDate& lastPostDate) : + TransactionEditor(*new StdTransactionEditorPrivate(this), + regForm, + item, + list, + lastPostDate) +{ +} + +StdTransactionEditor::~StdTransactionEditor() +{ +} + +void StdTransactionEditor::createEditWidgets() +{ + Q_D(StdTransactionEditor); + // we only create the account widget in case it is needed + // to avoid confusion in the tab order later on. + if (d->m_item->showRowInForm(0)) { + auto account = new KMyMoneyCategory; + account->setPlaceholderText(i18n("Account")); + account->setObjectName(QLatin1String("Account")); + d->m_editWidgets["account"] = account; + connect(account, &QComboBox::editTextChanged, this, &StdTransactionEditor::slotUpdateButtonState); + connect(account, &KMyMoneyCombo::itemSelected, this, &StdTransactionEditor::slotUpdateAccount); + } + + auto payee = new KMyMoneyPayeeCombo; + payee->setPlaceholderText(i18n("Payer/Receiver")); + payee->setObjectName(QLatin1String("Payee")); + d->m_editWidgets["payee"] = payee; + + connect(payee, &KMyMoneyMVCCombo::createItem, this, &TransactionEditor::createPayee); + connect(payee, &KMyMoneyMVCCombo::objectCreation, this, &TransactionEditor::objectCreation); + connect(payee, &KMyMoneyMVCCombo::itemSelected, this, &StdTransactionEditor::slotUpdatePayee); + connect(payee, &QComboBox::editTextChanged, this, &StdTransactionEditor::slotUpdateButtonState); + + auto category = new KMyMoneyCategory(0, true); + category->setPlaceholderText(i18n("Category/Account")); + category->setObjectName(QLatin1String("Category/Account")); + d->m_editWidgets["category"] = category; + connect(category, &KMyMoneyCombo::itemSelected, this, &StdTransactionEditor::slotUpdateCategory); + connect(category, &QComboBox::editTextChanged, this, &StdTransactionEditor::slotUpdateButtonState); + connect(category, &KMyMoneyCombo::createItem, this, &StdTransactionEditor::slotCreateCategory); + connect(category, &KMyMoneyCombo::objectCreation, this, &TransactionEditor::objectCreation); + connect(category->splitButton(), &QAbstractButton::clicked, this, &StdTransactionEditor::slotEditSplits); + // initially disable the split button since we don't have an account set + if (category->splitButton()) + category->splitButton()->setDisabled(d->m_account.id().isEmpty()); + + auto tag = new KTagContainer; + tag->tagCombo()->setPlaceholderText(i18n("Tag")); + tag->tagCombo()->setObjectName(QLatin1String("Tag")); + d->m_editWidgets["tag"] = tag; + connect(tag->tagCombo(), &KMyMoneyMVCCombo::createItem, this, &TransactionEditor::createTag); + connect(tag->tagCombo(), &KMyMoneyMVCCombo::objectCreation, this, &TransactionEditor::objectCreation); + + auto memo = new KTextEdit; + memo->setObjectName(QLatin1String("Memo")); + memo->setTabChangesFocus(true); + connect(memo, &QTextEdit::textChanged, this, &StdTransactionEditor::slotUpdateMemoState); + connect(memo, &QTextEdit::textChanged, this, &StdTransactionEditor::slotUpdateButtonState); + d->m_editWidgets["memo"] = memo; + d->m_memoText.clear(); + d->m_memoChanged = false; + + bool showNumberField = true; + switch (d->m_account.accountType()) { + case eMyMoney::Account::Savings: + case eMyMoney::Account::Cash: + case eMyMoney::Account::Loan: + case eMyMoney::Account::AssetLoan: + case eMyMoney::Account::Asset: + case eMyMoney::Account::Liability: + case eMyMoney::Account::Equity: + showNumberField = KMyMoneyGlobalSettings::alwaysShowNrField(); + break; + + case eMyMoney::Account::Income: + case eMyMoney::Account::Expense: + showNumberField = false; + break; + + default: + break; + } + + if (showNumberField) { + auto number = new kMyMoneyLineEdit; + number->setPlaceholderText(i18n("Number")); + number->setObjectName(QLatin1String("Number")); + d->m_editWidgets["number"] = number; + connect(number, &kMyMoneyLineEdit::lineChanged, this, &StdTransactionEditor::slotNumberChanged); + // number->installEventFilter(this); + } + + auto postDate = new kMyMoneyDateInput; + d->m_editWidgets["postdate"] = postDate; + postDate->setObjectName(QLatin1String("PostDate")); + connect(postDate, &kMyMoneyDateInput::dateChanged, this, &StdTransactionEditor::slotUpdateButtonState); + postDate->setDate(QDate()); + + auto value = new kMyMoneyEdit; + d->m_editWidgets["amount"] = value; + value->setObjectName(QLatin1String("Amount")); + value->setResetButtonVisible(false); + connect(value, &kMyMoneyEdit::valueChanged, this, &StdTransactionEditor::slotUpdateAmount); + connect(value, &kMyMoneyEdit::textChanged, this, &StdTransactionEditor::slotUpdateButtonState); + + value = new kMyMoneyEdit; + d->m_editWidgets["payment"] = value; + value->setObjectName(QLatin1String("Payment")); + value->setResetButtonVisible(false); + connect(value, &kMyMoneyEdit::valueChanged, this, &StdTransactionEditor::slotUpdatePayment); + connect(value, &kMyMoneyEdit::textChanged, this, &StdTransactionEditor::slotUpdateButtonState); + + value = new kMyMoneyEdit; + d->m_editWidgets["deposit"] = value; + value->setObjectName(QLatin1String("Deposit")); + value->setResetButtonVisible(false); + connect(value, &kMyMoneyEdit::valueChanged, this, &StdTransactionEditor::slotUpdateDeposit); + connect(value, &kMyMoneyEdit::textChanged, this, &StdTransactionEditor::slotUpdateButtonState); + + auto cashflow = new KMyMoneyCashFlowCombo(0, d->m_account.accountGroup()); + d->m_editWidgets["cashflow"] = cashflow; + cashflow->setObjectName(QLatin1String("Cashflow")); + connect(cashflow, &KMyMoneyCashFlowCombo::directionSelected, this, &StdTransactionEditor::slotUpdateCashFlow); + + auto reconcile = new KMyMoneyReconcileCombo; + d->m_editWidgets["status"] = reconcile; + reconcile->setObjectName(QLatin1String("Reconcile")); + + KMyMoneyRegister::QWidgetContainer::iterator it_w; + for (it_w = d->m_editWidgets.begin(); it_w != d->m_editWidgets.end(); ++it_w) { + (*it_w)->installEventFilter(this); + } + // 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 (!isMultiSelection()) { + reconcile->removeDontCare(); + cashflow->removeDontCare(); + } + + QLabel* label; + d->m_editWidgets["account-label"] = label = new QLabel(i18n("Account")); + label->setAlignment(Qt::AlignVCenter); + + d->m_editWidgets["category-label"] = label = new QLabel(i18n("Category")); + label->setAlignment(Qt::AlignVCenter); + + d->m_editWidgets["tag-label"] = label = new QLabel(i18n("Tags")); + label->setAlignment(Qt::AlignVCenter); + + d->m_editWidgets["memo-label"] = label = new QLabel(i18n("Memo")); + label->setAlignment(Qt::AlignVCenter); + + d->m_editWidgets["number-label"] = label = new QLabel(i18n("Number")); + label->setAlignment(Qt::AlignVCenter); + + d->m_editWidgets["date-label"] = label = new QLabel(i18n("Date")); + label->setAlignment(Qt::AlignVCenter); + + d->m_editWidgets["amount-label"] = label = new QLabel(i18n("Amount")); + label->setAlignment(Qt::AlignVCenter); + + d->m_editWidgets["status-label"] = label = new QLabel(i18n("Status")); + label->setAlignment(Qt::AlignVCenter); + + // create a copy of tabbar above the form (if we are created for a form) + KMyMoneyTransactionForm::TransactionForm* form = dynamic_cast(d->m_regForm); + if (form) { + KMyMoneyTransactionForm::TabBar* tabbar = new KMyMoneyTransactionForm::TabBar; + d->m_editWidgets["tabbar"] = tabbar; + tabbar->setObjectName(QLatin1String("TabBar")); + tabbar->copyTabs(form->tabBar()); + connect(tabbar, &TabBar::tabCurrentChanged, this, &StdTransactionEditor::slotUpdateAction); + connect(tabbar, &TabBar::tabCurrentChanged, this, &TransactionEditor::operationTypeChanged); + } + + setupPrecision(); +} + +void StdTransactionEditor::setupCategoryWidget(QString& categoryId) +{ + Q_D(StdTransactionEditor); + TransactionEditor::setupCategoryWidget(dynamic_cast(d->m_editWidgets["category"]), d->m_splits, categoryId, SLOT(slotEditSplits())); + + if (d->m_splits.count() == 1) + d->m_shares = d->m_splits[0].shares(); +} + +bool StdTransactionEditor::isTransfer(const QString& accId1, const QString& accId2) const +{ + if (accId1.isEmpty() || accId2.isEmpty()) + return false; + + return MyMoneyFile::instance()->account(accId1).isIncomeExpense() == MyMoneyFile::instance()->account(accId2).isIncomeExpense(); +} + +void StdTransactionEditor::loadEditWidgets(KMyMoneyRegister::Action action) +{ + Q_D(StdTransactionEditor); + // don't kick off VAT processing from here + d->m_inUpdateVat = true; + + QMap::const_iterator it_w; + QWidget* w; + AccountSet aSet; + + // load the account widget + KMyMoneyCategory* account = dynamic_cast(haveWidget("account")); + if (account) { + aSet.addAccountGroup(eMyMoney::Account::Asset); + aSet.addAccountGroup(eMyMoney::Account::Liability); + aSet.removeAccountType(eMyMoney::Account::AssetLoan); + aSet.removeAccountType(eMyMoney::Account::CertificateDep); + aSet.removeAccountType(eMyMoney::Account::Investment); + aSet.removeAccountType(eMyMoney::Account::Stock); + aSet.removeAccountType(eMyMoney::Account::MoneyMarket); + aSet.removeAccountType(eMyMoney::Account::Loan); + aSet.load(account->selector()); + account->completion()->setSelected(d->m_account.id()); + account->slotItemSelected(d->m_account.id()); + } + + // load the payee widget + auto payee = dynamic_cast(d->m_editWidgets["payee"]); + payee->loadPayees(MyMoneyFile::instance()->payeeList()); + + // load the category widget + auto category = dynamic_cast(d->m_editWidgets["category"]); + disconnect(category, &KMyMoneyCategory::focusIn, this, &StdTransactionEditor::slotEditSplits); + + // load the tag widget + //auto tag = dynamic_cast(m_editWidgets["tag"]); + auto tag = dynamic_cast(d->m_editWidgets["tag"]); + tag->loadTags(MyMoneyFile::instance()->tagList()); + + // check if the current transaction has a reference to an equity account + bool haveEquityAccount = false; + QList::const_iterator 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) + haveEquityAccount = true; + } + + aSet.clear(); + aSet.addAccountGroup(eMyMoney::Account::Asset); + aSet.addAccountGroup(eMyMoney::Account::Liability); + aSet.addAccountGroup(eMyMoney::Account::Income); + aSet.addAccountGroup(eMyMoney::Account::Expense); + if (KMyMoneyGlobalSettings::expertMode() || haveEquityAccount) + aSet.addAccountGroup(eMyMoney::Account::Equity); + + aSet.removeAccountType(eMyMoney::Account::CertificateDep); + aSet.removeAccountType(eMyMoney::Account::Investment); + aSet.removeAccountType(eMyMoney::Account::Stock); + aSet.removeAccountType(eMyMoney::Account::MoneyMarket); + aSet.load(category->selector()); + + // if an account is specified then remove it from the widget so that the user + // cannot create a transfer with from and to account being the same account + if (!d->m_account.id().isEmpty()) + category->selector()->removeItem(d->m_account.id()); + + // also show memo text if isMultiSelection() + dynamic_cast(d->m_editWidgets["memo"])->setText(d->m_split.memo()); + // need to know if it changed + d->m_memoText = d->m_split.memo(); + d->m_memoChanged = false; + + if (!isMultiSelection()) { + if (d->m_transaction.postDate().isValid()) + dynamic_cast(d->m_editWidgets["postdate"])->setDate(d->m_transaction.postDate()); + else if (d->m_lastPostDate.isValid()) + dynamic_cast(d->m_editWidgets["postdate"])->setDate(d->m_lastPostDate); + else + dynamic_cast(d->m_editWidgets["postdate"])->setDate(QDate::currentDate()); + + if ((w = haveWidget("number")) != 0) { + dynamic_cast(w)->loadText(d->m_split.number()); + if (d->m_transaction.id().isEmpty() // new transaction + && dynamic_cast(w)->text().isEmpty() // no number filled in + && d->m_account.accountType() == eMyMoney::Account::Checkings // checkings account + && KMyMoneyGlobalSettings::autoIncCheckNumber() // and auto inc number turned on? + && action != KMyMoneyRegister::ActionDeposit // only transfers or withdrawals + && d->m_paymentMethod == eMyMoney::Schedule::PaymentType::WriteChecque) {// only for WriteChecque + assignNextNumber(); + } + } + dynamic_cast(d->m_editWidgets["status"])->setState(d->m_split.reconcileFlag()); + + QString payeeId = d->m_split.payeeId(); + if (!payeeId.isEmpty()) { + payee->setSelectedItem(payeeId); + } + QList t = d->m_split.tagIdList(); + if (!t.isEmpty()) { + for (auto i = 0; i < t.size(); i++) + tag->addTagWidget(t[i]); + } + + d->m_splits.clear(); + if (d->m_transaction.splitCount() < 2) { + category->completion()->setSelected(QString()); + } else { + QList::const_iterator it_s; + for (it_s = d->m_transaction.splits().constBegin(); it_s != d->m_transaction.splits().constEnd(); ++it_s) { + if ((*it_s) == d->m_split) + continue; + d->m_splits.append(*it_s); + } + } + QString categoryId; + setupCategoryWidget(categoryId); + + if ((w = haveWidget("cashflow")) != 0) { + KMyMoneyCashFlowCombo* cashflow = dynamic_cast(w); + cashflow->setDirection(!d->m_split.value().isPositive() ? KMyMoneyRegister::Payment : KMyMoneyRegister::Deposit); // include isZero case + } + + if ((w = haveWidget("category-label")) != 0) { + QLabel *categoryLabel = dynamic_cast(w); + if (isTransfer(d->m_split.accountId(), categoryId)) { + if (d->m_split.value().isPositive()) + categoryLabel->setText(i18n("Transfer from")); + else + categoryLabel->setText(i18n("Transfer to")); + } + } + + MyMoneyMoney value = d->m_split.shares(); + + if (haveWidget("deposit")) { + if (d->m_split.shares().isNegative()) { + dynamic_cast(d->m_editWidgets["deposit"])->loadText(""); + dynamic_cast(d->m_editWidgets["payment"])->setValue(value.abs()); + } else { + dynamic_cast(d->m_editWidgets["deposit"])->setValue(value.abs()); + dynamic_cast(d->m_editWidgets["payment"])->loadText(""); + } + } + if ((w = haveWidget("amount")) != 0) { + dynamic_cast(w)->setValue(value.abs()); + } + + slotUpdateCategory(categoryId); + + // try to preset for specific action if a new transaction is being started + if (d->m_transaction.id().isEmpty()) { + if ((w = haveWidget("category-label")) != 0) { + TabBar* tabbar = dynamic_cast(haveWidget("tabbar")); + if (action == KMyMoneyRegister::ActionNone) { + if (tabbar) { + action = static_cast(tabbar->currentIndex()); + } + } + if (action != KMyMoneyRegister::ActionNone) { + QLabel *categoryLabel = dynamic_cast(w); + if (action == KMyMoneyRegister::ActionTransfer) { + if (d->m_split.value().isPositive()) + categoryLabel->setText(i18n("Transfer from")); + else + categoryLabel->setText(i18n("Transfer to")); + } + if ((w = haveWidget("cashflow")) != 0) { + KMyMoneyCashFlowCombo* cashflow = dynamic_cast(w); + if (action == KMyMoneyRegister::ActionDeposit || (action == KMyMoneyRegister::ActionTransfer && d->m_split.value().isPositive())) + cashflow->setDirection(KMyMoneyRegister::Deposit); + else + cashflow->setDirection(KMyMoneyRegister::Payment); + } + if (tabbar) { + tabbar->setCurrentIndex(action); + } + } + } + } else { + TabBar* tabbar = dynamic_cast(haveWidget("tabbar")); + if (tabbar) { + if (!isTransfer(d->m_split.accountId(), categoryId)) { + tabbar->setCurrentIndex(d->m_split.value().isNegative() ? KMyMoneyRegister::ActionWithdrawal : KMyMoneyRegister::ActionDeposit); + } else { + tabbar->setCurrentIndex(KMyMoneyRegister::ActionTransfer); + } + } + } + + } else { // isMultiSelection() + dynamic_cast(d->m_editWidgets["postdate"])->loadDate(QDate()); + dynamic_cast(d->m_editWidgets["status"])->setState(eMyMoney::Split::State::Unknown); + if (haveWidget("deposit")) { + dynamic_cast(d->m_editWidgets["deposit"])->loadText(""); + dynamic_cast(d->m_editWidgets["deposit"])->setAllowEmpty(); + dynamic_cast(d->m_editWidgets["payment"])->loadText(""); + dynamic_cast(d->m_editWidgets["payment"])->setAllowEmpty(); + } + if ((w = haveWidget("amount")) != 0) { + dynamic_cast(w)->loadText(""); + dynamic_cast(w)->setAllowEmpty(); + } + + slotUpdateAction(action); + + if ((w = haveWidget("tabbar")) != 0) { + w->setEnabled(false); + } + + category->completion()->setSelected(QString()); + } + + // allow kick off VAT processing again + d->m_inUpdateVat = false; +} + +void StdTransactionEditor::loadEditWidgets() +{ + loadEditWidgets(KMyMoneyRegister::ActionNone); +} + +QWidget* StdTransactionEditor::firstWidget() const +{ + Q_D(const StdTransactionEditor); + QWidget* w = 0; + if (d->m_initialAction != KMyMoneyRegister::ActionNone) { + w = haveWidget("payee"); + } + return w; +} + +void StdTransactionEditor::slotReloadEditWidgets() +{ + Q_D(StdTransactionEditor); + // reload category widget + KMyMoneyCategory* category = dynamic_cast(d->m_editWidgets["category"]); + QString categoryId = category->selectedItem(); + + AccountSet aSet; + aSet.addAccountGroup(eMyMoney::Account::Asset); + aSet.addAccountGroup(eMyMoney::Account::Liability); + aSet.addAccountGroup(eMyMoney::Account::Income); + aSet.addAccountGroup(eMyMoney::Account::Expense); + if (KMyMoneyGlobalSettings::expertMode()) + aSet.addAccountGroup(eMyMoney::Account::Equity); + aSet.load(category->selector()); + + // if an account is specified then remove it from the widget so that the user + // cannot create a transfer with from and to account being the same account + if (!d->m_account.id().isEmpty()) + category->selector()->removeItem(d->m_account.id()); + + if (!categoryId.isEmpty()) + category->setSelectedItem(categoryId); + + + // reload payee widget + KMyMoneyPayeeCombo* payee = dynamic_cast(d->m_editWidgets["payee"]); + QString payeeId = payee->selectedItem(); + + payee->loadPayees(MyMoneyFile::instance()->payeeList()); + + if (!payeeId.isEmpty()) { + payee->setSelectedItem(payeeId); + } + + // reload tag widget + KTagContainer* tag = dynamic_cast(d->m_editWidgets["tag"]); + QString tagId = tag->tagCombo()->selectedItem(); + + tag->loadTags(MyMoneyFile::instance()->tagList()); + + if (!tagId.isEmpty()) { + tag->RemoveAllTagWidgets(); + tag->addTagWidget(tagId); + } +} + +void StdTransactionEditor::slotUpdatePayee(const QString& payeeId) +{ + Q_D(StdTransactionEditor); + // we have a new payee assigned to this transaction. + // in case there is no category assigned, no value entered and no + // memo available, we search for the last transaction of this payee + // in the account. + if (d->m_transaction.id().isEmpty() + && d->m_splits.count() == 0 + && KMyMoneyGlobalSettings::autoFillTransaction() != 0) { + // check if category is empty + KMyMoneyCategory* category = dynamic_cast(d->m_editWidgets["category"]); + QStringList list; + category->selectedItems(list); + if (!list.isEmpty()) + return; + + // check if memo is empty + KTextEdit* memo = dynamic_cast(d->m_editWidgets["memo"]); + if (memo && !memo->toPlainText().isEmpty()) + return; + + // check if all value fields are empty + kMyMoneyEdit* amount; + QStringList fields; + fields << "amount" << "payment" << "deposit"; + QStringList::const_iterator it_f; + for (it_f = fields.constBegin(); it_f != fields.constEnd(); ++it_f) { + amount = dynamic_cast(haveWidget(*it_f)); + if (amount && !amount->value().isZero()) + return; + } + +#if 0 + // Tony mentioned, that autofill does not work when he changed the date. Well, + // that certainly makes sense when you enter transactions in register mode as + // opposed to form mode, because the date field is located prior to the date + // field in the tab order of the widgets and the user might have already + // changed it. + // + // So I commented out the code that checks the date but left it in for reference. + // (ipwizard, 2008-04-07) + + // check if date has been altered by user + kMyMoneyDateInput* postDate = dynamic_cast(m_editWidgets["postdate"]); + if ((m_lastPostDate.isValid() && (postDate->date() != m_lastPostDate)) + || (!m_lastPostDate.isValid() && (postDate->date() != QDate::currentDate()))) + return; +#endif + + // if we got here, we have to autofill + autoFill(payeeId); + } + + // If payee has associated default account (category), set that now. + const MyMoneyPayee& payeeObj = MyMoneyFile::instance()->payee(payeeId); + if (payeeObj.defaultAccountEnabled()) { + KMyMoneyCategory* category = dynamic_cast(d->m_editWidgets["category"]); + category->slotItemSelected(payeeObj.defaultAccountId()); + } +} + +MyMoneyMoney StdTransactionEditor::shares(const MyMoneyTransaction& t) const +{ + Q_D(const StdTransactionEditor); + MyMoneyMoney result; + QList::const_iterator it_s; + for (it_s = t.splits().begin(); it_s != t.splits().end(); ++it_s) { + if ((*it_s).accountId() == d->m_account.id()) { + result += (*it_s).shares(); + } + } + return result; +} + +struct uniqTransaction { + const MyMoneyTransaction* t; + int cnt; +}; + +void StdTransactionEditor::autoFill(const QString& payeeId) +{ + Q_D(StdTransactionEditor); + QList > list; + MyMoneyTransactionFilter filter(d->m_account.id()); + filter.addPayee(payeeId); + MyMoneyFile::instance()->transactionList(list, filter); + if (!list.empty()) { + // ok, we found at least one previous transaction. now we clear out + // what we have collected so far and add those splits from + // the previous transaction. + QList >::const_iterator it_t; + QMap uniqList; + + // collect the transactions and see if we have any duplicates + for (it_t = list.constBegin(); it_t != list.constEnd(); ++it_t) { + QString key = (*it_t).first.accountSignature(); + int cnt = 0; + QMap::iterator it_u; + do { + QString ukey = QString("%1-%2").arg(key).arg(cnt); + it_u = uniqList.find(ukey); + if (it_u == uniqList.end()) { + uniqList[ukey].t = &((*it_t).first); + uniqList[ukey].cnt = 1; + } else if (KMyMoneyGlobalSettings::autoFillTransaction() == 1) { + // we already have a transaction with this signature. we must + // now check, if we should really treat it as a duplicate according + // to the value comparison delta. + MyMoneyMoney s1 = shares(*((*it_u).t)); + MyMoneyMoney s2 = shares((*it_t).first); + if (s2.abs() > s1.abs()) { + MyMoneyMoney t(s1); + s1 = s2; + s2 = t; + } + MyMoneyMoney diff; + if (s2.isZero()) + diff = s1.abs(); + else + diff = ((s1 - s2) / s2).convert(10000); + if (diff.isPositive() && diff <= MyMoneyMoney(KMyMoneyGlobalSettings::autoFillDifference(), 100)) { + uniqList[ukey].t = &((*it_t).first); + break; // end while loop + } + } else if (KMyMoneyGlobalSettings::autoFillTransaction() == 2) { + (*it_u).cnt++; + break; // end while loop + } + ++cnt; + } while (it_u != uniqList.end()); + + } + + MyMoneyTransaction t; + if (KMyMoneyGlobalSettings::autoFillTransaction() != 2) { +#if 0 + // I removed this code to allow cancellation of an autofill if + // it does not match even if there is only a single matching + // transaction for the payee in question. In case, we want to revert + // to the old behavior, don't forget to uncomment the closing + // brace further down in the code as well. (ipwizard 2009-01-16) + if (uniqList.count() == 1) { + t = list.last().first; + } else { +#endif + QPointer dlg = new KSelectTransactionsDlg(d->m_account, d->m_regForm); + dlg->setWindowTitle(i18n("Select autofill transaction")); + + QMap::const_iterator it_u; + for (it_u = uniqList.constBegin(); it_u != uniqList.constEnd(); ++it_u) { + dlg->addTransaction(*(*it_u).t); + } + + auto tRegister = dlg->getRegister(); + // setup sort order + tRegister->setSortOrder("1,-9,-4"); + // sort the transactions according to the sort setting + tRegister->sortItems(); + + // and select the last item + if (tRegister->lastItem()) + tRegister->selectItem(tRegister->lastItem()); + + if (dlg->exec() == QDialog::Accepted) { + t = dlg->transaction(); + } +#if 0 + } +#endif + } else { + int maxCnt = 0; + QMap::const_iterator it_u; + for (it_u = uniqList.constBegin(); it_u != uniqList.constEnd(); ++it_u) { + if ((*it_u).cnt > maxCnt) { + t = *(*it_u).t; + maxCnt = (*it_u).cnt; + } + } + } + + if (t != MyMoneyTransaction()) { + d->m_transaction.removeSplits(); + d->m_split = MyMoneySplit(); + MyMoneySplit otherSplit; + QList::ConstIterator it; + for (it = t.splits().constBegin(); it != t.splits().constEnd(); ++it) { + MyMoneySplit s(*it); + s.setReconcileFlag(eMyMoney::Split::State::NotReconciled); + s.setReconcileDate(QDate()); + s.clearId(); + s.setBankID(QString()); + // older versions of KMyMoney used to set the action + // we don't need this anymore + if (s.action() != MyMoneySplit::ActionAmortization + && s.action() != MyMoneySplit::ActionInterest) { + s.setAction(QString()); + } + + // FIXME update check number. The old comment contained + // + // + // If a check number is already specified by the user it is + // used. If the input field is empty and the previous transaction + // contains a checknumber, the next usable check number will be assigned + // to the transaction. + // + + kMyMoneyLineEdit* editNr = dynamic_cast(haveWidget("number")); + if (editNr && !editNr->text().isEmpty()) { + s.setNumber(editNr->text()); + } else if (!s.number().isEmpty()) { + s.setNumber(KMyMoneyUtils::nextCheckNumber(d->m_account)); + } + + // if the memos should not be used with autofill or + // if the transaction has exactly two splits, remove + // the memo text of the split that does not reference + // the current account. This allows the user to change + // the autofilled memo text which will then also be used + // in this split. See createTransaction() for this logic. + if ((s.accountId() != d->m_account.id() && t.splitCount() == 2) || !KMyMoneyGlobalSettings::autoFillUseMemos()) + s.setMemo(QString()); + + d->m_transaction.addSplit(s); + if (s.accountId() == d->m_account.id() && d->m_split == MyMoneySplit()) { + d->m_split = s; + } else { + otherSplit = s; + } + } + + // make sure to extract the right action + KMyMoneyRegister::Action action; + action = d->m_split.shares().isNegative() ? KMyMoneyRegister::ActionWithdrawal : KMyMoneyRegister::ActionDeposit; + + if (d->m_transaction.splitCount() == 2) { + MyMoneyAccount acc = MyMoneyFile::instance()->account(otherSplit.accountId()); + if (acc.isAssetLiability()) + action = KMyMoneyRegister::ActionTransfer; + } + + // now setup the widgets with the new data but keep the date + QDate date = dynamic_cast(d->m_editWidgets["postdate"])->date(); + loadEditWidgets(action); + dynamic_cast(d->m_editWidgets["postdate"])->setDate(date); + } + } + + // focus jumps into the category field + QWidget* w; + if ((w = haveWidget("payee")) != 0) { + w->setFocus(); + } +} + +void StdTransactionEditor::slotUpdateAction(int action) +{ + Q_D(StdTransactionEditor); + TabBar* tabbar = dynamic_cast(haveWidget("tabbar")); + if (tabbar) { + QLabel* categoryLabel = dynamic_cast(haveWidget("category-label")); + KMyMoneyCashFlowCombo* cashflow = dynamic_cast(d->m_editWidgets["cashflow"]); + switch (action) { + case KMyMoneyRegister::ActionDeposit: + categoryLabel->setText(i18n("Category")); + cashflow->setDirection(KMyMoneyRegister::Deposit); + break; + case KMyMoneyRegister::ActionTransfer: + if (d->m_split.shares().isNegative()) { + cashflow->setDirection(KMyMoneyRegister::Payment); + categoryLabel->setText(i18n("Transfer to")); + } else { + cashflow->setDirection(KMyMoneyRegister::Deposit); + categoryLabel->setText(i18n("Transfer from")); + } + tabbar->setCurrentIndex(KMyMoneyRegister::ActionTransfer); + slotUpdateCashFlow(cashflow->direction()); + break; + case KMyMoneyRegister::ActionWithdrawal: + categoryLabel->setText(i18n("Category")); + cashflow->setDirection(KMyMoneyRegister::Payment); + break; + } + resizeForm(); + } +} + +void StdTransactionEditor::slotUpdateCashFlow(KMyMoneyRegister::CashFlowDirection dir) +{ + QLabel* categoryLabel = dynamic_cast(haveWidget("category-label")); + KMyMoneyCashFlowCombo* cashflow = dynamic_cast(haveWidget("cashflow")); + cashflow->setDirection(dir); + // qDebug("Update cashflow to %d", dir); + if (categoryLabel) { + TabBar* tabbar = dynamic_cast(haveWidget("tabbar")); + if (!tabbar) return; // no transaction form + if (categoryLabel->text() != i18n("Category")) { + tabbar->setCurrentIndex(KMyMoneyRegister::ActionTransfer); + if (dir == KMyMoneyRegister::Deposit) { + categoryLabel->setText(i18n("Transfer from")); + } else { + categoryLabel->setText(i18n("Transfer to")); + } + resizeForm(); + } else { + if (dir == KMyMoneyRegister::Deposit) + tabbar->setCurrentIndex(KMyMoneyRegister::ActionDeposit); + else + tabbar->setCurrentIndex(KMyMoneyRegister::ActionWithdrawal); + } + } +} + +void StdTransactionEditor::slotUpdateCategory(const QString& id) +{ + Q_D(StdTransactionEditor); + QLabel *categoryLabel = dynamic_cast(haveWidget("category-label")); + // qDebug("Update category to %s", qPrintable(id)); + + if (categoryLabel) { + TabBar* tabbar = dynamic_cast(haveWidget("tabbar")); + kMyMoneyEdit* amount = dynamic_cast(d->m_editWidgets["amount"]); + MyMoneyMoney val = amount->value(); + + if (categoryLabel->text() == i18n("Transfer from")) { + val = -val; + } else { + val = val.abs(); + } + + if (tabbar) { + tabbar->setTabEnabled(KMyMoneyRegister::ActionTransfer, true); + tabbar->setTabEnabled(KMyMoneyRegister::ActionDeposit, true); + tabbar->setTabEnabled(KMyMoneyRegister::ActionWithdrawal, true); + } + + bool disableTransferTab = false; + if (!id.isEmpty()) { + MyMoneyAccount acc = MyMoneyFile::instance()->account(id); + if (acc.isAssetLiability() + || acc.accountGroup() == eMyMoney::Account::Equity) { + if (tabbar) { + tabbar->setCurrentIndex(KMyMoneyRegister::ActionTransfer); + tabbar->setTabEnabled(KMyMoneyRegister::ActionDeposit, false); + tabbar->setTabEnabled(KMyMoneyRegister::ActionWithdrawal, false); + } + KMyMoneyCashFlowCombo* cashflow = dynamic_cast(d->m_editWidgets["cashflow"]); + if (val.isZero()) { + if (cashflow && (cashflow->direction() == KMyMoneyRegister::Deposit)) { + categoryLabel->setText(i18n("Transfer from")); + } else { + categoryLabel->setText(i18n("Transfer to")); + } + } else if (val.isNegative()) { + categoryLabel->setText(i18n("Transfer from")); + cashflow->setDirection(KMyMoneyRegister::Deposit); + } else + categoryLabel->setText(i18n("Transfer to")); + } else { + disableTransferTab = true; + categoryLabel->setText(i18n("Category")); + } + updateAmount(val); + } else { //id.isEmpty() + KMyMoneyCategory* category = dynamic_cast(d->m_editWidgets["category"]); + disableTransferTab = !category->currentText().isEmpty(); + categoryLabel->setText(i18n("Category")); + } + if (tabbar) { + if (disableTransferTab) { + // set the proper tab before disabling the currently active tab + if (tabbar->currentIndex() == KMyMoneyRegister::ActionTransfer) { + tabbar->setCurrentIndex(val.isPositive() ? KMyMoneyRegister::ActionWithdrawal : KMyMoneyRegister::ActionDeposit); + } + tabbar->setTabEnabled(KMyMoneyRegister::ActionTransfer, false); + } + tabbar->update(); + } + + resizeForm(); + } + updateVAT(false); +} + +void StdTransactionEditor::slotUpdatePayment(const QString& txt) +{ + Q_D(StdTransactionEditor); + MyMoneyMoney val(txt); + + if (val.isNegative()) { + dynamic_cast(d->m_editWidgets["deposit"])->setValue(val.abs()); + dynamic_cast(d->m_editWidgets["payment"])->clearText(); + } else { + dynamic_cast(d->m_editWidgets["deposit"])->clearText(); + } + updateVAT(); +} + +void StdTransactionEditor::slotUpdateDeposit(const QString& txt) +{ + Q_D(StdTransactionEditor); + MyMoneyMoney val(txt); + if (val.isNegative()) { + dynamic_cast(d->m_editWidgets["payment"])->setValue(val.abs()); + dynamic_cast(d->m_editWidgets["deposit"])->clearText(); + } else { + dynamic_cast(d->m_editWidgets["payment"])->clearText(); + } + updateVAT(); +} + +void StdTransactionEditor::slotUpdateAmount(const QString& txt) +{ + // qDebug("Update amount to %s", qPrintable(txt)); + MyMoneyMoney val(txt); + updateAmount(val); + updateVAT(true); +} + +void StdTransactionEditor::updateAmount(const MyMoneyMoney& val) +{ + // we don't do anything if we have multiple transactions selected + if (isMultiSelection()) + return; + + Q_D(StdTransactionEditor); + QLabel *categoryLabel = dynamic_cast(haveWidget("category-label")); + if (categoryLabel) { + KMyMoneyCashFlowCombo* cashflow = dynamic_cast(d->m_editWidgets["cashflow"]); + + if (!val.isPositive()) { // fixes BUG321317 + if (categoryLabel->text() != i18n("Category")) { + if (cashflow->direction() == KMyMoneyRegister::Payment) { + categoryLabel->setText(i18n("Transfer to")); + } + } else { + slotUpdateCashFlow(cashflow->direction()); + } + dynamic_cast(d->m_editWidgets["amount"])->setValue(val.abs()); + } else { + if (categoryLabel->text() != i18n("Category")) { + if (cashflow->direction() == KMyMoneyRegister::Payment) { + categoryLabel->setText(i18n("Transfer to")); + } else { + categoryLabel->setText(i18n("Transfer from")); + cashflow->setDirection(KMyMoneyRegister::Deposit); // editing with +ve shows 'from' not 'pay to' + } + } + dynamic_cast(d->m_editWidgets["amount"])->setValue(val.abs()); + } + } +} + +void StdTransactionEditor::updateVAT(bool amountChanged) +{ + Q_D(StdTransactionEditor); + // make sure that we don't do this recursively + if (d->m_inUpdateVat) + return; + + // we don't do anything if we have multiple transactions selected + if (isMultiSelection()) + return; + + // if auto vat assignment for this account is turned off + // we don't care about taxes + if (d->m_account.value("NoVat") == "Yes") + return; + + // more splits than category and tax are not supported + if (d->m_splits.count() > 2) + return; + + // in order to do anything, we need an amount + MyMoneyMoney amount, newAmount; + bool amountOk; + amount = amountFromWidget(&amountOk); + if (!amountOk) + return; + + // If the transaction has a tax and a category split, remove the tax split + if (d->m_splits.count() == 2) { + newAmount = removeVatSplit(); + if (d->m_splits.count() == 2) // not removed? + return; + + } else { + // otherwise, we need a category + KMyMoneyCategory* category = dynamic_cast(d->m_editWidgets["category"]); + if (category->selectedItem().isEmpty()) + return; + + // if no VAT account is associated with this category/account, then we bail out + MyMoneyAccount cat = MyMoneyFile::instance()->account(category->selectedItem()); + if (cat.value("VatAccount").isEmpty()) + return; + + newAmount = amount; + } + + // seems we have everything we need + if (amountChanged) + newAmount = amount; + + MyMoneyTransaction transaction; + if (createTransaction(transaction, d->m_transaction, d->m_split)) { + if (addVatSplit(transaction, newAmount)) { + d->m_transaction = transaction; + if (!d->m_transaction.splits().isEmpty()) + d->m_split = d->m_transaction.splits().front(); + + loadEditWidgets(); + + // if we made this a split transaction, then move the + // focus to the memo field + if (qApp->focusWidget() == haveWidget("category")) { + QWidget* w = haveWidget("memo"); + if (w) + w->setFocus(); + } + } + } +} + +bool StdTransactionEditor::addVatSplit(MyMoneyTransaction& tr, const MyMoneyMoney& amount) +{ + if (tr.splitCount() != 2) + return false; + + Q_D(StdTransactionEditor); + auto file = MyMoneyFile::instance(); + // extract the category split from the transaction + MyMoneyAccount category = file->account(tr.splitByAccount(d->m_account.id(), false).accountId()); + return file->addVATSplit(tr, d->m_account, category, amount); +} + +MyMoneyMoney StdTransactionEditor::removeVatSplit() +{ + Q_D(StdTransactionEditor); + // we only deal with splits that have three splits + if (d->m_splits.count() != 2) + return amountFromWidget(); + + MyMoneySplit c; // category split + MyMoneySplit t; // tax split + + bool netValue = false; + QList::const_iterator it_s; + for (it_s = d->m_splits.constBegin(); it_s != d->m_splits.constEnd(); ++it_s) { + MyMoneyAccount acc = MyMoneyFile::instance()->account((*it_s).accountId()); + if (!acc.value("VatAccount").isEmpty()) { + netValue = (acc.value("VatAmount").toLower() == "net"); + c = (*it_s); + } else if (!acc.value("VatRate").isEmpty()) { + t = (*it_s); + } + } + + // bail out if not all splits are setup + if (c.id().isEmpty() || t.id().isEmpty()) + return amountFromWidget(); + + MyMoneyMoney amount; + // reduce the splits + if (netValue) { + amount = -c.shares(); + } else { + amount = -(c.shares() + t.shares()); + } + + // remove tax split from the list, ... + d->m_splits.clear(); + d->m_splits.append(c); + + // ... make sure that the widget is updated ... + // block the signals to avoid popping up the split editor dialog + // for nothing + d->m_editWidgets["category"]->blockSignals(true); + QString id; + setupCategoryWidget(id); + d->m_editWidgets["category"]->blockSignals(false); + + // ... and return the updated amount + return amount; +} + +bool StdTransactionEditor::isComplete(QString& reason) const +{ + Q_D(const StdTransactionEditor); + reason.clear(); + QMap::const_iterator it_w; + + kMyMoneyDateInput* postDate = dynamic_cast(d->m_editWidgets["postdate"]); + if (postDate) { + QDate accountOpeningDate = d->m_account.openingDate(); + for (QList::const_iterator it_s = d->m_splits.constBegin(); it_s != d->m_splits.constEnd(); ++it_s) { + const MyMoneyAccount& acc = MyMoneyFile::instance()->account((*it_s).accountId()); + // compute the newest opening date of all accounts involved in the transaction + if (acc.openingDate() > accountOpeningDate) + accountOpeningDate = acc.openingDate(); + } + // check the selected category in case m_splits hasn't been updated yet + KMyMoneyCategory* category = dynamic_cast(d->m_editWidgets["category"]); + if (category && !category->selectedItem().isEmpty()) { + MyMoneyAccount cat = MyMoneyFile::instance()->account(category->selectedItem()); + if (cat.openingDate() > accountOpeningDate) + accountOpeningDate = cat.openingDate(); + } + + if (postDate->date().isValid() && (postDate->date() < accountOpeningDate)) { + postDate->markAsBadDate(true, KMyMoneyGlobalSettings::schemeColor(SchemeColor::Negative)); + reason = i18n("Cannot enter transaction with postdate prior to account's opening date."); + postDate->setToolTip(reason); + return false; + } + postDate->markAsBadDate(); + postDate->setToolTip(""); + } + + for (it_w = d->m_editWidgets.begin(); it_w != d->m_editWidgets.end(); ++it_w) { + KMyMoneyPayeeCombo* payee = dynamic_cast(*it_w); + KTagContainer* tagContainer = dynamic_cast(*it_w); + KMyMoneyCategory* category = dynamic_cast(*it_w); + kMyMoneyEdit* amount = dynamic_cast(*it_w); + KMyMoneyReconcileCombo* reconcile = dynamic_cast(*it_w); + KMyMoneyCashFlowCombo* cashflow = dynamic_cast(*it_w); + KTextEdit* memo = dynamic_cast(*it_w); + + if (payee && !(payee->currentText().isEmpty())) + break; + + if (category && !category->lineEdit()->text().isEmpty()) + break; + + if (amount && !(amount->value().isZero())) + break; + + // the following widgets are only checked if we are editing multiple transactions + if (isMultiSelection()) { + TabBar* tabbar = dynamic_cast(haveWidget("tabbar")); + if (tabbar) { + tabbar->setEnabled(true); + } + if (reconcile && reconcile->state() != eMyMoney::Split::State::Unknown) + break; + + if (cashflow && cashflow->direction() != KMyMoneyRegister::Unknown) + break; + + if (postDate->date().isValid() && (postDate->date() >= d->m_account.openingDate())) + break; + + if (memo && d->m_memoChanged) + break; + + if (tagContainer && !(tagContainer->selectedTags().isEmpty())) // Tag is optional field + break; + } + } + return it_w != d->m_editWidgets.end(); +} + +void StdTransactionEditor::slotCreateCategory(const QString& name, QString& id) +{ + Q_D(StdTransactionEditor); + MyMoneyAccount acc, parent; + acc.setName(name); + + KMyMoneyCashFlowCombo* cashflow = dynamic_cast(haveWidget("cashflow")); + if (cashflow) { + // form based input + if (cashflow->direction() == KMyMoneyRegister::Deposit) + parent = MyMoneyFile::instance()->income(); + else + parent = MyMoneyFile::instance()->expense(); + + } else if (haveWidget("deposit")) { + // register based input + kMyMoneyEdit* deposit = dynamic_cast(d->m_editWidgets["deposit"]); + if (deposit->value().isPositive()) + parent = MyMoneyFile::instance()->income(); + else + parent = MyMoneyFile::instance()->expense(); + + } else + parent = MyMoneyFile::instance()->expense(); + + // TODO extract possible first part of a hierarchy and check if it is one + // of our top categories. If so, remove it and select the parent + // according to this information. + + emit createCategory(acc, parent); + + // return id + id = acc.id(); +} + +int StdTransactionEditor::slotEditSplits() +{ + Q_D(StdTransactionEditor); + int rc = QDialog::Rejected; + + if (!d->m_openEditSplits) { + // only get in here in a single instance + d->m_openEditSplits = true; + + // force focus change to update all data + QWidget* w = dynamic_cast(d->m_editWidgets["category"])->splitButton(); + if (w) + w->setFocus(); + + kMyMoneyEdit* amount = dynamic_cast(haveWidget("amount")); + kMyMoneyEdit* deposit = dynamic_cast(haveWidget("deposit")); + kMyMoneyEdit* payment = dynamic_cast(haveWidget("payment")); + KMyMoneyCashFlowCombo* cashflow = 0; + KMyMoneyRegister::CashFlowDirection dir = KMyMoneyRegister::Unknown; + bool isValidAmount = false; + + if (amount) { + isValidAmount = amount->lineedit()->text().length() != 0; + cashflow = dynamic_cast(haveWidget("cashflow")); + if (cashflow) + dir = cashflow->direction(); + + } else { + if (deposit) { + if (deposit->lineedit()->text().length() != 0) { + isValidAmount = true; + dir = KMyMoneyRegister::Deposit; + } + } + if (payment) { + if (payment->lineedit()->text().length() != 0) { + isValidAmount = true; + dir = KMyMoneyRegister::Payment; + } + } + if (!deposit || !payment) { + qDebug("Internal error: deposit(%p) & payment(%p) widgets not found but required", deposit, payment); + return rc; + } + } + + if (dir == KMyMoneyRegister::Unknown) + dir = KMyMoneyRegister::Payment; + + MyMoneyTransaction transaction; + if (createTransaction(transaction, d->m_transaction, d->m_split)) { + MyMoneyMoney value; + + QPointer dlg = + new KSplitTransactionDlg(transaction, + transaction.splits().isEmpty() ? MyMoneySplit() : transaction.splits().front(), + d->m_account, + isValidAmount, + dir == KMyMoneyRegister::Deposit, + MyMoneyMoney(), + d->m_priceInfo, + d->m_regForm); + connect(dlg, SIGNAL(objectCreation(bool)), this, SIGNAL(objectCreation(bool))); + connect(dlg, SIGNAL(createCategory(MyMoneyAccount&,MyMoneyAccount)), this, SIGNAL(createCategory(MyMoneyAccount&,MyMoneyAccount))); + + if ((rc = dlg->exec()) == QDialog::Accepted) { + d->m_transaction = dlg->transaction(); + if (!d->m_transaction.splits().isEmpty()) + d->m_split = d->m_transaction.splits().front(); + loadEditWidgets(); + } + + delete dlg; + } + + // focus jumps into the tag field + if ((w = haveWidget("tag")) != 0) { + w->setFocus(); + } + + d->m_openEditSplits = false; + } + + return rc; +} + +void StdTransactionEditor::checkPayeeInSplit(MyMoneySplit& s, const QString& payeeId) +{ + if (s.accountId().isEmpty()) + return; + + MyMoneyAccount acc = MyMoneyFile::instance()->account(s.accountId()); + if (acc.isIncomeExpense()) { + s.setPayeeId(payeeId); + } else { + if (s.payeeId().isEmpty()) + s.setPayeeId(payeeId); + } +} + +MyMoneyMoney StdTransactionEditor::amountFromWidget(bool* update) const +{ + Q_D(const StdTransactionEditor); + bool updateValue = false; + MyMoneyMoney value; + + auto cashflow = dynamic_cast(haveWidget("cashflow")); + if (cashflow) { + // form based input + auto amount = dynamic_cast(d->m_editWidgets["amount"]); + // if both fields do not contain changes -> no need to update + if (cashflow->direction() != KMyMoneyRegister::Unknown + && !amount->lineedit()->text().isEmpty()) + updateValue = true; + value = amount->value(); + if (cashflow->direction() == KMyMoneyRegister::Payment) + value = -value; + + } else if (haveWidget("deposit")) { + // register based input + auto deposit = dynamic_cast(d->m_editWidgets["deposit"]); + auto payment = dynamic_cast(d->m_editWidgets["payment"]); + // if both fields do not contain text -> no need to update + if (!(deposit->lineedit()->text().isEmpty() && payment->lineedit()->text().isEmpty())) + updateValue = true; + + if (deposit->value().isPositive()) + value = deposit->value(); + else + value = -(payment->value()); + } + + if (update) + *update = updateValue; + + // determine the max fraction for this account and + // adjust the value accordingly + return value.convert(d->m_account.fraction()); +} + +bool StdTransactionEditor::createTransaction(MyMoneyTransaction& t, const MyMoneyTransaction& torig, const MyMoneySplit& sorig, bool skipPriceDialog) +{ + Q_D(StdTransactionEditor); + // extract price info from original transaction + d->m_priceInfo.clear(); + QList::const_iterator it_s; + if (!torig.id().isEmpty()) { + for (it_s = torig.splits().begin(); it_s != torig.splits().end(); ++it_s) { + if ((*it_s).id() != sorig.id()) { + MyMoneyAccount cat = MyMoneyFile::instance()->account((*it_s).accountId()); + if (cat.currencyId() != d->m_account.currencyId()) { + if (!(*it_s).shares().isZero() && !(*it_s).value().isZero()) { + d->m_priceInfo[cat.currencyId()] = ((*it_s).shares() / (*it_s).value()).reduce(); + } + } + } + } + } + + t = torig; + + t.removeSplits(); + t.setCommodity(d->m_account.currencyId()); + + kMyMoneyDateInput* postDate = dynamic_cast(d->m_editWidgets["postdate"]); + if (postDate->date().isValid()) { + t.setPostDate(postDate->date()); + } + + // we start with the previous values, make sure we can add them later on + MyMoneySplit s0 = sorig; + s0.clearId(); + + // make sure we reference this account here + s0.setAccountId(d->m_account.id()); + + // memo and number field are special: if we have multiple transactions selected + // and the edit field is empty, we treat it as "not modified". + // FIXME a better approach would be to have a 'dirty' flag with the widgets + // which identifies if the originally loaded value has been modified + // by the user + KTextEdit* memo = dynamic_cast(d->m_editWidgets["memo"]); + if (memo) { + if (!isMultiSelection() || (isMultiSelection() && d->m_memoChanged)) + s0.setMemo(memo->toPlainText()); + } + + kMyMoneyLineEdit* number = dynamic_cast(haveWidget("number")); + if (number) { + if (!isMultiSelection() || (isMultiSelection() && !number->text().isEmpty())) + s0.setNumber(number->text()); + } + + KMyMoneyPayeeCombo* payee = dynamic_cast(d->m_editWidgets["payee"]); + QString payeeId; + if (!isMultiSelection() || (isMultiSelection() && !payee->currentText().isEmpty())) { + payeeId = payee->selectedItem(); + s0.setPayeeId(payeeId); + } + + //KMyMoneyTagCombo* tag = dynamic_cast(m_editWidgets["tag"]); + KTagContainer* tag = dynamic_cast(d->m_editWidgets["tag"]); + if (!isMultiSelection() || (isMultiSelection() && !tag->selectedTags().isEmpty())) { + s0.setTagIdList(tag->selectedTags()); + } + + bool updateValue; + MyMoneyMoney value = amountFromWidget(&updateValue); + + if (updateValue) { + // for this account, the shares and value is the same + s0.setValue(value); + s0.setShares(value); + } else { + value = s0.value(); + } + + // if we mark the split reconciled here, we'll use today's date if no reconciliation date is given + KMyMoneyReconcileCombo* status = dynamic_cast(d->m_editWidgets["status"]); + if (status->state() != eMyMoney::Split::State::Unknown) + s0.setReconcileFlag(status->state()); + + if (s0.reconcileFlag() == eMyMoney::Split::State::Reconciled && !s0.reconcileDate().isValid()) + s0.setReconcileDate(QDate::currentDate()); + + checkPayeeInSplit(s0, payeeId); + + // add the split to the transaction + t.addSplit(s0); + + // if we have no other split we create it + // if we have none or only one other split, we reconstruct it here + // if we have more than one other split, we take them as they are + // make sure to perform all those changes on a local copy + QList splits = d->m_splits; + + MyMoneySplit s1; + if (splits.isEmpty()) { + s1.setMemo(s0.memo()); + splits.append(s1); + + // make sure we will fill the value and share fields later on + updateValue = true; + } + + // FIXME in multiSelection we currently only support transactions with one + // or two splits. So we check the original transaction and extract the other + // split or create it + if (isMultiSelection()) { + if (torig.splitCount() == 2) { + QList::const_iterator it_s; + for (it_s = torig.splits().begin(); it_s != torig.splits().end(); ++it_s) { + if ((*it_s).id() == sorig.id()) + continue; + s1 = *it_s; + s1.clearId(); + break; + } + } + } else { + if (splits.count() == 1) { + s1 = splits[0]; + s1.clearId(); + } + } + + if (isMultiSelection() || splits.count() == 1) { + KMyMoneyCategory* category = dynamic_cast(d->m_editWidgets["category"]); + if (!isMultiSelection() || (isMultiSelection() && !category->currentText().isEmpty())) { + s1.setAccountId(category->selectedItem()); + } + + // if the first split has a memo but the second split is empty, + // we just copy the memo text over + if (memo) { + if (!isMultiSelection() || (isMultiSelection() && !memo->toPlainText().isEmpty())) { + // if the memo is filled, we check if the + // account referenced by s1 is a regular account or a category. + // in case of a regular account, we just leave the memo as is + // in case of a category we simply copy the new value over the old. + // in case we don't even have an account id, we just skip because + // the split will be removed later on anyway. + if (!s1.memo().isEmpty() && s1.memo() != s0.memo()) { + if (!s1.accountId().isEmpty()) { + MyMoneyAccount acc = MyMoneyFile::instance()->account(s1.accountId()); + if (acc.isIncomeExpense()) + s1.setMemo(s0.memo()); + else if (KMessageBox::questionYesNo(d->m_regForm, + i18n("Do you want to replace memo

%1

with memo

%2

in the other split?", s1.memo(), s0.memo()), i18n("Copy memo"), + KStandardGuiItem::yes(), KStandardGuiItem::no(), + QStringLiteral("CopyMemoOver")) == KMessageBox::Yes) + s1.setMemo(s0.memo()); + } + } else { + s1.setMemo(s0.memo()); + } + } + } + + if (updateValue && !s1.accountId().isEmpty()) { + s1.setValue(-value); + MyMoneyMoney shares; + if (!skipPriceDialog) { + if (!KCurrencyCalculator::setupSplitPrice(shares, t, s1, d->m_priceInfo, d->m_regForm)) + return false; + } else { + MyMoneyAccount cat = MyMoneyFile::instance()->account(s1.accountId()); + if (d->m_priceInfo.find(cat.currencyId()) != d->m_priceInfo.end()) { + shares = (s1.value() * d->m_priceInfo[cat.currencyId()]).reduce().convert(cat.fraction()); + } else + shares = s1.value(); + } + s1.setShares(shares); + } + + checkPayeeInSplit(s1, payeeId); + + if (!s1.accountId().isEmpty()) + t.addSplit(s1); + + } else { + QList::iterator it_s; + for (it_s = splits.begin(); it_s != splits.end(); ++it_s) { + s1 = *it_s; + s1.clearId(); + checkPayeeInSplit(s1, payeeId); + t.addSplit(s1); + } + } + return true; +} + +void StdTransactionEditor::setupFinalWidgets() +{ + addFinalWidget(haveWidget("deposit")); + addFinalWidget(haveWidget("payment")); + addFinalWidget(haveWidget("amount")); + addFinalWidget(haveWidget("status")); +} + +void StdTransactionEditor::slotUpdateAccount(const QString& id) +{ + Q_D(StdTransactionEditor); + TransactionEditor::slotUpdateAccount(id); + KMyMoneyCategory* category = dynamic_cast(d->m_editWidgets["category"]); + if (category && category->splitButton()) { + category->splitButton()->setDisabled(id.isEmpty()); + } +} diff --git a/kmymoney/dialogs/transactioneditor.h b/kmymoney/dialogs/transactioneditor.h --- a/kmymoney/dialogs/transactioneditor.h +++ b/kmymoney/dialogs/transactioneditor.h @@ -4,6 +4,7 @@ begin : Wed Jun 07 2006 copyright : (C) 2006 by Thomas Baumgart email : Thomas Baumgart + (C) 2017 by Łukasz Wojniłowicz ***************************************************************************/ /*************************************************************************** @@ -22,6 +23,7 @@ // QT Includes #include +#include // ---------------------------------------------------------------------------- // KDE Includes @@ -29,24 +31,41 @@ // ---------------------------------------------------------------------------- // Project Includes -#include "register.h" - -class QString; -class QWidget; -class QEvent; +class QDate; class TransactionEditorContainer; class KMyMoneyCategory; -class MyMoneySchedule; +class MyMoneySplit; +class MyMoneyTransaction; +class MyMoneyAccount; template class QList; +namespace KMyMoneyRegister { + enum Action : int; + class SelectedTransactions; + class Transaction; +} + +namespace eMyMoney { + namespace Schedule { enum class Occurrence; + enum class PaymentType; } + namespace Split { enum class InvestmentTransactionType; } + } + +class TransactionEditorPrivate; class TransactionEditor : public QObject { Q_OBJECT + Q_DISABLE_COPY(TransactionEditor) + public: TransactionEditor(); - TransactionEditor(TransactionEditorContainer* regForm, KMyMoneyRegister::Transaction* item, const KMyMoneyRegister::SelectedTransactions& list, const QDate& lastPostDate); + explicit TransactionEditor(TransactionEditorPrivate &dd, + TransactionEditorContainer* regForm, + KMyMoneyRegister::Transaction* item, + const KMyMoneyRegister::SelectedTransactions& list, + const QDate& lastPostDate); virtual ~TransactionEditor(); /** @@ -65,7 +84,9 @@ * @param account account that is currently shown in the calling ledger view * @param action default action (defaults to ActionNone). */ - void setup(QWidgetList& tabOrderWidgets, const MyMoneyAccount& account = MyMoneyAccount(), KMyMoneyRegister::Action action = KMyMoneyRegister::ActionNone); + void setup(QWidgetList& tabOrderWidgets, const MyMoneyAccount& account, KMyMoneyRegister::Action action); + void setup(QWidgetList& tabOrderWidgets, const MyMoneyAccount& account); + void setup(QWidgetList& tabOrderWidgets); /** * Enter the transactions into the ledger. In case of a newly created @@ -122,9 +143,7 @@ * @retval false only a single transaction was selected when the editor was started * @retval true multiple transactions were selected when the editor was started */ - virtual bool isMultiSelection() const { - return m_transactions.count() > 1; - } + virtual bool isMultiSelection() const; virtual bool fixTransactionCommodity(const MyMoneyAccount& account); @@ -144,20 +163,16 @@ void setTransaction(const MyMoneyTransaction& t, const MyMoneySplit& s); - bool eventFilter(QObject* o, QEvent* e); + bool eventFilter(QObject* o, QEvent* e) override; - const MyMoneyAccount& account() const { - return m_account; - } + MyMoneyAccount account() const; void clearFinalWidgets(); void addFinalWidget(const QWidget*); - QString m_memoText; - QString m_scheduleInfo; - - eMyMoney::Schedule::PaymentType m_paymentMethod; + void setScheduleInfo(const QString& si); + void setPaymentMethod(eMyMoney::Schedule::PaymentType pm); public slots: void slotReloadEditWidgets(); @@ -178,7 +193,8 @@ protected: virtual void createEditWidgets() = 0; virtual void setupFinalWidgets() = 0; - virtual void loadEditWidgets(KMyMoneyRegister::Action action = KMyMoneyRegister::ActionNone) = 0; + virtual void loadEditWidgets(KMyMoneyRegister::Action action) = 0; + virtual void loadEditWidgets() = 0; void setupCategoryWidget(KMyMoneyCategory* category, const QList& splits, QString& categoryId, const char* splitEditSlot, bool allowObjectCreation = true); void resizeForm(); @@ -221,7 +237,7 @@ * @param txt The name of the payee to be created * @param id A connected slot should store the id of the created object in this variable */ - void createPayee(const QString& txt, QString& id); + bool createPayee(const QString& txt, QString& id); /** * This signal is sent out, when a new category needs to be created @@ -283,13 +299,13 @@ /** * This signal is sent out, if the user has pressed the ESC key. */ - void escapePressed(); + void escapePressed(int msec = 100); /** * This signal is sent out, if the user has pressed the Return or Enter * key and asks to end editing the transaction */ - void returnPressed(); + void returnPressed(int msec = 100); /** * This signal is sent out, if any of the balance warning levels @@ -301,145 +317,11 @@ void operationTypeChanged(int index); protected: - QList m_splits; - KMyMoneyRegister::SelectedTransactions m_transactions; - QList m_finalEditWidgets; - TransactionEditorContainer* m_regForm; - KMyMoneyRegister::Transaction* m_item; - KMyMoneyRegister::QWidgetContainer m_editWidgets; - MyMoneyAccount m_account; - MyMoneyTransaction m_transaction; - MyMoneySplit m_split; - QDate m_lastPostDate; - QMap m_priceInfo; - KMyMoneyRegister::Action m_initialAction; - bool m_openEditSplits; - bool m_memoChanged; + QScopedPointer d_ptr; + TransactionEditor(TransactionEditorPrivate &dd); private: - /** - * If a new or an edited transaction has a valid number, keep it with the account - */ - void keepNewNumber(const MyMoneyTransaction& tr); - + Q_DECLARE_PRIVATE(TransactionEditor) }; -class StdTransactionEditor : public TransactionEditor -{ - Q_OBJECT -public: - StdTransactionEditor(); - StdTransactionEditor(TransactionEditorContainer* regForm, KMyMoneyRegister::Transaction* item, const KMyMoneyRegister::SelectedTransactions& list, const QDate& lastPostDate); - ~StdTransactionEditor(); - - bool isComplete(QString& reason) const; - QWidget* firstWidget() const; - - /** - * This method creates a transaction based on the contents of the current widgets, - * the splits in m_split in single selection mode or an existing transaction/split - * and the contents of the widgets in multi selection mode. - * - * The split referencing the current account is returned as the first split in the - * transaction's split list. - * - * @param t reference to created transaction - * @param torig the original transaction - * @param sorig the original split - * @param skipPriceDialog if @p true the user will not be requested for price information - * (defaults to @p false) - * - * @return @p false if aborted by user, @p true otherwise - * - * @note Usually not used directly. If unsure, use enterTransactions() instead. - */ - bool createTransaction(MyMoneyTransaction& t, const MyMoneyTransaction& torig, const MyMoneySplit& sorig, bool skipPriceDialog = false); - -public slots: - int slotEditSplits(); - void slotUpdateAmount(const QString&); - -protected slots: - void slotReloadEditWidgets(); - void slotUpdatePayment(const QString&); - void slotUpdateDeposit(const QString&); - void slotUpdateCategory(const QString&); - void slotUpdatePayee(const QString&); - //void slotUpdateTag(const QString&); - void slotUpdateCashFlow(KMyMoneyRegister::CashFlowDirection); - void slotCreateCategory(const QString&, QString&); - void slotUpdateAction(int action); - void slotUpdateAccount(const QString& id); - -protected: - /** - * This method creates all necessary widgets for this transaction editor. - * All signals will be connected to the relevant slots. - */ - void createEditWidgets(); - - /** - * This method (re-)loads the widgets with the transaction information - * contained in @a m_transaction and @a m_split. - * - * @param action preset the edit wigdets for @a action if no transaction - * is present - */ - void loadEditWidgets(KMyMoneyRegister::Action action = KMyMoneyRegister::ActionNone); - - void setupCategoryWidget(QString&); - void updateAmount(const MyMoneyMoney& value); - bool isTransfer(const QString& accId1, const QString& accId2) const; - - void checkPayeeInSplit(MyMoneySplit& s, const QString& payeeId); - - /** - * This method fills the editor widgets with the last transaction - * that can be found for payee @a payeeId in the account @a m_account. - */ - void autoFill(const QString& payeeId); - - /** - * Extracts the amount of the transaction from the widgets depending - * if form or register based input method is used. - * Returns if an amount has been found in @a update. - * - * @param update pointer to update information flag - * @return amount of transaction (deposit positive, payment negative) - */ - MyMoneyMoney amountFromWidget(bool* update = 0) const; - - /** - * Create or update a VAT split - */ - void updateVAT(bool amountChanged = true); - - MyMoneyMoney removeVatSplit(); - - /** - * This method adds a VAT split to transaction @a tr if necessary. - * - * @param tr transaction that the split should be added to - * @param amount Amount to be used for the calculation. Depending upon the - * setting of the resp. category, this value is treated as - * either gross or net value. - * @retval false VAT split has not been added - * @retval true VAT split has been added - */ - bool addVatSplit(MyMoneyTransaction& tr, const MyMoneyMoney& amount); - - void setupFinalWidgets(); - - /** - * This method returns the sum of all splits of transaction @a t that - * reference account m_account. - */ - MyMoneyMoney shares(const MyMoneyTransaction& t) const; - -private: - MyMoneyMoney m_shares; - bool m_inUpdateVat; -}; - - #endif diff --git a/kmymoney/dialogs/transactioneditor.cpp b/kmymoney/dialogs/transactioneditor.cpp --- a/kmymoney/dialogs/transactioneditor.cpp +++ b/kmymoney/dialogs/transactioneditor.cpp @@ -4,6 +4,7 @@ begin : Wed Jun 07 2006 copyright : (C) 2006 by Thomas Baumgart email : Thomas Baumgart + (C) 2017 by Łukasz Wojniłowicz ***************************************************************************/ /*************************************************************************** @@ -16,19 +17,16 @@ ***************************************************************************/ #include "transactioneditor.h" +#include "transactioneditor_p.h" // ---------------------------------------------------------------------------- // QT Includes -#include #include #include -#include #include #include #include -#include -#include #include // ---------------------------------------------------------------------------- @@ -36,7 +34,6 @@ #include #include -#include #include #include #include @@ -47,25 +44,18 @@ #include "mymoneyutils.h" #include "kmymoneycategory.h" #include "kmymoneymvccombo.h" -#include "kmymoneydateinput.h" #include "kmymoneyedit.h" #include "kmymoneylineedit.h" -#include -#include "kmymoneyaccountselector.h" #include "mymoneyfile.h" #include "mymoneyprice.h" #include "mymoneysecurity.h" -#include "mymoneypayee.h" -#include "mymoneytag.h" -#include "mymoneyschedule.h" #include "kmymoneyutils.h" +#include "kmymoneycompletion.h" #include "transactionform.h" #include "kmymoneyglobalsettings.h" #include "transactioneditorcontainer.h" -#include "ksplittransactiondlg.h" #include "kcurrencycalculator.h" -#include "kselecttransactionsdlg.h" #include "icons.h" using namespace KMyMoneyRegister; @@ -73,33 +63,45 @@ using namespace Icons; TransactionEditor::TransactionEditor() : - m_paymentMethod(eMyMoney::Schedule::PaymentType::Any), - m_regForm(0), - m_item(0), - m_initialAction(ActionNone), - m_openEditSplits(false), - m_memoChanged(false) + d_ptr(new TransactionEditorPrivate(this)) { + Q_D(TransactionEditor); + d->init(); } -TransactionEditor::TransactionEditor(TransactionEditorContainer* regForm, KMyMoneyRegister::Transaction* item, const KMyMoneyRegister::SelectedTransactions& list, const QDate& lastPostDate) : - m_paymentMethod(eMyMoney::Schedule::PaymentType::Any), - m_transactions(list), - m_regForm(regForm), - m_item(item), - m_transaction(item->transaction()), - m_split(item->split()), - m_lastPostDate(lastPostDate), - m_initialAction(ActionNone), - m_openEditSplits(false), - m_memoChanged(false) +TransactionEditor::TransactionEditor(TransactionEditorPrivate &dd, + TransactionEditorContainer* regForm, + KMyMoneyRegister::Transaction* item, + const KMyMoneyRegister::SelectedTransactions& list, + const QDate& lastPostDate) : + d_ptr(&dd) +// d_ptr(new TransactionEditorPrivate) { - m_item->startEditMode(); - connect(MyMoneyFile::instance(), SIGNAL(dataChanged()), this, SLOT(slotUpdateAccount())); + Q_D(TransactionEditor); + d->m_paymentMethod = eMyMoney::Schedule::PaymentType::Any; + d->m_transactions = list; + d->m_regForm = regForm; + d->m_item = item; + d->m_transaction = item->transaction(); + d->m_split = item->split(); + d->m_lastPostDate = lastPostDate; + d->m_initialAction = ActionNone; + d->m_openEditSplits = false; + d->m_memoChanged = false; + d->m_item->startEditMode(); + connect(MyMoneyFile::instance(), &MyMoneyFile::dataChanged, this, static_cast(&TransactionEditor::slotUpdateAccount)); +} + +TransactionEditor::TransactionEditor(TransactionEditorPrivate &dd) : + d_ptr(&dd) +{ + Q_D(TransactionEditor); + d->init(); } TransactionEditor::~TransactionEditor() { + Q_D(TransactionEditor); // Make sure the widgets do not send out signals to the editor anymore // After all, the editor is about to die @@ -110,31 +112,34 @@ } QMap::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)->disconnect(this); } - m_regForm->removeEditWidgets(m_editWidgets); - m_item->leaveEditMode(); - emit finishEdit(m_transactions); + d->m_regForm->removeEditWidgets(d->m_editWidgets); + d->m_item->leaveEditMode(); + emit finishEdit(d->m_transactions); } void TransactionEditor::slotUpdateAccount(const QString& id) { - m_account = MyMoneyFile::instance()->account(id); + Q_D(TransactionEditor); + d->m_account = MyMoneyFile::instance()->account(id); setupPrecision(); } void TransactionEditor::slotUpdateAccount() { + Q_D(TransactionEditor); // reload m_account as it might have been changed - m_account = MyMoneyFile::instance()->account(m_account.id()); + d->m_account = MyMoneyFile::instance()->account(d->m_account.id()); setupPrecision(); } void TransactionEditor::setupPrecision() { - const int prec = (m_account.id().isEmpty()) ? 2 : MyMoneyMoney::denomToPrec(m_account.fraction()); + Q_D(TransactionEditor); + const int prec = (d->m_account.id().isEmpty()) ? 2 : MyMoneyMoney::denomToPrec(d->m_account.fraction()); QStringList widgets = QString("amount,deposit,payment").split(','); QStringList::const_iterator it_w; for (it_w = widgets.constBegin(); it_w != widgets.constEnd(); ++it_w) { @@ -147,11 +152,12 @@ void TransactionEditor::setup(QWidgetList& tabOrderWidgets, const MyMoneyAccount& account, KMyMoneyRegister::Action action) { - m_account = account; - m_initialAction = action; + Q_D(TransactionEditor); + d->m_account = account; + d->m_initialAction = action; createEditWidgets(); - m_regForm->arrangeEditWidgets(m_editWidgets, m_item); - m_regForm->tabOrder(tabOrderWidgets, m_item); + d->m_regForm->arrangeEditWidgets(d->m_editWidgets, d->m_item); + d->m_regForm->tabOrder(tabOrderWidgets, d->m_item); QWidget* w = haveWidget("tabbar"); if (w) { tabOrderWidgets.append(w); @@ -164,9 +170,9 @@ // remove all unused widgets and don't forget to remove them // from the tab order list as well - m_editWidgets.removeOrphans(); + d->m_editWidgets.removeOrphans(); QWidgetList::iterator it_w; - const QWidgetList editWidgets(m_editWidgets.values()); + const QWidgetList editWidgets(d->m_editWidgets.values()); for (it_w = tabOrderWidgets.begin(); it_w != tabOrderWidgets.end();) { if (editWidgets.contains(*it_w)) { ++it_w; @@ -195,15 +201,45 @@ slotUpdateButtonState(); } +void TransactionEditor::setup(QWidgetList& tabOrderWidgets, const MyMoneyAccount& account) +{ + setup(tabOrderWidgets, account, KMyMoneyRegister::ActionNone); +} + +void TransactionEditor::setup(QWidgetList& tabOrderWidgets) +{ + setup(tabOrderWidgets, MyMoneyAccount(), KMyMoneyRegister::ActionNone); +} + +MyMoneyAccount TransactionEditor::account() const +{ + Q_D(const TransactionEditor); + return d->m_account; +} + +void TransactionEditor::setScheduleInfo(const QString& si) +{ + Q_D(TransactionEditor); + d->m_scheduleInfo = si; +} + +void TransactionEditor::setPaymentMethod(eMyMoney::Schedule::PaymentType pm) +{ + Q_D(TransactionEditor); + d->m_paymentMethod = pm; +} + void TransactionEditor::clearFinalWidgets() { - m_finalEditWidgets.clear(); + Q_D(TransactionEditor); + d->m_finalEditWidgets.clear(); } void TransactionEditor::addFinalWidget(const QWidget* w) { + Q_D(TransactionEditor); if (w) { - m_finalEditWidgets << w; + d->m_finalEditWidgets << w; } } @@ -213,6 +249,7 @@ bool TransactionEditor::eventFilter(QObject* o, QEvent* e) { + Q_D(TransactionEditor); bool rc = false; if (o == haveWidget("number")) { if (e->type() == QEvent::MouseButtonDblClick) { @@ -225,7 +262,7 @@ // the object is one of our edit widgets, then .... if (o->isWidgetType() && (e->type() == QEvent::KeyPress) - && m_editWidgets.values().contains(dynamic_cast(o))) { + && d->m_editWidgets.values().contains(dynamic_cast(o))) { QKeyEvent* k = dynamic_cast(e); if ((k->modifiers() & Qt::KeyboardModifierMask) == 0 || (k->modifiers() & Qt::KeypadModifier) != 0) { @@ -241,7 +278,7 @@ // to do this as long as the appropriate option is set. In all other cases, // we treat the return/enter key as such. if (KMyMoneyGlobalSettings::enterMovesBetweenFields()) { - for (it_w = m_finalEditWidgets.constBegin(); !isFinal && it_w != m_finalEditWidgets.constEnd(); ++it_w) { + for (it_w = d->m_finalEditWidgets.constBegin(); !isFinal && it_w != d->m_finalEditWidgets.constEnd(); ++it_w) { if (*it_w == o) { if (dynamic_cast(*it_w)) { isFinal = !(dynamic_cast(*it_w)->value().isZero()); @@ -282,18 +319,19 @@ void TransactionEditor::slotNumberChanged(const QString& txt) { - QString next = txt; + Q_D(TransactionEditor); + auto next = txt; kMyMoneyLineEdit* number = dynamic_cast(haveWidget("number")); QString schedInfo; - if (!m_scheduleInfo.isEmpty()) { - schedInfo = i18n("
Processing schedule for %1.
", m_scheduleInfo); + if (!d->m_scheduleInfo.isEmpty()) { + schedInfo = i18n("
Processing schedule for %1.
", d->m_scheduleInfo); } - while (MyMoneyFile::instance()->checkNoUsed(m_account.id(), next)) { - if (KMessageBox::questionYesNo(m_regForm, QString("") + schedInfo + i18n("
Check number %1 has already been used in account %2.
" - "
Do you want to replace it with the next available number?
", next, m_account.name()) + QString("
"), i18n("Duplicate number")) == KMessageBox::Yes) { + while (MyMoneyFile::instance()->checkNoUsed(d->m_account.id(), next)) { + if (KMessageBox::questionYesNo(d->m_regForm, QString("") + schedInfo + i18n("
Check number %1 has already been used in account %2.
" + "
Do you want to replace it with the next available number?
", next, d->m_account.name()) + QString("
"), i18n("Duplicate number")) == KMessageBox::Yes) { assignNextNumber(); - next = KMyMoneyUtils::nextCheckNumber(m_account); + next = KMyMoneyUtils::nextCheckNumber(d->m_account); } else { number->setText(QString()); break; @@ -303,9 +341,10 @@ void TransactionEditor::slotUpdateMemoState() { - KTextEdit* memo = dynamic_cast(m_editWidgets["memo"]); + Q_D(TransactionEditor); + KTextEdit* memo = dynamic_cast(d->m_editWidgets["memo"]); if (memo) { - m_memoChanged = (memo->toPlainText() != m_memoText); + d->m_memoChanged = (memo->toPlainText() != d->m_memoText); } } @@ -317,7 +356,8 @@ QWidget* TransactionEditor::haveWidget(const QString& name) const { - return m_editWidgets.haveWidget(name); + Q_D(const TransactionEditor); + return d->m_editWidgets.haveWidget(name); } int TransactionEditor::slotEditSplits() @@ -327,32 +367,40 @@ void TransactionEditor::setTransaction(const MyMoneyTransaction& t, const MyMoneySplit& s) { - m_transaction = t; - m_split = s; + Q_D(TransactionEditor); + d->m_transaction = t; + d->m_split = s; loadEditWidgets(); } +bool TransactionEditor::isMultiSelection() const +{ + Q_D(const TransactionEditor); + return d->m_transactions.count() > 1; +} + bool TransactionEditor::fixTransactionCommodity(const MyMoneyAccount& account) { + Q_D(TransactionEditor); bool rc = true; bool firstTimeMultiCurrency = true; - m_account = account; + d->m_account = account; - MyMoneyFile* file = MyMoneyFile::instance(); + auto file = MyMoneyFile::instance(); // determine the max fraction for this account - MyMoneySecurity sec = file->security(m_account.currencyId()); - int fract = m_account.fraction(); + MyMoneySecurity sec = file->security(d->m_account.currencyId()); + int fract = d->m_account.fraction(); // scan the list of selected transactions KMyMoneyRegister::SelectedTransactions::iterator it_t; - for (it_t = m_transactions.begin(); (rc == true) && (it_t != m_transactions.end()); ++it_t) { + for (it_t = d->m_transactions.begin(); (rc == true) && (it_t != d->m_transactions.end()); ++it_t) { // there was a time when the schedule editor did not setup the transaction commodity // let's give a helping hand here for those old schedules if ((*it_t).transaction().commodity().isEmpty()) - (*it_t).transaction().setCommodity(m_account.currencyId()); + (*it_t).transaction().setCommodity(d->m_account.currencyId()); // we need to check things only if a different commodity is used - if (m_account.currencyId() != (*it_t).transaction().commodity()) { + if (d->m_account.currencyId() != (*it_t).transaction().commodity()) { MyMoneySecurity osec = file->security((*it_t).transaction().commodity()); switch ((*it_t).transaction().splitCount()) { case 0: @@ -363,8 +411,8 @@ try { // make sure, that the value is equal to the shares, don't forget our own copy MyMoneySplit& splitB = (*it_t).split(); // reference usage wanted here - if (m_split == splitB) - m_split.setValue(splitB.shares()); + if (d->m_split == splitB) + d->m_split.setValue(splitB.shares()); splitB.setValue(splitB.shares()); (*it_t).transaction().modifySplit(splitB); @@ -393,11 +441,11 @@ try { // retrieve the splits MyMoneySplit& splitB = (*it_t).split(); // reference usage wanted here - MyMoneySplit splitA = (*it_t).transaction().splitByAccount(m_account.id(), false); + MyMoneySplit splitA = (*it_t).transaction().splitByAccount(d->m_account.id(), false); // - set V in both splits to SB. Don't forget our own copy - if (m_split == splitB) { - m_split.setValue(splitB.shares()); + if (d->m_split == splitB) { + d->m_split.setValue(splitB.shares()); } splitB.setValue(splitB.shares()); splitA.setValue(-splitB.shares()); @@ -439,8 +487,8 @@ MyMoneySplit s = (*it_s); if (s == mySplit) { s.setValue(s.shares()); - if (mySplit == m_split) { - m_split = s; + if (mySplit == d->m_split) { + d->m_split = s; } mySplit = s; } else { @@ -456,11 +504,11 @@ } // set the transaction's ommodity to this account's currency - (*it_t).transaction().setCommodity(m_account.currencyId()); + (*it_t).transaction().setCommodity(d->m_account.currencyId()); // update our copy of the transaction that has the focus - if ((*it_t).transaction().id() == m_transaction.id()) { - m_transaction = (*it_t).transaction(); + if ((*it_t).transaction().id() == d->m_transaction.id()) { + d->m_transaction = (*it_t).transaction(); } } } @@ -469,25 +517,26 @@ void TransactionEditor::assignNextNumber() { + Q_D(TransactionEditor); if (canAssignNumber()) { kMyMoneyLineEdit* number = dynamic_cast(haveWidget("number")); - QString num = KMyMoneyUtils::nextCheckNumber(m_account); + QString num = KMyMoneyUtils::nextCheckNumber(d->m_account); bool showMessage = true; int rc = KMessageBox::No; QString schedInfo; - if (!m_scheduleInfo.isEmpty()) { - schedInfo = i18n("
Processing schedule for %1.
", m_scheduleInfo); + if (!d->m_scheduleInfo.isEmpty()) { + schedInfo = i18n("
Processing schedule for %1.
", d->m_scheduleInfo); } - while (MyMoneyFile::instance()->checkNoUsed(m_account.id(), num)) { + while (MyMoneyFile::instance()->checkNoUsed(d->m_account.id(), num)) { if (showMessage) { - rc = KMessageBox::questionYesNo(m_regForm, QString("") + schedInfo + i18n("Check number %1 has already been used in account %2." - "
Do you want to replace it with the next available number?
", num, m_account.name()) + QString("
"), i18n("Duplicate number")); + rc = KMessageBox::questionYesNo(d->m_regForm, QString("") + schedInfo + i18n("Check number %1 has already been used in account %2." + "
Do you want to replace it with the next available number?
", num, d->m_account.name()) + QString("
"), i18n("Duplicate number")); showMessage = false; } if (rc == KMessageBox::Yes) { - num = KMyMoneyUtils::nextCheckNumber(m_account); - KMyMoneyUtils::updateLastNumberUsed(m_account, num); - m_account.setValue("lastNumberUsed", num); + num = KMyMoneyUtils::nextCheckNumber(d->m_account); + KMyMoneyUtils::updateLastNumberUsed(d->m_account, num); + d->m_account.setValue("lastNumberUsed", num); number->loadText(num); } else { num = QString(); @@ -500,7 +549,7 @@ bool TransactionEditor::canAssignNumber() const { - kMyMoneyLineEdit* number = dynamic_cast(haveWidget("number")); + auto number = dynamic_cast(haveWidget("number")); return (number != 0); } @@ -547,14 +596,15 @@ bool TransactionEditor::enterTransactions(QString& newId, bool askForSchedule, bool suppressBalanceWarnings) { + Q_D(TransactionEditor); newId.clear(); - MyMoneyFile* file = MyMoneyFile::instance(); + auto file = MyMoneyFile::instance(); // make sure to run through all stuff that is tied to 'focusout events'. - m_regForm->parentWidget()->setFocus(); + d->m_regForm->parentWidget()->setFocus(); QCoreApplication::processEvents(QEventLoop::ExcludeUserInputEvents, 10); // we don't need to update our widgets anymore, so we just disconnect the signal - disconnect(file, SIGNAL(dataChanged()), this, SLOT(slotReloadEditWidgets())); + disconnect(file, &MyMoneyFile::dataChanged, this, &TransactionEditor::slotReloadEditWidgets); KMyMoneyRegister::SelectedTransactions::iterator it_t; MyMoneyTransaction t; @@ -570,10 +620,10 @@ // list first, so that the user has a chance to interrupt the storage // process QList list; - bool storeTransactions = true; + auto storeTransactions = true; // collect transactions - for (it_t = m_transactions.begin(); storeTransactions && !newTransactionCreated && it_t != m_transactions.end(); ++it_t) { + for (it_t = d->m_transactions.begin(); storeTransactions && !newTransactionCreated && it_t != d->m_transactions.end(); ++it_t) { storeTransactions = createTransaction(t, (*it_t).transaction(), (*it_t).split()); // if the transaction was created successfully, append it to the list if (storeTransactions) @@ -586,7 +636,7 @@ // if not interrupted by user, continue to store them in the engine if (storeTransactions) { - int i = 0; + auto i = 0; emit statusMsg(i18n("Storing transactions")); emit statusProgress(0, list.count()); @@ -640,7 +690,7 @@ i18n("Accepts the entered data and stores it as schedule"), i18n("Use this to schedule the transaction for later entry into the ledger.")); - enter = KMessageBox::questionYesNo(m_regForm, QString("%1").arg(i18n("The transaction you are about to enter has a post date in the future.

Do you want to enter it in the ledger or add it to the schedules?")), i18nc("Dialog caption for 'Enter or schedule' dialog", "Enter or schedule?"), enterButton, scheduleButton, "EnterOrScheduleTransactionInFuture") == KMessageBox::Yes; + enter = KMessageBox::questionYesNo(d->m_regForm, QString("%1").arg(i18n("The transaction you are about to enter has a post date in the future.

Do you want to enter it in the ledger or add it to the schedules?")), i18nc("Dialog caption for 'Enter or schedule' dialog", "Enter or schedule?"), enterButton, scheduleButton, "EnterOrScheduleTransactionInFuture") == KMessageBox::Yes; } if (enter) { // add new transaction @@ -649,11 +699,11 @@ newId = (*it_ts).id(); // refresh account object for transactional changes // refresh account and transaction object because they might have changed - m_account = file->account(m_account.id()); + d->m_account = file->account(d->m_account.id()); t = (*it_ts); // if a new transaction has a valid number, keep it with the account - keepNewNumber((*it_ts)); + d->keepNewNumber((*it_ts)); } else { // turn object creation on, so that moving the focus does // not screw up the dialog that might be popping up @@ -670,7 +720,7 @@ // modify existing transaction // its number might have been edited // bearing in mind it could contain alpha characters - keepNewNumber((*it_ts)); + d->keepNewNumber((*it_ts)); file->modifyTransaction(*it_ts); } } @@ -681,7 +731,7 @@ // we need to do that before we commit the transaction to the engine // as we need it during the update of the views that is caused by committing already. if (newTransactionCreated) { - m_transactions.clear(); + d->m_transactions.clear(); MyMoneySplit s; // a transaction w/o a single split should not exist and adding it // should throw an exception in MyMoneyFile::addTransaction, but we @@ -689,7 +739,7 @@ if (t.splitCount() > 0) s = t.splits().front(); KMyMoneyRegister::SelectedTransaction st(t, s); - m_transactions.append(st); + d->m_transactions.append(st); } // Save pricing information @@ -748,7 +798,7 @@ } if (!msg.isEmpty()) { - emit balanceWarning(m_regForm, acc, msg); + emit balanceWarning(d->m_regForm, acc, msg); } } } @@ -764,1534 +814,12 @@ return storeTransactions; } -void TransactionEditor::keepNewNumber(const MyMoneyTransaction& tr) -{ - // verify that new number, possibly containing alpha, is valid - MyMoneyTransaction txn = tr; - MyMoneyFile* file = MyMoneyFile::instance(); - if (!txn.splits().isEmpty()) { - QString number = txn.splits().first().number(); - if (KMyMoneyUtils::numericPart(number) > 0) { - // numeric is valid - kMyMoneyLineEdit* numberEdit = dynamic_cast(haveWidget("number")); - if (numberEdit) { - numberEdit->loadText(number); - MyMoneySplit split = txn.splits().first(); - split.setNumber(number); - txn.modifySplit(split); - m_account.setValue("lastNumberUsed", number); - file->modifyAccount(m_account); - } - } - } -} - void TransactionEditor::resizeForm() { + Q_D(TransactionEditor); // force resizeing of the columns in the form - KMyMoneyTransactionForm::TransactionForm* form = dynamic_cast(m_regForm); + auto form = dynamic_cast(d->m_regForm); if (form) { QMetaObject::invokeMethod(form, "resize", Qt::QueuedConnection, QGenericReturnArgument(), Q_ARG(int, ValueColumn1)); } } - -StdTransactionEditor::StdTransactionEditor() : - m_inUpdateVat(false) -{ -} - -StdTransactionEditor::StdTransactionEditor(TransactionEditorContainer* regForm, KMyMoneyRegister::Transaction* item, const KMyMoneyRegister::SelectedTransactions& list, const QDate& lastPostDate) : - TransactionEditor(regForm, item, list, lastPostDate), - m_inUpdateVat(false) -{ -} - -StdTransactionEditor::~StdTransactionEditor() -{ -} - - -void StdTransactionEditor::createEditWidgets() -{ - // we only create the account widget in case it is needed - // to avoid confusion in the tab order later on. - if (m_item->showRowInForm(0)) { - KMyMoneyCategory* account = new KMyMoneyCategory; - account->setPlaceholderText(i18n("Account")); - account->setObjectName(QLatin1String("Account")); - m_editWidgets["account"] = account; - connect(account, SIGNAL(editTextChanged(QString)), this, SLOT(slotUpdateButtonState())); - connect(account, SIGNAL(itemSelected(QString)), this, SLOT(slotUpdateAccount(QString))); - } - - KMyMoneyPayeeCombo* payee = new KMyMoneyPayeeCombo; - payee->setPlaceholderText(i18n("Payer/Receiver")); - payee->setObjectName(QLatin1String("Payee")); - m_editWidgets["payee"] = payee; - - connect(payee, SIGNAL(createItem(QString,QString&)), this, SIGNAL(createPayee(QString,QString&))); - connect(payee, SIGNAL(objectCreation(bool)), this, SIGNAL(objectCreation(bool))); - connect(payee, SIGNAL(itemSelected(QString)), this, SLOT(slotUpdatePayee(QString))); - connect(payee, SIGNAL(editTextChanged(QString)), this, SLOT(slotUpdateButtonState())); - - KMyMoneyCategory* category = new KMyMoneyCategory(0, true); - category->setPlaceholderText(i18n("Category/Account")); - category->setObjectName(QLatin1String("Category/Account")); - m_editWidgets["category"] = category; - connect(category, SIGNAL(itemSelected(QString)), this, SLOT(slotUpdateCategory(QString))); - connect(category, SIGNAL(editTextChanged(QString)), this, SLOT(slotUpdateButtonState())); - connect(category, SIGNAL(createItem(QString,QString&)), this, SLOT(slotCreateCategory(QString,QString&))); - connect(category, SIGNAL(objectCreation(bool)), this, SIGNAL(objectCreation(bool))); - connect(category->splitButton(), SIGNAL(clicked()), this, SLOT(slotEditSplits())); - // initially disable the split button since we don't have an account set - if (category->splitButton()) - category->splitButton()->setDisabled(m_account.id().isEmpty()); - - KTagContainer* tag = new KTagContainer; - tag->tagCombo()->setPlaceholderText(i18n("Tag")); - tag->tagCombo()->setObjectName(QLatin1String("Tag")); - m_editWidgets["tag"] = tag; - connect(tag->tagCombo(), SIGNAL(createItem(QString,QString&)), this, SIGNAL(createTag(QString,QString&))); - connect(tag->tagCombo(), SIGNAL(objectCreation(bool)), this, SIGNAL(objectCreation(bool))); - - KTextEdit* memo = new KTextEdit; - memo->setObjectName(QLatin1String("Memo")); - memo->setTabChangesFocus(true); - connect(memo, SIGNAL(textChanged()), this, SLOT(slotUpdateMemoState())); - connect(memo, SIGNAL(textChanged()), this, SLOT(slotUpdateButtonState())); - m_editWidgets["memo"] = memo; - m_memoText.clear(); - m_memoChanged = false; - - bool showNumberField = true; - switch (m_account.accountType()) { - case eMyMoney::Account::Savings: - case eMyMoney::Account::Cash: - case eMyMoney::Account::Loan: - case eMyMoney::Account::AssetLoan: - case eMyMoney::Account::Asset: - case eMyMoney::Account::Liability: - case eMyMoney::Account::Equity: - showNumberField = KMyMoneyGlobalSettings::alwaysShowNrField(); - break; - - case eMyMoney::Account::Income: - case eMyMoney::Account::Expense: - showNumberField = false; - break; - - default: - break; - } - - if (showNumberField) { - kMyMoneyLineEdit* number = new kMyMoneyLineEdit; - number->setPlaceholderText(i18n("Number")); - number->setObjectName(QLatin1String("Number")); - m_editWidgets["number"] = number; - connect(number, SIGNAL(lineChanged(QString)), this, SLOT(slotNumberChanged(QString))); - // number->installEventFilter(this); - } - - kMyMoneyDateInput* postDate = new kMyMoneyDateInput; - m_editWidgets["postdate"] = postDate; - postDate->setObjectName(QLatin1String("PostDate")); - connect(postDate, SIGNAL(dateChanged(QDate)), this, SLOT(slotUpdateButtonState())); - postDate->setDate(QDate()); - - kMyMoneyEdit* value = new kMyMoneyEdit; - m_editWidgets["amount"] = value; - value->setObjectName(QLatin1String("Amount")); - value->setResetButtonVisible(false); - connect(value, SIGNAL(valueChanged(QString)), this, SLOT(slotUpdateAmount(QString))); - connect(value, SIGNAL(textChanged(QString)), this, SLOT(slotUpdateButtonState())); - - value = new kMyMoneyEdit; - m_editWidgets["payment"] = value; - value->setObjectName(QLatin1String("Payment")); - value->setResetButtonVisible(false); - connect(value, SIGNAL(valueChanged(QString)), this, SLOT(slotUpdatePayment(QString))); - connect(value, SIGNAL(textChanged(QString)), this, SLOT(slotUpdateButtonState())); - - value = new kMyMoneyEdit; - m_editWidgets["deposit"] = value; - value->setObjectName(QLatin1String("Deposit")); - value->setResetButtonVisible(false); - connect(value, SIGNAL(valueChanged(QString)), this, SLOT(slotUpdateDeposit(QString))); - connect(value, SIGNAL(textChanged(QString)), this, SLOT(slotUpdateButtonState())); - - KMyMoneyCashFlowCombo* cashflow = new KMyMoneyCashFlowCombo(0, m_account.accountGroup()); - m_editWidgets["cashflow"] = cashflow; - cashflow->setObjectName(QLatin1String("Cashflow")); - connect(cashflow, SIGNAL(directionSelected(KMyMoneyRegister::CashFlowDirection)), this, SLOT(slotUpdateCashFlow(KMyMoneyRegister::CashFlowDirection))); - - KMyMoneyReconcileCombo* reconcile = new KMyMoneyReconcileCombo; - m_editWidgets["status"] = reconcile; - reconcile->setObjectName(QLatin1String("Reconcile")); - - KMyMoneyRegister::QWidgetContainer::iterator it_w; - for (it_w = m_editWidgets.begin(); it_w != m_editWidgets.end(); ++it_w) { - (*it_w)->installEventFilter(this); - } - // 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 (!isMultiSelection()) { - reconcile->removeDontCare(); - cashflow->removeDontCare(); - } - - QLabel* label; - m_editWidgets["account-label"] = label = new QLabel(i18n("Account")); - label->setAlignment(Qt::AlignVCenter); - - m_editWidgets["category-label"] = label = new QLabel(i18n("Category")); - label->setAlignment(Qt::AlignVCenter); - - m_editWidgets["tag-label"] = label = new QLabel(i18n("Tags")); - label->setAlignment(Qt::AlignVCenter); - - m_editWidgets["memo-label"] = label = new QLabel(i18n("Memo")); - label->setAlignment(Qt::AlignVCenter); - - m_editWidgets["number-label"] = label = new QLabel(i18n("Number")); - label->setAlignment(Qt::AlignVCenter); - - m_editWidgets["date-label"] = label = new QLabel(i18n("Date")); - label->setAlignment(Qt::AlignVCenter); - - m_editWidgets["amount-label"] = label = new QLabel(i18n("Amount")); - label->setAlignment(Qt::AlignVCenter); - - m_editWidgets["status-label"] = label = new QLabel(i18n("Status")); - label->setAlignment(Qt::AlignVCenter); - - // create a copy of tabbar above the form (if we are created for a form) - KMyMoneyTransactionForm::TransactionForm* form = dynamic_cast(m_regForm); - if (form) { - KMyMoneyTransactionForm::TabBar* tabbar = new KMyMoneyTransactionForm::TabBar; - m_editWidgets["tabbar"] = tabbar; - tabbar->setObjectName(QLatin1String("TabBar")); - tabbar->copyTabs(form->tabBar()); - connect(tabbar, SIGNAL(tabCurrentChanged(int)), this, SLOT(slotUpdateAction(int))); - connect(tabbar, SIGNAL(tabCurrentChanged(int)), this, SIGNAL(operationTypeChanged(int))); - } - - setupPrecision(); -} - -void StdTransactionEditor::setupCategoryWidget(QString& categoryId) -{ - TransactionEditor::setupCategoryWidget(dynamic_cast(m_editWidgets["category"]), m_splits, categoryId, SLOT(slotEditSplits())); - - if (m_splits.count() == 1) - m_shares = m_splits[0].shares(); -} - -bool StdTransactionEditor::isTransfer(const QString& accId1, const QString& accId2) const -{ - if (accId1.isEmpty() || accId2.isEmpty()) - return false; - - return MyMoneyFile::instance()->account(accId1).isIncomeExpense() == MyMoneyFile::instance()->account(accId2).isIncomeExpense(); -} - -void StdTransactionEditor::loadEditWidgets(KMyMoneyRegister::Action action) -{ - // don't kick off VAT processing from here - m_inUpdateVat = true; - - QMap::const_iterator it_w; - QWidget* w; - AccountSet aSet; - - // load the account widget - KMyMoneyCategory* account = dynamic_cast(haveWidget("account")); - if (account) { - aSet.addAccountGroup(eMyMoney::Account::Asset); - aSet.addAccountGroup(eMyMoney::Account::Liability); - aSet.removeAccountType(eMyMoney::Account::AssetLoan); - aSet.removeAccountType(eMyMoney::Account::CertificateDep); - aSet.removeAccountType(eMyMoney::Account::Investment); - aSet.removeAccountType(eMyMoney::Account::Stock); - aSet.removeAccountType(eMyMoney::Account::MoneyMarket); - aSet.removeAccountType(eMyMoney::Account::Loan); - aSet.load(account->selector()); - account->completion()->setSelected(m_account.id()); - account->slotItemSelected(m_account.id()); - } - - // load the payee widget - KMyMoneyPayeeCombo* payee = dynamic_cast(m_editWidgets["payee"]); - payee->loadPayees(MyMoneyFile::instance()->payeeList()); - - // load the category widget - KMyMoneyCategory* category = dynamic_cast(m_editWidgets["category"]); - disconnect(category, SIGNAL(focusIn()), this, SLOT(slotEditSplits())); - - // load the tag widget - //KMyMoneyTagCombo* tag = dynamic_cast(m_editWidgets["tag"]); - KTagContainer* tag = dynamic_cast(m_editWidgets["tag"]); - tag->loadTags(MyMoneyFile::instance()->tagList()); - - // 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) { - MyMoneyAccount acc = MyMoneyFile::instance()->account((*it_s).accountId()); - if (acc.accountType() == eMyMoney::Account::Equity) - haveEquityAccount = true; - } - - aSet.clear(); - aSet.addAccountGroup(eMyMoney::Account::Asset); - aSet.addAccountGroup(eMyMoney::Account::Liability); - aSet.addAccountGroup(eMyMoney::Account::Income); - aSet.addAccountGroup(eMyMoney::Account::Expense); - if (KMyMoneyGlobalSettings::expertMode() || haveEquityAccount) - aSet.addAccountGroup(eMyMoney::Account::Equity); - - aSet.removeAccountType(eMyMoney::Account::CertificateDep); - aSet.removeAccountType(eMyMoney::Account::Investment); - aSet.removeAccountType(eMyMoney::Account::Stock); - aSet.removeAccountType(eMyMoney::Account::MoneyMarket); - aSet.load(category->selector()); - - // if an account is specified then remove it from the widget so that the user - // cannot create a transfer with from and to account being the same account - if (!m_account.id().isEmpty()) - category->selector()->removeItem(m_account.id()); - - // also show memo text if isMultiSelection() - dynamic_cast(m_editWidgets["memo"])->setText(m_split.memo()); - // need to know if it changed - m_memoText = m_split.memo(); - m_memoChanged = false; - - if (!isMultiSelection()) { - if (m_transaction.postDate().isValid()) - dynamic_cast(m_editWidgets["postdate"])->setDate(m_transaction.postDate()); - else if (m_lastPostDate.isValid()) - dynamic_cast(m_editWidgets["postdate"])->setDate(m_lastPostDate); - else - dynamic_cast(m_editWidgets["postdate"])->setDate(QDate::currentDate()); - - if ((w = haveWidget("number")) != 0) { - dynamic_cast(w)->loadText(m_split.number()); - if (m_transaction.id().isEmpty() // new transaction - && dynamic_cast(w)->text().isEmpty() // no number filled in - && m_account.accountType() == eMyMoney::Account::Checkings // checkings account - && KMyMoneyGlobalSettings::autoIncCheckNumber() // and auto inc number turned on? - && action != KMyMoneyRegister::ActionDeposit // only transfers or withdrawals - && m_paymentMethod == eMyMoney::Schedule::PaymentType::WriteChecque) {// only for WriteChecque - assignNextNumber(); - } - } - dynamic_cast(m_editWidgets["status"])->setState(m_split.reconcileFlag()); - - QString payeeId = m_split.payeeId(); - if (!payeeId.isEmpty()) { - payee->setSelectedItem(payeeId); - } - QList t = m_split.tagIdList(); - if (!t.isEmpty()) { - for (int i = 0; i < t.size(); i++) - tag->addTagWidget(t[i]); - } - - m_splits.clear(); - if (m_transaction.splitCount() < 2) { - category->completion()->setSelected(QString()); - } else { - QList::const_iterator it_s; - for (it_s = m_transaction.splits().constBegin(); it_s != m_transaction.splits().constEnd(); ++it_s) { - if ((*it_s) == m_split) - continue; - m_splits.append(*it_s); - } - } - QString categoryId; - setupCategoryWidget(categoryId); - - if ((w = haveWidget("cashflow")) != 0) { - KMyMoneyCashFlowCombo* cashflow = dynamic_cast(w); - cashflow->setDirection(!m_split.value().isPositive() ? KMyMoneyRegister::Payment : KMyMoneyRegister::Deposit); // include isZero case - } - - if ((w = haveWidget("category-label")) != 0) { - QLabel *categoryLabel = dynamic_cast(w); - if (isTransfer(m_split.accountId(), categoryId)) { - if (m_split.value().isPositive()) - categoryLabel->setText(i18n("Transfer from")); - else - categoryLabel->setText(i18n("Transfer to")); - } - } - - MyMoneyMoney value = m_split.shares(); - - if (haveWidget("deposit")) { - if (m_split.shares().isNegative()) { - dynamic_cast(m_editWidgets["deposit"])->loadText(""); - dynamic_cast(m_editWidgets["payment"])->setValue(value.abs()); - } else { - dynamic_cast(m_editWidgets["deposit"])->setValue(value.abs()); - dynamic_cast(m_editWidgets["payment"])->loadText(""); - } - } - if ((w = haveWidget("amount")) != 0) { - dynamic_cast(w)->setValue(value.abs()); - } - - slotUpdateCategory(categoryId); - - // try to preset for specific action if a new transaction is being started - if (m_transaction.id().isEmpty()) { - if ((w = haveWidget("category-label")) != 0) { - TabBar* tabbar = dynamic_cast(haveWidget("tabbar")); - if (action == KMyMoneyRegister::ActionNone) { - if (tabbar) { - action = static_cast(tabbar->currentIndex()); - } - } - if (action != KMyMoneyRegister::ActionNone) { - QLabel *categoryLabel = dynamic_cast(w); - if (action == KMyMoneyRegister::ActionTransfer) { - if (m_split.value().isPositive()) - categoryLabel->setText(i18n("Transfer from")); - else - categoryLabel->setText(i18n("Transfer to")); - } - if ((w = haveWidget("cashflow")) != 0) { - KMyMoneyCashFlowCombo* cashflow = dynamic_cast(w); - if (action == KMyMoneyRegister::ActionDeposit || (action == KMyMoneyRegister::ActionTransfer && m_split.value().isPositive())) - cashflow->setDirection(KMyMoneyRegister::Deposit); - else - cashflow->setDirection(KMyMoneyRegister::Payment); - } - if (tabbar) { - tabbar->setCurrentIndex(action); - } - } - } - } else { - TabBar* tabbar = dynamic_cast(haveWidget("tabbar")); - if (tabbar) { - if (!isTransfer(m_split.accountId(), categoryId)) { - tabbar->setCurrentIndex(m_split.value().isNegative() ? KMyMoneyRegister::ActionWithdrawal : KMyMoneyRegister::ActionDeposit); - } else { - tabbar->setCurrentIndex(KMyMoneyRegister::ActionTransfer); - } - } - } - - } else { // isMultiSelection() - dynamic_cast(m_editWidgets["postdate"])->loadDate(QDate()); - dynamic_cast(m_editWidgets["status"])->setState(eMyMoney::Split::State::Unknown); - if (haveWidget("deposit")) { - dynamic_cast(m_editWidgets["deposit"])->loadText(""); - dynamic_cast(m_editWidgets["deposit"])->setAllowEmpty(); - dynamic_cast(m_editWidgets["payment"])->loadText(""); - dynamic_cast(m_editWidgets["payment"])->setAllowEmpty(); - } - if ((w = haveWidget("amount")) != 0) { - dynamic_cast(w)->loadText(""); - dynamic_cast(w)->setAllowEmpty(); - } - - slotUpdateAction(action); - - if ((w = haveWidget("tabbar")) != 0) { - w->setEnabled(false); - } - - category->completion()->setSelected(QString()); - } - - // allow kick off VAT processing again - m_inUpdateVat = false; -} - -QWidget* StdTransactionEditor::firstWidget() const -{ - QWidget* w = 0; - if (m_initialAction != KMyMoneyRegister::ActionNone) { - w = haveWidget("payee"); - } - return w; -} - -void StdTransactionEditor::slotReloadEditWidgets() -{ - // reload category widget - KMyMoneyCategory* category = dynamic_cast(m_editWidgets["category"]); - QString categoryId = category->selectedItem(); - - AccountSet aSet; - aSet.addAccountGroup(eMyMoney::Account::Asset); - aSet.addAccountGroup(eMyMoney::Account::Liability); - aSet.addAccountGroup(eMyMoney::Account::Income); - aSet.addAccountGroup(eMyMoney::Account::Expense); - if (KMyMoneyGlobalSettings::expertMode()) - aSet.addAccountGroup(eMyMoney::Account::Equity); - aSet.load(category->selector()); - - // if an account is specified then remove it from the widget so that the user - // cannot create a transfer with from and to account being the same account - if (!m_account.id().isEmpty()) - category->selector()->removeItem(m_account.id()); - - if (!categoryId.isEmpty()) - category->setSelectedItem(categoryId); - - - // reload payee widget - KMyMoneyPayeeCombo* payee = dynamic_cast(m_editWidgets["payee"]); - QString payeeId = payee->selectedItem(); - - payee->loadPayees(MyMoneyFile::instance()->payeeList()); - - if (!payeeId.isEmpty()) { - payee->setSelectedItem(payeeId); - } - - // reload tag widget - KTagContainer* tag = dynamic_cast(m_editWidgets["tag"]); - QString tagId = tag->tagCombo()->selectedItem(); - - tag->loadTags(MyMoneyFile::instance()->tagList()); - - if (!tagId.isEmpty()) { - tag->RemoveAllTagWidgets(); - tag->addTagWidget(tagId); - } -} - -void StdTransactionEditor::slotUpdatePayee(const QString& payeeId) -{ - // we have a new payee assigned to this transaction. - // in case there is no category assigned, no value entered and no - // memo available, we search for the last transaction of this payee - // in the account. - if (m_transaction.id().isEmpty() - && m_splits.count() == 0 - && KMyMoneyGlobalSettings::autoFillTransaction() != 0) { - // check if category is empty - KMyMoneyCategory* category = dynamic_cast(m_editWidgets["category"]); - QStringList list; - category->selectedItems(list); - if (!list.isEmpty()) - return; - - // check if memo is empty - KTextEdit* memo = dynamic_cast(m_editWidgets["memo"]); - if (memo && !memo->toPlainText().isEmpty()) - return; - - // check if all value fields are empty - kMyMoneyEdit* amount; - QStringList fields; - fields << "amount" << "payment" << "deposit"; - QStringList::const_iterator it_f; - for (it_f = fields.constBegin(); it_f != fields.constEnd(); ++it_f) { - amount = dynamic_cast(haveWidget(*it_f)); - if (amount && !amount->value().isZero()) - return; - } - -#if 0 - // Tony mentioned, that autofill does not work when he changed the date. Well, - // that certainly makes sense when you enter transactions in register mode as - // opposed to form mode, because the date field is located prior to the date - // field in the tab order of the widgets and the user might have already - // changed it. - // - // So I commented out the code that checks the date but left it in for reference. - // (ipwizard, 2008-04-07) - - // check if date has been altered by user - kMyMoneyDateInput* postDate = dynamic_cast(m_editWidgets["postdate"]); - if ((m_lastPostDate.isValid() && (postDate->date() != m_lastPostDate)) - || (!m_lastPostDate.isValid() && (postDate->date() != QDate::currentDate()))) - return; -#endif - - // if we got here, we have to autofill - autoFill(payeeId); - } - - // If payee has associated default account (category), set that now. - const MyMoneyPayee& payeeObj = MyMoneyFile::instance()->payee(payeeId); - if (payeeObj.defaultAccountEnabled()) { - KMyMoneyCategory* category = dynamic_cast(m_editWidgets["category"]); - category->slotItemSelected(payeeObj.defaultAccountId()); - } -} - -MyMoneyMoney StdTransactionEditor::shares(const MyMoneyTransaction& t) const -{ - MyMoneyMoney result; - QList::const_iterator it_s; - for (it_s = t.splits().begin(); it_s != t.splits().end(); ++it_s) { - if ((*it_s).accountId() == m_account.id()) { - result += (*it_s).shares(); - } - } - return result; -} - -struct uniqTransaction { - const MyMoneyTransaction* t; - int cnt; -}; - -void StdTransactionEditor::autoFill(const QString& payeeId) -{ - QList > list; - MyMoneyTransactionFilter filter(m_account.id()); - filter.addPayee(payeeId); - MyMoneyFile::instance()->transactionList(list, filter); - if (!list.empty()) { - // ok, we found at least one previous transaction. now we clear out - // what we have collected so far and add those splits from - // the previous transaction. - QList >::const_iterator it_t; - QMap uniqList; - - // collect the transactions and see if we have any duplicates - for (it_t = list.constBegin(); it_t != list.constEnd(); ++it_t) { - QString key = (*it_t).first.accountSignature(); - int cnt = 0; - QMap::iterator it_u; - do { - QString ukey = QString("%1-%2").arg(key).arg(cnt); - it_u = uniqList.find(ukey); - if (it_u == uniqList.end()) { - uniqList[ukey].t = &((*it_t).first); - uniqList[ukey].cnt = 1; - } else if (KMyMoneyGlobalSettings::autoFillTransaction() == 1) { - // we already have a transaction with this signature. we must - // now check, if we should really treat it as a duplicate according - // to the value comparison delta. - MyMoneyMoney s1 = shares(*((*it_u).t)); - MyMoneyMoney s2 = shares((*it_t).first); - if (s2.abs() > s1.abs()) { - MyMoneyMoney t(s1); - s1 = s2; - s2 = t; - } - MyMoneyMoney diff; - if (s2.isZero()) - diff = s1.abs(); - else - diff = ((s1 - s2) / s2).convert(10000); - if (diff.isPositive() && diff <= MyMoneyMoney(KMyMoneyGlobalSettings::autoFillDifference(), 100)) { - uniqList[ukey].t = &((*it_t).first); - break; // end while loop - } - } else if (KMyMoneyGlobalSettings::autoFillTransaction() == 2) { - (*it_u).cnt++; - break; // end while loop - } - ++cnt; - } while (it_u != uniqList.end()); - - } - - MyMoneyTransaction t; - if (KMyMoneyGlobalSettings::autoFillTransaction() != 2) { -#if 0 - // I removed this code to allow cancellation of an autofill if - // it does not match even if there is only a single matching - // transaction for the payee in question. In case, we want to revert - // to the old behavior, don't forget to uncomment the closing - // brace further down in the code as well. (ipwizard 2009-01-16) - if (uniqList.count() == 1) { - t = list.last().first; - } else { -#endif - QPointer dlg = new KSelectTransactionsDlg(m_account, m_regForm); - dlg->setWindowTitle(i18n("Select autofill transaction")); - - QMap::const_iterator it_u; - for (it_u = uniqList.constBegin(); it_u != uniqList.constEnd(); ++it_u) { - dlg->addTransaction(*(*it_u).t); - } - - // setup sort order - dlg->m_register->setSortOrder("1,-9,-4"); - // sort the transactions according to the sort setting - dlg->m_register->sortItems(); - - // and select the last item - if (dlg->m_register->lastItem()) - dlg->m_register->selectItem(dlg->m_register->lastItem()); - - if (dlg->exec() == QDialog::Accepted) { - t = dlg->transaction(); - } -#if 0 - } -#endif - } else { - int maxCnt = 0; - QMap::const_iterator it_u; - for (it_u = uniqList.constBegin(); it_u != uniqList.constEnd(); ++it_u) { - if ((*it_u).cnt > maxCnt) { - t = *(*it_u).t; - maxCnt = (*it_u).cnt; - } - } - } - - if (t != MyMoneyTransaction()) { - m_transaction.removeSplits(); - m_split = MyMoneySplit(); - MyMoneySplit otherSplit; - QList::ConstIterator it; - for (it = t.splits().constBegin(); it != t.splits().constEnd(); ++it) { - MyMoneySplit s(*it); - s.setReconcileFlag(eMyMoney::Split::State::NotReconciled); - s.setReconcileDate(QDate()); - s.clearId(); - s.setBankID(QString()); - // older versions of KMyMoney used to set the action - // we don't need this anymore - if (s.action() != MyMoneySplit::ActionAmortization - && s.action() != MyMoneySplit::ActionInterest) { - s.setAction(QString()); - } - - // FIXME update check number. The old comment contained - // - // - // If a check number is already specified by the user it is - // used. If the input field is empty and the previous transaction - // contains a checknumber, the next usable check number will be assigned - // to the transaction. - // - - kMyMoneyLineEdit* editNr = dynamic_cast(haveWidget("number")); - if (editNr && !editNr->text().isEmpty()) { - s.setNumber(editNr->text()); - } else if (!s.number().isEmpty()) { - s.setNumber(KMyMoneyUtils::nextCheckNumber(m_account)); - } - - // if the memos should not be used with autofill or - // if the transaction has exactly two splits, remove - // the memo text of the split that does not reference - // the current account. This allows the user to change - // the autofilled memo text which will then also be used - // in this split. See createTransaction() for this logic. - if ((s.accountId() != m_account.id() && t.splitCount() == 2) || !KMyMoneyGlobalSettings::autoFillUseMemos()) - s.setMemo(QString()); - - m_transaction.addSplit(s); - if (s.accountId() == m_account.id() && m_split == MyMoneySplit()) { - m_split = s; - } else { - otherSplit = s; - } - } - - // make sure to extract the right action - KMyMoneyRegister::Action action; - action = m_split.shares().isNegative() ? KMyMoneyRegister::ActionWithdrawal : KMyMoneyRegister::ActionDeposit; - - if (m_transaction.splitCount() == 2) { - MyMoneyAccount acc = MyMoneyFile::instance()->account(otherSplit.accountId()); - if (acc.isAssetLiability()) - action = KMyMoneyRegister::ActionTransfer; - } - - // now setup the widgets with the new data but keep the date - QDate date = dynamic_cast(m_editWidgets["postdate"])->date(); - loadEditWidgets(action); - dynamic_cast(m_editWidgets["postdate"])->setDate(date); - } - } - - // focus jumps into the category field - QWidget* w; - if ((w = haveWidget("payee")) != 0) { - w->setFocus(); - } -} - -void StdTransactionEditor::slotUpdateAction(int action) -{ - TabBar* tabbar = dynamic_cast(haveWidget("tabbar")); - if (tabbar) { - QLabel* categoryLabel = dynamic_cast(haveWidget("category-label")); - KMyMoneyCashFlowCombo* cashflow = dynamic_cast(m_editWidgets["cashflow"]); - switch (action) { - case KMyMoneyRegister::ActionDeposit: - categoryLabel->setText(i18n("Category")); - cashflow->setDirection(KMyMoneyRegister::Deposit); - break; - case KMyMoneyRegister::ActionTransfer: - if (m_split.shares().isNegative()) { - cashflow->setDirection(KMyMoneyRegister::Payment); - categoryLabel->setText(i18n("Transfer to")); - } else { - cashflow->setDirection(KMyMoneyRegister::Deposit); - categoryLabel->setText(i18n("Transfer from")); - } - tabbar->setCurrentIndex(KMyMoneyRegister::ActionTransfer); - slotUpdateCashFlow(cashflow->direction()); - break; - case KMyMoneyRegister::ActionWithdrawal: - categoryLabel->setText(i18n("Category")); - cashflow->setDirection(KMyMoneyRegister::Payment); - break; - } - resizeForm(); - } -} - -void StdTransactionEditor::slotUpdateCashFlow(KMyMoneyRegister::CashFlowDirection dir) -{ - QLabel* categoryLabel = dynamic_cast(haveWidget("category-label")); - KMyMoneyCashFlowCombo* cashflow = dynamic_cast(haveWidget("cashflow")); - cashflow->setDirection(dir); - // qDebug("Update cashflow to %d", dir); - if (categoryLabel) { - TabBar* tabbar = dynamic_cast(haveWidget("tabbar")); - if (!tabbar) return; // no transaction form - if (categoryLabel->text() != i18n("Category")) { - tabbar->setCurrentIndex(KMyMoneyRegister::ActionTransfer); - if (dir == KMyMoneyRegister::Deposit) { - categoryLabel->setText(i18n("Transfer from")); - } else { - categoryLabel->setText(i18n("Transfer to")); - } - resizeForm(); - } else { - if (dir == KMyMoneyRegister::Deposit) - tabbar->setCurrentIndex(KMyMoneyRegister::ActionDeposit); - else - tabbar->setCurrentIndex(KMyMoneyRegister::ActionWithdrawal); - } - } -} - -void StdTransactionEditor::slotUpdateCategory(const QString& id) -{ - QLabel *categoryLabel = dynamic_cast(haveWidget("category-label")); - // qDebug("Update category to %s", qPrintable(id)); - - if (categoryLabel) { - TabBar* tabbar = dynamic_cast(haveWidget("tabbar")); - kMyMoneyEdit* amount = dynamic_cast(m_editWidgets["amount"]); - MyMoneyMoney val = amount->value(); - - if (categoryLabel->text() == i18n("Transfer from")) { - val = -val; - } else { - val = val.abs(); - } - - if (tabbar) { - tabbar->setTabEnabled(KMyMoneyRegister::ActionTransfer, true); - tabbar->setTabEnabled(KMyMoneyRegister::ActionDeposit, true); - tabbar->setTabEnabled(KMyMoneyRegister::ActionWithdrawal, true); - } - - bool disableTransferTab = false; - if (!id.isEmpty()) { - MyMoneyAccount acc = MyMoneyFile::instance()->account(id); - if (acc.isAssetLiability() - || acc.accountGroup() == eMyMoney::Account::Equity) { - if (tabbar) { - tabbar->setCurrentIndex(KMyMoneyRegister::ActionTransfer); - tabbar->setTabEnabled(KMyMoneyRegister::ActionDeposit, false); - tabbar->setTabEnabled(KMyMoneyRegister::ActionWithdrawal, false); - } - KMyMoneyCashFlowCombo* cashflow = dynamic_cast(m_editWidgets["cashflow"]); - if (val.isZero()) { - if (cashflow && (cashflow->direction() == KMyMoneyRegister::Deposit)) { - categoryLabel->setText(i18n("Transfer from")); - } else { - categoryLabel->setText(i18n("Transfer to")); - } - } else if (val.isNegative()) { - categoryLabel->setText(i18n("Transfer from")); - cashflow->setDirection(KMyMoneyRegister::Deposit); - } else - categoryLabel->setText(i18n("Transfer to")); - } else { - disableTransferTab = true; - categoryLabel->setText(i18n("Category")); - } - updateAmount(val); - } else { //id.isEmpty() - KMyMoneyCategory* category = dynamic_cast(m_editWidgets["category"]); - disableTransferTab = !category->currentText().isEmpty(); - categoryLabel->setText(i18n("Category")); - } - if (tabbar) { - if (disableTransferTab) { - // set the proper tab before disabling the currently active tab - if (tabbar->currentIndex() == KMyMoneyRegister::ActionTransfer) { - tabbar->setCurrentIndex(val.isPositive() ? KMyMoneyRegister::ActionWithdrawal : KMyMoneyRegister::ActionDeposit); - } - tabbar->setTabEnabled(KMyMoneyRegister::ActionTransfer, false); - } - tabbar->update(); - } - - resizeForm(); - } - updateVAT(false); -} - -void StdTransactionEditor::slotUpdatePayment(const QString& txt) -{ - MyMoneyMoney val(txt); - - if (val.isNegative()) { - dynamic_cast(m_editWidgets["deposit"])->setValue(val.abs()); - dynamic_cast(m_editWidgets["payment"])->clearText(); - } else { - dynamic_cast(m_editWidgets["deposit"])->clearText(); - } - updateVAT(); -} - -void StdTransactionEditor::slotUpdateDeposit(const QString& txt) -{ - MyMoneyMoney val(txt); - if (val.isNegative()) { - dynamic_cast(m_editWidgets["payment"])->setValue(val.abs()); - dynamic_cast(m_editWidgets["deposit"])->clearText(); - } else { - dynamic_cast(m_editWidgets["payment"])->clearText(); - } - updateVAT(); -} - -void StdTransactionEditor::slotUpdateAmount(const QString& txt) -{ - // qDebug("Update amount to %s", qPrintable(txt)); - MyMoneyMoney val(txt); - updateAmount(val); - updateVAT(true); -} - -void StdTransactionEditor::updateAmount(const MyMoneyMoney& val) -{ - // we don't do anything if we have multiple transactions selected - if (isMultiSelection()) - return; - - QLabel *categoryLabel = dynamic_cast(haveWidget("category-label")); - if (categoryLabel) { - KMyMoneyCashFlowCombo* cashflow = dynamic_cast(m_editWidgets["cashflow"]); - - if (!val.isPositive()) { // fixes BUG321317 - if (categoryLabel->text() != i18n("Category")) { - if (cashflow->direction() == KMyMoneyRegister::Payment) { - categoryLabel->setText(i18n("Transfer to")); - } - } else { - slotUpdateCashFlow(cashflow->direction()); - } - dynamic_cast(m_editWidgets["amount"])->setValue(val.abs()); - } else { - if (categoryLabel->text() != i18n("Category")) { - if (cashflow->direction() == KMyMoneyRegister::Payment) { - categoryLabel->setText(i18n("Transfer to")); - } else { - categoryLabel->setText(i18n("Transfer from")); - cashflow->setDirection(KMyMoneyRegister::Deposit); // editing with +ve shows 'from' not 'pay to' - } - } - dynamic_cast(m_editWidgets["amount"])->setValue(val.abs()); - } - } -} - -void StdTransactionEditor::updateVAT(bool amountChanged) -{ - // make sure that we don't do this recursively - if (m_inUpdateVat) - return; - - // we don't do anything if we have multiple transactions selected - if (isMultiSelection()) - return; - - // if auto vat assignment for this account is turned off - // we don't care about taxes - if (m_account.value("NoVat") == "Yes") - return; - - // more splits than category and tax are not supported - if (m_splits.count() > 2) - return; - - // in order to do anything, we need an amount - MyMoneyMoney amount, newAmount; - bool amountOk; - amount = amountFromWidget(&amountOk); - if (!amountOk) - return; - - // If the transaction has a tax and a category split, remove the tax split - if (m_splits.count() == 2) { - newAmount = removeVatSplit(); - if (m_splits.count() == 2) // not removed? - return; - - } else { - // otherwise, we need a category - KMyMoneyCategory* category = dynamic_cast(m_editWidgets["category"]); - if (category->selectedItem().isEmpty()) - return; - - // if no VAT account is associated with this category/account, then we bail out - MyMoneyAccount cat = MyMoneyFile::instance()->account(category->selectedItem()); - if (cat.value("VatAccount").isEmpty()) - return; - - newAmount = amount; - } - - // seems we have everything we need - if (amountChanged) - newAmount = amount; - - MyMoneyTransaction transaction; - if (createTransaction(transaction, m_transaction, m_split)) { - if (addVatSplit(transaction, newAmount)) { - m_transaction = transaction; - if (!m_transaction.splits().isEmpty()) - m_split = m_transaction.splits().front(); - - loadEditWidgets(); - - // if we made this a split transaction, then move the - // focus to the memo field - if (qApp->focusWidget() == haveWidget("category")) { - QWidget* w = haveWidget("memo"); - if (w) - w->setFocus(); - } - } - } -} - -bool StdTransactionEditor::addVatSplit(MyMoneyTransaction& tr, const MyMoneyMoney& amount) -{ - if (tr.splitCount() != 2) - return false; - - MyMoneyFile* file = MyMoneyFile::instance(); - // extract the category split from the transaction - MyMoneyAccount category = file->account(tr.splitByAccount(m_account.id(), false).accountId()); - return file->addVATSplit(tr, m_account, category, amount); -} - -MyMoneyMoney StdTransactionEditor::removeVatSplit() -{ - // we only deal with splits that have three splits - if (m_splits.count() != 2) - return amountFromWidget(); - - MyMoneySplit c; // category split - MyMoneySplit t; // tax split - - bool netValue = false; - QList::const_iterator it_s; - for (it_s = m_splits.constBegin(); it_s != m_splits.constEnd(); ++it_s) { - MyMoneyAccount acc = MyMoneyFile::instance()->account((*it_s).accountId()); - if (!acc.value("VatAccount").isEmpty()) { - netValue = (acc.value("VatAmount").toLower() == "net"); - c = (*it_s); - } else if (!acc.value("VatRate").isEmpty()) { - t = (*it_s); - } - } - - // bail out if not all splits are setup - if (c.id().isEmpty() || t.id().isEmpty()) - return amountFromWidget(); - - MyMoneyMoney amount; - // reduce the splits - if (netValue) { - amount = -c.shares(); - } else { - amount = -(c.shares() + t.shares()); - } - - // remove tax split from the list, ... - m_splits.clear(); - m_splits.append(c); - - // ... make sure that the widget is updated ... - // block the signals to avoid popping up the split editor dialog - // for nothing - m_editWidgets["category"]->blockSignals(true); - QString id; - setupCategoryWidget(id); - m_editWidgets["category"]->blockSignals(false); - - // ... and return the updated amount - return amount; -} - -bool StdTransactionEditor::isComplete(QString& reason) const -{ - reason.clear(); - QMap::const_iterator it_w; - - kMyMoneyDateInput* postDate = dynamic_cast(m_editWidgets["postdate"]); - if (postDate) { - QDate accountOpeningDate = m_account.openingDate(); - for (QList::const_iterator it_s = m_splits.constBegin(); it_s != m_splits.constEnd(); ++it_s) { - const MyMoneyAccount& acc = MyMoneyFile::instance()->account((*it_s).accountId()); - // compute the newest opening date of all accounts involved in the transaction - if (acc.openingDate() > accountOpeningDate) - accountOpeningDate = acc.openingDate(); - } - // check the selected category in case m_splits hasn't been updated yet - KMyMoneyCategory* category = dynamic_cast(m_editWidgets["category"]); - if (category && !category->selectedItem().isEmpty()) { - MyMoneyAccount cat = MyMoneyFile::instance()->account(category->selectedItem()); - if (cat.openingDate() > accountOpeningDate) - accountOpeningDate = cat.openingDate(); - } - - if (postDate->date().isValid() && (postDate->date() < accountOpeningDate)) { - postDate->markAsBadDate(true, KMyMoneyGlobalSettings::schemeColor(SchemeColor::Negative)); - reason = i18n("Cannot enter transaction with postdate prior to account's opening date."); - postDate->setToolTip(reason); - return false; - } - postDate->markAsBadDate(); - postDate->setToolTip(""); - } - - for (it_w = m_editWidgets.begin(); it_w != m_editWidgets.end(); ++it_w) { - KMyMoneyPayeeCombo* payee = dynamic_cast(*it_w); - KTagContainer* tagContainer = dynamic_cast(*it_w); - KMyMoneyCategory* category = dynamic_cast(*it_w); - kMyMoneyEdit* amount = dynamic_cast(*it_w); - KMyMoneyReconcileCombo* reconcile = dynamic_cast(*it_w); - KMyMoneyCashFlowCombo* cashflow = dynamic_cast(*it_w); - KTextEdit* memo = dynamic_cast(*it_w); - - if (payee && !(payee->currentText().isEmpty())) - break; - - if (category && !category->lineEdit()->text().isEmpty()) - break; - - if (amount && !(amount->value().isZero())) - break; - - // the following widgets are only checked if we are editing multiple transactions - if (isMultiSelection()) { - TabBar* tabbar = dynamic_cast(haveWidget("tabbar")); - if (tabbar) { - tabbar->setEnabled(true); - } - if (reconcile && reconcile->state() != eMyMoney::Split::State::Unknown) - break; - - if (cashflow && cashflow->direction() != KMyMoneyRegister::Unknown) - break; - - if (postDate->date().isValid() && (postDate->date() >= m_account.openingDate())) - break; - - if (memo && m_memoChanged) - break; - - if (tagContainer && !(tagContainer->selectedTags().isEmpty())) // Tag is optional field - break; - } - } - return it_w != m_editWidgets.end(); -} - -void StdTransactionEditor::slotCreateCategory(const QString& name, QString& id) -{ - MyMoneyAccount acc, parent; - acc.setName(name); - - KMyMoneyCashFlowCombo* cashflow = dynamic_cast(haveWidget("cashflow")); - if (cashflow) { - // form based input - if (cashflow->direction() == KMyMoneyRegister::Deposit) - parent = MyMoneyFile::instance()->income(); - else - parent = MyMoneyFile::instance()->expense(); - - } else if (haveWidget("deposit")) { - // register based input - kMyMoneyEdit* deposit = dynamic_cast(m_editWidgets["deposit"]); - if (deposit->value().isPositive()) - parent = MyMoneyFile::instance()->income(); - else - parent = MyMoneyFile::instance()->expense(); - - } else - parent = MyMoneyFile::instance()->expense(); - - // TODO extract possible first part of a hierarchy and check if it is one - // of our top categories. If so, remove it and select the parent - // according to this information. - - emit createCategory(acc, parent); - - // return id - id = acc.id(); -} - -int StdTransactionEditor::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 - QWidget* w = dynamic_cast(m_editWidgets["category"])->splitButton(); - if (w) - w->setFocus(); - - kMyMoneyEdit* amount = dynamic_cast(haveWidget("amount")); - kMyMoneyEdit* deposit = dynamic_cast(haveWidget("deposit")); - kMyMoneyEdit* payment = dynamic_cast(haveWidget("payment")); - KMyMoneyCashFlowCombo* cashflow = 0; - KMyMoneyRegister::CashFlowDirection dir = KMyMoneyRegister::Unknown; - bool isValidAmount = false; - - if (amount) { - isValidAmount = amount->lineedit()->text().length() != 0; - cashflow = dynamic_cast(haveWidget("cashflow")); - if (cashflow) - dir = cashflow->direction(); - - } else { - if (deposit) { - if (deposit->lineedit()->text().length() != 0) { - isValidAmount = true; - dir = KMyMoneyRegister::Deposit; - } - } - if (payment) { - if (payment->lineedit()->text().length() != 0) { - isValidAmount = true; - dir = KMyMoneyRegister::Payment; - } - } - if (!deposit || !payment) { - qDebug("Internal error: deposit(%p) & payment(%p) widgets not found but required", deposit, payment); - return rc; - } - } - - if (dir == KMyMoneyRegister::Unknown) - dir = KMyMoneyRegister::Payment; - - MyMoneyTransaction transaction; - if (createTransaction(transaction, m_transaction, m_split)) { - MyMoneyMoney value; - - QPointer dlg = - new KSplitTransactionDlg(transaction, - transaction.splits().isEmpty() ? MyMoneySplit() : transaction.splits().front(), - m_account, - isValidAmount, - dir == KMyMoneyRegister::Deposit, - MyMoneyMoney(), - m_priceInfo, - m_regForm); - connect(dlg, SIGNAL(objectCreation(bool)), this, SIGNAL(objectCreation(bool))); - connect(dlg, SIGNAL(createCategory(MyMoneyAccount&,MyMoneyAccount)), this, SIGNAL(createCategory(MyMoneyAccount&,MyMoneyAccount))); - - if ((rc = dlg->exec()) == QDialog::Accepted) { - m_transaction = dlg->transaction(); - if (!m_transaction.splits().isEmpty()) - m_split = m_transaction.splits().front(); - loadEditWidgets(); - } - - delete dlg; - } - - // focus jumps into the tag field - if ((w = haveWidget("tag")) != 0) { - w->setFocus(); - } - - m_openEditSplits = false; - } - - return rc; -} - -void StdTransactionEditor::checkPayeeInSplit(MyMoneySplit& s, const QString& payeeId) -{ - if (s.accountId().isEmpty()) - return; - - MyMoneyAccount acc = MyMoneyFile::instance()->account(s.accountId()); - if (acc.isIncomeExpense()) { - s.setPayeeId(payeeId); - } else { - if (s.payeeId().isEmpty()) - s.setPayeeId(payeeId); - } -} - -MyMoneyMoney StdTransactionEditor::amountFromWidget(bool* update) const -{ - bool updateValue = false; - MyMoneyMoney value; - - KMyMoneyCashFlowCombo* cashflow = dynamic_cast(haveWidget("cashflow")); - if (cashflow) { - // form based input - kMyMoneyEdit* amount = dynamic_cast(m_editWidgets["amount"]); - // if both fields do not contain changes -> no need to update - if (cashflow->direction() != KMyMoneyRegister::Unknown - && !amount->lineedit()->text().isEmpty()) - updateValue = true; - value = amount->value(); - if (cashflow->direction() == KMyMoneyRegister::Payment) - value = -value; - - } else if (haveWidget("deposit")) { - // register based input - kMyMoneyEdit* deposit = dynamic_cast(m_editWidgets["deposit"]); - kMyMoneyEdit* payment = dynamic_cast(m_editWidgets["payment"]); - // if both fields do not contain text -> no need to update - if (!(deposit->lineedit()->text().isEmpty() && payment->lineedit()->text().isEmpty())) - updateValue = true; - - if (deposit->value().isPositive()) - value = deposit->value(); - else - value = -(payment->value()); - } - - if (update) - *update = updateValue; - - // determine the max fraction for this account and - // adjust the value accordingly - return value.convert(m_account.fraction()); -} - -bool StdTransactionEditor::createTransaction(MyMoneyTransaction& t, const MyMoneyTransaction& torig, const MyMoneySplit& sorig, bool skipPriceDialog) -{ - // extract price info from original transaction - m_priceInfo.clear(); - QList::const_iterator it_s; - if (!torig.id().isEmpty()) { - for (it_s = torig.splits().begin(); it_s != torig.splits().end(); ++it_s) { - if ((*it_s).id() != sorig.id()) { - MyMoneyAccount cat = MyMoneyFile::instance()->account((*it_s).accountId()); - if (cat.currencyId() != m_account.currencyId()) { - if (!(*it_s).shares().isZero() && !(*it_s).value().isZero()) { - m_priceInfo[cat.currencyId()] = ((*it_s).shares() / (*it_s).value()).reduce(); - } - } - } - } - } - - t = torig; - - t.removeSplits(); - t.setCommodity(m_account.currencyId()); - - kMyMoneyDateInput* postDate = dynamic_cast(m_editWidgets["postdate"]); - if (postDate->date().isValid()) { - t.setPostDate(postDate->date()); - } - - // we start with the previous values, make sure we can add them later on - MyMoneySplit s0 = sorig; - s0.clearId(); - - // make sure we reference this account here - s0.setAccountId(m_account.id()); - - // memo and number field are special: if we have multiple transactions selected - // and the edit field is empty, we treat it as "not modified". - // FIXME a better approach would be to have a 'dirty' flag with the widgets - // which identifies if the originally loaded value has been modified - // by the user - KTextEdit* memo = dynamic_cast(m_editWidgets["memo"]); - if (memo) { - if (!isMultiSelection() || (isMultiSelection() && m_memoChanged)) - s0.setMemo(memo->toPlainText()); - } - - kMyMoneyLineEdit* number = dynamic_cast(haveWidget("number")); - if (number) { - if (!isMultiSelection() || (isMultiSelection() && !number->text().isEmpty())) - s0.setNumber(number->text()); - } - - KMyMoneyPayeeCombo* payee = dynamic_cast(m_editWidgets["payee"]); - QString payeeId; - if (!isMultiSelection() || (isMultiSelection() && !payee->currentText().isEmpty())) { - payeeId = payee->selectedItem(); - s0.setPayeeId(payeeId); - } - - //KMyMoneyTagCombo* tag = dynamic_cast(m_editWidgets["tag"]); - KTagContainer* tag = dynamic_cast(m_editWidgets["tag"]); - if (!isMultiSelection() || (isMultiSelection() && !tag->selectedTags().isEmpty())) { - s0.setTagIdList(tag->selectedTags()); - } - - bool updateValue; - MyMoneyMoney value = amountFromWidget(&updateValue); - - if (updateValue) { - // for this account, the shares and value is the same - s0.setValue(value); - s0.setShares(value); - } else { - value = s0.value(); - } - - // if we mark the split reconciled here, we'll use today's date if no reconciliation date is given - KMyMoneyReconcileCombo* status = dynamic_cast(m_editWidgets["status"]); - if (status->state() != eMyMoney::Split::State::Unknown) - s0.setReconcileFlag(status->state()); - - if (s0.reconcileFlag() == eMyMoney::Split::State::Reconciled && !s0.reconcileDate().isValid()) - s0.setReconcileDate(QDate::currentDate()); - - checkPayeeInSplit(s0, payeeId); - - // add the split to the transaction - t.addSplit(s0); - - // if we have no other split we create it - // if we have none or only one other split, we reconstruct it here - // if we have more than one other split, we take them as they are - // make sure to perform all those changes on a local copy - QList splits = m_splits; - - MyMoneySplit s1; - if (splits.isEmpty()) { - s1.setMemo(s0.memo()); - splits.append(s1); - - // make sure we will fill the value and share fields later on - updateValue = true; - } - - // FIXME in multiSelection we currently only support transactions with one - // or two splits. So we check the original transaction and extract the other - // split or create it - if (isMultiSelection()) { - if (torig.splitCount() == 2) { - QList::const_iterator it_s; - for (it_s = torig.splits().begin(); it_s != torig.splits().end(); ++it_s) { - if ((*it_s).id() == sorig.id()) - continue; - s1 = *it_s; - s1.clearId(); - break; - } - } - } else { - if (splits.count() == 1) { - s1 = splits[0]; - s1.clearId(); - } - } - - if (isMultiSelection() || splits.count() == 1) { - KMyMoneyCategory* category = dynamic_cast(m_editWidgets["category"]); - if (!isMultiSelection() || (isMultiSelection() && !category->currentText().isEmpty())) { - s1.setAccountId(category->selectedItem()); - } - - // if the first split has a memo but the second split is empty, - // we just copy the memo text over - if (memo) { - if (!isMultiSelection() || (isMultiSelection() && !memo->toPlainText().isEmpty())) { - // if the memo is filled, we check if the - // account referenced by s1 is a regular account or a category. - // in case of a regular account, we just leave the memo as is - // in case of a category we simply copy the new value over the old. - // in case we don't even have an account id, we just skip because - // the split will be removed later on anyway. - if (!s1.memo().isEmpty() && s1.memo() != s0.memo()) { - if (!s1.accountId().isEmpty()) { - MyMoneyAccount acc = MyMoneyFile::instance()->account(s1.accountId()); - if (acc.isIncomeExpense()) - s1.setMemo(s0.memo()); - else if (KMessageBox::questionYesNo(m_regForm, - i18n("Do you want to replace memo

%1

with memo

%2

in the other split?", s1.memo(), s0.memo()), i18n("Copy memo"), - KStandardGuiItem::yes(), KStandardGuiItem::no(), - QStringLiteral("CopyMemoOver")) == KMessageBox::Yes) - s1.setMemo(s0.memo()); - } - } else { - s1.setMemo(s0.memo()); - } - } - } - - if (updateValue && !s1.accountId().isEmpty()) { - s1.setValue(-value); - MyMoneyMoney shares; - if (!skipPriceDialog) { - if (!KCurrencyCalculator::setupSplitPrice(shares, t, s1, m_priceInfo, m_regForm)) - return false; - } else { - MyMoneyAccount cat = MyMoneyFile::instance()->account(s1.accountId()); - if (m_priceInfo.find(cat.currencyId()) != m_priceInfo.end()) { - shares = (s1.value() * m_priceInfo[cat.currencyId()]).reduce().convert(cat.fraction()); - } else - shares = s1.value(); - } - s1.setShares(shares); - } - - checkPayeeInSplit(s1, payeeId); - - if (!s1.accountId().isEmpty()) - t.addSplit(s1); - - } else { - QList::iterator it_s; - for (it_s = splits.begin(); it_s != splits.end(); ++it_s) { - s1 = *it_s; - s1.clearId(); - checkPayeeInSplit(s1, payeeId); - t.addSplit(s1); - } - } - return true; -} - -void StdTransactionEditor::setupFinalWidgets() -{ - addFinalWidget(haveWidget("deposit")); - addFinalWidget(haveWidget("payment")); - addFinalWidget(haveWidget("amount")); - addFinalWidget(haveWidget("status")); -} - -void StdTransactionEditor::slotUpdateAccount(const QString& id) -{ - TransactionEditor::slotUpdateAccount(id); - KMyMoneyCategory* category = dynamic_cast(m_editWidgets["category"]); - if (category && category->splitButton()) { - category->splitButton()->setDisabled(id.isEmpty()); - } -} diff --git a/kmymoney/dialogs/transactioneditor_p.h b/kmymoney/dialogs/transactioneditor_p.h new file mode 100644 --- /dev/null +++ b/kmymoney/dialogs/transactioneditor_p.h @@ -0,0 +1,124 @@ +/*************************************************************************** + transactioneditor_p.h + ---------- + begin : Wed Jun 07 2006 + copyright : (C) 2006 by Thomas Baumgart + email : Thomas Baumgart + (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 TRANSACTIONEDITOR_P_H +#define TRANSACTIONEDITOR_P_H + +// ---------------------------------------------------------------------------- +// QT Includes + +#include +#include +#include +#include +#include + +// ---------------------------------------------------------------------------- +// KDE Includes + +// ---------------------------------------------------------------------------- +// Project Includes + +#include "kmymoneylineedit.h" +#include "kmymoneyutils.h" +#include "mymoneyaccount.h" +#include "mymoneyenums.h" +#include "mymoneyfile.h" +#include "mymoneysplit.h" +#include "mymoneytransaction.h" +#include "register.h" +#include "registeritem.h" +#include "selectedtransaction.h" +#include "transactioneditor.h" + +class MyMoneyMoney; +class TransactionEditorContainer; +namespace KMyMoneyRegister { class Transaction; } + +class TransactionEditorPrivate +{ + Q_DISABLE_COPY(TransactionEditorPrivate) + Q_DECLARE_PUBLIC(TransactionEditor) + +public: + TransactionEditorPrivate(TransactionEditor *qq) : + q_ptr(qq) + { + } + + ~TransactionEditorPrivate() + { + } + + void init() + { + m_paymentMethod = eMyMoney::Schedule::PaymentType::Any; + m_regForm = 0; + m_item = 0; + m_initialAction = KMyMoneyRegister::ActionNone; + m_openEditSplits = false; + m_memoChanged = false; + } + + /** + * If a new or an edited transaction has a valid number, keep it with the account + */ + void keepNewNumber(const MyMoneyTransaction& tr) + { + Q_Q(TransactionEditor); + // verify that new number, possibly containing alpha, is valid + auto txn = tr; + auto file = MyMoneyFile::instance(); + if (!txn.splits().isEmpty()) { + QString number = txn.splits().first().number(); + if (KMyMoneyUtils::numericPart(number) > 0) { + // numeric is valid + auto numberEdit = dynamic_cast(q->haveWidget("number")); + if (numberEdit) { + numberEdit->loadText(number); + MyMoneySplit split = txn.splits().first(); + split.setNumber(number); + txn.modifySplit(split); + m_account.setValue("lastNumberUsed", number); + file->modifyAccount(m_account); + } + } + } + } + + TransactionEditor *q_ptr; + QString m_scheduleInfo; + eMyMoney::Schedule::PaymentType m_paymentMethod; + QString m_memoText; + QList m_splits; + KMyMoneyRegister::SelectedTransactions m_transactions; + QList m_finalEditWidgets; + TransactionEditorContainer* m_regForm; + KMyMoneyRegister::Transaction* m_item; + KMyMoneyRegister::QWidgetContainer m_editWidgets; + MyMoneyAccount m_account; + MyMoneyTransaction m_transaction; + MyMoneySplit m_split; + QDate m_lastPostDate; + QMap m_priceInfo; + KMyMoneyRegister::Action m_initialAction; + bool m_openEditSplits; + bool m_memoChanged; +}; + +#endif // KMERGETRANSACTIONSDLG_H diff --git a/kmymoney/dialogs/transactionmatcher.h b/kmymoney/dialogs/transactionmatcher.h --- a/kmymoney/dialogs/transactionmatcher.h +++ b/kmymoney/dialogs/transactionmatcher.h @@ -4,6 +4,7 @@ begin : Tue Jul 08 2008 copyright : (C) 2008 by Thomas Baumgart email : Thomas Baumgart + (C) 2017 by Łukasz Wojniłowicz ***************************************************************************/ /*************************************************************************** @@ -18,14 +19,20 @@ #ifndef TRANSACTIONMATCHER_H #define TRANSACTIONMATCHER_H -#include "mymoneyaccount.h" +#include +class MyMoneySplit; class MyMoneyTransaction; +class MyMoneyAccount; +class TransactionMatcherPrivate; class TransactionMatcher { public: - TransactionMatcher(const MyMoneyAccount& acc); + Q_DISABLE_COPY(TransactionMatcher) + + explicit TransactionMatcher(const MyMoneyAccount& acc); + ~TransactionMatcher(); /** * This method matches the manual entered transaction @p tm with the imported @@ -94,8 +101,8 @@ void accept(const MyMoneyTransaction& t, const MyMoneySplit& s); private: - MyMoneyAccount m_account; + TransactionMatcherPrivate * const d_ptr; + Q_DECLARE_PRIVATE(TransactionMatcher) }; - #endif diff --git a/kmymoney/dialogs/transactionmatcher.cpp b/kmymoney/dialogs/transactionmatcher.cpp --- a/kmymoney/dialogs/transactionmatcher.cpp +++ b/kmymoney/dialogs/transactionmatcher.cpp @@ -5,6 +5,7 @@ copyright : (C) 2008 by Thomas Baumgart email : Thomas Baumgart : Christian David + (C) 2017 by Łukasz Wojniłowicz ***************************************************************************/ /*************************************************************************** @@ -18,26 +19,47 @@ #include "transactionmatcher.h" -#include +#include + #include -#include +#include "mymoneyaccount.h" #include "mymoneymoney.h" #include "mymoneysplit.h" #include "mymoneytransaction.h" #include "mymoneyutils.h" #include "mymoneyfile.h" -#include "kmymoneyglobalsettings.h" #include "mymoneyexception.h" +class TransactionMatcherPrivate +{ + Q_DISABLE_COPY(TransactionMatcherPrivate) + +public: + TransactionMatcherPrivate() + { + } + + MyMoneyAccount m_account; +}; + TransactionMatcher::TransactionMatcher(const MyMoneyAccount& acc) : - m_account(acc) + d_ptr(new TransactionMatcherPrivate) +{ + Q_D(TransactionMatcher); + d->m_account = acc; +} + +TransactionMatcher::~TransactionMatcher() { + Q_D(TransactionMatcher); + delete d; } void TransactionMatcher::match(MyMoneyTransaction tm, MyMoneySplit sm, MyMoneyTransaction ti, MyMoneySplit si, bool allowImportedTransactions) { - const MyMoneySecurity& sec = MyMoneyFile::instance()->security(m_account.currencyId()); + Q_D(TransactionMatcher); + const MyMoneySecurity& sec = MyMoneyFile::instance()->security(d->m_account.currencyId()); // Now match the transactions. // @@ -78,7 +100,7 @@ // verify that the amounts are the same, otherwise we should not be matching! if (sm.shares() != si.shares()) { - throw MYMONEYEXCEPTION(i18n("Splits for %1 have conflicting values (%2,%3)", m_account.name(), MyMoneyUtils::formatMoney(sm.shares(), m_account, sec), MyMoneyUtils::formatMoney(si.shares(), m_account, sec))); + throw MYMONEYEXCEPTION(i18n("Splits for %1 have conflicting values (%2,%3)", d->m_account.name(), MyMoneyUtils::formatMoney(sm.shares(), d->m_account, sec), MyMoneyUtils::formatMoney(si.shares(), d->m_account, sec))); } // ipwizard: I took over the code to keep the bank id found in the endMatchTransaction diff --git a/kmymoney/kmymoney.h b/kmymoney/kmymoney.h --- a/kmymoney/kmymoney.h +++ b/kmymoney/kmymoney.h @@ -126,6 +126,8 @@ OnlineJobDelete, OnlineJobEdit, OnlineJobLog }; +namespace eDialogs { enum class ScheduleResultCode; } + inline uint qHash(const Action key, uint seed) { return ::qHash(static_cast(key), seed); @@ -327,27 +329,6 @@ void slotPrintView(); /** - * Create a new investment - */ - void slotInvestmentNew(); - - /** - * Create a new investment in a given @p parent investment account - */ - void slotInvestmentNew(MyMoneyAccount& account, const MyMoneyAccount& parent); - - /** - * This slot opens the investment editor to edit the currently - * selected investment if possible - */ - void slotInvestmentEdit(); - - /** - * Deletes the current selected investment. - */ - void slotInvestmentDelete(); - - /** * Performs online update for currently selected investment */ void slotOnlinePriceUpdate(); @@ -364,11 +345,6 @@ /** */ - bool slotPayeeNew(const QString& newnameBase, QString& id); - void slotPayeeNew(); - - /** - */ void slotPayeeDelete(); /** @@ -840,7 +816,7 @@ * The transaction will be created and entered into the ledger * and the schedule updated. */ - KMyMoneyUtils::EnterScheduleResultCodeE enterSchedule(MyMoneySchedule& s, bool autoEnter = false, bool extendedKeys = false); + eDialogs::ScheduleResultCode enterSchedule(MyMoneySchedule& s, bool autoEnter = false, bool extendedKeys = false); /** * Creates a new institution entry in the MyMoneyFile engine @@ -1139,6 +1115,51 @@ void slotShowOnlineJobContextMenu(); /** + * Brings up the new category editor and saves the information. + */ + void slotCategoryNew(); + + /** + * Brings up the new category editor and saves the information. + * The dialog will be preset with the name and parent account. + * + * @param account reference of category to be created. The @p name member + * should be filled by the caller. The object will be filled + * with additional information during the creation process + * esp. the @p id member. + * @param parent reference to parent account (defaults to none) + */ + void slotCategoryNew(MyMoneyAccount& account, const MyMoneyAccount& parent); + void slotCategoryNew(MyMoneyAccount& account); + + /** + * Create a new investment + */ + void slotInvestmentNew(); + + /** + * Create a new investment in a given @p parent investment account + */ + void slotInvestmentNew(MyMoneyAccount& account, const MyMoneyAccount& parent); + + /** + * This slot opens the investment editor to edit the currently + * selected investment if possible + */ + void slotInvestmentEdit(); + + /** + * Deletes the current selected investment. + */ + void slotInvestmentDelete(); + + /** + */ + void slotPayeeNew(const QString& newnameBase, QString& id); + bool createPayeeNew(const QString& newnameBase, QString& id); + void slotPayeeNew(); + + /** * This slot collects information for a new scheduled transaction * and saves it in the engine. @sa slotScheduleNew(const MyMoneyTransaction&) */ @@ -1214,24 +1235,6 @@ void slotAccountNew(MyMoneyAccount&); /** - * Brings up the new category editor and saves the information. - */ - void slotCategoryNew(); - - /** - * Brings up the new category editor and saves the information. - * The dialog will be preset with the name and parent account. - * - * @param account reference of category to be created. The @p name member - * should be filled by the caller. The object will be filled - * with additional information during the creation process - * esp. the @p id member. - * @param parent reference to parent account (defaults to none) - */ - void slotCategoryNew(MyMoneyAccount& account, const MyMoneyAccount& parent); - void slotCategoryNew(MyMoneyAccount& account); - - /** * This method updates all KAction items to the current state. */ void slotUpdateActions(); diff --git a/kmymoney/kmymoney.cpp b/kmymoney/kmymoney.cpp --- a/kmymoney/kmymoney.cpp +++ b/kmymoney/kmymoney.cpp @@ -45,6 +45,8 @@ #include #include #include +#include +#include // ---------------------------------------------------------------------------- // KDE Includes @@ -164,6 +166,7 @@ #include "ledgerdelegate.h" #include "storageenums.h" #include "mymoneyenums.h" +#include "dialogenums.h" #include "misc/platformtools.h" @@ -1970,13 +1973,13 @@ user.email(), this, i18n("Edit Personal Data")); if (editPersonalDataDlg->exec() == QDialog::Accepted && editPersonalDataDlg != 0) { - user.setName(editPersonalDataDlg->userNameText); - user.setAddress(editPersonalDataDlg->userStreetText); - user.setCity(editPersonalDataDlg->userTownText); - user.setState(editPersonalDataDlg->userCountyText); - user.setPostcode(editPersonalDataDlg->userPostcodeText); - user.setTelephone(editPersonalDataDlg->userTelephoneText); - user.setEmail(editPersonalDataDlg->userEmailText); + user.setName(editPersonalDataDlg->userName()); + user.setAddress(editPersonalDataDlg->userStreet()); + user.setCity(editPersonalDataDlg->userTown()); + user.setState(editPersonalDataDlg->userCountry()); + user.setPostcode(editPersonalDataDlg->userPostcode()); + user.setTelephone(editPersonalDataDlg->userTelephone()); + user.setEmail(editPersonalDataDlg->userEmail()); MyMoneyFileTransaction ft; try { file->setUser(user); @@ -2364,10 +2367,11 @@ int returncode = backupDlg->exec(); if (returncode == QDialog::Accepted && backupDlg != 0) { - d->m_backupMount = backupDlg->mountCheckBox->isChecked(); + + d->m_backupMount = backupDlg->mountCheckBox(); d->m_proc.clearProgram(); d->m_backupState = BACKUP_MOUNTING; - d->m_mountpoint = backupDlg->txtMountPoint->text(); + d->m_mountpoint = backupDlg->mountPoint(); if (d->m_backupMount) { slotBackupMount(); @@ -3497,17 +3501,17 @@ QMap skipMap; bool processedOne; - KMyMoneyUtils::EnterScheduleResultCodeE rc = KMyMoneyUtils::Enter; + eDialogs::ScheduleResultCode rc = eDialogs::ScheduleResultCode::Enter; do { processedOne = false; QList::const_iterator it_sch; - for (it_sch = schedules.constBegin(); (rc != KMyMoneyUtils::Cancel) && (it_sch != schedules.constEnd()); ++it_sch) { + for (it_sch = schedules.constBegin(); (rc != eDialogs::ScheduleResultCode::Cancel) && (it_sch != schedules.constEnd()); ++it_sch) { MyMoneySchedule sch(*(it_sch)); // and enter it if it is not on the skip list if (skipMap.find((*it_sch).id()) == skipMap.end()) { rc = enterSchedule(sch, false, true); - if (rc == KMyMoneyUtils::Ignore) { + if (rc == eDialogs::ScheduleResultCode::Ignore) { skipMap[(*it_sch).id()] = true; } } @@ -4131,9 +4135,9 @@ } } -KMyMoneyUtils::EnterScheduleResultCodeE KMyMoneyApp::enterSchedule(MyMoneySchedule& schedule, bool autoEnter, bool extendedKeys) +eDialogs::ScheduleResultCode KMyMoneyApp::enterSchedule(MyMoneySchedule& schedule, bool autoEnter, bool extendedKeys) { - KMyMoneyUtils::EnterScheduleResultCodeE rc = KMyMoneyUtils::Cancel; + eDialogs::ScheduleResultCode rc = eDialogs::ScheduleResultCode::Cancel; if (!schedule.id().isEmpty()) { try { schedule = MyMoneyFile::instance()->schedule(schedule.id()); @@ -4163,10 +4167,10 @@ KConfirmManualEnterDlg::Action action = KConfirmManualEnterDlg::ModifyOnce; if (!autoEnter || !schedule.isFixed()) { for (; dlg != 0;) { - rc = KMyMoneyUtils::Cancel; + rc = eDialogs::ScheduleResultCode::Cancel; if (dlg->exec() == QDialog::Accepted && dlg != 0) { rc = dlg->resultCode(); - if (rc == KMyMoneyUtils::Enter) { + if (rc == eDialogs::ScheduleResultCode::Enter) { d->m_transactionEditor->createTransaction(taccepted, torig, torig.splits().isEmpty() ? MyMoneySplit() : torig.splits().front(), true); // make sure to suppress comparison of some data: postDate torig.setPostDate(taccepted.postDate()); @@ -4184,7 +4188,7 @@ // we go back to the editor continue; } - } else if (rc == KMyMoneyUtils::Skip) { + } else if (rc == eDialogs::ScheduleResultCode::Skip) { slotTransactionsCancel(); skipSchedule(schedule); } else { @@ -4246,7 +4250,7 @@ schedule.setNextDueDate(nextDueDate); } MyMoneyFile::instance()->modifySchedule(schedule); - rc = KMyMoneyUtils::Enter; + rc = eDialogs::ScheduleResultCode::Enter; // delete the editor before we emit the dataChanged() signal from the // engine. Calling this twice in a row does not hurt. @@ -4267,7 +4271,12 @@ return rc; } -bool KMyMoneyApp::slotPayeeNew(const QString& newnameBase, QString& id) +void KMyMoneyApp::slotPayeeNew(const QString& newnameBase, QString& id) +{ + createPayeeNew(newnameBase, id); +} + +bool KMyMoneyApp::createPayeeNew(const QString& newnameBase, QString& id) { bool doit = true; @@ -4470,7 +4479,7 @@ if (type == KPayeeReassignDlg::TypeMerge) { // it's ok to use payee_id for both arguments since the first is const, // so it's garantee not to change its content - if (!slotPayeeNew(payee_id, payee_id)) + if (!createPayeeNew(payee_id, payee_id)) return false; // the user aborted the dialog, so let's abort as well newPayee = file->payee(payee_id); } else { @@ -6729,25 +6738,25 @@ QList scheduleList = file->scheduleList(); QList::Iterator it; - KMyMoneyUtils::EnterScheduleResultCodeE rc = KMyMoneyUtils::Enter; - for (it = scheduleList.begin(); (it != scheduleList.end()) && (rc != KMyMoneyUtils::Cancel); ++it) { + eDialogs::ScheduleResultCode rc = eDialogs::ScheduleResultCode::Enter; + for (it = scheduleList.begin(); (it != scheduleList.end()) && (rc != eDialogs::ScheduleResultCode::Cancel); ++it) { // Get the copy in the file because it might be modified by commitTransaction MyMoneySchedule schedule = file->schedule((*it).id()); if (schedule.autoEnter()) { try { while (!schedule.isFinished() && (schedule.adjustedNextDueDate() <= checkDate) - && rc != KMyMoneyUtils::Ignore - && rc != KMyMoneyUtils::Cancel) { + && rc != eDialogs::ScheduleResultCode::Ignore + && rc != eDialogs::ScheduleResultCode::Cancel) { rc = enterSchedule(schedule, true, true); schedule = file->schedule((*it).id()); // get a copy of the modified schedule } } catch (const MyMoneyException &) { } } - if (rc == KMyMoneyUtils::Ignore) { + if (rc == eDialogs::ScheduleResultCode::Ignore) { // if the current schedule was ignored then we must make sure that the user can still enter the next scheduled transaction - rc = KMyMoneyUtils::Enter; + rc = eDialogs::ScheduleResultCode::Enter; } } updateCaption(); diff --git a/kmymoney/kmymoneyutils.h b/kmymoney/kmymoneyutils.h --- a/kmymoney/kmymoneyutils.h +++ b/kmymoney/kmymoneyutils.h @@ -59,27 +59,6 @@ class KMyMoneyUtils { public: - /** - * 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 categoryTypeE { - 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 transactionTypeE { /** * Unknown transaction type (e.g. used for a transaction with only @@ -122,13 +101,6 @@ InvestmentTransaction }; - enum EnterScheduleResultCodeE { - Cancel = 0, // cancel the operation - Enter, // enter the schedule - Skip, // skip the schedule - Ignore // ignore the schedule - }; - enum CanCloseAccountCodeE { AccountCanClose = 0, // can close the account AccountBalanceNonZero, // balance is non zero diff --git a/kmymoney/plugins/ofximport/dialogs/kofxdirectconnectdlg.cpp b/kmymoney/plugins/ofximport/dialogs/kofxdirectconnectdlg.cpp --- a/kmymoney/plugins/ofximport/dialogs/kofxdirectconnectdlg.cpp +++ b/kmymoney/plugins/ofximport/dialogs/kofxdirectconnectdlg.cpp @@ -26,7 +26,6 @@ #include #include #include -#include // ---------------------------------------------------------------------------- // KDE Includes diff --git a/kmymoney/views/splitdialog.cpp b/kmymoney/views/splitdialog.cpp --- a/kmymoney/views/splitdialog.cpp +++ b/kmymoney/views/splitdialog.cpp @@ -34,7 +34,6 @@ #include "ui_splitdialog.h" #include "mymoneyaccount.h" -#include "ledgermodel.h" #include "splitdelegate.h" #include "newtransactioneditor.h" #include "splitadjustdialog.h" diff --git a/kmymoney/widgets/kmymoneyaccountselector.cpp b/kmymoney/widgets/kmymoneyaccountselector.cpp --- a/kmymoney/widgets/kmymoneyaccountselector.cpp +++ b/kmymoney/widgets/kmymoneyaccountselector.cpp @@ -45,6 +45,7 @@ #include "kmymoneyglobalsettings.h" #include "icons/icons.h" #include "mymoneyenums.h" +#include "dialogenums.h" using namespace Icons; using namespace eMyMoney; @@ -248,21 +249,21 @@ || m_typeList.contains(Account::MoneyMarket) || m_typeList.contains(Account::Asset) || m_typeList.contains(Account::Currency)) - typeMask |= KMyMoneyUtils::asset; + typeMask |= eDialogs::Category::asset; if (m_typeList.contains(Account::CreditCard) || m_typeList.contains(Account::Loan) || m_typeList.contains(Account::Liability)) - typeMask |= KMyMoneyUtils::liability; + typeMask |= eDialogs::Category::liability; if (m_typeList.contains(Account::Income)) - typeMask |= KMyMoneyUtils::income; + typeMask |= eDialogs::Category::income; if (m_typeList.contains(Account::Expense)) - typeMask |= KMyMoneyUtils::expense; + typeMask |= eDialogs::Category::expense; if (m_typeList.contains(Account::Equity)) - typeMask |= KMyMoneyUtils::equity; + typeMask |= eDialogs::Category::equity; selector->clear(); QTreeWidget* lv = selector->listView(); @@ -284,9 +285,9 @@ } m_favorites->setIcon(0, QIcon(accountPixmap)); - for (int mask = 0x01; mask != KMyMoneyUtils::last; mask <<= 1) { + for (auto mask = 0x01; mask != eDialogs::Category::last; mask <<= 1) { QTreeWidgetItem* item = 0; - if ((typeMask & mask & KMyMoneyUtils::asset) != 0) { + if ((typeMask & mask & eDialogs::Category::asset) != 0) { ++m_count; key = QString("B%1").arg(i18n("Asset")); item = selector->newItem(i18n("Asset accounts"), key); @@ -294,7 +295,7 @@ list = m_file->asset().accountList(); } - if ((typeMask & mask & KMyMoneyUtils::liability) != 0) { + if ((typeMask & mask & eDialogs::Category::liability) != 0) { ++m_count; key = QString("C%1").arg(i18n("Liability")); item = selector->newItem(i18n("Liability accounts"), key); @@ -302,7 +303,7 @@ list = m_file->liability().accountList(); } - if ((typeMask & mask & KMyMoneyUtils::income) != 0) { + if ((typeMask & mask & eDialogs::Category::income) != 0) { ++m_count; key = QString("D%1").arg(i18n("Income")); item = selector->newItem(i18n("Income categories"), key); @@ -313,7 +314,7 @@ } } - if ((typeMask & mask & KMyMoneyUtils::expense) != 0) { + if ((typeMask & mask & eDialogs::Category::expense) != 0) { ++m_count; key = QString("E%1").arg(i18n("Expense")); item = selector->newItem(i18n("Expense categories"), key); @@ -324,7 +325,7 @@ } } - if ((typeMask & mask & KMyMoneyUtils::equity) != 0) { + if ((typeMask & mask & eDialogs::Category::equity) != 0) { ++m_count; key = QString("F%1").arg(i18n("Equity")); item = selector->newItem(i18n("Equity accounts"), key); diff --git a/kmymoney/widgets/registeritem.h b/kmymoney/widgets/registeritem.h --- a/kmymoney/widgets/registeritem.h +++ b/kmymoney/widgets/registeritem.h @@ -39,13 +39,13 @@ namespace KMyMoneyRegister { -typedef enum { + enum CashFlowDirection : int { Deposit = 0, //< transaction is deposit Payment, //< transaction is payment Unknown //< transaction cashflow is unknown -} CashFlowDirection; +}; -typedef enum { + enum Action : int { ActionNone = -1, ActionCheck = 0, /* these should be values which qt 3.3 never uses for QTab: @@ -57,7 +57,7 @@ ActionAtm, // insert new values above this line MaxAction -} Action; +}; /** * Used to filter items from the register. diff --git a/kmymoney/widgets/transaction.cpp b/kmymoney/widgets/transaction.cpp --- a/kmymoney/widgets/transaction.cpp +++ b/kmymoney/widgets/transaction.cpp @@ -56,6 +56,9 @@ #include "investtransactioneditor.h" #include "kmymoneyutils.h" #include "kmymoneymvccombo.h" +#ifndef KMM_DESIGNER +#include "stdtransactioneditor.h" +#endif #include "kmymoneyglobalsettings.h" diff --git a/kmymoney/wizards/endingbalancedlg/kendingbalancedlg.cpp b/kmymoney/wizards/endingbalancedlg/kendingbalancedlg.cpp --- a/kmymoney/wizards/endingbalancedlg/kendingbalancedlg.cpp +++ b/kmymoney/wizards/endingbalancedlg/kendingbalancedlg.cpp @@ -23,6 +23,7 @@ #include #include #include +#include // ---------------------------------------------------------------------------- // KDE Includes @@ -111,7 +112,7 @@ } // We don't need to add the default into the list (see ::help() why) - // m_helpAnchor[m_startPageCheckings] = QString(""); + // m_helpAnchor[m_startPageCheckings] = QString(QString()); d->m_helpAnchor[m_interestChargeCheckings] = QString("details.reconcile.wizard.interest"); d->m_helpAnchor[m_statementInfoPageCheckings] = QString("details.reconcile.wizard.statement"); @@ -204,24 +205,24 @@ balance = balance * factor; endBalance = startBalance = balance; - tracer.printf("total balance = %s", qPrintable(endBalance.formatMoney("", 2))); + tracer.printf("total balance = %s", qPrintable(endBalance.formatMoney(QString(), 2))); for (it = transactionList.constBegin(); it != transactionList.constEnd(); ++it) { const MyMoneySplit& split = (*it).second; balance -= split.shares() * factor; if ((*it).first.postDate() > field("statementDate").toDate()) { - tracer.printf("Reducing balances by %s because postdate of %s/%s(%s) is past statement date", qPrintable((split.shares() * factor).formatMoney("", 2)), qPrintable((*it).first.id()), qPrintable(split.id()), qPrintable((*it).first.postDate().toString(Qt::ISODate))); + tracer.printf("Reducing balances by %s because postdate of %s/%s(%s) is past statement date", qPrintable((split.shares() * factor).formatMoney(QString(), 2)), qPrintable((*it).first.id()), qPrintable(split.id()), qPrintable((*it).first.postDate().toString(Qt::ISODate))); endBalance -= split.shares() * factor; startBalance -= split.shares() * factor; } else { switch (split.reconcileFlag()) { case eMyMoney::Split::State::NotReconciled: - tracer.printf("Reducing balances by %s because %s/%s(%s) is not reconciled", qPrintable((split.shares() * factor).formatMoney("", 2)), qPrintable((*it).first.id()), qPrintable(split.id()), qPrintable((*it).first.postDate().toString(Qt::ISODate))); + tracer.printf("Reducing balances by %s because %s/%s(%s) is not reconciled", qPrintable((split.shares() * factor).formatMoney(QString(), 2)), qPrintable((*it).first.id()), qPrintable(split.id()), qPrintable((*it).first.postDate().toString(Qt::ISODate))); endBalance -= split.shares() * factor; startBalance -= split.shares() * factor; break; case eMyMoney::Split::State::Cleared: - tracer.printf("Reducing start balance by %s because %s/%s(%s) is cleared", qPrintable((split.shares() * factor).formatMoney("", 2)), qPrintable((*it).first.id()), qPrintable(split.id()), qPrintable((*it).first.postDate().toString(Qt::ISODate))); + tracer.printf("Reducing start balance by %s because %s/%s(%s) is cleared", qPrintable((split.shares() * factor).formatMoney(QString(), 2)), qPrintable((*it).first.id()), qPrintable(split.id()), qPrintable((*it).first.postDate().toString(Qt::ISODate))); startBalance -= split.shares() * factor; break; default: @@ -232,8 +233,8 @@ //FIXME: port m_statementInfoPageCheckings->m_previousBalance->setValue(startBalance); m_statementInfoPageCheckings->m_endingBalance->setValue(endBalance); - tracer.printf("total balance = %s", qPrintable(endBalance.formatMoney("", 2))); - tracer.printf("start balance = %s", qPrintable(startBalance.formatMoney("", 2))); + tracer.printf("total balance = %s", qPrintable(endBalance.formatMoney(QString(), 2))); + tracer.printf("start balance = %s", qPrintable(startBalance.formatMoney(QString(), 2))); setField("interestDateEdit", field("statementDate").toDate()); setField("chargesDateEdit", field("statementDate").toDate()); diff --git a/kmymoney/wizards/newaccountwizard/knewaccountwizard.cpp b/kmymoney/wizards/newaccountwizard/knewaccountwizard.cpp --- a/kmymoney/wizards/newaccountwizard/knewaccountwizard.cpp +++ b/kmymoney/wizards/newaccountwizard/knewaccountwizard.cpp @@ -56,6 +56,7 @@ #include "mymoneyinstitution.h" #include "mymoneyaccountloan.h" #include "mymoneypayee.h" +#include "mymoneyprice.h" #include "mymoneytransaction.h" using namespace NewAccountWizard; @@ -409,7 +410,7 @@ qSort(d->m_list); QList::const_iterator it_l; - m_institutionComboBox->addItem(""); + m_institutionComboBox->addItem(QString()); for (it_l = d->m_list.constBegin(); it_l != d->m_list.constEnd(); ++it_l) { m_institutionComboBox->addItem((*it_l).name()); } @@ -981,14 +982,14 @@ if (m_loanAmount->lineedit()->text().isEmpty()) { // calculate the amount of the loan out of the other information val = calc.presentValue(); - m_loanAmount->loadText(MyMoneyMoney(static_cast(val)).abs().formatMoney("", m_wizard->precision())); + m_loanAmount->loadText(MyMoneyMoney(static_cast(val)).abs().formatMoney(QString(), m_wizard->precision())); result = i18n("KMyMoney has calculated the amount of the loan as %1.", m_loanAmount->lineedit()->text()); } else if (m_interestRate->lineedit()->text().isEmpty()) { // calculate the interest rate out of the other information val = calc.interestRate(); - m_interestRate->loadText(MyMoneyMoney(static_cast(val)).abs().formatMoney("", 3)); + m_interestRate->loadText(MyMoneyMoney(static_cast(val)).abs().formatMoney(QString(), 3)); result = i18n("KMyMoney has calculated the interest rate to %1%.", m_interestRate->lineedit()->text()); } else if (m_paymentAmount->lineedit()->text().isEmpty()) { @@ -1010,15 +1011,15 @@ // updateTermWidgets(calc.npp()); val = calc.futureValue(); MyMoneyMoney refVal(static_cast(val)); - m_balloonAmount->loadText(refVal.abs().formatMoney("", m_wizard->precision())); + m_balloonAmount->loadText(refVal.abs().formatMoney(QString(), m_wizard->precision())); result += QString(" "); result += i18n("The number of payments has been decremented and the balloon payment has been modified to %1.", m_balloonAmount->lineedit()->text()); } else if ((moneyBorrowed && val < 0 && qAbs(val) < qAbs(calc.payment())) || (moneyLend && val > 0 && qAbs(val) < qAbs(calc.payment()))) { - m_balloonAmount->loadText(MyMoneyMoney().formatMoney("", m_wizard->precision())); + m_balloonAmount->loadText(MyMoneyMoney().formatMoney(QString(), m_wizard->precision())); } else { MyMoneyMoney refVal(static_cast(val)); - m_balloonAmount->loadText(refVal.abs().formatMoney("", m_wizard->precision())); + m_balloonAmount->loadText(refVal.abs().formatMoney(QString(), m_wizard->precision())); result += i18n("The balloon payment has been modified to %1.", m_balloonAmount->lineedit()->text()); } @@ -1036,7 +1037,7 @@ calc.setNpp(qFloor(val)); val = calc.futureValue(); MyMoneyMoney refVal(static_cast(val)); - m_balloonAmount->loadText(refVal.abs().formatMoney("", m_wizard->precision())); + m_balloonAmount->loadText(refVal.abs().formatMoney(QString(), m_wizard->precision())); result += i18n("The balloon payment has been modified to %1.", m_balloonAmount->lineedit()->text()); } @@ -1067,7 +1068,7 @@ } MyMoneyMoney refVal(static_cast(val)); - result = i18n("KMyMoney has calculated a balloon payment of %1 for this loan.", refVal.abs().formatMoney("", m_wizard->precision())); + result = i18n("KMyMoney has calculated a balloon payment of %1 for this loan.", refVal.abs().formatMoney(QString(), m_wizard->precision())); if (!m_balloonAmount->lineedit()->text().isEmpty()) { if ((m_balloonAmount->value().abs() - refVal.abs()).abs().toDouble() > 1) { @@ -1075,7 +1076,7 @@ } result = i18n("KMyMoney has successfully verified your loan information."); } - m_balloonAmount->loadText(refVal.abs().formatMoney("", m_wizard->precision())); + m_balloonAmount->loadText(refVal.abs().formatMoney(QString(), m_wizard->precision())); } } catch (const MyMoneyException &) { @@ -1584,7 +1585,7 @@ m_dataList->append(i18n("Currency: %1", m_wizard->currency().name())); m_dataList->append(i18n("Opening date: %1", QLocale().toString(acc.openingDate()))); if (m_wizard->currency().id() != MyMoneyFile::instance()->baseCurrency().id()) { - m_dataList->append(i18n("Conversion rate: %1", m_wizard->conversionRate().rate(QString()).formatMoney("", m_wizard->currency().pricePrecision()))); + m_dataList->append(i18n("Conversion rate: %1", m_wizard->conversionRate().rate(QString()).formatMoney(QString(), m_wizard->currency().pricePrecision()))); } if (!acc.isLoan() || !m_wizard->openingBalance().isZero()) m_dataList->append(i18n("Opening balance: %1", MyMoneyUtils::formatMoney(m_wizard->openingBalance(), acc, sec))); @@ -1624,7 +1625,7 @@ } else { m_dataList->append(i18n("Amount lent: %1", m_wizard->m_loanDetailsPage->m_loanAmount->value().formatMoney(m_wizard->currency().tradingSymbol(), m_wizard->precision()))); } - m_dataList->append(i18n("Interest rate: %1 %", m_wizard->m_loanDetailsPage->m_interestRate->value().formatMoney("", -1))); + m_dataList->append(i18n("Interest rate: %1 %", m_wizard->m_loanDetailsPage->m_interestRate->value().formatMoney(QString(), -1))); m_dataList->append(i18n("Interest rate is %1", m_wizard->m_generalLoanInfoPage->m_interestType->currentText())); m_dataList->append(i18n("Principal and interest: %1", MyMoneyUtils::formatMoney(m_wizard->m_loanDetailsPage->m_paymentAmount->value(), acc, sec))); m_dataList->append(i18n("Additional Fees: %1", MyMoneyUtils::formatMoney(m_wizard->m_loanPaymentPage->additionalFees(), acc, sec))); diff --git a/kmymoney/wizards/newloanwizard/loanattributeswizardpage.cpp b/kmymoney/wizards/newloanwizard/loanattributeswizardpage.cpp --- a/kmymoney/wizards/newloanwizard/loanattributeswizardpage.cpp +++ b/kmymoney/wizards/newloanwizard/loanattributeswizardpage.cpp @@ -34,6 +34,7 @@ #include "knewbankdlg.h" #include "mymoneyfile.h" +#include "mymoneyinstitution.h" #include "mymoneyexception.h" LoanAttributesWizardPage::LoanAttributesWizardPage(QWidget *parent)