]> cloud.milkyroute.net Git - dolphin.git/commitdiff
Wrap the cursor on the right/left side to have a similar keyboard behavior like in...
authorPeter Penz <peter.penz19@gmail.com>
Sun, 5 Jul 2009 16:24:46 +0000 (16:24 +0000)
committerPeter Penz <peter.penz19@gmail.com>
Sun, 5 Jul 2009 16:24:46 +0000 (16:24 +0000)
No backport to KDE 4.3.x is done until the patch has proven to work well under all circumstances.

BUG: 152985
CCMAIL: tahseen.mohammad@gmail.com
CCMAIL: frank78ac@googlemail.com

svn path=/trunk/KDE/kdebase/apps/; revision=991780

src/dolphiniconsview.cpp
src/dolphiniconsview.h

index 183197ffb3101795bf3b843e01a52a3f23b78362..55d70a0a22172862e4487124577656c3ee800099 100644 (file)
@@ -245,6 +245,85 @@ void DolphinIconsView::dropEvent(QDropEvent* event)
     KCategorizedView::dropEvent(event);
 }
 
+QModelIndex DolphinIconsView::moveCursor(CursorAction cursorAction, Qt::KeyboardModifiers modifiers)
+{
+    QModelIndex current = currentIndex();
+
+    QModelIndex newCurrent = QListView::moveCursor(cursorAction, modifiers);
+    if (newCurrent != current) {
+        return newCurrent;
+    }
+
+    // The cursor has not been moved by the base implementation. Provide a
+    // wrap behavior, so that the cursor will go to the next item when reaching
+    // the border.
+    const IconsModeSettings* settings = DolphinSettings::instance().iconsModeSettings();
+    if (settings->arrangement() == QListView::LeftToRight) {
+        switch (cursorAction) {
+        case MoveUp:
+            if (newCurrent.row() == 0) {
+                return newCurrent;
+            }
+            newCurrent = QListView::moveCursor(MoveLeft, modifiers);
+            selectionModel()->setCurrentIndex(newCurrent, QItemSelectionModel::NoUpdate);
+            newCurrent = QListView::moveCursor(MovePageDown, modifiers);
+            break;
+
+        case MoveDown:
+            if (newCurrent.row() == (model()->rowCount() - 1)) {
+                return newCurrent;
+            }
+            newCurrent = QListView::moveCursor(MovePageUp, modifiers);
+            selectionModel()->setCurrentIndex(newCurrent, QItemSelectionModel::Clear);
+            newCurrent = QListView::moveCursor(MoveRight, modifiers);
+            break;
+
+        default:
+            break;
+        }
+    } else {
+        switch (cursorAction) {
+        case MoveLeft:
+            if (newCurrent.row() == 0) {
+                return newCurrent;
+            }
+            newCurrent = QListView::moveCursor(MoveUp, modifiers);
+            do {
+                selectionModel()->setCurrentIndex(newCurrent, QItemSelectionModel::NoUpdate);
+                current = newCurrent;
+                newCurrent = QListView::moveCursor(MoveRight, modifiers);
+            } while (newCurrent != current);
+
+            if (!(modifiers & Qt::ControlModifier)) {
+                // Ctrl is not pressed -> selection is updated
+                if (!(modifiers & Qt::ShiftModifier)) {
+                    // Shift is not pressed -> previous selection is lost
+                    selectionModel()->clearSelection();
+                }
+                selectionModel()->setCurrentIndex(newCurrent, QItemSelectionModel::Select);
+            }
+            break;
+
+        case MoveRight:
+            if (newCurrent.row() == (model()->rowCount() - 1)) {
+                return newCurrent;
+            }
+            do {
+                selectionModel()->setCurrentIndex(newCurrent, QItemSelectionModel::NoUpdate);
+                current = newCurrent;
+                newCurrent = QListView::moveCursor(MoveLeft, modifiers);
+            } while (newCurrent != current);
+            newCurrent = QListView::moveCursor(MoveDown, modifiers);
+            break;
+
+        default:
+            break;
+        }
+    }
+
+    return newCurrent;
+}
+
 void DolphinIconsView::keyPressEvent(QKeyEvent* event)
 {
     KCategorizedView::keyPressEvent(event);
index 8cb2fd3af7d1edda4861db2289e5879669cd33e3..70552a413aa89d8e06fe32e8df093b01d7276108 100644 (file)
@@ -62,6 +62,7 @@ protected:
     virtual void dragLeaveEvent(QDragLeaveEvent* event);
     virtual void dragMoveEvent(QDragMoveEvent* event);
     virtual void dropEvent(QDropEvent* event);
+    virtual QModelIndex moveCursor(CursorAction cursorAction, Qt::KeyboardModifiers modifiers);
     virtual void keyPressEvent(QKeyEvent* event);
     virtual void wheelEvent(QWheelEvent* event);
     virtual void showEvent(QShowEvent* event);