File indexing completed on 2024-05-12 05:07:41

0001 /*
0002     SPDX-FileCopyrightText: 2002-2004 Kevin Tambascio <ktambascio@users.sourceforge.net>
0003     SPDX-FileCopyrightText: 2003-2021 Thomas Baumgart <tbaumgart@kde.org>
0004     SPDX-FileCopyrightText: 2004-2005 Ace Jones <acejones@users.sourceforge.net>
0005     SPDX-FileCopyrightText: 2009-2010 Alvaro Soliverez <asoliverez@kde.org>
0006     SPDX-FileCopyrightText: 2017 Łukasz Wojniłowicz <lukasz.wojnilowicz@gmail.com>
0007     SPDX-License-Identifier: GPL-2.0-or-later
0008 */
0009 
0010 #ifndef KINVESTMENTVIEW_P_H
0011 #define KINVESTMENTVIEW_P_H
0012 
0013 #include "kinvestmentview.h"
0014 
0015 // ----------------------------------------------------------------------------
0016 // QT Includes
0017 
0018 #include <QIcon>
0019 
0020 // ----------------------------------------------------------------------------
0021 // KDE Includes
0022 
0023 #include <KSharedConfig>
0024 #include <KExtraColumnsProxyModel>
0025 
0026 // ----------------------------------------------------------------------------
0027 // Project Includes
0028 
0029 #include "ui_kinvestmentview.h"
0030 #include "kmymoneyviewbase_p.h"
0031 
0032 #include "mymoneyexception.h"
0033 #include "mymoneyfile.h"
0034 #include "mymoneysecurity.h"
0035 #include "mymoneyaccount.h"
0036 #include "kmymoneysettings.h"
0037 #include "kmymoneyaccountcombo.h"
0038 #include "accountsmodel.h"
0039 #include "equitiesmodel.h"
0040 #include "securitiesmodel.h"
0041 #include "icons.h"
0042 #include "mymoneyenums.h"
0043 #include "columnselector.h"
0044 
0045 using namespace Icons;
0046 
0047 namespace eView {
0048 namespace Investment {
0049 enum Tab { Equities = 0, Securities };
0050 }
0051 }
0052 
0053 class KInvestmentViewPrivate : public KMyMoneyViewBasePrivate
0054 {
0055     Q_DECLARE_PUBLIC(KInvestmentView)
0056 
0057 public:
0058     explicit KInvestmentViewPrivate(KInvestmentView *qq)
0059         : KMyMoneyViewBasePrivate(qq)
0060         , ui(new Ui::KInvestmentView)
0061         , m_idInvAcc(QString())
0062         , m_needLoad(true)
0063         , m_accountsProxyModel(nullptr)
0064         , m_equitiesProxyModel(nullptr)
0065         , m_securitiesProxyModel(nullptr)
0066         , m_securityColumnSelector(nullptr)
0067         , m_equityColumnSelector(nullptr)
0068     {
0069     }
0070 
0071     ~KInvestmentViewPrivate()
0072     {
0073         delete ui;
0074     }
0075 
0076     void init()
0077     {
0078         Q_Q(KInvestmentView);
0079         m_needLoad = false;
0080         ui->setupUi(q);
0081 
0082         // Equities tab
0083         m_accountsProxyModel = new AccountNamesFilterProxyModel(q);
0084         m_accountsProxyModel->setObjectName("m_accountsProxyModel");
0085         m_accountsProxyModel->addAccountType(eMyMoney::Account::Type::Investment);
0086         m_accountsProxyModel->setHideEquityAccounts(false);
0087         m_accountsProxyModel->setHideZeroBalancedEquityAccounts(false);
0088         m_accountsProxyModel->setHideZeroBalancedAccounts(KMyMoneySettings::hideZeroBalanceAccounts());
0089         m_accountsProxyModel->setSourceModel(MyMoneyFile::instance()->accountsModel());
0090         m_accountsProxyModel->sort(AccountsModel::Column::AccountName);
0091         ui->m_accountComboBox->setModel(m_accountsProxyModel);
0092         ui->m_accountComboBox->expandAll();
0093 
0094         auto extraColumnModel = new EquitiesModel(q);
0095         extraColumnModel->setObjectName("extraColumnModel");
0096         extraColumnModel->setSourceModel(MyMoneyFile::instance()->accountsModel());
0097 
0098         m_equitiesProxyModel = new AccountsProxyModel(q);
0099         m_equitiesProxyModel->setObjectName("m_equitiesProxyModel");
0100         m_equitiesProxyModel->clear();
0101         m_equitiesProxyModel->addAccountType(eMyMoney::Account::Type::Stock);
0102         m_equitiesProxyModel->setHideEquityAccounts(false);
0103         m_equitiesProxyModel->setHideAllEntries(true);
0104         m_equitiesProxyModel->setClosedSelectable(true);
0105         m_equitiesProxyModel->setSourceModel(extraColumnModel);
0106         m_equitiesProxyModel->sort(AccountsModel::Column::AccountName);
0107         m_equitiesProxyModel->setSortRole(Qt::EditRole);
0108         m_equitiesProxyModel->setHideClosedAccounts(!KMyMoneySettings::showAllAccounts());
0109 
0110         ui->m_equitiesTree->setModel(m_equitiesProxyModel);
0111 
0112         QVector<int> equityColumns({extraColumnModel->proxyColumnForExtraColumn(EquitiesModel::Column::Symbol),
0113                                     extraColumnModel->proxyColumnForExtraColumn(EquitiesModel::Column::Value),
0114                                     extraColumnModel->proxyColumnForExtraColumn(EquitiesModel::Column::Quantity),
0115                                     extraColumnModel->proxyColumnForExtraColumn(EquitiesModel::Column::Price),
0116                                     extraColumnModel->proxyColumnForExtraColumn(EquitiesModel::Column::LastPriceUpdate)});
0117 
0118         m_equityColumnSelector = new ColumnSelector(ui->m_equitiesTree,
0119                 QStringLiteral("KInvestmentView_Equities"),
0120                 extraColumnModel->proxyColumnForExtraColumn(EquitiesModel::Column::Symbol)-1,
0121                 equityColumns);
0122         m_equityColumnSelector->setModel(m_equitiesProxyModel);
0123 
0124         m_equityColumnSelector->setAlwaysVisible(QVector<int>({ AccountsModel::Column::AccountName }));
0125 
0126         QVector<int> columns;
0127         columns = m_equityColumnSelector->columns();
0128 
0129         int colIdx;
0130         for (const auto& col : qAsConst(equityColumns)) {
0131             colIdx = columns.indexOf(col);
0132             if (colIdx != -1)
0133                 columns.remove(colIdx);
0134         }
0135         colIdx = columns.indexOf(AccountsModel::Column::AccountName);
0136         if (colIdx != -1)
0137             columns.remove(colIdx);
0138 
0139         m_equityColumnSelector->setAlwaysHidden(columns);
0140         m_equityColumnSelector->setSelectable(equityColumns);
0141 
0142 
0143         // Securities tab
0144         m_securitiesProxyModel = new QSortFilterProxyModel(q);
0145         ui->m_securitiesTree->setModel(m_securitiesProxyModel);
0146         m_securitiesProxyModel->setSourceModel(MyMoneyFile::instance()->securitiesModel());
0147         m_securitiesProxyModel->setFilterCaseSensitivity(Qt::CaseInsensitive);
0148 
0149         m_securityColumnSelector = new ColumnSelector(ui->m_securitiesTree, QStringLiteral("KInvestmentView_Securities"));
0150         m_securityColumnSelector->setModel(MyMoneyFile::instance()->securitiesModel());
0151         m_securityColumnSelector->setAlwaysVisible(QVector<int>({0}));
0152         m_securityColumnSelector->setSelectable(m_securityColumnSelector->columns());
0153 
0154         q->connect(ui->m_searchSecurities, &QLineEdit::textChanged, m_securitiesProxyModel, &QSortFilterProxyModel::setFilterFixedString);
0155     }
0156 
0157     /**
0158      * Use a copy of the account @a id here because we pass
0159      * m_idInvAcc as argument at one point which gets cleared
0160      * but we need it later on.
0161      */
0162     void loadAccount(QString id)
0163     {
0164         Q_Q(KInvestmentView);
0165         auto baseModel = MyMoneyFile::instance()->accountsModel();
0166         auto baseIdx = baseModel->indexById(id);
0167         const auto currentSelectedId = ui->m_equitiesTree->currentIndex().data(eMyMoney::Model::IdRole).toString();
0168         QModelIndex idx;
0169 
0170         m_selections.clearSelections();
0171         Q_EMIT q->requestSelectionChange(m_selections);
0172 
0173         m_equitiesProxyModel->setHideAllEntries(true);
0174         m_idInvAcc.clear();
0175         if (baseIdx.isValid()) {
0176             if (baseIdx.data(eMyMoney::Model::AccountTypeRole).value<eMyMoney::Account::Type>() == eMyMoney::Account::Type::Investment) {
0177                 m_equitiesProxyModel->setHideAllEntries(false);
0178                 idx = baseModel->mapFromBaseSource(m_equitiesProxyModel, baseIdx);
0179                 m_idInvAcc = id;
0180             }
0181         }
0182 
0183         if (idx.isValid()) {
0184             ui->m_equitiesTree->setRootIndex(idx);
0185         } else {
0186             m_equitiesProxyModel->setHideAllEntries(true);
0187         }
0188 
0189         if (m_equitiesProxyModel->rowCount(idx) > 0) {
0190             int row(0);
0191             if (!currentSelectedId.isEmpty()) {
0192                 const auto indexList = m_equitiesProxyModel->match(idx, eMyMoney::Model::IdRole, currentSelectedId, 1, Qt::MatchRecursive);
0193                 if (!indexList.isEmpty()) {
0194                     row = indexList.first().row();
0195                 }
0196             }
0197             idx = m_equitiesProxyModel->index(row, 0, idx);
0198             ui->m_equitiesTree->selectionModel()->select(idx, QItemSelectionModel::SelectCurrent | QItemSelectionModel::Rows);
0199             ui->m_equitiesTree->setCurrentIndex(idx);
0200         }
0201 
0202         if (m_securitiesProxyModel->rowCount(QModelIndex()) > 0) {
0203             idx = m_securitiesProxyModel->index(0, 0);
0204             ui->m_securitiesTree->selectionModel()->select(idx, QItemSelectionModel::SelectCurrent | QItemSelectionModel::Rows);
0205             ui->m_securitiesTree->setCurrentIndex(idx);
0206         }
0207     }
0208 
0209     /**
0210       * This slot is used to programmatically preselect default account in investment view
0211       */
0212     void selectDefaultInvestmentAccount()
0213     {
0214         if (m_accountsProxyModel->rowCount() > 0) {
0215             const auto indexes = m_accountsProxyModel->match(m_accountsProxyModel->index(0, 0),
0216                                                              eMyMoney::Model::AccountTypeRole,
0217                                                              QVariant::fromValue<eMyMoney::Account::Type>(eMyMoney::Account::Type::Investment),
0218                                                              1,
0219                                                              Qt::MatchRecursive);
0220             if (!indexes.isEmpty()) {
0221                 ui->m_accountComboBox->setSelected(indexes.first().data(eMyMoney::Model::IdRole).toString());
0222             }
0223         }
0224     }
0225 
0226     /**
0227       * This slots returns security currently selected in tree view
0228       */
0229     MyMoneySecurity currentSecurity()
0230     {
0231         MyMoneySecurity sec;
0232         const auto securityIdx = ui->m_securitiesTree->currentIndex();
0233         if (securityIdx.isValid()) {
0234             auto mdlItem = m_securitiesProxyModel->index(securityIdx.row(), SecuritiesModel::Security, securityIdx.parent());
0235             sec = MyMoneyFile::instance()->security(mdlItem.data(eMyMoney::Model::IdRole).toString());
0236         }
0237         return sec;
0238     }
0239 
0240     /**
0241       * This slots returns equity currently selected in tree view
0242       */
0243     MyMoneyAccount currentEquity()
0244     {
0245         QModelIndex idx = MyMoneyFile::baseModel()->mapToBaseSource(ui->m_equitiesTree->currentIndex());
0246         return MyMoneyFile::instance()->accountsModel()->itemByIndex(idx);
0247     }
0248 
0249     Ui::KInvestmentView *ui;
0250     QString             m_idInvAcc;
0251 
0252     /**
0253       * This member holds the load state of page
0254       */
0255     bool m_needLoad;
0256 
0257     AccountNamesFilterProxyModel* m_accountsProxyModel;
0258     AccountsProxyModel* m_equitiesProxyModel;
0259     QSortFilterProxyModel* m_securitiesProxyModel;
0260     ColumnSelector* m_securityColumnSelector;
0261     ColumnSelector* m_equityColumnSelector;
0262     SelectedObjects m_equitySelections;
0263     SelectedObjects m_securitySelections;
0264     SelectedObjects m_externalSelections;
0265 };
0266 
0267 #endif