X-Git-Url: https://cloud.milkyroute.net/gitweb/dolphin.git/blobdiff_plain/a6d36df99ee82c4b081f67f6cf19e2f6fe65e253..bd925ea49a7e4e7c6e652f4529dcd0c4e25fd19a:/src/selectionmanager.cpp diff --git a/src/selectionmanager.cpp b/src/selectionmanager.cpp index 02125d7c9..248b4288d 100644 --- a/src/selectionmanager.cpp +++ b/src/selectionmanager.cpp @@ -62,10 +62,14 @@ 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); @@ -78,9 +82,13 @@ void SelectionManager::slotEntered(const QModelIndex& index) 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&))); } } @@ -92,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) { @@ -113,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(m_view->model()); KDirModel* dirModel = static_cast(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(m_view->model()); KDirModel* dirModel = static_cast(proxyModel->sourceModel()); - const QModelIndex dirIndex = dirModel->indexForItem(item); + const QModelIndex dirIndex = dirModel->indexForUrl(url); return proxyModel->mapFromSource(dirIndex); }