File indexing completed on 2024-05-12 16:42:10

0001 /*
0002     SPDX-FileCopyrightText: 2007-2018 Thomas Baumgart <tbaumgart@kde.org>
0003     SPDX-FileCopyrightText: 2017-2018 Łukasz Wojniłowicz <lukasz.wojnilowicz@gmail.com>
0004     SPDX-License-Identifier: GPL-2.0-or-later
0005 */
0006 
0007 #include "kselecttransactionsdlg.h"
0008 #include "kselecttransactionsdlg_p.h"
0009 
0010 // ----------------------------------------------------------------------------
0011 // QT Includes
0012 
0013 #include <QEvent>
0014 #include <QHeaderView>
0015 #include <QKeyEvent>
0016 #include <QList>
0017 #include <QPushButton>
0018 
0019 // ----------------------------------------------------------------------------
0020 // KDE Includes
0021 
0022 #include <KStandardGuiItem>
0023 #include <KLocalizedString>
0024 
0025 // ----------------------------------------------------------------------------
0026 // Project Includes
0027 
0028 #include "ui_kselecttransactionsdlg.h"
0029 
0030 #include "mymoneyaccount.h"
0031 #include "selectedtransactions.h"
0032 #include "mymoneysplit.h"
0033 #include "mymoneytransaction.h"
0034 #include "transaction.h"
0035 #include "kmymoneysettings.h"
0036 #include "widgetenums.h"
0037 
0038 KSelectTransactionsDlg::KSelectTransactionsDlg(const MyMoneyAccount& _account, QWidget* parent) :
0039     QDialog(parent),
0040     d_ptr(new KSelectTransactionsDlgPrivate)
0041 {
0042     Q_D(KSelectTransactionsDlg);
0043     d->m_account = _account;
0044     d->ui->setupUi(this);
0045     // setup descriptive texts
0046     setWindowTitle(i18n("Select Transaction"));
0047     d->ui->m_description->setText(i18n("Select a transaction and press the OK button or use Cancel to select none."));
0048 
0049     // clear current register contents
0050     d->ui->m_register->clear();
0051 
0052     // no selection possible
0053     d->ui->m_register->setSelectionMode(QTableWidget::SingleSelection);
0054 
0055     // setup header font
0056     auto font = KMyMoneySettings::listHeaderFontEx();
0057     QFontMetrics fm(font);
0058     auto height = fm.lineSpacing() + 6;
0059     d->ui->m_register->horizontalHeader()->setMinimumHeight(height);
0060     d->ui->m_register->horizontalHeader()->setMaximumHeight(height);
0061     d->ui->m_register->horizontalHeader()->setFont(font);
0062 
0063     // setup cell font
0064     font = KMyMoneySettings::listCellFontEx();
0065     d->ui->m_register->setFont(font);
0066 
0067     // ... setup the register columns ...
0068     d->ui->m_register->setupRegister(d->m_account);
0069 
0070     // setup buttons
0071 
0072     // default is to need at least one transaction selected
0073     d->ui->buttonBox->button(QDialogButtonBox::Ok)->setDisabled(true);
0074 
0075     // catch some events from the register
0076     d->ui->m_register->installEventFilter(this);
0077 
0078     connect(d->ui->m_register, &KMyMoneyRegister::Register::transactionsSelected, this, &KSelectTransactionsDlg::slotEnableOk);
0079     connect(d->ui->m_register, &KMyMoneyRegister::Register::editTransaction, this, &QDialog::accept);
0080 
0081     connect(d->ui->buttonBox, &QDialogButtonBox::helpRequested, this, &KSelectTransactionsDlg::slotHelp);
0082 }
0083 
0084 KSelectTransactionsDlg::~KSelectTransactionsDlg()
0085 {
0086     Q_D(KSelectTransactionsDlg);
0087     delete d;
0088 }
0089 
0090 void KSelectTransactionsDlg::slotEnableOk(const KMyMoneyRegister::SelectedTransactions& list)
0091 {
0092     Q_D(KSelectTransactionsDlg);
0093     d->ui->buttonBox->button(QDialogButtonBox::Ok)->setEnabled(list.count() != 0);
0094 }
0095 
0096 void KSelectTransactionsDlg::addTransaction(const MyMoneyTransaction& t)
0097 {
0098     Q_D(KSelectTransactionsDlg);
0099     foreach (const auto split, t.splits()) {
0100         if (split.accountId() == d->m_account.id()) {
0101             KMyMoneyRegister::Transaction* tr = KMyMoneyRegister::Register::transactionFactory(d->ui->m_register, t, split, 0);
0102             // force full detail display
0103             tr->setNumRowsRegister(tr->numRowsRegister(true));
0104             break;
0105         }
0106     }
0107 }
0108 
0109 int KSelectTransactionsDlg::exec()
0110 {
0111     Q_D(KSelectTransactionsDlg);
0112     d->ui->m_register->updateRegister(true);
0113     d->ui->m_register->update();
0114 
0115     d->ui->m_register->setFocus();
0116 
0117     return QDialog::exec();
0118 }
0119 
0120 void KSelectTransactionsDlg::slotHelp()
0121 {
0122     // KHelpClient::invokeHelp("details.ledgers.match");
0123 }
0124 
0125 void KSelectTransactionsDlg::showEvent(QShowEvent* event)
0126 {
0127     Q_D(KSelectTransactionsDlg);
0128     QDialog::showEvent(event);
0129     d->ui->m_register->resize((int)eWidgets::eTransaction::Column::Detail, true);
0130 }
0131 
0132 void KSelectTransactionsDlg::resizeEvent(QResizeEvent* ev)
0133 {
0134     Q_D(KSelectTransactionsDlg);
0135     // don't forget the resizer
0136     QDialog::resizeEvent(ev);
0137 
0138     // resize the register
0139     d->ui->m_register->resize((int)eWidgets::eTransaction::Column::Detail, true);
0140 }
0141 
0142 MyMoneyTransaction KSelectTransactionsDlg::transaction() const
0143 {
0144     Q_D(const KSelectTransactionsDlg);
0145     MyMoneyTransaction t;
0146 
0147     QList<KMyMoneyRegister::RegisterItem*> list;
0148     list = d->ui->m_register->selectedItems();
0149     if (list.count()) {
0150         if (auto _t = dynamic_cast<KMyMoneyRegister::Transaction*>(list[0]))
0151             t = _t->transaction();
0152     }
0153     return t;
0154 }
0155 
0156 KMyMoneyRegister::Register* KSelectTransactionsDlg::getRegister()
0157 {
0158     Q_D(KSelectTransactionsDlg);
0159     return d->ui->m_register;
0160 }
0161 
0162 bool KSelectTransactionsDlg::eventFilter(QObject* o, QEvent* e)
0163 {
0164     Q_D(KSelectTransactionsDlg);
0165     auto rc = false;
0166 
0167     if (o == d->ui->m_register) {
0168         switch (e->type()) {
0169         case QEvent::KeyPress:
0170             if (auto k = dynamic_cast<QKeyEvent*>(e)) {
0171                 if ((k->modifiers() & Qt::KeyboardModifierMask) == 0
0172                         || (k->modifiers() & Qt::KeypadModifier) != 0) {
0173                     switch (k->key()) {
0174                     case Qt::Key_Return:
0175                     case Qt::Key_Enter:
0176                         if (d->ui->buttonBox->button(QDialogButtonBox::Ok)->isEnabled()) {
0177                             accept();
0178                             rc = true;
0179                         }
0180                     // tricky fall through here
0181                     default:
0182                         break;
0183                     }
0184                 }
0185             }
0186         // tricky fall through here
0187         default:
0188             break;
0189         }
0190     }
0191     return rc;
0192 }