]> cloud.milkyroute.net Git - dolphin.git/blobdiff - src/kitemviews/kitemlistcontroller.cpp
Include "Space" in the keyboard search string
[dolphin.git] / src / kitemviews / kitemlistcontroller.cpp
index c16488f9eb448e5563578b9e0b07d8a0e6ce1a35..9335ab816c334631ffa53ff6cbf78563e9399097 100644 (file)
@@ -44,7 +44,7 @@
 
 KItemListController::KItemListController(KItemModelBase* model, KItemListView* view, QObject* parent) :
     QObject(parent),
-    m_singleClickActivation(KGlobalSettings::singleClick()),
+    m_singleClickActivationEnforced(false),
     m_selectionTogglePressed(false),
     m_clearSelectionIfItemsAreNotDragged(false),
     m_selectionBehavior(NoSelection),
@@ -190,14 +190,14 @@ int KItemListController::autoActivationDelay() const
     return m_autoActivationTimer->interval();
 }
 
-void KItemListController::setSingleClickActivation(bool singleClick)
+void KItemListController::setSingleClickActivationEnforced(bool singleClick)
 {
-    m_singleClickActivation = singleClick;
+    m_singleClickActivationEnforced = singleClick;
 }
 
-bool KItemListController::singleClickActivation() const
+bool KItemListController::singleClickActivationEnforced() const
 {
-    return m_singleClickActivation;
+    return m_singleClickActivationEnforced;
 }
 
 bool KItemListController::showEvent(QShowEvent* event)
@@ -375,19 +375,6 @@ bool KItemListController::keyPressEvent(QKeyEvent* event)
         break;
     }
 
-    case Qt::Key_Space:
-        if (m_selectionBehavior == MultiSelection) {
-            if (controlPressed) {
-                m_selectionManager->endAnchoredSelection();
-                m_selectionManager->setSelected(index, 1, KItemListSelectionManager::Toggle);
-                m_selectionManager->beginAnchoredSelection(index);
-            } else {
-                const int current = m_selectionManager->currentItem();
-                m_selectionManager->setSelected(current);
-            }
-        }
-        break;
-
     case Qt::Key_Menu: {
         // Emit the signal itemContextMenuRequested() in case if at least one
         // item is selected. Otherwise the signal viewContextMenuRequested() will be emitted.
@@ -418,8 +405,29 @@ bool KItemListController::keyPressEvent(QKeyEvent* event)
         m_keyboardManager->cancelSearch();
         break;
 
+    case Qt::Key_Space:
+        if (m_selectionBehavior == MultiSelection) {
+            if (controlPressed) {
+                // Toggle the selection state of the current item.
+                m_selectionManager->endAnchoredSelection();
+                m_selectionManager->setSelected(index, 1, KItemListSelectionManager::Toggle);
+                m_selectionManager->beginAnchoredSelection(index);
+                break;
+            } else {
+                // Select the current item if it is not selected yet.
+                const int current = m_selectionManager->currentItem();
+                if (!m_selectionManager->isSelected(current)) {
+                    m_selectionManager->setSelected(current);
+                    break;
+                }
+            }
+        }
+        // Fall through to the default case and add the Space to the current search string.
+
     default:
         m_keyboardManager->addKeys(event->text());
+        // Make sure unconsumed events get propagated up the chain. #302329
+        event->ignore();
         return false;
     }
 
@@ -472,9 +480,13 @@ void KItemListController::slotChangeCurrentItem(const QString& text, bool search
     }
     if (index >= 0) {
         m_selectionManager->setCurrentItem(index);
-        m_selectionManager->clearSelection();
-        m_selectionManager->setSelected(index, 1);
-        m_selectionManager->beginAnchoredSelection(index);
+
+        if (m_selectionBehavior != NoSelection) {
+            m_selectionManager->clearSelection();
+            m_selectionManager->setSelected(index, 1);
+            m_selectionManager->beginAnchoredSelection(index);
+        }
+
         m_view->scrollToItem(index);
     }
 }
@@ -754,7 +766,7 @@ bool KItemListController::mouseReleaseEvent(QGraphicsSceneMouseEvent* event, con
             } else if (shiftOrControlPressed) {
                 // The mouse click should only update the selection, not trigger the item
                 emitItemActivated = false;
-            } else if (!m_singleClickActivation) {
+            } else if (!(KGlobalSettings::singleClick() || m_singleClickActivationEnforced)) {
                 emitItemActivated = false;
             }
             if (emitItemActivated) {
@@ -784,7 +796,7 @@ bool KItemListController::mouseDoubleClickEvent(QGraphicsSceneMouseEvent* event,
         }
     }
 
-    bool emitItemActivated = !m_singleClickActivation &&
+    bool emitItemActivated = !(KGlobalSettings::singleClick() || m_singleClickActivationEnforced) &&
                              (event->button() & Qt::LeftButton) &&
                              index >= 0 && index < m_model->count();
     if (emitItemActivated) {
@@ -836,27 +848,39 @@ bool KItemListController::dragMoveEvent(QGraphicsSceneDragDropEvent* event, cons
             oldHoveredWidget->setHovered(false);
             emit itemUnhovered(oldHoveredWidget->index());
         }
+    }
 
-        if (newHoveredWidget) {
-            bool droppingBetweenItems = false;
-            if (m_model->sortRole().isEmpty()) {
-                // The model supports inserting items between other items.
-                droppingBetweenItems = (m_view->showDropIndicator(pos) >= 0);
-            }
+    if (newHoveredWidget) {
+        bool droppingBetweenItems = false;
+        if (m_model->sortRole().isEmpty()) {
+            // The model supports inserting items between other items.
+            droppingBetweenItems = (m_view->showDropIndicator(pos) >= 0);
+        }
 
-            const int index = newHoveredWidget->index();
-            if (!droppingBetweenItems && m_model->supportsDropping(index)) {
+        const int index = newHoveredWidget->index();
+        if (!droppingBetweenItems) {
+            if (m_model->supportsDropping(index)) {
                 // Something has been dragged on an item.
                 m_view->hideDropIndicator();
-                newHoveredWidget->setHovered(true);
-                emit itemHovered(index);
+                if (!newHoveredWidget->isHovered()) {
+                    newHoveredWidget->setHovered(true);
+                    emit itemHovered(index);
+                }
 
-                if (m_autoActivationTimer->interval() >= 0) {
+                if (!m_autoActivationTimer->isActive() && m_autoActivationTimer->interval() >= 0) {
                     m_autoActivationTimer->setProperty("index", index);
                     m_autoActivationTimer->start();
                 }
             }
+        } else {
+            m_autoActivationTimer->stop();
+            if (newHoveredWidget && newHoveredWidget->isHovered()) {
+                newHoveredWidget->setHovered(false);
+                emit itemUnhovered(index);
+            }
         }
+    } else {
+        m_view->hideDropIndicator();
     }
 
     return false;