From eb5d6904e11445a3827679463df46f8ab8ce95de Mon Sep 17 00:00:00 2001 From: Andre Hartmann Date: Mon, 24 Dec 2018 19:53:59 +0100 Subject: BookmarkFilter: Allow more filtering MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Allow filtering for: * fileName:lineNumber pattern * line text at bookmark Fixes: QTCREATORBUG-21771 Change-Id: I55ff2a5cb82460d5aa0dbcdbb60f87cf05f985e0 Reviewed-by: David Schulz Reviewed-by: André Hartmann --- src/plugins/bookmarks/bookmarkfilter.cpp | 42 ++++++++++++++++++++++++++++---- 1 file changed, 37 insertions(+), 5 deletions(-) (limited to 'src/plugins/bookmarks') diff --git a/src/plugins/bookmarks/bookmarkfilter.cpp b/src/plugins/bookmarks/bookmarkfilter.cpp index c211ad0beb5..a148e699550 100644 --- a/src/plugins/bookmarks/bookmarkfilter.cpp +++ b/src/plugins/bookmarks/bookmarkfilter.cpp @@ -50,11 +50,30 @@ QList BookmarkFilter::matchesFor(QFutureInterfacerowCount() == 0) return QList(); - const QModelIndexList matches = filteredUnique( - m_manager->match(m_manager->index(0, 0), BookmarkManager::Filename, entry, -1, - Qt::MatchContains | Qt::MatchWrap) - + m_manager->match(m_manager->index(0, 0), BookmarkManager::Note, entry, -1, - Qt::MatchContains | Qt::MatchWrap)); + auto match = [this](const QString &name, BookmarkManager::Roles role) { + return m_manager->match(m_manager->index(0, 0), role, name, -1, + Qt::MatchContains | Qt::MatchWrap); + }; + + int colonIndex = entry.lastIndexOf(':'); + QModelIndexList fileNameLineNumberMatches; + if (colonIndex >= 0) { + // Filter by "fileName:lineNumber" pattern + const QString fileName = entry.left(colonIndex); + const QString lineNumber = entry.mid(colonIndex + 1); + fileNameLineNumberMatches = match(fileName, BookmarkManager::Filename); + fileNameLineNumberMatches = + Utils::filtered(fileNameLineNumberMatches, [lineNumber](const QModelIndex &index) { + return index.data(BookmarkManager::LineNumber).toString().contains(lineNumber); + }); + } + + const QModelIndexList matches = filteredUnique(fileNameLineNumberMatches + + match(entry, BookmarkManager::Filename) + + match(entry, BookmarkManager::LineNumber) + + match(entry, BookmarkManager::Note) + + match(entry, BookmarkManager::LineText)); + QList entries; for (const QModelIndex &idx : matches) { const Bookmark *bookmark = m_manager->bookmarkForIndex(idx); @@ -76,6 +95,19 @@ QList BookmarkFilter::matchesFor(QFutureInterface= 0) { filterEntry.highlightInfo = {highlightIndex, entry.length(), LocatorFilterEntry::HighlightInfo::ExtraInfo}; + } else if (colonIndex >= 0) { + const QString fileName = entry.left(colonIndex); + const QString lineNumber = entry.mid(colonIndex + 1); + highlightIndex = filterEntry.displayName.indexOf(fileName, 0, Qt::CaseInsensitive); + if (highlightIndex >= 0) { + filterEntry.highlightInfo = {highlightIndex, fileName.length()}; + highlightIndex = filterEntry.displayName.indexOf( + lineNumber, highlightIndex, Qt::CaseInsensitive); + if (highlightIndex >= 0) { + filterEntry.highlightInfo.starts += highlightIndex; + filterEntry.highlightInfo.lengths += lineNumber.length(); + } + } } } -- cgit v1.2.3