summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAndreas Sturmlechner <asturm@gentoo.org>2017-04-23 15:54:19 +0200
committerAndreas Sturmlechner <asturm@gentoo.org>2017-04-23 21:07:31 +0200
commit87e6967f8b82468e077a8f2004732e2db1cbf751 (patch)
tree160d57d4bb1c65498069219e4756d4a35be8dec6 /dev-qt/qtcore/files/qtcore-5.7.1-qipm.patch
parentkde-apps: Add blockers against kde-apps/kdepim-l10n (diff)
downloadgentoo-87e6967f8b82468e077a8f2004732e2db1cbf751.tar.gz
gentoo-87e6967f8b82468e077a8f2004732e2db1cbf751.tar.bz2
gentoo-87e6967f8b82468e077a8f2004732e2db1cbf751.zip
dev-qt/qtcore: Try to fix random plasmashell crashes
Backports from Qt-5.8.0. See also: https://bugs.kde.org/show_bug.cgi?id=342763 Package-Manager: Portage-2.3.3, Repoman-2.3.1
Diffstat (limited to 'dev-qt/qtcore/files/qtcore-5.7.1-qipm.patch')
-rw-r--r--dev-qt/qtcore/files/qtcore-5.7.1-qipm.patch152
1 files changed, 152 insertions, 0 deletions
diff --git a/dev-qt/qtcore/files/qtcore-5.7.1-qipm.patch b/dev-qt/qtcore/files/qtcore-5.7.1-qipm.patch
new file mode 100644
index 000000000000..abea14588075
--- /dev/null
+++ b/dev-qt/qtcore/files/qtcore-5.7.1-qipm.patch
@@ -0,0 +1,152 @@
+From baad82d242a4d8c1af6c87faaa7f25584183fd53 Mon Sep 17 00:00:00 2001
+From: Stephen Kelly <steveire@gmail.com>
+Date: Tue, 20 Dec 2016 00:44:12 +0000
+Subject: [PATCH] QIPM: Persist model indexes after emitting layoutChange, not
+ before
+
+Callers can persist a QModelIndex which was not persisted before in a
+slot connected to the signal, and such a persisted index must be updated
+in the course of the layoutChange.
+
+Store the indexes to persist after emitting the signal.
+
+Task-number: QTBUG-32981
+Change-Id: Ibee4c0d84817d72603a03fe5b22fdeefeac0695e
+Reviewed-by: David Faure <david.faure@kdab.com>
+---
+ src/corelib/itemmodels/qidentityproxymodel.cpp | 18 ++---
+ .../tst_qidentityproxymodel.cpp | 76 ++++++++++++++++++++++
+ 2 files changed, 85 insertions(+), 9 deletions(-)
+
+diff --git a/src/corelib/itemmodels/qidentityproxymodel.cpp b/src/corelib/itemmodels/qidentityproxymodel.cpp
+index e537793..7c30679 100644
+--- a/src/corelib/itemmodels/qidentityproxymodel.cpp
++++ b/src/corelib/itemmodels/qidentityproxymodel.cpp
+@@ -496,15 +496,6 @@ void QIdentityProxyModelPrivate::_q_sourceLayoutAboutToBeChanged(const QList<QPe
+ {
+ Q_Q(QIdentityProxyModel);
+
+- const auto proxyPersistentIndexes = q->persistentIndexList();
+- for (const QPersistentModelIndex &proxyPersistentIndex : proxyPersistentIndexes) {
+- proxyIndexes << proxyPersistentIndex;
+- Q_ASSERT(proxyPersistentIndex.isValid());
+- const QPersistentModelIndex srcPersistentIndex = q->mapToSource(proxyPersistentIndex);
+- Q_ASSERT(srcPersistentIndex.isValid());
+- layoutChangePersistentIndexes << srcPersistentIndex;
+- }
+-
+ QList<QPersistentModelIndex> parents;
+ parents.reserve(sourceParents.size());
+ for (const QPersistentModelIndex &parent : sourceParents) {
+@@ -518,6 +509,15 @@ void QIdentityProxyModelPrivate::_q_sourceLayoutAboutToBeChanged(const QList<QPe
+ }
+
+ q->layoutAboutToBeChanged(parents, hint);
++
++ const auto proxyPersistentIndexes = q->persistentIndexList();
++ for (const QPersistentModelIndex &proxyPersistentIndex : proxyPersistentIndexes) {
++ proxyIndexes << proxyPersistentIndex;
++ Q_ASSERT(proxyPersistentIndex.isValid());
++ const QPersistentModelIndex srcPersistentIndex = q->mapToSource(proxyPersistentIndex);
++ Q_ASSERT(srcPersistentIndex.isValid());
++ layoutChangePersistentIndexes << srcPersistentIndex;
++ }
+ }
+
+ void QIdentityProxyModelPrivate::_q_sourceLayoutChanged(const QList<QPersistentModelIndex> &sourceParents, QAbstractItemModel::LayoutChangeHint hint)
+diff --git a/tests/auto/corelib/itemmodels/qidentityproxymodel/tst_qidentityproxymodel.cpp b/tests/auto/corelib/itemmodels/qidentityproxymodel/tst_qidentityproxymodel.cpp
+index e946f31..564b854 100644
+--- a/tests/auto/corelib/itemmodels/qidentityproxymodel/tst_qidentityproxymodel.cpp
++++ b/tests/auto/corelib/itemmodels/qidentityproxymodel/tst_qidentityproxymodel.cpp
+@@ -68,6 +68,8 @@ private slots:
+
+ void itemData();
+
++ void persistIndexOnLayoutChange();
++
+ protected:
+ void verifyIdentity(QAbstractItemModel *model, const QModelIndex &parent = QModelIndex());
+
+@@ -377,5 +379,79 @@ void tst_QIdentityProxyModel::itemData()
+ QCOMPARE(proxy.itemData(topIndex).value(Qt::DisplayRole).toString(), QStringLiteral("Monday_appended"));
+ }
+
++void dump(QAbstractItemModel* model, QString const& indent = " - ", QModelIndex const& parent = {})
++{
++ for (auto row = 0; row < model->rowCount(parent); ++row)
++ {
++ auto idx = model->index(row, 0, parent);
++ qDebug() << (indent + idx.data().toString());
++ dump(model, indent + "- ", idx);
++ }
++}
++
++void tst_QIdentityProxyModel::persistIndexOnLayoutChange()
++{
++ DynamicTreeModel model;
++
++ QList<int> ancestors;
++ for (auto i = 0; i < 3; ++i)
++ {
++ Q_UNUSED(i);
++ ModelInsertCommand insertCommand(&model);
++ insertCommand.setAncestorRowNumbers(ancestors);
++ insertCommand.setStartRow(0);
++ insertCommand.setEndRow(0);
++ insertCommand.doCommand();
++ ancestors.push_back(0);
++ }
++ ModelInsertCommand insertCommand(&model);
++ insertCommand.setAncestorRowNumbers(ancestors);
++ insertCommand.setStartRow(0);
++ insertCommand.setEndRow(1);
++ insertCommand.doCommand();
++
++ // dump(&model);
++ // " - 1"
++ // " - - 2"
++ // " - - - 3"
++ // " - - - - 4"
++ // " - - - - 5"
++
++ QIdentityProxyModel proxy;
++ proxy.setSourceModel(&model);
++
++ QPersistentModelIndex persistentIndex;
++
++ QPersistentModelIndex sourcePersistentIndex = model.match(model.index(0, 0), Qt::DisplayRole, "5", 1, Qt::MatchRecursive).first();
++
++ QCOMPARE(sourcePersistentIndex.data().toString(), QStringLiteral("5"));
++
++ bool gotLayoutAboutToBeChanged = false;
++ bool gotLayoutChanged = false;
++
++ QObject::connect(&proxy, &QAbstractItemModel::layoutAboutToBeChanged, &proxy, [&proxy, &persistentIndex, &gotLayoutAboutToBeChanged]
++ {
++ gotLayoutAboutToBeChanged = true;
++ persistentIndex = proxy.match(proxy.index(0, 0), Qt::DisplayRole, "5", 1, Qt::MatchRecursive).first();
++ });
++
++ QObject::connect(&proxy, &QAbstractItemModel::layoutChanged, &proxy, [&proxy, &persistentIndex, &sourcePersistentIndex, &gotLayoutChanged]
++ {
++ gotLayoutChanged = true;
++ QCOMPARE(QModelIndex(persistentIndex), proxy.mapFromSource(sourcePersistentIndex));
++ });
++
++ ModelChangeChildrenLayoutsCommand layoutChangeCommand(&model, 0);
++
++ layoutChangeCommand.setAncestorRowNumbers(QList<int>{0, 0, 0});
++ layoutChangeCommand.setSecondAncestorRowNumbers(QList<int>{0, 0});
++
++ layoutChangeCommand.doCommand();
++
++ QVERIFY(gotLayoutAboutToBeChanged);
++ QVERIFY(gotLayoutChanged);
++ QVERIFY(persistentIndex.isValid());
++}
++
+ QTEST_MAIN(tst_QIdentityProxyModel)
+ #include "tst_qidentityproxymodel.moc"
+--
+2.7.4
+