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 }