From fdc69d0c38332184feb0e6006b773726e27169cc Mon Sep 17 00:00:00 2001 From: Stephen Kelly Date: Tue, 20 Dec 2016 22:40:22 +0000 Subject: [PATCH] Update proxies for recently realised class of bugs. Store persistent indexes for updating after emitting any signals which can invoke user code. --- src/kconcatenaterowsproxymodel.cpp | 22 +++++++++++----------- src/kdescendantsproxymodel.cpp | 4 ++-- src/kselectionproxymodel.cpp | 18 +++++++++--------- 3 files changed, 22 insertions(+), 22 deletions(-) diff --git a/src/kconcatenaterowsproxymodel.cpp b/src/kconcatenaterowsproxymodel.cpp index f3b0c10..465c09b 100644 --- a/src/kconcatenaterowsproxymodel.cpp +++ b/src/kconcatenaterowsproxymodel.cpp @@ -303,17 +303,6 @@ void KConcatenateRowsProxyModelPrivate::slotDataChanged(const QModelIndex &from, void KConcatenateRowsProxyModelPrivate::slotSourceLayoutAboutToBeChanged(const QList &sourceParents, QAbstractItemModel::LayoutChangeHint hint) { - const QModelIndexList persistentIndexList = q->persistentIndexList(); - layoutChangePersistentIndexes.reserve(persistentIndexList.size()); - - foreach (const QPersistentModelIndex &proxyPersistentIndex, persistentIndexList) { - proxyIndexes << proxyPersistentIndex; - Q_ASSERT(proxyPersistentIndex.isValid()); - const QPersistentModelIndex srcPersistentIndex = q->mapToSource(proxyPersistentIndex); - Q_ASSERT(srcPersistentIndex.isValid()); - layoutChangePersistentIndexes << srcPersistentIndex; - } - QList parents; parents.reserve(sourceParents.size()); foreach (const QPersistentModelIndex &parent, sourceParents) { @@ -327,6 +316,17 @@ void KConcatenateRowsProxyModelPrivate::slotSourceLayoutAboutToBeChanged(const Q } emit q->layoutAboutToBeChanged(parents, hint); + + const QModelIndexList persistentIndexList = q->persistentIndexList(); + layoutChangePersistentIndexes.reserve(persistentIndexList.size()); + + foreach (const QPersistentModelIndex &proxyPersistentIndex, persistentIndexList) { + proxyIndexes << proxyPersistentIndex; + Q_ASSERT(proxyPersistentIndex.isValid()); + const QPersistentModelIndex srcPersistentIndex = q->mapToSource(proxyPersistentIndex); + Q_ASSERT(srcPersistentIndex.isValid()); + layoutChangePersistentIndexes << srcPersistentIndex; + } } void KConcatenateRowsProxyModelPrivate::slotSourceLayoutChanged(const QList &sourceParents, QAbstractItemModel::LayoutChangeHint hint) diff --git a/src/kdescendantsproxymodel.cpp b/src/kdescendantsproxymodel.cpp index 810d3f1..5f758ff 100644 --- a/src/kdescendantsproxymodel.cpp +++ b/src/kdescendantsproxymodel.cpp @@ -901,6 +901,8 @@ void KDescendantsProxyModelPrivate::sourceLayoutAboutToBeChanged() return; } + q->layoutAboutToBeChanged(); + QPersistentModelIndex srcPersistentIndex; Q_FOREACH (const QPersistentModelIndex &proxyPersistentIndex, q->persistentIndexList()) { m_proxyIndexes << proxyPersistentIndex; @@ -909,8 +911,6 @@ void KDescendantsProxyModelPrivate::sourceLayoutAboutToBeChanged() Q_ASSERT(srcPersistentIndex.isValid()); m_layoutChangePersistentIndexes << srcPersistentIndex; } - - q->layoutAboutToBeChanged(); } void KDescendantsProxyModelPrivate::sourceLayoutChanged() diff --git a/src/kselectionproxymodel.cpp b/src/kselectionproxymodel.cpp index 873e974..d0ff4a1 100644 --- a/src/kselectionproxymodel.cpp +++ b/src/kselectionproxymodel.cpp @@ -767,15 +767,6 @@ void KSelectionProxyModelPrivate::sourceLayoutAboutToBeChanged() emit q->layoutAboutToBeChanged(); - QPersistentModelIndex srcPersistentIndex; - Q_FOREACH (const QPersistentModelIndex &proxyPersistentIndex, q->persistentIndexList()) { - m_proxyIndexes << proxyPersistentIndex; - Q_ASSERT(proxyPersistentIndex.isValid()); - srcPersistentIndex = q->mapToSource(proxyPersistentIndex); - Q_ASSERT(srcPersistentIndex.isValid()); - m_layoutChangePersistentIndexes << srcPersistentIndex; - } - QItemSelection selection; Q_FOREACH (const QModelIndex &rootIndex, m_rootIndexList) { // This will be optimized later. @@ -786,6 +777,15 @@ void KSelectionProxyModelPrivate::sourceLayoutAboutToBeChanged() selection = kNormalizeSelection(selection); emit q->rootSelectionAboutToBeRemoved(selection); + QPersistentModelIndex srcPersistentIndex; + Q_FOREACH (const QPersistentModelIndex &proxyPersistentIndex, q->persistentIndexList()) { + m_proxyIndexes << proxyPersistentIndex; + Q_ASSERT(proxyPersistentIndex.isValid()); + srcPersistentIndex = q->mapToSource(proxyPersistentIndex); + Q_ASSERT(srcPersistentIndex.isValid()); + m_layoutChangePersistentIndexes << srcPersistentIndex; + } + m_rootIndexList.clear(); }