From f55b0559c8b8dd8fcfeb0f811bb846b04b3c046f Mon Sep 17 00:00:00 2001 From: David Faure Date: Tue, 20 Dec 2016 11:16:35 +0100 Subject: [PATCH] KExtraColumnsProxyModel: Persist model indexes after emitting layoutChange, not before Same fix as Stephen Kelly's fix for QIdentityProxyModel in https://codereview.qt-project.org/180390 I tried to write a unittest but QStandardItemModel doesn't support moveRow, and we don't have all the infrastructure here to force emitting a layoutChange with specific parents like in the Qt unittests. This commit, added to the 3 fixes in Qt, fixes crashes when moving folders in kmail. CCMAIL: steveire@gmail.com --- src/kextracolumnsproxymodel.cpp | 29 +++++++++++++++-------------- 1 file changed, 15 insertions(+), 14 deletions(-) diff --git a/src/kextracolumnsproxymodel.cpp b/src/kextracolumnsproxymodel.cpp index 53235b8..3626d26 100644 --- a/src/kextracolumnsproxymodel.cpp +++ b/src/kextracolumnsproxymodel.cpp @@ -271,6 +271,21 @@ int KExtraColumnsProxyModel::proxyColumnForExtraColumn(int extraColumn) const void KExtraColumnsProxyModelPrivate::_ec_sourceLayoutAboutToBeChanged(const QList &sourceParents, QAbstractItemModel::LayoutChangeHint hint) { Q_Q(KExtraColumnsProxyModel); + + QList parents; + parents.reserve(sourceParents.size()); + foreach (const QPersistentModelIndex &parent, sourceParents) { + if (!parent.isValid()) { + parents << QPersistentModelIndex(); + continue; + } + const QModelIndex mappedParent = q->mapFromSource(parent); + Q_ASSERT(mappedParent.isValid()); + parents << mappedParent; + } + + emit q->layoutAboutToBeChanged(parents, hint); + const QModelIndexList persistentIndexList = q->persistentIndexList(); layoutChangePersistentIndexes.reserve(persistentIndexList.size()); layoutChangeProxyColumns.reserve(persistentIndexList.size()); @@ -287,20 +302,6 @@ void KExtraColumnsProxyModelPrivate::_ec_sourceLayoutAboutToBeChanged(const QLis Q_ASSERT(srcPersistentIndex.isValid()); layoutChangePersistentIndexes << srcPersistentIndex; } - - QList parents; - parents.reserve(sourceParents.size()); - foreach (const QPersistentModelIndex &parent, sourceParents) { - if (!parent.isValid()) { - parents << QPersistentModelIndex(); - continue; - } - const QModelIndex mappedParent = q->mapFromSource(parent); - Q_ASSERT(mappedParent.isValid()); - parents << mappedParent; - } - - emit q->layoutAboutToBeChanged(parents, hint); } void KExtraColumnsProxyModelPrivate::_ec_sourceLayoutChanged(const QList &sourceParents, QAbstractItemModel::LayoutChangeHint hint)