From 27065239a0f953c19763a07eb17fac5299c91b08 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Martin=20Aum=C3=BCller?= <aumuell@reserv.at>
Date: Tue, 5 Jan 2010 18:23:36 +0100
Subject: [PATCH] implement Ctrl+N/Ctrl-P to select next/previous completion
 item

- this is compatible with choosing completion items in vim
- especially when using FakeVim mode, this makes it unnecessary to move
  the hands from the main row to the arrow keys

Merge-request: 2158
Reviewed-by: hjk <qtc-committer@nokia.com>
---
 src/plugins/texteditor/completionwidget.cpp | 25 +++++++++++++++++++++
 1 file changed, 25 insertions(+)

diff --git a/src/plugins/texteditor/completionwidget.cpp b/src/plugins/texteditor/completionwidget.cpp
index bb6cf900f4e..57ece870d52 100644
--- a/src/plugins/texteditor/completionwidget.cpp
+++ b/src/plugins/texteditor/completionwidget.cpp
@@ -150,9 +150,34 @@ bool CompletionWidget::event(QEvent *e)
 #endif
         closeList(index);
         return true;
+    } else if (e->type() == QEvent::ShortcutOverride) {
+        QKeyEvent *ke = static_cast<QKeyEvent *>(e);
+        switch (ke->key()) {
+        case Qt::Key_N:
+        case Qt::Key_P:
+            // select next/previous completion
+            if (ke->modifiers() == Qt::ControlModifier)
+            {
+                e->accept();
+                QModelIndex oldIndex = currentIndex();
+                int change = (ke->key() == Qt::Key_N) ? 1 : -1;
+                int nrows = model()->rowCount();
+                int row = currentIndex().row();
+                int newRow = (row + change + nrows) % nrows;
+                if (newRow == row + change || !ke->isAutoRepeat())
+                    setCurrentIndex(m_model->index(newRow));
+                return true;
+            }
+        }
     } else if (e->type() == QEvent::KeyPress) {
         QKeyEvent *ke = static_cast<QKeyEvent *>(e);
         switch (ke->key()) {
+        case Qt::Key_N:
+        case Qt::Key_P:
+            // select next/previous completion - so don't pass on to editor
+            if (ke->modifiers() == Qt::ControlModifier)
+                forwardKeys = false;
+            break;
         case Qt::Key_Escape:
             closeList();
             return true;
-- 
GitLab