From 06a48c672a8da267fe0de5ac7ef35ec6c581d03a Mon Sep 17 00:00:00 2001 From: David Faure Date: Fri, 7 Aug 2015 01:39:42 +0200 Subject: [PATCH] KExtraColumnsProxyModel: fix bug in sibling() which broke e.g. selections --- autotests/kextracolumnsproxymodeltest.cpp | 16 ++++++++++++++++ src/kextracolumnsproxymodel.cpp | 8 ++++---- 2 files changed, 20 insertions(+), 4 deletions(-) diff --git a/autotests/kextracolumnsproxymodeltest.cpp b/autotests/kextracolumnsproxymodeltest.cpp index 1ac7856..83fa369 100644 --- a/autotests/kextracolumnsproxymodeltest.cpp +++ b/autotests/kextracolumnsproxymodeltest.cpp @@ -170,6 +170,9 @@ private Q_SLOTS: QVERIFY(indexToText(pm.index(0, 5)).startsWith("0,5,")); QCOMPARE(indexToText(pm.index(0, 5, secondParent).parent()), indexToText(secondParent)); + QCOMPARE(pm.index(0, 0).sibling(0, 4).column(), 4); + QCOMPARE(pm.index(0, 4).sibling(0, 1).column(), 1); + QVERIFY(!pm.canFetchMore(QModelIndex())); } @@ -304,15 +307,28 @@ private Q_SLOTS: // And a QSFPM underneath QSortFilterProxyModel proxy; proxy.setSourceModel(&mod); + QCOMPARE(proxy.columnCount(), 4); pm.setSourceModel(&proxy); + QCOMPARE(pm.columnCount(), 6); + QCOMPARE(extractRowTexts(&pm, 0), QString("ABCDZ0")); // And a selection QItemSelectionModel selection(&pm); selection.select(pm.index(0, 0), QItemSelectionModel::Select | QItemSelectionModel::Rows); + const QModelIndexList lst = selection.selectedIndexes(); + QCOMPARE(lst.count(), 6); + for (int col = 0; col < lst.count(); ++col) { + QCOMPARE(lst.at(col).row(), 0); + QCOMPARE(lst.at(col).column(), col); + } // When sorting pm.sort(0, Qt::DescendingOrder); + + // Then the proxy should be sorted QCOMPARE(extractRowTexts(&pm, 0), QString("EFGHZ0")); QCOMPARE(extractRowTexts(&pm, 1), QString("ABCDZ1")); + // And the selection should be updated accordingly + QCOMPARE(selection.selectedIndexes().first().row(), 1); } private: diff --git a/src/kextracolumnsproxymodel.cpp b/src/kextracolumnsproxymodel.cpp index eec7ae9..8c64b9d 100644 --- a/src/kextracolumnsproxymodel.cpp +++ b/src/kextracolumnsproxymodel.cpp @@ -39,7 +39,7 @@ public: // Configuration (doesn't change once source model is plugged in) QVector m_extraHeaders; - // for layoutAboutToChanged/layoutChanged + // for layoutAboutToBeChanged/layoutChanged QVector layoutChangePersistentIndexes; QVector layoutChangeProxyColumns; QModelIndexList proxyIndexes; @@ -117,10 +117,10 @@ QModelIndex KExtraColumnsProxyModel::mapToSource(const QModelIndex &proxyIndex) QModelIndex KExtraColumnsProxyModel::sibling(int row, int column, const QModelIndex &idx) const { - if (idx.column() >= sourceModel()->columnCount()) { - return index(row, column, parent(idx)); + if (row == idx.row() && column == idx.column()) { + return idx; } - return mapFromSource(sourceModel()->sibling(row, column, mapToSource(idx))); + return index(row, column, parent(idx)); } QItemSelection KExtraColumnsProxyModel::mapSelectionToSource(const QItemSelection &selection) const