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