File indexing completed on 2024-05-19 05:08:32

0001 /*
0002     SPDX-FileCopyrightText: 2004-2017 Thomas Baumgart <tbaumgart@kde.org>
0003     SPDX-FileCopyrightText: 2017 Łukasz Wojniłowicz <lukasz.wojnilowicz@gmail.com>
0004     SPDX-License-Identifier: GPL-2.0-or-later
0005 */
0006 
0007 #include "kmymoneyaccountcompletion.h"
0008 #include "kmymoneycompletion_p.h"
0009 
0010 // ----------------------------------------------------------------------------
0011 // QT Includes
0012 
0013 #include <QLayout>
0014 
0015 // ----------------------------------------------------------------------------
0016 // KDE Includes
0017 
0018 // ----------------------------------------------------------------------------
0019 // Project Includes
0020 
0021 #include "mymoneyfile.h"
0022 #include "kmymoneyaccountselector.h"
0023 #include "mymoneyenums.h"
0024 
0025 KMyMoneyAccountCompletion::KMyMoneyAccountCompletion(QWidget *parent) :
0026     KMyMoneyCompletion(parent)
0027 {
0028     Q_D(KMyMoneyCompletion);
0029     delete d->m_selector;
0030     d->m_selector = new KMyMoneyAccountSelector(this, {}, false);
0031     d->m_selector->listView()->setFocusProxy(parent);
0032     layout()->addWidget(d->m_selector);
0033 
0034 #ifndef KMM_DESIGNER
0035     // Default is to show all accounts
0036     // FIXME We should leave this also to the caller
0037     AccountSet set;
0038     set.addAccountGroup(eMyMoney::Account::Type::Asset);
0039     set.addAccountGroup(eMyMoney::Account::Type::Liability);
0040     set.addAccountGroup(eMyMoney::Account::Type::Income);
0041     set.addAccountGroup(eMyMoney::Account::Type::Expense);
0042     set.load(selector());
0043 #endif
0044 
0045     connectSignals(d->m_selector, d->m_selector->listView());
0046 }
0047 
0048 KMyMoneyAccountCompletion::~KMyMoneyAccountCompletion()
0049 {
0050 }
0051 
0052 QStringList KMyMoneyAccountCompletion::accountList(const QList<eMyMoney::Account::Type>& list = QList<eMyMoney::Account::Type>()) const
0053 {
0054     return selector()->accountList(list);
0055 }
0056 
0057 QStringList KMyMoneyAccountCompletion::accountList() const
0058 {
0059     return accountList(QList<eMyMoney::Account::Type>());
0060 }
0061 
0062 KMyMoneyAccountSelector* KMyMoneyAccountCompletion::selector() const
0063 {
0064     Q_D(const KMyMoneyCompletion);
0065 //  return nullptr;
0066     return dynamic_cast<KMyMoneyAccountSelector*>(d->m_selector);
0067 }
0068 
0069 void KMyMoneyAccountCompletion::slotMakeCompletion(const QString& txt)
0070 {
0071     Q_D(KMyMoneyCompletion);
0072     // if(txt.isEmpty() || txt.length() == 0)
0073     //  return;
0074 
0075     auto cnt = 0;
0076     if (txt.contains(MyMoneyFile::AccountSeparator) == 0) {
0077         d->m_lastCompletion = QRegularExpression(QRegularExpression::escape(txt), QRegularExpression::CaseInsensitiveOption);
0078         cnt = selector()->slotMakeCompletion(txt);
0079     } else {
0080         QStringList parts = txt.split(MyMoneyFile::AccountSeparator, Qt::SkipEmptyParts);
0081         QString pattern("^");
0082         QStringList::iterator it;
0083         for (it = parts.begin(); it != parts.end(); ++it) {
0084             if (pattern.length() > 1)
0085                 pattern += MyMoneyFile::AccountSeparator;
0086             pattern += QRegularExpression::escape(QString(*it).trimmed()) + ".*";
0087         }
0088         pattern += '$';
0089         d->m_lastCompletion = QRegularExpression(pattern, QRegularExpression::CaseInsensitiveOption);
0090         cnt = selector()->slotMakeCompletion(d->m_lastCompletion);
0091         // if we don't have a match, we try it again, but this time
0092         // we add a wildcard for the top level
0093         if (cnt == 0) {
0094             pattern = pattern.insert(1, QString(".*") + MyMoneyFile::AccountSeparator);
0095             d->m_lastCompletion = QRegularExpression(pattern, QRegularExpression::CaseInsensitiveOption);
0096             cnt = selector()->slotMakeCompletion(d->m_lastCompletion);
0097         }
0098     }
0099 
0100     if (d->m_parent && d->m_parent->isVisible() && !isVisible() && cnt)
0101         show(false);
0102     else {
0103         if (cnt != 0) {
0104             adjustSize();
0105         } else {
0106             hide();
0107         }
0108     }
0109 }