]> cloud.milkyroute.net Git - dolphin.git/commitdiff
Fix keyboard navigation issues in the column view
authorPeter Penz <peter.penz19@gmail.com>
Sat, 29 May 2010 19:31:46 +0000 (19:31 +0000)
committerPeter Penz <peter.penz19@gmail.com>
Sat, 29 May 2010 19:31:46 +0000 (19:31 +0000)
BUG: 236039

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

src/dolphincolumnview.cpp
src/dolphincolumnviewcontainer.cpp
src/dolphincolumnviewcontainer.h

index f5bcd79eeccee210d61a224027365a3cefcff2eb..3f470bdbc9886ff100e96ab29efd7aca1d3aa925 100644 (file)
@@ -153,10 +153,6 @@ DolphinColumnView::~DolphinColumnView()
 
 void DolphinColumnView::setActive(bool active)
 {
-    if (active && (m_container->focusProxy() != this)) {
-        m_container->setFocusProxy(this);
-    }
-
     if (m_active != active) {
         m_active = active;
 
@@ -309,9 +305,8 @@ void DolphinColumnView::mousePressEvent(QMouseEvent* event)
 }
 
 void DolphinColumnView::keyPressEvent(QKeyEvent* event)
-{
+{   
     QListView::keyPressEvent(event);
-    requestActivation();
 
     DolphinViewController* controller = m_container->m_dolphinViewController;
     controller->handleKeyPressEvent(event);
@@ -443,9 +438,16 @@ void DolphinColumnView::deactivate()
                    m_container->m_dolphinViewController, SLOT(triggerItem(const QModelIndex&)));
     }
 
+    // It is important to disconnect the connection to requestActivation() temporary, otherwise the internal
+    // clearing of the selection would result in activating the column again.
+    disconnect(selectionModel(), SIGNAL(selectionChanged(QItemSelection, QItemSelection)),
+               this, SLOT(requestActivation()));
     const QModelIndex current = selectionModel()->currentIndex();
     selectionModel()->clear();
     selectionModel()->setCurrentIndex(current, QItemSelectionModel::NoUpdate);
+    connect(selectionModel(), SIGNAL(selectionChanged(QItemSelection, QItemSelection)),
+            this, SLOT(requestActivation()));
+    
     updateBackground();
 }
 
index 421f195d55f73979235dfd4c28773d365e474525..344d38d8a343b186bbe2aebf7e1ba73781fd6140 100644 (file)
@@ -73,7 +73,7 @@ DolphinColumnViewContainer::DolphinColumnViewContainer(QWidget* parent,
 
     DolphinColumnView* column = new DolphinColumnView(viewport(), this, viewModeController->url());
     m_columns.append(column);
-    setActiveColumnIndex(0);
+    requestActivation(column);
 
     m_emptyViewport = new QFrame(viewport());
     m_emptyViewport->setFrameStyle(QFrame::StyledPanel | QFrame::Sunken);
@@ -175,12 +175,7 @@ void DolphinColumnViewContainer::showColumn(const KUrl& url)
         }
     }
 
-    // set the last column as active column without modifying the controller
-    // and hence the history
-    m_columns[m_index]->setActive(false);
-    m_index = columnIndex;
-    m_columns[m_index]->setActive(true);
-    assureVisibleActiveColumn();
+    requestActivation(m_columns[columnIndex]);
 }
 
 void DolphinColumnViewContainer::mousePressEvent(QMouseEvent* event)
@@ -192,7 +187,9 @@ void DolphinColumnViewContainer::mousePressEvent(QMouseEvent* event)
 void DolphinColumnViewContainer::keyPressEvent(QKeyEvent* event)
 {
     if (event->key() == Qt::Key_Left) {
-        setActiveColumnIndex(m_index - 1);
+        if (m_index > 0) {
+            requestActivation(m_columns[m_index - 1]);
+        }
     } else {
         QScrollArea::keyPressEvent(event);
     }
@@ -250,24 +247,6 @@ void DolphinColumnViewContainer::updateActiveUrl()
     m_dolphinViewController->requestUrlChange(activeUrl);
 }
 
-void DolphinColumnViewContainer::setActiveColumnIndex(int index)
-{
-    if ((m_index == index) || (index < 0) || (index >= m_columns.count())) {
-        return;
-    }
-
-    const bool hasActiveColumn = (m_index >= 0);
-    if (hasActiveColumn) {
-        m_columns[m_index]->setActive(false);
-    }
-
-    m_index = index;
-    m_columns[m_index]->setActive(true);
-
-    assureVisibleActiveColumn();
-    m_activeUrlTimer->start(); // calls slot updateActiveUrl()
-}
-
 void DolphinColumnViewContainer::layoutColumns()
 {
     const int gap = 4;
@@ -342,18 +321,39 @@ void DolphinColumnViewContainer::assureVisibleActiveColumn()
 
 void DolphinColumnViewContainer::requestActivation(DolphinColumnView* column)
 {
-    m_dolphinViewController->setItemView(column);
+    if (m_dolphinViewController->itemView() != column) {
+        m_dolphinViewController->setItemView(column);
+    }
+    if (focusProxy() != column) {
+        setFocusProxy(column);
+    }
+    
     if (column->isActive()) {
         assureVisibleActiveColumn();
     } else {
+        // Deactivate the currently active column
+        if (m_index >= 0) {
+            m_columns[m_index]->setActive(false);
+        }
+        
+        // Get the index of the column that should get activated
         int index = 0;
         foreach (DolphinColumnView* currColumn, m_columns) {
             if (currColumn == column) {
-                setActiveColumnIndex(index);
-                return;
+                break;
             }
             ++index;
         }
+
+        Q_ASSERT(index != m_index);
+        Q_ASSERT(index < m_columns.count());
+
+        // Activate the requested column
+        m_index = index;
+        m_columns[m_index]->setActive(true);
+
+        assureVisibleActiveColumn();
+        m_activeUrlTimer->start(); // calls slot updateActiveUrl()
     }
 }
 
index 41a1d167a4001af2427dba204cb57b194aad8ddd..c67fb3cff7ad59883ce9aab8123d357420165a0d 100644 (file)
@@ -97,14 +97,6 @@ private slots:
     void updateActiveUrl();
 
 private:
-    /**
-     * Deactivates the currently active column and activates
-     * the new column indicated by \a index. m_index represents
-     * the active column afterwards. Also the URL of the navigator
-     * will be adjusted to reflect the column URL.
-     */
-    void setActiveColumnIndex(int index);
-
     void layoutColumns();
     void updateScrollBar();