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"