forked from qt-creator/qt-creator
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:
@@ -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 ¶meters,
|
||||
BaseFileFind *baseFileFind) override
|
||||
QFuture<SearchResultItems> executeSearch(const TextEditor::FileFindParameters ¶meters,
|
||||
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 ¶meters)
|
||||
QFuture<SearchResultItems> BaseFileFind::executeSearch(const FileFindParameters ¶meters)
|
||||
{
|
||||
return d->m_searchEngines[parameters.searchEngineIndex]->executeSearch(parameters, this);
|
||||
}
|
||||
|
||||
@@ -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 ¶meters, BaseFileFind *baseFileFind) = 0;
|
||||
virtual Core::IEditor *openEditor(const Utils::SearchResultItem &item,
|
||||
const FileFindParameters ¶meters) = 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 ¶meters);
|
||||
QFuture<Utils::SearchResultItems> executeSearch(const FileFindParameters ¶meters);
|
||||
|
||||
void writeCommonSettings(QSettings *settings);
|
||||
void readCommonSettings(QSettings *settings, const QString &defaultFilter, const QString &defaultExclusionFilter);
|
||||
|
||||
@@ -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();
|
||||
|
||||
Reference in New Issue
Block a user