File indexing completed on 2024-05-19 05:44:26
0001 /* 0002 SPDX-FileCopyrightText: 2015-2017 Milian Wolff <mail@milianw.de> 0003 0004 SPDX-License-Identifier: LGPL-2.1-or-later 0005 */ 0006 0007 #include "treeproxy.h" 0008 #include "locationdata.h" 0009 0010 #include <resultdata.h> 0011 #include <QDebug> 0012 0013 TreeProxy::TreeProxy(int symbolRole, int resultDataRole, QObject* parent) 0014 : QSortFilterProxyModel(parent) 0015 , m_symbolRole(symbolRole) 0016 , m_resultDataRole(resultDataRole) 0017 { 0018 setRecursiveFilteringEnabled(true); 0019 setSortLocaleAware(false); 0020 } 0021 0022 TreeProxy::~TreeProxy() = default; 0023 0024 void TreeProxy::setFunctionFilter(const QString& functionFilter) 0025 { 0026 m_functionFilter = functionFilter; 0027 invalidate(); 0028 } 0029 0030 void TreeProxy::setModuleFilter(const QString& moduleFilter) 0031 { 0032 m_moduleFilter = moduleFilter; 0033 invalidate(); 0034 } 0035 0036 bool TreeProxy::filterAcceptsRow(int sourceRow, const QModelIndex& sourceParent) const 0037 { 0038 auto source = sourceModel(); 0039 if (!source) { 0040 return false; 0041 } 0042 0043 if (m_functionFilter.isEmpty() && m_moduleFilter.isEmpty()) { 0044 return true; 0045 } 0046 0047 const auto index = source->index(sourceRow, 0, sourceParent); 0048 const auto* resultData = index.data(m_resultDataRole).value<const ResultData*>(); 0049 Q_ASSERT(resultData); 0050 0051 auto filterOut = [&](StringIndex stringId, const QString& filter) { 0052 return !filter.isEmpty() && !resultData->string(stringId).contains(filter, Qt::CaseInsensitive); 0053 }; 0054 0055 const auto symbol = index.data(m_symbolRole).value<Symbol>(); 0056 if (filterOut(symbol.functionId, m_functionFilter) || filterOut(symbol.moduleId, m_moduleFilter)) { 0057 return false; 0058 } 0059 return true; 0060 } 0061 0062 bool TreeProxy::lessThan(const QModelIndex& source_left, const QModelIndex& source_right) const 0063 { 0064 if (sortColumn() != 0) { 0065 return QSortFilterProxyModel::lessThan(source_left, source_right); 0066 } 0067 0068 const auto* resultData = source_left.data(m_resultDataRole).value<const ResultData*>(); 0069 0070 const auto symbol_left = source_left.data(m_symbolRole).value<Symbol>(); 0071 const auto symbol_right = source_right.data(m_symbolRole).value<Symbol>(); 0072 0073 if (symbol_left.functionId != symbol_right.functionId) { 0074 return resultData->string(symbol_left.functionId) < resultData->string(symbol_right.functionId); 0075 } 0076 0077 const auto path_left = resultData->string(symbol_left.moduleId); 0078 const auto path_right = resultData->string(symbol_right.moduleId); 0079 0080 auto toShortPath = [](const QString& path) { 0081 int idx = path.lastIndexOf(QLatin1Char('/')); 0082 return QStringView(path).mid(idx + 1); 0083 }; 0084 0085 return toShortPath(path_left) < toShortPath(path_right); 0086 } 0087 0088 #include "moc_treeproxy.cpp"