From 82a35ed3f1dede556e9ab6e30b86997c4a8f0fd1 Mon Sep 17 00:00:00 2001 From: Stephen Kelly Date: Fri, 18 Dec 2009 15:13:09 +0000 Subject: Make the layout{,AboutToBe}Changed signals in the QSortFilterProxyModel match its source. Merge-request: 2266 Reviewed-by: Olivier Goffart --- src/gui/itemviews/qsortfilterproxymodel.cpp | 6 +- tests/auto/modeltest/tst_modeltest.cpp | 122 +++++++++++++++++++++++++--- 2 files changed, 115 insertions(+), 13 deletions(-) diff --git a/src/gui/itemviews/qsortfilterproxymodel.cpp b/src/gui/itemviews/qsortfilterproxymodel.cpp index 95d6bc8..646a3a1 100644 --- a/src/gui/itemviews/qsortfilterproxymodel.cpp +++ b/src/gui/itemviews/qsortfilterproxymodel.cpp @@ -1198,9 +1198,10 @@ void QSortFilterProxyModelPrivate::_q_sourceLayoutAboutToBeChanged() { Q_Q(QSortFilterProxyModel); saved_persistent_indexes.clear(); + emit q->layoutAboutToBeChanged(); if (persistent.indexes.isEmpty()) return; - emit q->layoutAboutToBeChanged(); + saved_persistent_indexes = store_persistent_indexes(); } @@ -1208,7 +1209,8 @@ void QSortFilterProxyModelPrivate::_q_sourceLayoutChanged() { Q_Q(QSortFilterProxyModel); if (saved_persistent_indexes.isEmpty()) { - q->invalidate(); + clear_mapping(); + emit q->layoutChanged(); return; } diff --git a/tests/auto/modeltest/tst_modeltest.cpp b/tests/auto/modeltest/tst_modeltest.cpp index 78aa79f..262b966 100644 --- a/tests/auto/modeltest/tst_modeltest.cpp +++ b/tests/auto/modeltest/tst_modeltest.cpp @@ -66,6 +66,7 @@ private slots: void treeWidgetModel(); void standardItemModel(); void testInsertThroughProxy(); + void moveSourceItems(); }; @@ -94,15 +95,15 @@ void tst_ModelTest::stringListModel() { QStringListModel model; QSortFilterProxyModel proxy; - + ModelTest t1(&model); ModelTest t2(&proxy); - + proxy.setSourceModel(&model); - + model.setStringList(QStringList() << "2" << "3" << "1"); model.setStringList(QStringList() << "a" << "e" << "plop" << "b" << "c" ); - + proxy.setDynamicSortFilter(true); proxy.setFilterRegExp(QRegExp("[^b]")); } @@ -112,7 +113,7 @@ void tst_ModelTest::treeWidgetModel() QTreeWidget widget; ModelTest t1(widget.model()); - + QTreeWidgetItem *root = new QTreeWidgetItem(&widget, QStringList("root")); for (int i = 0; i < 20; ++i) { new QTreeWidgetItem(root, QStringList(QString::number(i))); @@ -122,7 +123,7 @@ void tst_ModelTest::treeWidgetModel() QTreeWidgetItem *parent = new QTreeWidgetItem(&widget, QStringList("parent")); new QTreeWidgetItem(parent, QStringList("child")); widget.setItemHidden(parent, true); - + widget.sortByColumn(0); } @@ -130,19 +131,19 @@ void tst_ModelTest::standardItemModel() { QStandardItemModel model(10,10); QSortFilterProxyModel proxy; - - + + ModelTest t1(&model); ModelTest t2(&proxy); - + proxy.setSourceModel(&model); - + model.insertRows(2, 5); model.removeRows(4, 5); model.insertColumns(2, 5); model.removeColumns(4, 5); - + model.insertRows(0,5, model.index(1,1)); model.insertColumns(0,5, model.index(1,3)); } @@ -179,5 +180,104 @@ void tst_ModelTest::testInsertThroughProxy() moveCommand->doCommand(); } +/** + Makes the persistent index list publicly accessible +*/ +class AccessibleProxyModel : public QSortFilterProxyModel +{ + Q_OBJECT +public: + AccessibleProxyModel(QObject *parent = 0) : QSortFilterProxyModel(parent) {} + + QModelIndexList persistent() + { + return persistentIndexList(); + } +}; + +class ObservingObject : public QObject +{ + Q_OBJECT +public: + ObservingObject(AccessibleProxyModel *proxy, QObject *parent = 0) + : QObject(parent), + m_proxy(proxy) + { + connect(m_proxy, SIGNAL(layoutAboutToBeChanged()), SLOT(storePersistent())); + connect(m_proxy, SIGNAL(layoutChanged()), SLOT(checkPersistent())); + } + +public slots: + + void storePersistent(const QModelIndex &parent) + { + for (int row = 0; row < m_proxy->rowCount(parent); ++row) { + QModelIndex proxyIndex = m_proxy->index(row, 0, parent); + QModelIndex sourceIndex = m_proxy->mapToSource(proxyIndex); + Q_ASSERT(proxyIndex.isValid()); + Q_ASSERT(sourceIndex.isValid()); + m_persistentSourceIndexes.append(sourceIndex); + m_persistentProxyIndexes.append(proxyIndex); + if (m_proxy->hasChildren(proxyIndex)) + storePersistent(proxyIndex); + } + } + + void storePersistent() + { + m_persistentSourceIndexes.clear(); + m_persistentProxyIndexes.clear(); + Q_ASSERT(m_proxy->persistent().isEmpty()); + storePersistent(QModelIndex()); + Q_ASSERT(!m_proxy->persistent().isEmpty()); + } + + void checkPersistent() + { + for (int row = 0; row < m_persistentProxyIndexes.size(); ++row) { + QModelIndex updatedProxy = m_persistentProxyIndexes.at(row); + QModelIndex updatedSource = m_persistentSourceIndexes.at(row); + } + for (int row = 0; row < m_persistentProxyIndexes.size(); ++row) { + QModelIndex updatedProxy = m_persistentProxyIndexes.at(row); + QModelIndex updatedSource = m_persistentSourceIndexes.at(row); + QCOMPARE(m_proxy->mapToSource(updatedProxy), updatedSource); + } + } + +private: + AccessibleProxyModel *m_proxy; + QList m_persistentSourceIndexes; + QList m_persistentProxyIndexes; +}; + +void tst_ModelTest::moveSourceItems() +{ + DynamicTreeModel *model = new DynamicTreeModel(this); + AccessibleProxyModel *proxy = new AccessibleProxyModel(this); + proxy->setSourceModel(model); + + ModelInsertCommand *insertCommand = new ModelInsertCommand(model, this); + insertCommand->setStartRow(0); + insertCommand->setEndRow(2); + insertCommand->doCommand(); + + insertCommand = new ModelInsertCommand(model, this); + insertCommand->setAncestorRowNumbers(QList() << 1); + insertCommand->setStartRow(0); + insertCommand->setEndRow(2); + insertCommand->doCommand(); + + ObservingObject observer(proxy); + + ModelMoveCommand *moveCommand = new ModelMoveCommand(model, this); + moveCommand->setStartRow(0); + moveCommand->setEndRow(0); + moveCommand->setDestAncestors(QList() << 1); + moveCommand->setDestRow(0); + moveCommand->doCommand(); +} + + QTEST_MAIN(tst_ModelTest) #include "tst_modeltest.moc" -- cgit v0.12