]> cloud.milkyroute.net Git - dolphin.git/blobdiff - src/views/selectionmanager.cpp
Fix Dolphin session management regression
[dolphin.git] / src / views / selectionmanager.cpp
index ac5f1c939cb8a35d8973e80fe9f3c669a72755e6..7a9e814126c998bc1400d2c3d1003ab1cda819e8 100644 (file)
@@ -1,5 +1,5 @@
 /***************************************************************************
- *   Copyright (C) 2008 by Peter Penz <peter.penz@gmx.at>                  *
+ *   Copyright (C) 2008 by Peter Penz <peter.penz19@gmail.com>             *
  *                                                                         *
  *   This program is free software; you can redistribute it and/or modify  *
  *   it under the terms of the GNU General Public License as published by  *
 #include "selectionmanager.h"
 
 #include "dolphinmodel.h"
+#include "dolphin_generalsettings.h"
 #include "selectiontoggle.h"
-#include <kdirmodel.h>
-#include <kiconeffect.h>
+#include "settings/dolphinsettings.h"
+#include <KDirModel>
+#include <KGlobalSettings>
+#include <KIconEffect>
 
 #include <QAbstractButton>
 #include <QAbstractItemView>
@@ -38,17 +41,23 @@ SelectionManager::SelectionManager(QAbstractItemView* parent) :
     QObject(parent),
     m_view(parent),
     m_toggle(0),
-    m_connected(false)
+    m_connected(false),
+    m_appliedPointingHandCursor(false)
 {
     connect(parent, SIGNAL(entered(const QModelIndex&)),
             this, SLOT(slotEntered(const QModelIndex&)));
     connect(parent, SIGNAL(viewportEntered()),
             this, SLOT(slotViewportEntered()));
-    m_toggle = new SelectionToggle(m_view->viewport());
-    m_toggle->setCheckable(true);
-    m_toggle->hide();
-    connect(m_toggle, SIGNAL(clicked(bool)),
-            this, SLOT(setItemSelected(bool)));
+
+    const GeneralSettings* settings = DolphinSettings::instance().generalSettings();
+    if (settings->showSelectionToggle()) {
+        m_toggle = new SelectionToggle(m_view->viewport());
+        m_toggle->setCheckable(true);
+        m_toggle->hide();
+        connect(m_toggle, SIGNAL(clicked(bool)),
+                this, SLOT(setItemSelected(bool)));
+        m_toggle->installEventFilter(this);
+    }
 
     m_view->viewport()->installEventFilter(this);
 }
@@ -59,31 +68,66 @@ SelectionManager::~SelectionManager()
 
 bool SelectionManager::eventFilter(QObject* watched, QEvent* event)
 {
-    Q_ASSERT(watched == m_view->viewport());
-    if (event->type() == QEvent::MouseButtonPress) {
-        // Set the toggle invisible, if a mouse button has been pressed
-        // outside the toggle boundaries. This e.g. assures, that the toggle
-        // gets invisible during dragging items.
-        const QRect toggleBounds(m_toggle->mapToGlobal(QPoint(0, 0)), m_toggle->size());
-        m_toggle->setVisible(toggleBounds.contains(QCursor::pos()));
+    if (watched == m_view->viewport()) {
+        switch (event->type()) {
+        case QEvent::Leave:
+            if (m_toggle) {
+                m_toggle->hide();
+            }
+            restoreCursor();
+            break;
+
+        case QEvent::MouseButtonPress: {
+            // Set the toggle invisible, if a mouse button has been pressed
+            // outside the toggle boundaries. This e.g. assures, that the toggle
+            // gets invisible during dragging items.
+            if (m_toggle) {
+                const QRect toggleBounds(m_toggle->mapToGlobal(QPoint(0, 0)), m_toggle->size());
+                m_toggle->setVisible(toggleBounds.contains(QCursor::pos()));
+            }
+            break;
+        }
+
+        default:
+            break;
+        }
+    } else if (watched == m_toggle) {
+        switch (event->type()) {
+        case QEvent::Enter:
+            QApplication::changeOverrideCursor(Qt::ArrowCursor);
+            break;
+
+        case QEvent::Leave:
+            QApplication::changeOverrideCursor(Qt::PointingHandCursor);
+            break;
+
+        default:
+            break;
+        }
     }
+
     return QObject::eventFilter(watched, event);
 }
 
 void SelectionManager::reset()
 {
-    m_toggle->reset();
+    if (m_toggle) {
+        m_toggle->reset();
+    }
 }
 
 void SelectionManager::slotEntered(const QModelIndex& index)
 {
-    m_toggle->hide();
-    const bool showToggle = index.isValid() &&
-                            (index.column() == DolphinModel::Name) &&
-                            (QApplication::mouseButtons() == Qt::NoButton);
-    if (showToggle) {
-        m_toggle->setUrl(urlForIndex(index));
+    const bool isSelectionCandidate = index.isValid() &&
+                                      (index.column() == DolphinModel::Name) &&
+                                      (QApplication::mouseButtons() == Qt::NoButton);
+
+    restoreCursor();
+    if (isSelectionCandidate && KGlobalSettings::singleClick()) {
+        applyPointingHandCursor();
+    }
 
+    if (isSelectionCandidate) {
         if (!m_connected) {
             connect(m_view->model(), SIGNAL(rowsRemoved(const QModelIndex&, int, int)),
                     this, SLOT(slotRowsRemoved(const QModelIndex&, int, int)));
@@ -93,54 +137,67 @@ void SelectionManager::slotEntered(const QModelIndex& index)
                     SLOT(slotSelectionChanged(const QItemSelection&, const QItemSelection&)));
             m_connected = true;
         }
+    } else {
+        disconnect(m_view->model(), SIGNAL(rowsRemoved(const QModelIndex&, int, int)),
+                   this, SLOT(slotRowsRemoved(const QModelIndex&, int, int)));
+        disconnect(m_view->selectionModel(),
+                   SIGNAL(selectionChanged(const QItemSelection&, const QItemSelection&)),
+                   this,
+                   SLOT(slotSelectionChanged(const QItemSelection&, const QItemSelection&)));
+        m_connected = false;
+    }
 
-        // increase the size of the toggle for large items
-        const int height = m_view->iconSize().height();
-        if (height >= KIconLoader::SizeEnormous) {
-            m_toggle->resize(KIconLoader::SizeMedium, KIconLoader::SizeMedium);
-        } else if (height >= KIconLoader::SizeLarge) {
-            m_toggle->resize(KIconLoader::SizeSmallMedium, KIconLoader::SizeSmallMedium);
-        } else {
-            m_toggle->resize(KIconLoader::SizeSmall, KIconLoader::SizeSmall);
+    if (!m_toggle) {
+        return;
+    }
+
+    m_toggle->hide();
+    if (isSelectionCandidate) {
+        m_toggle->setUrl(urlForIndex(index));
+
+        // Increase the size of the toggle for large items
+        const int iconHeight = m_view->iconSize().height();
+
+        int toggleSize = KIconLoader::SizeSmall;
+        if (iconHeight >= KIconLoader::SizeEnormous) {
+            toggleSize = KIconLoader::SizeMedium;
+        } else if (iconHeight >= KIconLoader::SizeLarge) {
+            toggleSize = KIconLoader::SizeSmallMedium;
         }
 
+        // Add a small invisible margin, if the item-height is nearly
+        // equal to the toggleSize (#169494).
         const QRect rect = m_view->visualRect(index);
-        int x = rect.left();
-        int y = rect.top();
-        if (height < KIconLoader::SizeSmallMedium) {
-            // The height is nearly equal to the smallest toggle height.
-            // Assure that the toggle is vertically centered instead
-            // of aligned on the top and gets more horizontal gap.
-            x += 2;
-            y += (rect.height() - m_toggle->height()) / 2;
+        int margin = (rect.height() - toggleSize) / 2;
+        if (margin > 4) {
+            margin = 0;
         }
-        m_toggle->move(QPoint(x, y));
+        toggleSize += 2 * margin;
+        m_toggle->setMargin(margin);
+        m_toggle->resize(toggleSize, toggleSize);
+        m_toggle->move(rect.topLeft());
 
         QItemSelectionModel* selModel = m_view->selectionModel();
         m_toggle->setChecked(selModel->isSelected(index));
         m_toggle->show();
     } else {
         m_toggle->setUrl(KUrl());
-        disconnect(m_view->model(), SIGNAL(rowsRemoved(const QModelIndex&, int, int)),
-                   this, SLOT(slotRowsRemoved(const QModelIndex&, int, int)));
-        disconnect(m_view->selectionModel(),
-                   SIGNAL(selectionChanged(const QItemSelection&, const QItemSelection&)),
-                   this,
-                   SLOT(slotSelectionChanged(const QItemSelection&, const QItemSelection&)));
-        m_connected = false;
     }
 }
 
 void SelectionManager::slotViewportEntered()
 {
-    m_toggle->hide();
+    if (m_toggle) {
+        m_toggle->hide();
+    }
+    restoreCursor();
 }
 
 void SelectionManager::setItemSelected(bool selected)
 {
     emit selectionChanged();
 
-    if (!m_toggle->url().isEmpty()) {
+    if (m_toggle && !m_toggle->url().isEmpty()) {
         const QModelIndex index = indexForUrl(m_toggle->url());
         if (index.isValid()) {
             QItemSelectionModel* selModel = m_view->selectionModel();
@@ -159,7 +216,10 @@ void SelectionManager::slotRowsRemoved(const QModelIndex& parent, int start, int
     Q_UNUSED(parent);
     Q_UNUSED(start);
     Q_UNUSED(end);
-    m_toggle->hide();
+    if (m_toggle) {
+        m_toggle->hide();
+    }
+    restoreCursor();
 }
 
 void SelectionManager::slotSelectionChanged(const QItemSelection& selected,
@@ -168,7 +228,7 @@ void SelectionManager::slotSelectionChanged(const QItemSelection& selected,
     // The selection has been changed outside the scope of the selection manager
     // (e. g. by the rubberband or the "Select All" action). Take care updating
     // the state of the toggle button.
-    if (!m_toggle->url().isEmpty()) {
+    if (m_toggle && !m_toggle->url().isEmpty()) {
         const QModelIndex index = indexForUrl(m_toggle->url());
         if (index.isValid()) {
             if (selected.contains(index)) {
@@ -198,4 +258,21 @@ const QModelIndex SelectionManager::indexForUrl(const KUrl& url) const
     return proxyModel->mapFromSource(dirIndex);
 }
 
+
+void SelectionManager::applyPointingHandCursor()
+{
+    if (!m_appliedPointingHandCursor) {
+        QApplication::setOverrideCursor(QCursor(Qt::PointingHandCursor));
+        m_appliedPointingHandCursor = true;
+    }
+}
+
+void SelectionManager::restoreCursor()
+{
+    if (m_appliedPointingHandCursor) {
+        QApplication::restoreOverrideCursor();
+        m_appliedPointingHandCursor = false;
+    }
+}
+
 #include "selectionmanager.moc"