diff options
author | Eike Ziller <eike.ziller@qt.io> | 2016-11-29 16:17:34 +0100 |
---|---|---|
committer | Eike Ziller <eike.ziller@qt.io> | 2016-11-30 09:40:49 +0000 |
commit | 6365eda349379e38455d33098681b229dcde2a3e (patch) | |
tree | f540b19498c9dfa95b0df64467c2f46a8c9f7e97 /src/plugins/texteditor/basefilefind.cpp | |
parent | 6d08973ced98ecbcc2d1ce5da256d1bb2c25a8f4 (diff) |
BaseFileFind: Simplify code
Get rid of the need to manage a map of QFutureWatcher -> SearchResult
Change-Id: Ieafbd852c09174ec09b94f167c3b4e211bd841c6
Reviewed-by: David Schulz <david.schulz@qt.io>
Diffstat (limited to 'src/plugins/texteditor/basefilefind.cpp')
-rw-r--r-- | src/plugins/texteditor/basefilefind.cpp | 97 |
1 files changed, 35 insertions, 62 deletions
diff --git a/src/plugins/texteditor/basefilefind.cpp b/src/plugins/texteditor/basefilefind.cpp index abd90776d0..d6a24dd653 100644 --- a/src/plugins/texteditor/basefilefind.cpp +++ b/src/plugins/texteditor/basefilefind.cpp @@ -111,7 +111,6 @@ class BaseFileFindPrivate { public: ~BaseFileFindPrivate() { delete m_internalSearchEngine; } - QMap<QFutureWatcher<FileSearchResultList> *, QPointer<SearchResult> > m_watchers; QPointer<IFindSupport> m_currentFindSupport; QLabel *m_resultLabel = 0; @@ -189,25 +188,6 @@ bool BaseFileFind::isEnabled() const return true; } -void BaseFileFind::cancel() -{ - SearchResult *search = qobject_cast<SearchResult *>(sender()); - QTC_ASSERT(search, return); - QFutureWatcher<FileSearchResultList> *watcher = d->m_watchers.key(search); - QTC_ASSERT(watcher, return); - watcher->cancel(); -} - -void BaseFileFind::setPaused(bool paused) -{ - SearchResult *search = qobject_cast<SearchResult *>(sender()); - QTC_ASSERT(search, return); - QFutureWatcher<FileSearchResultList> *watcher = d->m_watchers.key(search); - QTC_ASSERT(watcher, return); - if (!paused || watcher->isRunning()) // guard against pausing when the search is finished - watcher->setPaused(paused); -} - QStringList BaseFileFind::fileNameFilters() const { QStringList filters; @@ -242,6 +222,26 @@ void BaseFileFind::setCurrentSearchEngine(int index) emit currentSearchEngineChanged(); } +static void displayResult(QFutureWatcher<FileSearchResultList> *watcher, + SearchResult *search, int index) +{ + FileSearchResultList results = watcher->resultAt(index); + QList<SearchResultItem> items; + foreach (const FileSearchResult &result, results) { + SearchResultItem item; + item.path = QStringList() << QDir::toNativeSeparators(result.fileName); + item.mainRange.begin.line = result.lineNumber; + item.mainRange.begin.column = result.matchStart; + item.mainRange.end = item.mainRange.begin; + item.mainRange.end.column += result.matchLength; + item.text = result.matchingLine; + item.useTextEditorFont = true; + item.userData = result.regexpCapturedTexts; + items << item; + } + search->addResults(items, SearchResult::AddOrdered); +} + void BaseFileFind::runNewSearch(const QString &txt, FindFlags findFlags, SearchResultWindow::SearchMode searchMode) { @@ -269,8 +269,6 @@ void BaseFileFind::runNewSearch(const QString &txt, FindFlags findFlags, if (searchMode == SearchResultWindow::SearchAndReplace) connect(search, &SearchResult::replaceButtonClicked, this, &BaseFileFind::doReplace); connect(search, &SearchResult::visibilityChanged, this, &BaseFileFind::hideHighlightAll); - connect(search, &SearchResult::cancelled, this, &BaseFileFind::cancel); - connect(search, &SearchResult::paused, this, &BaseFileFind::setPaused); connect(search, &SearchResult::searchAgainRequested, this, &BaseFileFind::searchAgain); connect(this, &BaseFileFind::enabledChanged, search, &SearchResult::requestEnabledCheck); connect(search, &SearchResult::requestEnabledCheck, this, &BaseFileFind::recheckEnabled); @@ -287,10 +285,22 @@ void BaseFileFind::runSearch(SearchResult *search) connect(search, &SearchResult::countChanged, statusLabel, &CountingLabel::updateCount); SearchResultWindow::instance()->popup(IOutputPane::Flags(IOutputPane::ModeSwitch|IOutputPane::WithFocus)); QFutureWatcher<FileSearchResultList> *watcher = new QFutureWatcher<FileSearchResultList>(); - d->m_watchers.insert(watcher, search); watcher->setPendingResultsLimit(1); - connect(watcher, &QFutureWatcherBase::resultReadyAt, this, &BaseFileFind::displayResult); - connect(watcher, &QFutureWatcherBase::finished, this, &BaseFileFind::searchFinished); + // search is deleted if it is removed from search panel + connect(search, &QObject::destroyed, watcher, &QFutureWatcherBase::cancel); + connect(search, &SearchResult::cancelled, watcher, &QFutureWatcherBase::cancel); + connect(search, &SearchResult::paused, watcher, [watcher](bool paused) { + if (!paused || watcher->isRunning()) // guard against pausing when the search is finished + watcher->setPaused(paused); + }); + connect(watcher, &QFutureWatcherBase::resultReadyAt, search, [watcher, search](int index) { + displayResult(watcher, search, index); + }); + // auto-delete: + connect(watcher, &QFutureWatcherBase::finished, watcher, &QObject::deleteLater); + connect(watcher, &QFutureWatcherBase::finished, search, [watcher, search]() { + search->finishSearch(watcher->isCanceled()); + }); watcher->setFuture(executeSearch(parameters)); FutureProgress *progress = ProgressManager::addTask(watcher->future(), tr("Searching"), Constants::TASK_SEARCH); @@ -330,43 +340,6 @@ void BaseFileFind::doReplace(const QString &text, } } -void BaseFileFind::displayResult(int index) { - QFutureWatcher<FileSearchResultList> *watcher = - static_cast<QFutureWatcher<FileSearchResultList> *>(sender()); - SearchResult *search = d->m_watchers.value(watcher); - if (!search) { - // search was removed from search history while the search is running - watcher->cancel(); - return; - } - FileSearchResultList results = watcher->resultAt(index); - QList<SearchResultItem> items; - foreach (const FileSearchResult &result, results) { - SearchResultItem item; - item.path = QStringList() << QDir::toNativeSeparators(result.fileName); - item.mainRange.begin.line = result.lineNumber; - item.mainRange.begin.column = result.matchStart; - item.mainRange.end = item.mainRange.begin; - item.mainRange.end.column += result.matchLength; - item.text = result.matchingLine; - item.useTextEditorFont = true; - item.userData = result.regexpCapturedTexts; - items << item; - } - search->addResults(items, SearchResult::AddOrdered); -} - -void BaseFileFind::searchFinished() -{ - QFutureWatcher<FileSearchResultList> *watcher = - static_cast<QFutureWatcher<FileSearchResultList> *>(sender()); - SearchResult *search = d->m_watchers.value(watcher); - if (search) - search->finishSearch(watcher->isCanceled()); - d->m_watchers.remove(watcher); - watcher->deleteLater(); -} - QWidget *BaseFileFind::createPatternWidget() { QString filterToolTip = tr("List of comma separated wildcard filters"); |