]> cloud.milkyroute.net Git - dolphin.git/blobdiff - src/selectionmanager.cpp
fix crash when e. g. right clicking on a file using SMB inside Konqueror
[dolphin.git] / src / selectionmanager.cpp
index f79e1ada00ca002055a9d3ceaf0ebe0329ab50c2..248b4288d9f9c8a862face80522769891ccae497 100644 (file)
@@ -62,31 +62,33 @@ void SelectionManager::slotEntered(const QModelIndex& index)
 {
     m_toggle->hide();
     if (index.isValid() && (index.column() == DolphinModel::Name)) {
-        m_toggle->setFileItem(itemForIndex(index));
+        m_toggle->setUrl(urlForIndex(index));
 
         connect(m_view->model(), SIGNAL(rowsRemoved(const QModelIndex&, int, int)),
                 this, SLOT(slotRowsRemoved(const QModelIndex&, int, int)));
+        connect(m_view->selectionModel(),
+                SIGNAL(selectionChanged(const QItemSelection&, const QItemSelection&)),
+                this,
+                SLOT(slotSelectionChanged(const QItemSelection&, const QItemSelection&)));
 
         const QRect rect = m_view->visualRect(index);
-        const int gap = 2;
-        const int x = rect.right() - m_toggle->width() - gap;
-        int y = rect.top();
-        if (rect.height() <= m_toggle->height() * 2) {
-            // center the button vertically
-            y += (rect.height() - m_toggle->height()) / 2;
-        } else {
-            y += gap;
-        }
 
+        const int gap = 2;
+        const int x = rect.left() + gap;
+        const int y = rect.top() + gap;
         m_toggle->move(QPoint(x, y));
 
         QItemSelectionModel* selModel = m_view->selectionModel();
         m_toggle->setChecked(selModel->isSelected(index));
         m_toggle->show();
     } else {
-        m_toggle->setFileItem(KFileItem());
+        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&)));
     }
 }
 
@@ -98,9 +100,8 @@ void SelectionManager::slotViewportEntered()
 void SelectionManager::setItemSelected(bool selected)
 {
     emit selectionChanged();
-    Q_ASSERT(!m_toggle->fileItem().isNull());
 
-    const QModelIndex index = indexForItem(m_toggle->fileItem());
+    const QModelIndex index = indexForUrl(m_toggle->url());
     if (index.isValid()) {
         QItemSelectionModel* selModel = m_view->selectionModel();
         if (selected) {
@@ -119,19 +120,37 @@ void SelectionManager::slotRowsRemoved(const QModelIndex& parent, int start, int
     m_toggle->hide();
 }
 
-KFileItem SelectionManager::itemForIndex(const QModelIndex& index) const
+void SelectionManager::slotSelectionChanged(const QItemSelection& selected,
+                                            const QItemSelection& deselected)
+{
+    // 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.
+    const QModelIndex index = indexForUrl(m_toggle->url());
+    if (index.isValid()) {
+        if (selected.contains(index)) {
+            m_toggle->setChecked(true);
+        }
+
+        if (deselected.contains(index)) {
+            m_toggle->setChecked(false);
+        }
+    }
+}
+
+KUrl SelectionManager::urlForIndex(const QModelIndex& index) const
 {
     QAbstractProxyModel* proxyModel = static_cast<QAbstractProxyModel*>(m_view->model());
     KDirModel* dirModel = static_cast<KDirModel*>(proxyModel->sourceModel());
     const QModelIndex dirIndex = proxyModel->mapToSource(index);
-    return dirModel->itemForIndex(dirIndex);
+    return dirModel->itemForIndex(dirIndex).url();
 }
 
-const QModelIndex SelectionManager::indexForItem(const KFileItem& item) const
+const QModelIndex SelectionManager::indexForUrl(const KUrl& url) const
 {
     QAbstractProxyModel* proxyModel = static_cast<QAbstractProxyModel*>(m_view->model());
     KDirModel* dirModel = static_cast<KDirModel*>(proxyModel->sourceModel());
-    const QModelIndex dirIndex = dirModel->indexForItem(item);
+    const QModelIndex dirIndex = dirModel->indexForUrl(url);
     return proxyModel->mapFromSource(dirIndex);
 }