Update proxies for recently realised class of bugs.

Store persistent indexes for updating after emitting any signals which
can invoke user code.
wilder
Stephen Kelly 9 years ago
parent 0dbeb3fb64
commit fdc69d0c38
  1. 22
      src/kconcatenaterowsproxymodel.cpp
  2. 4
      src/kdescendantsproxymodel.cpp
  3. 18
      src/kselectionproxymodel.cpp

@ -303,17 +303,6 @@ void KConcatenateRowsProxyModelPrivate::slotDataChanged(const QModelIndex &from,
void KConcatenateRowsProxyModelPrivate::slotSourceLayoutAboutToBeChanged(const QList<QPersistentModelIndex> &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<QPersistentModelIndex> 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<QPersistentModelIndex> &sourceParents, QAbstractItemModel::LayoutChangeHint hint)

@ -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()

@ -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();
}

Loading…
Cancel
Save