diff options
author | Roberto Raggi <roberto.raggi@nokia.com> | 2010-09-03 13:35:28 +0200 |
---|---|---|
committer | Roberto Raggi <roberto.raggi@nokia.com> | 2010-09-03 13:35:48 +0200 |
commit | 8d169786f4c8ee63b654ac3f931b395b91726731 (patch) | |
tree | 99b6ace8362b36b71187964c2b58e72143305dc0 /src/plugins | |
parent | 68f6d162f0018593b9c790390171007a936e6fda (diff) | |
download | qt-creator-8d169786f4c8ee63b654ac3f931b395b91726731.tar.gz |
Update the locator in background.
Reviewed-by: Friedemann Kleint
Diffstat (limited to 'src/plugins')
-rw-r--r-- | src/plugins/locator/locatorwidget.cpp | 45 | ||||
-rw-r--r-- | src/plugins/locator/locatorwidget.h | 4 |
2 files changed, 44 insertions, 5 deletions
diff --git a/src/plugins/locator/locatorwidget.cpp b/src/plugins/locator/locatorwidget.cpp index 5887390987..cc7dd54f3c 100644 --- a/src/plugins/locator/locatorwidget.cpp +++ b/src/plugins/locator/locatorwidget.cpp @@ -48,7 +48,9 @@ QT_END_NAMESPACE #include <coreplugin/fileiconprovider.h> #include <utils/filterlineedit.h> #include <utils/qtcassert.h> +#include <qtconcurrent/runextensions.h> +#include <QtCore/QtConcurrentRun> #include <QtCore/QFileInfo> #include <QtCore/QFile> #include <QtCore/QTimer> @@ -315,6 +317,14 @@ LocatorWidget::LocatorWidget(LocatorPlugin *qop) : this, SLOT(showPopup())); connect(m_completionList, SIGNAL(activated(QModelIndex)), this, SLOT(acceptCurrentEntry())); + + m_entriesWatcher = new QFutureWatcher<FilterEntry>(this); + connect(m_entriesWatcher, SIGNAL(finished()), SLOT(updateEntries())); + + m_showPopupTimer = new QTimer(this); + m_showPopupTimer->setInterval(100); + m_showPopupTimer->setSingleShot(true); + connect(m_showPopupTimer, SIGNAL(timeout()), SLOT(showPopupNow())); } void LocatorWidget::updateFilterList() @@ -384,6 +394,12 @@ void LocatorWidget::showCompletionList() void LocatorWidget::showPopup() { + m_showPopupTimer->start(); +} + +void LocatorWidget::showPopupNow() +{ + m_showPopupTimer->stop(); updateCompletionList(m_fileLineEdit->text()); showCompletionList(); } @@ -412,22 +428,41 @@ QList<ILocatorFilter*> LocatorWidget::filtersFor(const QString &text, QString &s return activeFilters; } -void LocatorWidget::updateCompletionList(const QString &text) +static void filter_helper(QFutureInterface<FilterEntry> &entries, QList<ILocatorFilter *> filters, QString searchText) { - QString searchText; - const QList<ILocatorFilter*> filters = filtersFor(text, searchText); QSet<FilterEntry> alreadyAdded; const bool checkDuplicates = (filters.size() > 1); - QList<FilterEntry> entries; foreach (ILocatorFilter *filter, filters) { + if (entries.isCanceled()) + break; + foreach (const FilterEntry &entry, filter->matchesFor(searchText)) { if (checkDuplicates && alreadyAdded.contains(entry)) continue; - entries.append(entry); + //entries.append(entry); + entries.reportResult(entry); if (checkDuplicates) alreadyAdded.insert(entry); } } +} + +void LocatorWidget::updateCompletionList(const QString &text) +{ + QString searchText; + const QList<ILocatorFilter*> filters = filtersFor(text, searchText); + + QFuture<FilterEntry> future = QtConcurrent::run(filter_helper, filters, searchText); + m_entriesWatcher->future().cancel(); + m_entriesWatcher->setFuture(future); +} + +void LocatorWidget::updateEntries() +{ + if (m_entriesWatcher->future().isCanceled()) + return; + + const QList<FilterEntry> entries = m_entriesWatcher->future().results(); m_locatorModel->setEntries(entries); if (m_locatorModel->rowCount() > 0) { m_completionList->setCurrentIndex(m_locatorModel->index(0, 0)); diff --git a/src/plugins/locator/locatorwidget.h b/src/plugins/locator/locatorwidget.h index 4f112cff76..a3a0cd33b6 100644 --- a/src/plugins/locator/locatorwidget.h +++ b/src/plugins/locator/locatorwidget.h @@ -66,9 +66,11 @@ public: private slots: void showPopup(); + void showPopupNow(); void acceptCurrentEntry(); void filterSelected(); void showConfigureDialog(); + void updateEntries(); private: bool eventFilter(QObject *obj, QEvent *event); @@ -87,6 +89,8 @@ private: QAction *m_refreshAction; QAction *m_configureAction; Utils::FilterLineEdit *m_fileLineEdit; + QTimer *m_showPopupTimer; + QFutureWatcher<FilterEntry> *m_entriesWatcher; }; } // namespace Internal |