File indexing completed on 2024-05-12 05:35:45

0001 /*
0002     SPDX-FileCopyrightText: 2020 David Redondo <kde@david-redondo.de>
0003 
0004     SPDX-License-Identifier: GPL-2.0-only OR GPL-3.0-only OR LicenseRef-KDE-Accepted-GPL
0005 */
0006 
0007 #include "filteredmodel.h"
0008 
0009 #include <QKeySequence>
0010 
0011 #include "basemodel.h"
0012 
0013 FilteredShortcutsModel::FilteredShortcutsModel(QObject *parent)
0014     : QSortFilterProxyModel(parent)
0015 {
0016     setRecursiveFilteringEnabled(true);
0017 }
0018 
0019 bool FilteredShortcutsModel::filterAcceptsRow(int source_row, const QModelIndex &source_parent) const
0020 {
0021     if (m_filter.isEmpty()) {
0022         return true;
0023     }
0024 
0025     const QModelIndex index = sourceModel()->index(source_row, 0, source_parent);
0026     const bool displayMatches = index.data(Qt::DisplayRole).toString().contains(m_filter, Qt::CaseInsensitive);
0027     if (!source_parent.isValid() || displayMatches) {
0028         return displayMatches;
0029     }
0030 
0031     if (index.parent().data(Qt::DisplayRole).toString().contains(m_filter, Qt::CaseInsensitive)) {
0032         return true;
0033     }
0034 
0035     const auto &defaultShortcuts = index.data(BaseModel::DefaultShortcutsRole).value<QSet<QKeySequence>>();
0036     for (const auto &shortcut : defaultShortcuts) {
0037         if (shortcut.toString(QKeySequence::NativeText).contains(m_filter, Qt::CaseInsensitive)
0038             || shortcut.toString(QKeySequence::PortableText).contains(m_filter, Qt::CaseInsensitive)) {
0039             return true;
0040         }
0041     }
0042 
0043     const auto &shortcuts = index.data(BaseModel::CustomShortcutsRole).value<QSet<QKeySequence>>();
0044     for (const auto &shortcut : shortcuts) {
0045         if (shortcut.toString(QKeySequence::NativeText).contains(m_filter, Qt::CaseInsensitive)
0046             || shortcut.toString(QKeySequence::PortableText).contains(m_filter, Qt::CaseInsensitive)) {
0047             return true;
0048         }
0049     }
0050     return false;
0051 }
0052 
0053 QString FilteredShortcutsModel::filter() const
0054 {
0055     return m_filter;
0056 }
0057 
0058 void FilteredShortcutsModel::setFilter(const QString &filter)
0059 {
0060     if (filter == m_filter) {
0061         return;
0062     }
0063     m_filter = filter;
0064     invalidateFilter();
0065     Q_EMIT filterChanged();
0066 }