소스 검색

enable Ctrl+J and Ctrl+K navigation in VNotebookSelector

Le Tan 8 년 전
부모
커밋
4bd05739c0
2개의 변경된 파일54개의 추가작업 그리고 1개의 파일을 삭제
  1. 53 1
      src/vnotebookselector.cpp
  2. 1 0
      src/vnotebookselector.h

+ 53 - 1
src/vnotebookselector.cpp

@@ -39,6 +39,7 @@ VNotebookSelector::VNotebookSelector(VNote *vnote, QWidget *p_parent)
     setView(m_listWidget);
     setView(m_listWidget);
 
 
     m_listWidget->viewport()->installEventFilter(this);
     m_listWidget->viewport()->installEventFilter(this);
+    m_listWidget->installEventFilter(this);
 
 
     initActions();
     initActions();
 
 
@@ -327,7 +328,12 @@ void VNotebookSelector::requestPopupListContextMenu(QPoint p_pos)
 
 
 bool VNotebookSelector::eventFilter(QObject *watched, QEvent *event)
 bool VNotebookSelector::eventFilter(QObject *watched, QEvent *event)
 {
 {
-    if (event->type() == QEvent::MouseButtonRelease) {
+    QEvent::Type type = event->type();
+    if (type == QEvent::KeyPress && watched == m_listWidget) {
+        if (handlePopupKeyPress(static_cast<QKeyEvent *>(event))) {
+            return true;
+        }
+    } else if (type == QEvent::MouseButtonRelease) {
         if (static_cast<QMouseEvent *>(event)->button() == Qt::RightButton) {
         if (static_cast<QMouseEvent *>(event)->button() == Qt::RightButton) {
             return true;
             return true;
         }
         }
@@ -427,3 +433,49 @@ bool VNotebookSelector::handleKeyNavigation(int p_key, bool &p_succeed)
     }
     }
     return ret;
     return ret;
 }
 }
+
+bool VNotebookSelector::handlePopupKeyPress(QKeyEvent *p_event)
+{
+    int key = p_event->key();
+    int modifiers = p_event->modifiers();
+    switch (key) {
+    case Qt::Key_BracketLeft:
+    {
+        if (modifiers == Qt::ControlModifier) {
+            p_event->accept();
+            hidePopup();
+            return true;
+        }
+        break;
+    }
+
+    case Qt::Key_J:
+    {
+        if (modifiers == Qt::ControlModifier) {
+            p_event->accept();
+            QKeyEvent *downEvent = new QKeyEvent(QEvent::KeyPress, Qt::Key_Down,
+                                                 Qt::NoModifier);
+            QCoreApplication::postEvent(m_listWidget, downEvent);
+            return true;
+        }
+        break;
+    }
+
+    case Qt::Key_K:
+    {
+        if (modifiers == Qt::ControlModifier) {
+            p_event->accept();
+            QKeyEvent *upEvent = new QKeyEvent(QEvent::KeyPress, Qt::Key_Up,
+                                               Qt::NoModifier);
+            QCoreApplication::postEvent(m_listWidget, upEvent);
+            return true;
+        }
+        break;
+    }
+
+    default:
+        break;
+    }
+
+    return false;
+}

+ 1 - 0
src/vnotebookselector.h

@@ -70,6 +70,7 @@ private:
     // @p_index is the idnex of QComboBox.
     // @p_index is the idnex of QComboBox.
     inline VNotebook *getNotebookFromComboIndex(int p_index);
     inline VNotebook *getNotebookFromComboIndex(int p_index);
     void resizeListWidgetToContent();
     void resizeListWidgetToContent();
+    bool handlePopupKeyPress(QKeyEvent *p_event);
 
 
     VNote *m_vnote;
     VNote *m_vnote;
     QVector<VNotebook *> &m_notebooks;
     QVector<VNotebook *> &m_notebooks;