From a48679b36b876815fccab3ab8559734f29372907 Mon Sep 17 00:00:00 2001 From: Peter Penz Date: Sun, 9 Jan 2011 15:03:30 +0000 Subject: [PATCH] Fix implementation of DolphinView::invertSelection() which assures that DolphinView::hasSelection() provides a valid return-value. This looks like an issue in Qt, but I did not have the time yet to provide a Qt-only example for a bug-report :-( svn path=/trunk/KDE/kdebase/apps/; revision=1213199 --- src/tests/dolphinviewtest_allviewmodes.cpp | 20 +++++------------ src/views/dolphinview.cpp | 26 ++++++++++++++-------- 2 files changed, 22 insertions(+), 24 deletions(-) diff --git a/src/tests/dolphinviewtest_allviewmodes.cpp b/src/tests/dolphinviewtest_allviewmodes.cpp index 9d13c6a5c..d1557be05 100644 --- a/src/tests/dolphinviewtest_allviewmodes.cpp +++ b/src/tests/dolphinviewtest_allviewmodes.cpp @@ -83,13 +83,11 @@ void DolphinViewTest_AllViewModes::testSelection() { m_view->selectAll(); verifySelectedItemsCount(totalItems); - // TODO: DolphinView::invertSelection() does not work in combination with DolphinView::hasSelection(). Might - // be a Qt-issue - further investigations are needed. - //m_view->invertSelection(); - //verifySelectedItemsCount(0); - // - //m_view->invertSelection(); - //verifySelectedItemsCount(totalItems); + m_view->invertSelection(); + verifySelectedItemsCount(0); + + m_view->invertSelection(); + verifySelectedItemsCount(totalItems); m_view->clearSelection(); verifySelectedItemsCount(0); @@ -149,14 +147,6 @@ void DolphinViewTest_AllViewModes::verifySelectedItemsCount(int itemsCount) cons QVERIFY(m_view->hasSelection()); } else { - if (mode() == DolphinView::ColumnView && - itemView()->selectionModel()->selectedIndexes().count() == 0 && - itemView()->selectionModel()->hasSelection()) { - QEXPECT_FAIL("", - "The selection model's hasSelection() method returns true, but there are no selected indexes. Needs to be investigated.", - Continue); - } - QVERIFY(!m_view->hasSelection()); } } diff --git a/src/views/dolphinview.cpp b/src/views/dolphinview.cpp index 2dc21b335..f2340fa89 100644 --- a/src/views/dolphinview.cpp +++ b/src/views/dolphinview.cpp @@ -566,15 +566,23 @@ void DolphinView::selectAll() void DolphinView::invertSelection() { - QItemSelectionModel* selectionModel = m_viewAccessor.itemView()->selectionModel(); - const QAbstractItemModel* itemModel = selectionModel->model(); - - const QModelIndex topLeft = itemModel->index(0, 0); - const QModelIndex bottomRight = itemModel->index(itemModel->rowCount() - 1, - itemModel->columnCount() - 1); + // Implementation note: Using selectionModel->select(selection, QItemSelectionModel::Toggle) does not + // work, as QItemSelectionModel::hasSelection() provides invalid values in this case. This might be a Qt-issue - + // when changing the implementation with an updated Qt-version don't forget to run the Dolphin-unit-tests that + // verify this usecase. + const KFileItemList selItems = selectedItems(); + clearSelection(); + + QItemSelection invertedSelection; + foreach (const KFileItem& item, items()) { + if (!selItems.contains(item)) { + const QModelIndex index = m_viewAccessor.proxyModel()->mapFromSource(m_viewAccessor.dirModel()->indexForItem(item)); + invertedSelection.select(index, index); + } + } - const QItemSelection selection(topLeft, bottomRight); - selectionModel->select(selection, QItemSelectionModel::Toggle); + QItemSelectionModel* selectionModel = m_viewAccessor.itemView()->selectionModel(); + selectionModel->select(invertedSelection, QItemSelectionModel::ClearAndSelect | QItemSelectionModel::Current); } void DolphinView::clearSelection() @@ -1100,7 +1108,7 @@ void DolphinView::slotLoadingCompleted() foreach(const KFileItem& item, m_selectedItems) { url = item.url().upUrl(); if (baseUrl.equals(url, KUrl::CompareWithoutTrailingSlash)) { - QModelIndex index = m_viewAccessor.proxyModel()->mapFromSource(m_viewAccessor.dirModel()->indexForItem(item)); + const QModelIndex index = m_viewAccessor.proxyModel()->mapFromSource(m_viewAccessor.dirModel()->indexForItem(item)); newSelection.select(index, index); } } -- 2.47.3