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
wilder
David Faure 9 years ago
parent 27d4bbc79e
commit f55b0559c8
  1. 29
      src/kextracolumnsproxymodel.cpp

@ -271,6 +271,21 @@ int KExtraColumnsProxyModel::proxyColumnForExtraColumn(int extraColumn) const
void KExtraColumnsProxyModelPrivate::_ec_sourceLayoutAboutToBeChanged(const QList<QPersistentModelIndex> &sourceParents, QAbstractItemModel::LayoutChangeHint hint) void KExtraColumnsProxyModelPrivate::_ec_sourceLayoutAboutToBeChanged(const QList<QPersistentModelIndex> &sourceParents, QAbstractItemModel::LayoutChangeHint hint)
{ {
Q_Q(KExtraColumnsProxyModel); Q_Q(KExtraColumnsProxyModel);
QList<QPersistentModelIndex> 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(); const QModelIndexList persistentIndexList = q->persistentIndexList();
layoutChangePersistentIndexes.reserve(persistentIndexList.size()); layoutChangePersistentIndexes.reserve(persistentIndexList.size());
layoutChangeProxyColumns.reserve(persistentIndexList.size()); layoutChangeProxyColumns.reserve(persistentIndexList.size());
@ -287,20 +302,6 @@ void KExtraColumnsProxyModelPrivate::_ec_sourceLayoutAboutToBeChanged(const QLis
Q_ASSERT(srcPersistentIndex.isValid()); Q_ASSERT(srcPersistentIndex.isValid());
layoutChangePersistentIndexes << srcPersistentIndex; layoutChangePersistentIndexes << srcPersistentIndex;
} }
QList<QPersistentModelIndex> 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<QPersistentModelIndex> &sourceParents, QAbstractItemModel::LayoutChangeHint hint) void KExtraColumnsProxyModelPrivate::_ec_sourceLayoutChanged(const QList<QPersistentModelIndex> &sourceParents, QAbstractItemModel::LayoutChangeHint hint)

Loading…
Cancel
Save