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 @@ -39,7 +39,8 @@ class KSettingsGeneral : public KSettingsGeneralDecl { Q_OBJECT - +private: + bool initialHideZeroBalanceEquities; public: KSettingsGeneral(QWidget* parent = 0); ~KSettingsGeneral(); @@ -47,6 +48,8 @@ protected slots: void slotLoadStartDate(const QDate&); +public slots: + void slotUpdateEquitiesVisibility(); }; #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 @@ -29,6 +29,8 @@ // Project Includes #include +#include "models.h" +#include "accountsmodel.h" KSettingsGeneral::KSettingsGeneral(QWidget* parent) : KSettingsGeneralDecl(parent) @@ -41,6 +43,8 @@ // 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))); + + initialHideZeroBalanceEquities = kcfg_HideZeroBalanceEquities->isChecked(); } KSettingsGeneral::~KSettingsGeneral() @@ -53,3 +57,27 @@ disconnect(kcfg_StartDate, SIGNAL(dateChanged(QDate)), this, SLOT(slotLoadStartDate(QDate))); m_startDateEdit->setDate(kcfg_StartDate->date()); } + +void KSettingsGeneral::slotUpdateEquitiesVisibility() +{ + if (initialHideZeroBalanceEquities == kcfg_HideZeroBalanceEquities->isChecked()) // setting hasn't been changed, so return + return; + initialHideZeroBalanceEquities = 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(); + QList accountsList; + file->accountList(accountsList); + + foreach (const auto account, accountsList) { + if (account.isInvest() && account.balance().isZero()) { // search only for zero balance stocks + if (initialHideZeroBalanceEquities) { + accountsModel->slotObjectRemoved(MyMoneyFile::notifyAccount, account.id()); // remove item from accounts' page + institutionsModel->slotObjectRemoved(MyMoneyFile::notifyAccount, account.id()); // remove item from institutions' page + } else { + accountsModel->slotObjectAdded(MyMoneyFile::notifyAccount, dynamic_cast(&account)); // add item to accounts' page + institutionsModel->slotObjectAdded(MyMoneyFile::notifyAccount, dynamic_cast(&account)); // add item to institutions' page + } + } + } +} 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 @@ -88,6 +88,7 @@ QAbstractButton* 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); diff --git a/kmymoney/models/accountsmodel.cpp b/kmymoney/models/accountsmodel.cpp --- a/kmymoney/models/accountsmodel.cpp +++ b/kmymoney/models/accountsmodel.cpp @@ -532,9 +532,17 @@ accountsItem->appendRow(item); item->setColumnCount(columnCount()); item->setEditable(false); - if (acc.accountList().count() > 0) { - d->loadSubAccounts(this, item, favoriteAccountsItem, acc.accountList()); + QStringList subaccountsList = acc.accountList(); + // filter out stocks with zero balance if requested by user + for (QStringList::Iterator it = subaccountsList.begin(); it != subaccountsList.end();) { + const MyMoneyAccount& subAcc = d->m_file->account(*it); + if (subAcc.isInvest() && KMyMoneyGlobalSettings::hideZeroBalanceEquities() && subAcc.balance().isZero()) + it = subaccountsList.erase(it); + else + ++it; } + if (!subaccountsList.isEmpty()) + d->loadSubAccounts(this, item, favoriteAccountsItem, subaccountsList); d->setAccountData(this, item->index(), acc); // set the account data after the children have been loaded if (acc.value("PreferredAccount") == "Yes") { @@ -915,15 +923,22 @@ MyMoneyInstitution none; none.setName(i18n("Accounts with no institution assigned")); institutionList.append(none); - foreach (const MyMoneyInstitution &institution, institutionList) { + foreach (const auto institution, institutionList) static_cast(d)->addInstitutionItem(this, institution); + + QList accountsList; + QList stocksList; + d->m_file->accountList(accountsList); + foreach (const auto account, accountsList) { // create items for all the accounts... + if (account.isInvest()) // ...but wait with stocks until investment accounts appear + stocksList.append(account); + else + static_cast(d)->loadInstitution(this, account); } - // create items for all the accounts - QList list; - d->m_file->accountList(list); - for (QList::ConstIterator it_l = list.constBegin(); it_l != list.constEnd(); ++it_l) { - static_cast(d)->loadInstitution(this, *it_l); + foreach (const auto stock, stocksList) { + if (!(KMyMoneyGlobalSettings::hideZeroBalanceEquities() && stock.balance().isZero())) + static_cast(d)->loadInstitution(this, stock); } }