File indexing completed on 2024-05-12 16:43:47
0001 /* 0002 SPDX-FileCopyrightText: 2007 Thomas Baumgart <ipwizard@users.sourceforge.net> 0003 SPDX-FileCopyrightText: 2017 Łukasz Wojniłowicz <lukasz.wojnilowicz@gmail.com> 0004 SPDX-License-Identifier: GPL-2.0-or-later 0005 */ 0006 0007 #include "kinstitutionsview_p.h" 0008 0009 #include <typeinfo> 0010 0011 // ---------------------------------------------------------------------------- 0012 // QT Includes 0013 0014 #include <QTimer> 0015 #include <QMenu> 0016 0017 // ---------------------------------------------------------------------------- 0018 // KDE Includes 0019 0020 #include <KMessageBox> 0021 0022 // ---------------------------------------------------------------------------- 0023 // Project Includes 0024 0025 #include "kmymoneysettings.h" 0026 #include "mymoneyexception.h" 0027 #include "knewbankdlg.h" 0028 #include "menuenums.h" 0029 0030 using namespace Icons; 0031 0032 KInstitutionsView::KInstitutionsView(QWidget *parent) : 0033 KMyMoneyAccountsViewBase(*new KInstitutionsViewPrivate(this), parent) 0034 { 0035 Q_D(KInstitutionsView); 0036 d->ui->setupUi(this); 0037 0038 connect(pActions[eMenu::Action::NewInstitution], &QAction::triggered, this, &KInstitutionsView::slotNewInstitution); 0039 connect(pActions[eMenu::Action::EditInstitution], &QAction::triggered, this, &KInstitutionsView::slotEditInstitution); 0040 connect(pActions[eMenu::Action::DeleteInstitution], &QAction::triggered, this, &KInstitutionsView::slotDeleteInstitution); 0041 } 0042 0043 KInstitutionsView::~KInstitutionsView() 0044 { 0045 } 0046 0047 void KInstitutionsView::executeCustomAction(eView::Action action) 0048 { 0049 Q_D(KInstitutionsView); 0050 switch(action) { 0051 case eView::Action::Refresh: 0052 refresh(); 0053 break; 0054 0055 case eView::Action::SetDefaultFocus: 0056 QTimer::singleShot(0, d->ui->m_accountTree, SLOT(setFocus())); 0057 break; 0058 0059 case eView::Action::EditInstitution: 0060 slotEditInstitution(); 0061 break; 0062 0063 default: 0064 break; 0065 } 0066 } 0067 0068 void KInstitutionsView::refresh() 0069 { 0070 Q_D(KInstitutionsView); 0071 if (!isVisible()) { 0072 d->m_needsRefresh = true; 0073 return; 0074 } 0075 d->m_needsRefresh = false; 0076 0077 d->m_proxyModel->invalidate(); 0078 d->m_proxyModel->setHideEquityAccounts(!KMyMoneySettings::expertMode()); 0079 d->m_proxyModel->setHideClosedAccounts(!KMyMoneySettings::showAllAccounts()); 0080 } 0081 0082 void KInstitutionsView::showEvent(QShowEvent * event) 0083 { 0084 Q_D(KInstitutionsView); 0085 if (!d->m_proxyModel) 0086 d->init(); 0087 0088 emit customActionRequested(View::Institutions, eView::Action::AboutToShow); 0089 0090 if (d->m_needsRefresh) 0091 refresh(); 0092 0093 // don't forget base class implementation 0094 QWidget::showEvent(event); 0095 } 0096 0097 void KInstitutionsView::updateActions(const MyMoneyObject& obj) 0098 { 0099 Q_D(KInstitutionsView); 0100 if (typeid(obj) != typeid(MyMoneyInstitution) || 0101 (obj.id().isEmpty() && d->m_currentInstitution.id().isEmpty())) // do not disable actions that were already disabled 0102 return; 0103 0104 const auto& inst = static_cast<const MyMoneyInstitution&>(obj); 0105 0106 pActions[eMenu::Action::NewInstitution]->setEnabled(true); 0107 auto b = inst.id().isEmpty() ? false : true; 0108 pActions[eMenu::Action::EditInstitution]->setEnabled(b); 0109 pActions[eMenu::Action::DeleteInstitution]->setEnabled(b && !MyMoneyFile::instance()->isReferenced(inst)); 0110 d->m_currentInstitution = inst; 0111 } 0112 0113 void KInstitutionsView::slotNetWorthChanged(const MyMoneyMoney &netWorth) 0114 { 0115 Q_D(KInstitutionsView); 0116 d->netBalProChanged(netWorth, d->ui->m_totalProfitsLabel, View::Institutions); 0117 } 0118 0119 void KInstitutionsView::slotNewInstitution() 0120 { 0121 Q_D(KInstitutionsView); 0122 MyMoneyInstitution institution; 0123 0124 QPointer<KNewBankDlg> dlg = new KNewBankDlg(institution); 0125 if (dlg->exec() == QDialog::Accepted && dlg != 0) { 0126 d->m_currentInstitution = dlg->institution(); 0127 0128 const auto file = MyMoneyFile::instance(); 0129 MyMoneyFileTransaction ft; 0130 0131 try { 0132 file->addInstitution(d->m_currentInstitution); 0133 ft.commit(); 0134 0135 } catch (const MyMoneyException &e) { 0136 KMessageBox::information(this, i18n("Cannot add institution: %1", QString::fromLatin1(e.what()))); 0137 } 0138 } 0139 delete dlg; 0140 } 0141 0142 void KInstitutionsView::slotShowInstitutionsMenu(const MyMoneyInstitution& inst) 0143 { 0144 Q_UNUSED(inst); 0145 pMenus[eMenu::Menu::Institution]->exec(QCursor::pos()); 0146 } 0147 0148 void KInstitutionsView::slotEditInstitution() 0149 { 0150 Q_D(KInstitutionsView); 0151 0152 // make sure the selected object has an id 0153 if (d->m_currentInstitution.id().isEmpty()) 0154 return; 0155 0156 try { 0157 const auto file = MyMoneyFile::instance(); 0158 0159 //grab a pointer to the view, regardless of it being a account or institution view. 0160 auto institution = file->institution(d->m_currentInstitution.id()); 0161 0162 // bankSuccess is not checked anymore because d->m_file->institution will throw anyway 0163 QPointer<KNewBankDlg> dlg = new KNewBankDlg(institution); 0164 if (dlg->exec() == QDialog::Accepted && dlg != 0) { 0165 MyMoneyFileTransaction ft; 0166 try { 0167 file->modifyInstitution(dlg->institution()); 0168 ft.commit(); 0169 emit selectByObject(dlg->institution(), eView::Intent::None); 0170 } catch (const MyMoneyException &e) { 0171 KMessageBox::information(this, i18n("Unable to store institution: %1", QString::fromLatin1(e.what()))); 0172 } 0173 } 0174 delete dlg; 0175 0176 } catch (const MyMoneyException &e) { 0177 KMessageBox::information(this, i18n("Unable to edit institution: %1", QString::fromLatin1(e.what()))); 0178 } 0179 } 0180 0181 void KInstitutionsView::slotSelectByObject(const MyMoneyObject& obj, eView::Intent intent) 0182 { 0183 switch(intent) { 0184 case eView::Intent::UpdateActions: 0185 updateActions(obj); 0186 break; 0187 0188 case eView::Intent::OpenContextMenu: 0189 slotShowInstitutionsMenu(static_cast<const MyMoneyInstitution&>(obj)); 0190 break; 0191 0192 default: 0193 break; 0194 } 0195 } 0196 0197 void KInstitutionsView::slotSelectByVariant(const QVariantList& variant, eView::Intent intent) 0198 { 0199 switch (intent) { 0200 case eView::Intent::UpdateNetWorth: 0201 if (variant.count() == 1) 0202 slotNetWorthChanged(variant.first().value<MyMoneyMoney>()); 0203 break; 0204 default: 0205 break; 0206 } 0207 } 0208 0209 void KInstitutionsView::slotDeleteInstitution() 0210 { 0211 Q_D(KInstitutionsView); 0212 const auto file = MyMoneyFile::instance(); 0213 try { 0214 auto institution = file->institution(d->m_currentInstitution.id()); 0215 if ((KMessageBox::questionYesNo(this, i18n("<p>Do you really want to delete the institution <b>%1</b>?</p>", institution.name()))) == KMessageBox::No) 0216 return; 0217 MyMoneyFileTransaction ft; 0218 0219 try { 0220 file->removeInstitution(institution); 0221 emit selectByObject(MyMoneyInstitution(), eView::Intent::None); 0222 ft.commit(); 0223 } catch (const MyMoneyException &e) { 0224 KMessageBox::information(this, i18n("Unable to delete institution: %1", QString::fromLatin1(e.what()))); 0225 } 0226 } catch (const MyMoneyException &e) { 0227 KMessageBox::information(this, i18n("Unable to delete institution: %1", QString::fromLatin1(e.what()))); 0228 } 0229 }