From 13a721d985aa04de3ded3c3049179512469ec0f7 Mon Sep 17 00:00:00 2001 From: Roberto Raggi <roberto.raggi@nokia.com> Date: Wed, 26 May 2010 14:44:16 +0200 Subject: [PATCH] Sort the items lazily. --- src/plugins/cpptools/cppcodecompletion.cpp | 29 +++++++++++++++---- src/plugins/cpptools/cppcodecompletion.h | 2 ++ src/plugins/texteditor/icompletioncollector.h | 3 +- 3 files changed, 28 insertions(+), 6 deletions(-) diff --git a/src/plugins/cpptools/cppcodecompletion.cpp b/src/plugins/cpptools/cppcodecompletion.cpp index 88ca3b75587..beecf56a8b5 100644 --- a/src/plugins/cpptools/cppcodecompletion.cpp +++ b/src/plugins/cpptools/cppcodecompletion.cpp @@ -69,6 +69,7 @@ #include <QtCore/QDebug> #include <QtCore/QMap> #include <QtCore/QFile> +#include <QtCore/QtConcurrentRun> #include <QtGui/QAction> #include <QtGui/QApplication> #include <QtGui/QDesktopWidget> @@ -652,11 +653,22 @@ bool CppCodeCompletion::triggersCompletion(TextEditor::ITextEditable *editor) return false; } +static QList<TextEditor::CompletionItem> sortCompletionItems(QList<TextEditor::CompletionItem> items) +{ + qStableSort(items.begin(), items.end(), CppCodeCompletion::completionItemLessThan); + return items; +} + int CppCodeCompletion::startCompletion(TextEditor::ITextEditable *editor) { int index = startCompletionHelper(editor); - if (index != -1) - qStableSort(m_completions.begin(), m_completions.end(), completionItemLessThan); + if (index != -1) { + m_sortedCompletions = QtConcurrent::run(sortCompletionItems, m_completions); + + if (m_completions.size() < 1000) + m_completions = m_sortedCompletions; + } + return index; } @@ -1568,8 +1580,14 @@ void CppCodeCompletion::completions(QList<TextEditor::CompletionItem> *completio const QString key = m_editor->textAt(m_startPosition, length); + QList<TextEditor::CompletionItem> currentCompletion; + if (m_sortedCompletions.isFinished()) + currentCompletion = m_sortedCompletions; + else + currentCompletion = m_completions; + if (length == 0) - *completions = m_completions; + *completions = currentCompletion; else if (length > 0) { /* Close on the trailing slash for include completion, to enable the slash to * trigger a new completion list. */ @@ -1578,12 +1596,12 @@ void CppCodeCompletion::completions(QList<TextEditor::CompletionItem> *completio return; if (m_completionOperator != T_LPAREN) { - filter(m_completions, completions, key); + filter(currentCompletion, completions, key); } else if (m_completionOperator == T_LPAREN || m_completionOperator == T_SIGNAL || m_completionOperator == T_SLOT) { - foreach (const TextEditor::CompletionItem &item, m_completions) { + foreach (const TextEditor::CompletionItem &item, currentCompletion) { if (item.text.startsWith(key, Qt::CaseInsensitive)) { completions->append(item); } @@ -1742,6 +1760,7 @@ bool CppCodeCompletion::partiallyComplete(const QList<TextEditor::CompletionItem void CppCodeCompletion::cleanup() { + m_sortedCompletions.cancel(); m_completions.clear(); // Set empty map in order to avoid referencing old versions of the documents diff --git a/src/plugins/cpptools/cppcodecompletion.h b/src/plugins/cpptools/cppcodecompletion.h index f7d1667f761..806717d6917 100644 --- a/src/plugins/cpptools/cppcodecompletion.h +++ b/src/plugins/cpptools/cppcodecompletion.h @@ -40,6 +40,7 @@ #include <QtCore/QObject> #include <QtCore/QPointer> +#include <QtCore/QFuture> QT_BEGIN_NAMESPACE class QTextCursor; @@ -149,6 +150,7 @@ private: QPointer<FunctionArgumentWidget> m_functionArgumentWidget; QList<TextEditor::CompletionItem> m_completions; + QFuture<QList<TextEditor::CompletionItem> > m_sortedCompletions; }; } // namespace Internal diff --git a/src/plugins/texteditor/icompletioncollector.h b/src/plugins/texteditor/icompletioncollector.h index e78ad83b829..cb6d1a1c863 100644 --- a/src/plugins/texteditor/icompletioncollector.h +++ b/src/plugins/texteditor/icompletioncollector.h @@ -131,13 +131,14 @@ public: QList<TextEditor::CompletionItem> *filteredItems, const QString &key); + static bool completionItemLessThan(const CompletionItem &item, const CompletionItem &other); + public slots: void setCompletionSettings(const TextEditor::CompletionSettings &); protected: static bool compareChar(const QChar &item, const QChar &other); static bool lessThan(const QString &item, const QString &other); - static bool completionItemLessThan(const CompletionItem &item, const CompletionItem &other); private: Internal::ICompletionCollectorPrivate *m_d; -- GitLab