]> cloud.milkyroute.net Git - dolphin.git/commitdiff
Implement basic keyboard navigation in Icons and Compact View
authorFrank Reininghaus <frank78ac@googlemail.com>
Sat, 13 Aug 2011 16:24:02 +0000 (18:24 +0200)
committerFrank Reininghaus <frank78ac@googlemail.com>
Sat, 13 Aug 2011 16:24:02 +0000 (18:24 +0200)
Things that are still missing:
1. Moving to the previous/next row with Up/Down in Icons View,
   moving to the previous/next columns in Compact View.
2. Navigation in Details View.
Note that scrolling to the current item doesn't work yet, and
that the view does not have keyboard focus initially, so one has
to click the view before keyboard navigation and seleciton works.

src/kitemviews/kitemlistcontroller.cpp

index afa70e60c6cf4008f63437b668897822e8285534..af93715cf2d50c6b8c5dd869874c54bda3066c52 100644 (file)
@@ -119,15 +119,92 @@ bool KItemListController::hideEvent(QHideEvent* event)
 
 bool KItemListController::keyPressEvent(QKeyEvent* event)
 {
+    const bool shiftPressed = event->modifiers() & Qt::ShiftModifier;
+    const bool controlPressed = event->modifiers() & Qt::ControlModifier;
+    const bool shiftOrControlPressed = shiftPressed || controlPressed;
+
+    int index = m_selectionManager->currentItem();
+
     switch (event->key()) {
     case Qt::Key_Home:
-        m_selectionManager->setCurrentItem(0);
+        index = 0;
         break;
+
     case Qt::Key_End:
-        m_selectionManager->setCurrentItem(m_model->count() - 1);
+        index = m_model->count() - 1;
+        break;
+
+    case Qt::Key_Up:
+        if (m_view->scrollOrientation() == Qt::Horizontal) {
+            if (index > 0) {
+                index--;
+            }
+        }
+        else {
+            // TODO: Move to the previous row
+        }
+        break;
+
+    case Qt::Key_Down:
+        if (m_view->scrollOrientation() == Qt::Horizontal) {
+            if (index < m_model->count() - 1) {
+                index++;
+            }
+        }
+        else {
+            // TODO: Move to the next row
+        }
+        break;
+
+    case Qt::Key_Left:
+        if (m_view->scrollOrientation() == Qt::Vertical) {
+            if (index > 0) {
+                index--;
+            }
+        }
+        else {
+            // TODO: Move to the previous column
+        }
+        break;
+
+    case Qt::Key_Right:
+        if (m_view->scrollOrientation() == Qt::Vertical) {
+            if (index < m_model->count() - 1) {
+                index++;
+            }
+        }
+        else {
+            // TODO: Move to the next column
+        }
+        break;
+
+    case Qt::Key_Space:
+        if (controlPressed) {
+            m_selectionManager->endAnchoredSelection();
+            m_selectionManager->setSelected(index, 1, KItemListSelectionManager::Toggle);
+            m_selectionManager->beginAnchoredSelection(index);
+        }
+     default:
         break;
     }
-    return false;
+
+    if (m_selectionManager->currentItem() != index) {
+        if (controlPressed) {
+            m_selectionManager->endAnchoredSelection();
+        }
+
+        m_selectionManager->setCurrentItem(index);
+
+        if (!shiftOrControlPressed || m_selectionBehavior == SingleSelection) {
+            m_selectionManager->clearSelection();
+            m_selectionManager->setSelected(index, 1);
+        }
+
+        if (!shiftPressed) {
+            m_selectionManager->beginAnchoredSelection(index);
+        }
+    }
+    return true;
 }
 
 bool KItemListController::inputMethodEvent(QInputMethodEvent* event)