summaryrefslogtreecommitdiff
path: root/src/plugins
diff options
context:
space:
mode:
authorRoberto Raggi <roberto.raggi@nokia.com>2010-09-03 13:35:28 +0200
committerRoberto Raggi <roberto.raggi@nokia.com>2010-09-03 13:35:48 +0200
commit8d169786f4c8ee63b654ac3f931b395b91726731 (patch)
tree99b6ace8362b36b71187964c2b58e72143305dc0 /src/plugins
parent68f6d162f0018593b9c790390171007a936e6fda (diff)
downloadqt-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.cpp45
-rw-r--r--src/plugins/locator/locatorwidget.h4
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