diff --git a/src/plugins/cpptools/cppcodecompletion.cpp b/src/plugins/cpptools/cppcodecompletion.cpp index ba535a1218f376c185e2311ece2fc96f89e74e02..02ff770986d3a90f238e80db4e93e406d50dcb93 100644 --- a/src/plugins/cpptools/cppcodecompletion.cpp +++ b/src/plugins/cpptools/cppcodecompletion.cpp @@ -696,6 +696,10 @@ int CppCodeCompletion::startCompletion(TextEditor::ITextEditable *editor) // always remove duplicates m_completions = removeDuplicates(m_completions); } + + for (int i = 0; i < m_completions.size(); ++i) + m_completions[i].originalIndex = i; + return index; } diff --git a/src/plugins/texteditor/completionsupport.cpp b/src/plugins/texteditor/completionsupport.cpp index 44dfad52199a4f7d9031e02fd00748d80a0e4d2a..8feb4bbd60eff19ca85dfeecf80e2709b7bbea8e 100644 --- a/src/plugins/texteditor/completionsupport.cpp +++ b/src/plugins/texteditor/completionsupport.cpp @@ -131,6 +131,8 @@ void CompletionSupport::autoComplete_helper(ITextEditable *editor, bool forced, m_editor = editor; QList<CompletionItem> completionItems; + int currentIndex = 0; + if (!m_completionList) { if (!forced) { const CompletionSettings &completionSettings = m_completionCollector->completionSettings(); @@ -170,10 +172,24 @@ void CompletionSupport::autoComplete_helper(ITextEditable *editor, bool forced, m_completionList->closeList(); return; } + + if (m_completionList->explicitlySelected()) { + const int originalIndex = m_completionList->currentCompletionItem().originalIndex; + + for (int index = 0; index < completionItems.size(); ++index) { + if (completionItems.at(index).originalIndex == originalIndex) { + currentIndex = index; + break; + } + } + } } m_completionList->setCompletionItems(completionItems); + if (currentIndex) + m_completionList->setCurrentIndex(currentIndex); + // Partially complete when completion was forced if (forced && m_completionCollector->partiallyComplete(completionItems)) { m_checkCompletionTrigger = true; diff --git a/src/plugins/texteditor/completionwidget.cpp b/src/plugins/texteditor/completionwidget.cpp index 5b005c17b07f16e141b6e2047c92e0f001829ca6..5a63c24c79bf2333e66746508fd56ce46a6333bb 100644 --- a/src/plugins/texteditor/completionwidget.cpp +++ b/src/plugins/texteditor/completionwidget.cpp @@ -204,6 +204,21 @@ QChar CompletionWidget::typedChar() const return m_completionListView->m_typedChar; } +CompletionItem CompletionWidget::currentCompletionItem() const +{ + return m_completionListView->currentCompletionItem(); +} + +bool CompletionWidget::explicitlySelected() const +{ + return m_completionListView->explicitlySelected(); +} + +void CompletionWidget::setCurrentIndex(int index) +{ + m_completionListView->setCurrentIndex(m_completionListView->model()->index(index, 0)); +} + void CompletionWidget::updatePositionAndSize(int startPos) { // Determine size by calculating the space of the visible items @@ -257,7 +272,8 @@ CompletionListView::CompletionListView(CompletionSupport *support, ITextEditable m_editorWidget(editor->widget()), m_completionWidget(completionWidget), m_model(new AutoCompletionModel(this)), - m_support(support) + m_support(support), + m_explicitlySelected(false) { QTC_ASSERT(m_editorWidget, return); @@ -284,6 +300,20 @@ CompletionListView::~CompletionListView() { } +CompletionItem CompletionListView::currentCompletionItem() const +{ + int row = currentIndex().row(); + if (row >= 0 && row < m_model->rowCount()) + return m_model->itemAt(currentIndex()); + + return CompletionItem(); +} + +bool CompletionListView::explicitlySelected() const +{ + return m_explicitlySelected; +} + void CompletionListView::maybeShowInfoTip() { QModelIndex current = currentIndex(); @@ -389,6 +419,7 @@ bool CompletionListView::event(QEvent *e) return true; case Qt::Key_Up: + m_explicitlySelected = true; if (!ke->isAutoRepeat() && currentIndex().row() == 0) { setCurrentIndex(model()->index(model()->rowCount()-1, 0)); @@ -398,6 +429,7 @@ bool CompletionListView::event(QEvent *e) break; case Qt::Key_Down: + m_explicitlySelected = true; if (!ke->isAutoRepeat() && currentIndex().row() == model()->rowCount()-1) { setCurrentIndex(model()->index(0, 0)); diff --git a/src/plugins/texteditor/completionwidget.h b/src/plugins/texteditor/completionwidget.h index 813fd89f3071842b5246ebcd0bc76b507323dd75..abaf50f7f9467564e63d0aac5ed8b3d4ce074ece 100644 --- a/src/plugins/texteditor/completionwidget.h +++ b/src/plugins/texteditor/completionwidget.h @@ -62,6 +62,10 @@ public: void showCompletions(int startPos); QChar typedChar() const; + CompletionItem currentCompletionItem() const; + + void setCurrentIndex(int index); + bool explicitlySelected() const; signals: void itemSelected(const TextEditor::CompletionItem &item); @@ -86,6 +90,9 @@ class CompletionListView : public QListView public: ~CompletionListView(); + CompletionItem currentCompletionItem() const; + bool explicitlySelected() const; + signals: void itemSelected(const TextEditor::CompletionItem &item); void completionListClosed(); @@ -118,6 +125,7 @@ private: QPointer<CompletionInfoFrame> m_infoFrame; QTimer m_infoTimer; QChar m_typedChar; + bool m_explicitlySelected; }; } // namespace Internal diff --git a/src/plugins/texteditor/icompletioncollector.h b/src/plugins/texteditor/icompletioncollector.h index d62f01557b589265cf62c5e4fa0c75d87a2f26fe..7db7e9a94590370ecd2d957c41091c34f958baf7 100644 --- a/src/plugins/texteditor/icompletioncollector.h +++ b/src/plugins/texteditor/icompletioncollector.h @@ -52,6 +52,7 @@ struct CompletionItem : relevance(0), duplicateCount(0), order(0), + originalIndex(0), collector(collector) { } @@ -65,6 +66,7 @@ struct CompletionItem int relevance; int duplicateCount; int order; + int originalIndex; ICompletionCollector *collector; };