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