File indexing completed on 2024-05-19 05:13:17

0001 /*
0002     SPDX-FileCopyrightText: 2018 Daniel Vrátil <dvratil@kde.org>
0003 
0004     SPDX-License-Identifier: LGPL-2.0-or-later
0005 */
0006 
0007 #include "loggingfiltermodel.h"
0008 #include "akonadiconsole_debug.h"
0009 #include "loggingmodel.h"
0010 
0011 #include <Libkdepim/KCheckComboBox>
0012 #ifndef COMPILE_WITH_UNITY_CMAKE_SUPPORT
0013 Q_DECLARE_METATYPE(LoggingModel::Message)
0014 #endif
0015 #include <chrono>
0016 
0017 using namespace std::chrono_literals;
0018 using namespace KPIM;
0019 
0020 LoggingFilterModel::LoggingFilterModel(QObject *parent)
0021     : QSortFilterProxyModel(parent)
0022 {
0023     mInvalidateTimer.setInterval(50ms);
0024     mInvalidateTimer.setSingleShot(true);
0025     connect(&mInvalidateTimer, &QTimer::timeout, this, &LoggingFilterModel::invalidate);
0026 }
0027 
0028 LoggingFilterModel::~LoggingFilterModel() = default;
0029 
0030 void LoggingFilterModel::setAppFilter(KCheckComboBox *appFilter)
0031 {
0032     if (mAppFilter) {
0033         mAppFilter->disconnect(this);
0034     }
0035     mAppFilter = appFilter;
0036     connect(mAppFilter, &KCheckComboBox::checkedItemsChanged, this, [this](const QStringList &items) {
0037         mCheckedApps.clear();
0038         mCheckedApps.reserve(items.count());
0039         for (const auto &item : items) {
0040             mCheckedApps.insert(item);
0041         }
0042         if (!mInvalidateTimer.isActive()) {
0043             mInvalidateTimer.start();
0044         }
0045     });
0046 }
0047 
0048 void LoggingFilterModel::setTypeFilter(KCheckComboBox *typeFilter)
0049 {
0050     if (mTypeFilter) {
0051         mTypeFilter->disconnect(this);
0052     }
0053     mTypeFilter = typeFilter;
0054     connect(mTypeFilter, &KCheckComboBox::checkedItemsChanged, this, [this](const QStringList &items) {
0055         mCheckedTypes.clear();
0056         mCheckedTypes.reserve(items.count());
0057         for (const auto &item : mTypeFilter->checkedItems(Qt::UserRole)) {
0058             mCheckedTypes.insert(static_cast<QtMsgType>(item.toInt()));
0059         }
0060         if (!mInvalidateTimer.isActive()) {
0061             mInvalidateTimer.start();
0062         }
0063     });
0064 }
0065 
0066 void LoggingFilterModel::setCategoryFilter(KCheckComboBox *categoryFilter)
0067 {
0068     if (mCategoryFilter) {
0069         mCategoryFilter->disconnect(this);
0070     }
0071     mCategoryFilter = categoryFilter;
0072     connect(mCategoryFilter, &KCheckComboBox::checkedItemsChanged, this, [this](const QStringList &items) {
0073         mCheckedCategories.clear();
0074         mCheckedCategories.reserve(items.count());
0075         for (const auto &item : items) {
0076             mCheckedCategories.insert(item);
0077         }
0078         if (!mInvalidateTimer.isActive()) {
0079             mInvalidateTimer.start();
0080         }
0081     });
0082 }
0083 
0084 bool LoggingFilterModel::filterAcceptsRow(int source_row, const QModelIndex &) const
0085 {
0086     const auto source_idx = sourceModel()->index(source_row, 0);
0087     const auto msg = sourceModel()->data(source_idx, LoggingModel::MessageRole).value<LoggingModel::Message>();
0088     return mCheckedApps.contains(msg.app) && mCheckedCategories.contains(msg.category) && mCheckedTypes.contains(msg.type);
0089 }
0090 
0091 #include "moc_loggingfiltermodel.cpp"