From baf10259a384777c1310707244d2d2739bb2ed56 Mon Sep 17 00:00:00 2001 From: Roberto Raggi <roberto.raggi@nokia.com> Date: Tue, 3 Aug 2010 16:13:00 +0200 Subject: [PATCH] Keep the current explicitly selected item. MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Done with: Thorbjørn Lindeijer --- src/plugins/cpptools/cppcodecompletion.cpp | 4 +++ src/plugins/texteditor/completionsupport.cpp | 16 +++++++++ src/plugins/texteditor/completionwidget.cpp | 34 ++++++++++++++++++- src/plugins/texteditor/completionwidget.h | 8 +++++ src/plugins/texteditor/icompletioncollector.h | 2 ++ 5 files changed, 63 insertions(+), 1 deletion(-) diff --git a/src/plugins/cpptools/cppcodecompletion.cpp b/src/plugins/cpptools/cppcodecompletion.cpp index ba535a1218f..02ff770986d 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 44dfad52199..8feb4bbd60e 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 5b005c17b07..5a63c24c79b 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 813fd89f307..abaf50f7f94 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 d62f01557b5..7db7e9a9459 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; }; -- GitLab