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 }