FileSearch: Get rid of FileSearchResult

Use SearchResultItem instead.
This change should reduce the remaining freeze described in
a9eb732ce6 even more.

Change-Id: I102b82ed5677360ccd9e425dd0bdd941d87116f0
Reviewed-by: Eike Ziller <eike.ziller@qt.io>
This commit is contained in:
Jarek Kobus
2023-05-05 14:05:10 +02:00
parent 1d4228dfda
commit 936086745a
18 changed files with 289 additions and 294 deletions

View File

@@ -51,9 +51,8 @@ public:
QVariant parameters() const override { return {}; }
void readSettings(QSettings * /*settings*/) override {}
void writeSettings(QSettings * /*settings*/) const override {}
QFuture<FileSearchResultList> executeSearch(
const TextEditor::FileFindParameters &parameters,
BaseFileFind *baseFileFind) override
QFuture<SearchResultItems> executeSearch(const TextEditor::FileFindParameters &parameters,
BaseFileFind *baseFileFind) override
{
const auto func = parameters.flags & FindRegularExpression ? Utils::findInFilesRegExp
: Utils::findInFiles;
@@ -208,34 +207,6 @@ void BaseFileFind::setCurrentSearchEngine(int index)
emit currentSearchEngineChanged();
}
static QString displayText(const QString &line)
{
QString result = line;
auto end = result.end();
for (auto it = result.begin(); it != end; ++it) {
if (!it->isSpace() && !it->isPrint())
*it = QChar('?');
}
return result;
}
static void displayResult(QFutureWatcher<FileSearchResultList> *watcher,
SearchResult *search, int index)
{
const FileSearchResultList results = watcher->resultAt(index);
SearchResultItems items;
for (const FileSearchResult &result : results) {
SearchResultItem item;
item.setFilePath(result.fileName);
item.setMainRange(result.lineNumber, result.matchStart, result.matchLength);
item.setLineText(displayText(result.matchingLine));
item.setUseTextEditorFont(true);
item.setUserData(result.regexpCapturedTexts);
items << item;
}
search->addResults(items, SearchResult::AddOrdered);
}
void BaseFileFind::runNewSearch(const QString &txt, FindFlags findFlags,
SearchResultWindow::SearchMode searchMode)
{
@@ -283,7 +254,7 @@ void BaseFileFind::runSearch(SearchResult *search)
{
const FileFindParameters parameters = search->userData().value<FileFindParameters>();
SearchResultWindow::instance()->popup(IOutputPane::Flags(IOutputPane::ModeSwitch|IOutputPane::WithFocus));
auto watcher = new QFutureWatcher<FileSearchResultList>();
auto watcher = new QFutureWatcher<SearchResultItems>;
watcher->setPendingResultsLimit(1);
// search is deleted if it is removed from search panel
connect(search, &QObject::destroyed, watcher, &QFutureWatcherBase::cancel);
@@ -293,14 +264,14 @@ void BaseFileFind::runSearch(SearchResult *search)
watcher->setPaused(paused);
});
connect(watcher, &QFutureWatcherBase::resultReadyAt, search, [watcher, search](int index) {
displayResult(watcher, search, index);
search->addResults(watcher->resultAt(index), SearchResult::AddOrdered);
});
// auto-delete:
connect(watcher, &QFutureWatcherBase::finished, watcher, &QObject::deleteLater);
connect(watcher, &QFutureWatcherBase::finished, search, [watcher, search]() {
search->finishSearch(watcher->isCanceled());
});
QFuture<FileSearchResultList> future = executeSearch(parameters);
QFuture<SearchResultItems> future = executeSearch(parameters);
watcher->setFuture(future);
d->m_futureSynchronizer.addFuture(future);
FutureProgress *progress = ProgressManager::addTask(future,
@@ -541,7 +512,7 @@ QVariant BaseFileFind::getAdditionalParameters(SearchResult *search)
return search->userData().value<FileFindParameters>().additionalParameters;
}
QFuture<FileSearchResultList> BaseFileFind::executeSearch(const FileFindParameters &parameters)
QFuture<SearchResultItems> BaseFileFind::executeSearch(const FileFindParameters &parameters)
{
return d->m_searchEngines[parameters.searchEngineIndex]->executeSearch(parameters, this);
}

View File

@@ -56,7 +56,7 @@ public:
virtual QVariant parameters() const = 0;
virtual void readSettings(QSettings *settings) = 0;
virtual void writeSettings(QSettings *settings) const = 0;
virtual QFuture<Utils::FileSearchResultList> executeSearch(
virtual QFuture<Utils::SearchResultItems> executeSearch(
const FileFindParameters &parameters, BaseFileFind *baseFileFind) = 0;
virtual Core::IEditor *openEditor(const Utils::SearchResultItem &item,
const FileFindParameters &parameters) = 0;
@@ -97,7 +97,7 @@ protected:
virtual QString label() const = 0; // see Core::SearchResultWindow::startNewSearch
virtual QString toolTip() const = 0; // see Core::SearchResultWindow::startNewSearch,
// add %1 placeholder where the find flags should be put
QFuture<Utils::FileSearchResultList> executeSearch(const FileFindParameters &parameters);
QFuture<Utils::SearchResultItems> executeSearch(const FileFindParameters &parameters);
void writeCommonSettings(QSettings *settings);
void readCommonSettings(QSettings *settings, const QString &defaultFilter, const QString &defaultExclusionFilter);

View File

@@ -61,6 +61,7 @@
#include <utils/minimizableinfobars.h>
#include <utils/multitextcursor.h>
#include <utils/qtcassert.h>
#include <utils/searchresultitem.h>
#include <utils/styledbar.h>
#include <utils/stylehelper.h>
#include <utils/textutils.h>
@@ -790,7 +791,7 @@ public:
QScopedPointer<AutoCompleter> m_autoCompleter;
CommentDefinition m_commentDefinition;
QFutureWatcher<FileSearchResultList> *m_searchWatcher = nullptr;
QFutureWatcher<SearchResultItems> *m_searchWatcher = nullptr;
QVector<SearchResult> m_searchResults;
QTimer m_scrollBarUpdateTimer;
HighlightScrollBarController *m_highlightScrollBarController = nullptr;
@@ -846,10 +847,27 @@ public:
private:
TextEditorWidget * const m_editor;
static QFutureWatcher<FileSearchResultList> *m_selectWatcher;
static QFutureWatcher<SearchResultItems> *m_selectWatcher;
};
QFutureWatcher<FileSearchResultList> *TextEditorWidgetFind::m_selectWatcher = nullptr;
static QTextCursor selectRange(QTextDocument *textDocument, const Search::TextRange &range,
TextEditorWidgetPrivate::SearchResult *searchResult = nullptr)
{
const int startLine = qMax(range.begin.line - 1, 0);
const int startColumn = qMax(range.begin.column, 0);
const int endLine = qMax(range.end.line - 1, 0);
const int endColumn = qMax(range.end.column, 0);
const int startPosition = textDocument->findBlockByNumber(startLine).position() + startColumn;
const int endPosition = textDocument->findBlockByNumber(endLine).position() + endColumn;
QTextCursor textCursor(textDocument);
textCursor.setPosition(startPosition);
textCursor.setPosition(endPosition, QTextCursor::KeepAnchor);
if (searchResult)
*searchResult = {startPosition + 1, endPosition + 1};
return textCursor;
}
QFutureWatcher<SearchResultItems> *TextEditorWidgetFind::m_selectWatcher = nullptr;
void TextEditorWidgetFind::selectAll(const QString &txt, FindFlags findFlags)
{
@@ -858,26 +876,24 @@ void TextEditorWidgetFind::selectAll(const QString &txt, FindFlags findFlags)
cancelCurrentSelectAll();
m_selectWatcher = new QFutureWatcher<FileSearchResultList>();
connect(m_selectWatcher, &QFutureWatcher<Utils::FileSearchResultList>::finished,
this, [this] {
const QFuture<FileSearchResultList> future = m_selectWatcher->future();
m_selectWatcher->deleteLater();
m_selectWatcher = nullptr;
if (future.resultCount() <= 0)
return;
const FileSearchResultList &results = future.result();
const QTextCursor c(m_editor->document());
auto cursorForResult = [c](const FileSearchResult &r) {
return Utils::Text::selectAt(c, r.lineNumber, r.matchStart + 1, r.matchLength);
};
QList<QTextCursor> cursors = Utils::transform(results, cursorForResult);
cursors = Utils::filtered(cursors, [this](const QTextCursor &c) {
return m_editor->inFindScope(c);
});
m_editor->setMultiTextCursor(MultiTextCursor(cursors));
m_editor->setFocus();
});
m_selectWatcher = new QFutureWatcher<SearchResultItems>();
connect(m_selectWatcher, &QFutureWatcher<SearchResultItems>::finished, this, [this] {
const QFuture<SearchResultItems> future = m_selectWatcher->future();
m_selectWatcher->deleteLater();
m_selectWatcher = nullptr;
if (future.resultCount() <= 0)
return;
const SearchResultItems &results = future.result();
const auto cursorForResult = [this](const SearchResultItem &item) {
return selectRange(m_editor->document(), item.mainRange());
};
QList<QTextCursor> cursors = Utils::transform(results, cursorForResult);
cursors = Utils::filtered(cursors, [this](const QTextCursor &c) {
return m_editor->inFindScope(c);
});
m_editor->setMultiTextCursor(MultiTextCursor(cursors));
m_editor->setFocus();
});
const FilePath &fileName = m_editor->textDocument()->filePath();
QMap<FilePath, QString> fileToContentsMap;
@@ -6671,16 +6687,11 @@ void TextEditorWidgetPrivate::searchResultsReady(int beginIndex, int endIndex)
{
QVector<SearchResult> results;
for (int index = beginIndex; index < endIndex; ++index) {
const FileSearchResultList resultList = m_searchWatcher->resultAt(index);
for (FileSearchResult result : resultList) {
const QTextBlock &block = q->document()->findBlockByNumber(result.lineNumber - 1);
const int matchStart = block.position() + result.matchStart;
QTextCursor cursor(block);
cursor.setPosition(matchStart);
cursor.setPosition(matchStart + result.matchLength, QTextCursor::KeepAnchor);
if (!q->inFindScope(cursor))
continue;
results << SearchResult{matchStart, result.matchLength};
const SearchResultItems resultList = m_searchWatcher->resultAt(index);
for (const SearchResultItem &result : resultList) {
SearchResult searchResult;
if (q->inFindScope(selectRange(q->document(), result.mainRange(), &searchResult)))
results << searchResult;
}
}
m_searchResults << results;
@@ -6726,10 +6737,10 @@ void TextEditorWidgetPrivate::highlightSearchResultsInScrollBar()
adjustScrollBarRanges();
m_searchWatcher = new QFutureWatcher<FileSearchResultList>();
connect(m_searchWatcher, &QFutureWatcher<FileSearchResultList>::resultsReadyAt,
m_searchWatcher = new QFutureWatcher<SearchResultItems>;
connect(m_searchWatcher, &QFutureWatcher<SearchResultItems>::resultsReadyAt,
this, &TextEditorWidgetPrivate::searchResultsReady);
connect(m_searchWatcher, &QFutureWatcher<FileSearchResultList>::finished,
connect(m_searchWatcher, &QFutureWatcher<SearchResultItems>::finished,
this, &TextEditorWidgetPrivate::searchFinished);
m_searchWatcher->setPendingResultsLimit(10);
@@ -6775,7 +6786,7 @@ void TextEditorWidgetPrivate::addSearchResultsToScrollBar(const QVector<SearchRe
{
if (!m_highlightScrollBarController)
return;
for (SearchResult result : results) {
for (const SearchResult &result : results) {
const QTextBlock &block = q->document()->findBlock(result.start);
if (block.isValid() && block.isVisible()) {
const int firstLine = block.layout()->lineForTextPosition(result.start - block.position()).lineNumber();