284void QIdentityProxyModel::setSourceModel(QAbstractItemModel* newSourceModel)
286 Q_D(QIdentityProxyModel);
288 if (newSourceModel == d->model)
296 for (
auto &c : d->m_sourceModelConnections)
297 QObject::disconnect(c);
299 QAbstractProxyModel::setSourceModel(newSourceModel);
302 auto *m = sourceModel();
303 using C = QMetaObject::Connection;
304 d->m_sourceModelConnections = std::array{
305 QObjectPrivate::connect(m, &QAbstractItemModel::rowsAboutToBeInserted, d,
306 &QIdentityProxyModelPrivate::sourceRowsAboutToBeInserted),
307 QObjectPrivate::connect(m, &QAbstractItemModel::rowsInserted, d,
308 &QIdentityProxyModelPrivate::sourceRowsInserted),
309 QObjectPrivate::connect(m, &QAbstractItemModel::rowsAboutToBeRemoved, d,
310 &QIdentityProxyModelPrivate::sourceRowsAboutToBeRemoved),
311 QObjectPrivate::connect(m, &QAbstractItemModel::rowsRemoved, d,
312 &QIdentityProxyModelPrivate::sourceRowsRemoved),
313 QObjectPrivate::connect(m, &QAbstractItemModel::rowsAboutToBeMoved, d,
314 &QIdentityProxyModelPrivate::sourceRowsAboutToBeMoved),
315 QObjectPrivate::connect(m, &QAbstractItemModel::rowsMoved, d,
316 &QIdentityProxyModelPrivate::sourceRowsMoved),
317 QObjectPrivate::connect(m, &QAbstractItemModel::columnsAboutToBeInserted, d,
318 &QIdentityProxyModelPrivate::sourceColumnsAboutToBeInserted),
319 QObjectPrivate::connect(m, &QAbstractItemModel::columnsInserted, d,
320 &QIdentityProxyModelPrivate::sourceColumnsInserted),
321 QObjectPrivate::connect(m, &QAbstractItemModel::columnsAboutToBeRemoved, d,
322 &QIdentityProxyModelPrivate::sourceColumnsAboutToBeRemoved),
323 QObjectPrivate::connect(m, &QAbstractItemModel::columnsRemoved, d,
324 &QIdentityProxyModelPrivate::sourceColumnsRemoved),
325 QObjectPrivate::connect(m, &QAbstractItemModel::columnsAboutToBeMoved, d,
326 &QIdentityProxyModelPrivate::sourceColumnsAboutToBeMoved),
327 QObjectPrivate::connect(m, &QAbstractItemModel::columnsMoved, d,
328 &QIdentityProxyModelPrivate::sourceColumnsMoved),
329 QObjectPrivate::connect(m, &QAbstractItemModel::modelAboutToBeReset, d,
330 &QIdentityProxyModelPrivate::sourceModelAboutToBeReset),
331 QObjectPrivate::connect(m, &QAbstractItemModel::modelReset, d,
332 &QIdentityProxyModelPrivate::sourceModelReset),
333 QObjectPrivate::connect(m, &QAbstractItemModel::headerDataChanged, d,
334 &QIdentityProxyModelPrivate::sourceHeaderDataChanged),
335 !d->m_handleDataChanges ? C{} :
336 QObjectPrivate::connect(m, &QAbstractItemModel::dataChanged, d,
337 &QIdentityProxyModelPrivate::sourceDataChanged),
338 !d->m_handleLayoutChanges ? C{} :
339 QObjectPrivate::connect(m, &QAbstractItemModel::layoutAboutToBeChanged, d,
340 &QIdentityProxyModelPrivate::sourceLayoutAboutToBeChanged),
341 !d->m_handleLayoutChanges ? C{} :
342 QObjectPrivate::connect(m, &QAbstractItemModel::layoutChanged, d,
343 &QIdentityProxyModelPrivate::sourceLayoutChanged),
488void QIdentityProxyModelPrivate::sourceLayoutAboutToBeChanged(
489 const QList<QPersistentModelIndex> &sourceParents, QAbstractItemModel::LayoutChangeHint hint)
491 Q_Q(QIdentityProxyModel);
493 QList<QPersistentModelIndex> parents;
494 parents.reserve(sourceParents.size());
495 for (
const QPersistentModelIndex &parent : sourceParents) {
496 if (!parent.isValid()) {
497 parents << QPersistentModelIndex();
500 const QModelIndex mappedParent = q->mapFromSource(parent);
501 Q_ASSERT(mappedParent.isValid());
502 parents << mappedParent;
505 emit q->layoutAboutToBeChanged(parents, hint);
507 const auto proxyPersistentIndexes = q->persistentIndexList();
508 for (
const QModelIndex &proxyPersistentIndex : proxyPersistentIndexes) {
509 proxyIndexes << proxyPersistentIndex;
510 Q_ASSERT(proxyPersistentIndex.isValid());
511 const QPersistentModelIndex srcPersistentIndex = q->mapToSource(proxyPersistentIndex);
512 Q_ASSERT(srcPersistentIndex.isValid());
513 layoutChangePersistentIndexes << srcPersistentIndex;
517void QIdentityProxyModelPrivate::sourceLayoutChanged(
518 const QList<QPersistentModelIndex> &sourceParents, QAbstractItemModel::LayoutChangeHint hint)
520 Q_Q(QIdentityProxyModel);
522 for (
int i = 0; i < proxyIndexes.size(); ++i) {
523 q->changePersistentIndex(proxyIndexes.at(i), q->mapFromSource(layoutChangePersistentIndexes.at(i)));
526 layoutChangePersistentIndexes.clear();
527 proxyIndexes.clear();
529 QList<QPersistentModelIndex> parents;
530 parents.reserve(sourceParents.size());
531 for (
const QPersistentModelIndex &parent : sourceParents) {
532 if (!parent.isValid()) {
533 parents << QPersistentModelIndex();
536 const QModelIndex mappedParent = q->mapFromSource(parent);
537 Q_ASSERT(mappedParent.isValid());
538 parents << mappedParent;
541 emit q->layoutChanged(parents, hint);