24 #include <QtGui/QItemSelection> 25 #include <QtCore/QStringList> 28 class KIdentityProxyModelPrivate
44 QModelIndexList proxyIndexes;
46 void _k_sourceRowsAboutToBeInserted(
const QModelIndex &parent,
int start,
int end);
47 void _k_sourceRowsInserted(
const QModelIndex &parent,
int start,
int end);
48 void _k_sourceRowsAboutToBeRemoved(
const QModelIndex &parent,
int start,
int end);
49 void _k_sourceRowsRemoved(
const QModelIndex &parent,
int start,
int end);
50 void _k_sourceRowsAboutToBeMoved(
const QModelIndex &sourceParent,
int sourceStart,
int sourceEnd,
const QModelIndex &destParent,
int dest);
51 void _k_sourceRowsMoved(
const QModelIndex &sourceParent,
int sourceStart,
int sourceEnd,
const QModelIndex &destParent,
int dest);
53 void _k_sourceColumnsAboutToBeInserted(
const QModelIndex &parent,
int start,
int end);
54 void _k_sourceColumnsInserted(
const QModelIndex &parent,
int start,
int end);
55 void _k_sourceColumnsAboutToBeRemoved(
const QModelIndex &parent,
int start,
int end);
56 void _k_sourceColumnsRemoved(
const QModelIndex &parent,
int start,
int end);
57 void _k_sourceColumnsAboutToBeMoved(
const QModelIndex &sourceParent,
int sourceStart,
int sourceEnd,
const QModelIndex &destParent,
int dest);
58 void _k_sourceColumnsMoved(
const QModelIndex &sourceParent,
int sourceStart,
int sourceEnd,
const QModelIndex &destParent,
int dest);
60 void _k_sourceDataChanged(
const QModelIndex &topLeft,
const QModelIndex &bottomRight);
61 void _k_sourceHeaderDataChanged(Qt::Orientation orientation,
int first,
int last);
63 void _k_sourceLayoutAboutToBeChanged();
64 void _k_sourceLayoutChanged();
67 void _k_sourceModelAboutToBeReset();
68 void _k_sourceModelReset();
69 void _k_sourceModelDestroyed();
152 Q_ASSERT(parent.isValid() ? parent.model() == this :
true);
153 return sourceModel()->canFetchMore(
mapToSource(parent));
163 Q_ASSERT(parent.isValid() ? parent.model() == this :
true);
164 return sourceModel()->columnCount(
mapToSource(parent));
174 Q_ASSERT(parent.isValid() ? parent.model() == this :
true);
185 Q_ASSERT(parent.isValid() ? parent.model() == this :
true);
186 return sourceModel()->dropMimeData(data, action, row, column,
mapToSource(parent));
195 return QModelIndex();
196 Q_ASSERT(parent.isValid() ? parent.model() == this :
true);
197 const QModelIndex sourceParent =
mapToSource(parent);
198 const QModelIndex sourceIndex = sourceModel()->index(row, column, sourceParent);
209 Q_ASSERT(parent.isValid() ? parent.model() == this :
true);
210 return sourceModel()->insertColumns(column, count,
mapToSource(parent));
220 Q_ASSERT(parent.isValid() ? parent.model() == this :
true);
221 return sourceModel()->insertRows(row, count,
mapToSource(parent));
229 if (!sourceModel() || !sourceIndex.isValid())
230 return QModelIndex();
232 Q_ASSERT(sourceIndex.model() == sourceModel());
233 return createIndex(sourceIndex.row(), sourceIndex.column(), sourceIndex.internalPointer());
241 QItemSelection proxySelection;
244 return proxySelection;
246 QItemSelection::const_iterator it = selection.constBegin();
247 const QItemSelection::const_iterator
end = selection.constEnd();
248 for ( ; it !=
end; ++it) {
249 Q_ASSERT(it->model() == sourceModel());
251 proxySelection.append(range);
254 return proxySelection;
262 QItemSelection sourceSelection;
265 return sourceSelection;
267 QItemSelection::const_iterator it = selection.constBegin();
268 const QItemSelection::const_iterator
end = selection.constEnd();
269 for ( ; it !=
end; ++it) {
270 Q_ASSERT(it->model() ==
this);
272 sourceSelection.append(range);
275 return sourceSelection;
278 struct SourceModelIndex
281 : r(_r), c(_c), p(_p), m(_m)
286 operator QModelIndex() {
return reinterpret_cast<QModelIndex&
>(*this); }
298 if (!sourceModel() || !proxyIndex.isValid())
299 return QModelIndex();
300 Q_ASSERT(proxyIndex.model() ==
this);
301 return SourceModelIndex(proxyIndex.row(), proxyIndex.column(), proxyIndex.internalPointer(), sourceModel());
309 Q_ASSERT(start.isValid() ? start.model() == this :
true);
311 return QModelIndexList();
313 const QModelIndexList sourceList = sourceModel()->match(
mapToSource(start), role, value, hits, flags);
314 QModelIndexList::const_iterator it = sourceList.constBegin();
315 const QModelIndexList::const_iterator
end = sourceList.constEnd();
316 QModelIndexList proxyList;
317 for ( ; it !=
end; ++it)
328 return sourceModel()->mimeTypes();
330 return QAbstractProxyModel::mimeTypes();
336 return QAbstractProxyModel::mimeData(indexes);
338 QModelIndexList proxyIndexes;
339 foreach(
const QModelIndex &
index, indexes)
342 return sourceModel()->mimeData(proxyIndexes);
352 return QModelIndex();
354 Q_ASSERT(child.isValid() ? child.model() == this :
true);
355 const QModelIndex sourceIndex =
mapToSource(child);
356 const QModelIndex sourceParent = sourceIndex.parent();
368 Q_ASSERT(parent.isValid() ? parent.model() == this :
true);
369 return sourceModel()->removeColumns(column, count,
mapToSource(parent));
380 Q_ASSERT(parent.isValid() ? parent.model() == this :
true);
381 return sourceModel()->removeRows(row, count,
mapToSource(parent));
391 Q_ASSERT(parent.isValid() ? parent.model() == this :
true);
392 return sourceModel()->rowCount(
mapToSource(parent));
403 disconnect(sourceModel, SIGNAL(rowsAboutToBeInserted(QModelIndex,
int,
int)),
404 this, SLOT(_k_sourceRowsAboutToBeInserted(QModelIndex,
int,
int)));
405 disconnect(sourceModel, SIGNAL(rowsInserted(QModelIndex,
int,
int)),
406 this, SLOT(_k_sourceRowsInserted(QModelIndex,
int,
int)));
407 disconnect(sourceModel, SIGNAL(rowsAboutToBeRemoved(QModelIndex,
int,
int)),
408 this, SLOT(_k_sourceRowsAboutToBeRemoved(QModelIndex,
int,
int)));
409 disconnect(sourceModel, SIGNAL(rowsRemoved(QModelIndex,
int,
int)),
410 this, SLOT(_k_sourceRowsRemoved(QModelIndex,
int,
int)));
411 disconnect(sourceModel, SIGNAL(rowsAboutToBeMoved(QModelIndex,
int,
int,QModelIndex,
int)),
412 this, SLOT(_k_sourceRowsAboutToBeMoved(QModelIndex,
int,
int,QModelIndex,
int)));
413 disconnect(sourceModel, SIGNAL(rowsMoved(QModelIndex,
int,
int,QModelIndex,
int)),
414 this, SLOT(_k_sourceRowsMoved(QModelIndex,
int,
int,QModelIndex,
int)));
415 disconnect(sourceModel, SIGNAL(columnsAboutToBeInserted(QModelIndex,
int,
int)),
416 this, SLOT(_k_sourceColumnsAboutToBeInserted(QModelIndex,
int,
int)));
417 disconnect(sourceModel, SIGNAL(columnsInserted(QModelIndex,
int,
int)),
418 this, SLOT(_k_sourceColumnsInserted(QModelIndex,
int,
int)));
419 disconnect(sourceModel, SIGNAL(columnsAboutToBeRemoved(QModelIndex,
int,
int)),
420 this, SLOT(_k_sourceColumnsAboutToBeRemoved(QModelIndex,
int,
int)));
421 disconnect(sourceModel, SIGNAL(columnsRemoved(QModelIndex,
int,
int)),
422 this, SLOT(_k_sourceColumnsRemoved(QModelIndex,
int,
int)));
423 disconnect(sourceModel, SIGNAL(columnsAboutToBeMoved(QModelIndex,
int,
int,QModelIndex,
int)),
424 this, SLOT(_k_sourceColumnsAboutToBeMoved(QModelIndex,
int,
int,QModelIndex,
int)));
425 disconnect(sourceModel, SIGNAL(columnsMoved(QModelIndex,
int,
int,QModelIndex,
int)),
426 this, SLOT(_k_sourceColumnsMoved(QModelIndex,
int,
int,QModelIndex,
int)));
427 disconnect(sourceModel, SIGNAL(modelAboutToBeReset()),
428 this, SLOT(_k_sourceModelAboutToBeReset()));
431 disconnect(sourceModel, SIGNAL(modelReset()),
432 this, SLOT(_k_sourceModelReset()));
433 disconnect(sourceModel, SIGNAL(dataChanged(QModelIndex,QModelIndex)),
434 this, SLOT(_k_sourceDataChanged(QModelIndex,QModelIndex)));
435 disconnect(sourceModel, SIGNAL(headerDataChanged(Qt::Orientation,
int,
int)),
436 this, SLOT(_k_sourceHeaderDataChanged(Qt::Orientation,
int,
int)));
437 disconnect(sourceModel, SIGNAL(layoutAboutToBeChanged()),
438 this, SLOT(_k_sourceLayoutAboutToBeChanged()));
439 disconnect(sourceModel, SIGNAL(layoutChanged()),
440 this, SLOT(_k_sourceLayoutChanged()));
445 disconnect(sourceModel, SIGNAL(destroyed()),
446 this, SLOT(_k_sourceModelDestroyed()));
449 QAbstractProxyModel::setSourceModel(sourceModel);
452 connect(sourceModel, SIGNAL(rowsAboutToBeInserted(QModelIndex,
int,
int)),
453 SLOT(_k_sourceRowsAboutToBeInserted(QModelIndex,
int,
int)));
454 connect(sourceModel, SIGNAL(rowsInserted(QModelIndex,
int,
int)),
455 SLOT(_k_sourceRowsInserted(QModelIndex,
int,
int)));
456 connect(sourceModel, SIGNAL(rowsAboutToBeRemoved(QModelIndex,
int,
int)),
457 SLOT(_k_sourceRowsAboutToBeRemoved(QModelIndex,
int,
int)));
458 connect(sourceModel, SIGNAL(rowsRemoved(QModelIndex,
int,
int)),
459 SLOT(_k_sourceRowsRemoved(QModelIndex,
int,
int)));
460 connect(sourceModel, SIGNAL(rowsAboutToBeMoved(QModelIndex,
int,
int,QModelIndex,
int)),
461 SLOT(_k_sourceRowsAboutToBeMoved(QModelIndex,
int,
int,QModelIndex,
int)));
462 connect(sourceModel, SIGNAL(rowsMoved(QModelIndex,
int,
int,QModelIndex,
int)),
463 SLOT(_k_sourceRowsMoved(QModelIndex,
int,
int,QModelIndex,
int)));
464 connect(sourceModel, SIGNAL(columnsAboutToBeInserted(QModelIndex,
int,
int)),
465 SLOT(_k_sourceColumnsAboutToBeInserted(QModelIndex,
int,
int)));
466 connect(sourceModel, SIGNAL(columnsInserted(QModelIndex,
int,
int)),
467 SLOT(_k_sourceColumnsInserted(QModelIndex,
int,
int)));
468 connect(sourceModel, SIGNAL(columnsAboutToBeRemoved(QModelIndex,
int,
int)),
469 SLOT(_k_sourceColumnsAboutToBeRemoved(QModelIndex,
int,
int)));
470 connect(sourceModel, SIGNAL(columnsRemoved(QModelIndex,
int,
int)),
471 SLOT(_k_sourceColumnsRemoved(QModelIndex,
int,
int)));
472 connect(sourceModel, SIGNAL(columnsAboutToBeMoved(QModelIndex,
int,
int,QModelIndex,
int)),
473 SLOT(_k_sourceColumnsAboutToBeMoved(QModelIndex,
int,
int,QModelIndex,
int)));
474 connect(sourceModel, SIGNAL(columnsMoved(QModelIndex,
int,
int,QModelIndex,
int)),
475 SLOT(_k_sourceColumnsMoved(QModelIndex,
int,
int,QModelIndex,
int)));
476 connect(sourceModel, SIGNAL(modelAboutToBeReset()),
477 SLOT(_k_sourceModelAboutToBeReset()));
480 connect(sourceModel, SIGNAL(modelReset()),
481 SLOT(_k_sourceModelReset()));
482 connect(sourceModel, SIGNAL(dataChanged(QModelIndex,QModelIndex)),
483 SLOT(_k_sourceDataChanged(QModelIndex,QModelIndex)));
484 connect(sourceModel, SIGNAL(headerDataChanged(Qt::Orientation,
int,
int)),
485 SLOT(_k_sourceHeaderDataChanged(Qt::Orientation,
int,
int)));
486 connect(sourceModel, SIGNAL(layoutAboutToBeChanged()),
487 SLOT(_k_sourceLayoutAboutToBeChanged()));
488 connect(sourceModel, SIGNAL(layoutChanged()),
489 SLOT(_k_sourceLayoutChanged()));
495 connect(sourceModel, SIGNAL(destroyed()),
496 SLOT(_k_sourceModelDestroyed()));
505 return sourceModel()->supportedDropActions();
507 return QAbstractProxyModel::supportedDropActions();
510 void KIdentityProxyModelPrivate::_k_sourceColumnsAboutToBeInserted(
const QModelIndex &
parent,
int start,
int end)
513 Q_ASSERT(
parent.isValid() ?
parent.model() == q->sourceModel() :
true);
514 q->beginInsertColumns(q->mapFromSource(
parent), start,
end);
517 void KIdentityProxyModelPrivate::_k_sourceColumnsAboutToBeMoved(
const QModelIndex &sourceParent,
int sourceStart,
int sourceEnd,
const QModelIndex &destParent,
int dest)
520 Q_ASSERT(sourceParent.isValid() ? sourceParent.model() == q->sourceModel() :
true);
521 Q_ASSERT(destParent.isValid() ? destParent.model() == q->sourceModel() :
true);
522 q->beginMoveColumns(q->mapFromSource(sourceParent), sourceStart, sourceEnd, q->mapFromSource(destParent), dest);
525 void KIdentityProxyModelPrivate::_k_sourceColumnsAboutToBeRemoved(
const QModelIndex &
parent,
int start,
int end)
528 Q_ASSERT(
parent.isValid() ?
parent.model() == q->sourceModel() :
true);
529 q->beginRemoveColumns(q->mapFromSource(
parent), start,
end);
532 void KIdentityProxyModelPrivate::_k_sourceColumnsInserted(
const QModelIndex &
parent,
int start,
int end)
535 Q_ASSERT(
parent.isValid() ?
parent.model() == q->sourceModel() :
true);
539 q->endInsertColumns();
542 void KIdentityProxyModelPrivate::_k_sourceColumnsMoved(
const QModelIndex &sourceParent,
int sourceStart,
int sourceEnd,
const QModelIndex &destParent,
int dest)
545 Q_ASSERT(sourceParent.isValid() ? sourceParent.model() == q->sourceModel() :
true);
546 Q_ASSERT(destParent.isValid() ? destParent.model() == q->sourceModel() :
true);
547 Q_UNUSED(sourceParent)
548 Q_UNUSED(sourceStart)
555 void KIdentityProxyModelPrivate::_k_sourceColumnsRemoved(
const QModelIndex &
parent,
int start,
int end)
558 Q_ASSERT(
parent.isValid() ?
parent.model() == q->sourceModel() :
true);
562 q->endRemoveColumns();
565 void KIdentityProxyModelPrivate::_k_sourceDataChanged(
const QModelIndex &topLeft,
const QModelIndex &bottomRight)
568 Q_ASSERT(topLeft.model() == q->sourceModel());
569 Q_ASSERT(bottomRight.model() == q->sourceModel());
570 q->dataChanged(q->mapFromSource(topLeft), q->mapFromSource(bottomRight));
573 void KIdentityProxyModelPrivate::_k_sourceHeaderDataChanged(Qt::Orientation orientation,
int first,
int last)
576 q->headerDataChanged(orientation, first, last);
579 void KIdentityProxyModelPrivate::_k_sourceLayoutAboutToBeChanged()
586 q->layoutAboutToBeChanged();
588 Q_FOREACH(
const QModelIndex &proxyPersistentIndex, q->persistentIndexList()) {
589 Q_ASSERT(proxyPersistentIndex.isValid());
590 const QPersistentModelIndex srcPersistentIndex = q->mapToSource(proxyPersistentIndex);
591 if (!srcPersistentIndex.isValid())
593 proxyIndexes << proxyPersistentIndex;
594 layoutChangePersistentIndexes << srcPersistentIndex;
598 void KIdentityProxyModelPrivate::_k_sourceLayoutChanged()
605 for (
int i = 0; i < proxyIndexes.size(); ++i) {
606 const QModelIndex oldProxyIndex = proxyIndexes.at(i);
607 const QModelIndex newProxyIndex = q->mapFromSource(layoutChangePersistentIndexes.at(i));
608 if (oldProxyIndex != newProxyIndex)
609 q->changePersistentIndex(oldProxyIndex, newProxyIndex);
612 layoutChangePersistentIndexes.clear();
613 proxyIndexes.clear();
618 #if 0 // this code was for the stuff that never went into Qt-4.8. We are keeping it for the Qt5 QIPM sourceLayoutChanged(QModelIndex) future code. 619 void KIdentityProxyModelPrivate::_k_sourceChildrenLayoutsAboutToBeChanged(
const QModelIndex &parent1,
const QModelIndex &parent2)
622 Q_ASSERT(parent1.isValid() ? parent1.model() == q->sourceModel() :
true);
623 Q_ASSERT(parent2.isValid() ? parent2.model() == q->sourceModel() :
true);
626 ignoreNextLayoutAboutToBeChanged =
true;
628 const QModelIndex proxyParent1 = q->mapFromSource(parent1);
629 const QModelIndex proxyParent2 = q->mapFromSource(parent2);
631 emit q->layoutAboutToBeChanged();
633 if (q->persistentIndexList().isEmpty())
636 Q_FOREACH(
const QModelIndex &proxyPersistentIndex, q->persistentIndexList()) {
637 const QPersistentModelIndex srcPersistentIndex = q->mapToSource(proxyPersistentIndex);
638 Q_ASSERT(proxyPersistentIndex.isValid());
639 Q_ASSERT(srcPersistentIndex.isValid());
640 const QModelIndex idxParent = srcPersistentIndex.parent();
641 if (idxParent != parent1 && idxParent != parent2)
643 proxyIndexes << proxyPersistentIndex;
644 layoutChangePersistentIndexes << srcPersistentIndex;
648 void KIdentityProxyModelPrivate::_k_sourceChildrenLayoutsChanged(
const QModelIndex &parent1,
const QModelIndex &parent2)
651 Q_ASSERT(parent1.isValid() ? parent1.model() == q->sourceModel() :
true);
652 Q_ASSERT(parent2.isValid() ? parent2.model() == q->sourceModel() :
true);
654 ignoreNextLayoutChanged =
true;
656 QModelIndexList oldList, newList;
657 for(
int i = 0; i < layoutChangePersistentIndexes.size(); ++i) {
658 const QModelIndex srcIdx = layoutChangePersistentIndexes.at(i);
659 const QModelIndex oldProxyIdx = proxyIndexes.at(i);
660 oldList << oldProxyIdx;
661 newList << q->mapFromSource(srcIdx);
663 q->changePersistentIndexList(oldList, newList);
664 layoutChangePersistentIndexes.clear();
665 proxyIndexes.clear();
667 const QModelIndex proxyParent1 = q->mapFromSource(parent1);
668 const QModelIndex proxyParent2 = q->mapFromSource(parent2);
670 emit q->layoutChanged();
674 void KIdentityProxyModelPrivate::_k_sourceModelAboutToBeReset()
677 q->beginResetModel();
680 void KIdentityProxyModelPrivate::_k_sourceModelReset()
686 void KIdentityProxyModelPrivate::_k_sourceModelDestroyed()
692 void KIdentityProxyModelPrivate::_k_sourceRowsAboutToBeInserted(
const QModelIndex &
parent,
int start,
int end)
695 Q_ASSERT(
parent.isValid() ?
parent.model() == q->sourceModel() :
true);
696 q->beginInsertRows(q->mapFromSource(
parent), start,
end);
699 void KIdentityProxyModelPrivate::_k_sourceRowsAboutToBeMoved(
const QModelIndex &sourceParent,
int sourceStart,
int sourceEnd,
const QModelIndex &destParent,
int dest)
702 Q_ASSERT(sourceParent.isValid() ? sourceParent.model() == q->sourceModel() :
true);
703 Q_ASSERT(destParent.isValid() ? destParent.model() == q->sourceModel() :
true);
704 q->beginMoveRows(q->mapFromSource(sourceParent), sourceStart, sourceEnd, q->mapFromSource(destParent), dest);
707 void KIdentityProxyModelPrivate::_k_sourceRowsAboutToBeRemoved(
const QModelIndex &
parent,
int start,
int end)
710 Q_ASSERT(
parent.isValid() ?
parent.model() == q->sourceModel() :
true);
711 q->beginRemoveRows(q->mapFromSource(
parent), start,
end);
714 void KIdentityProxyModelPrivate::_k_sourceRowsInserted(
const QModelIndex &
parent,
int start,
int end)
717 Q_ASSERT(
parent.isValid() ?
parent.model() == q->sourceModel() :
true);
724 void KIdentityProxyModelPrivate::_k_sourceRowsMoved(
const QModelIndex &sourceParent,
int sourceStart,
int sourceEnd,
const QModelIndex &destParent,
int dest)
727 Q_ASSERT(sourceParent.isValid() ? sourceParent.model() == q->sourceModel() :
true);
728 Q_ASSERT(destParent.isValid() ? destParent.model() == q->sourceModel() :
true);
729 Q_UNUSED(sourceParent)
730 Q_UNUSED(sourceStart)
737 void KIdentityProxyModelPrivate::_k_sourceRowsRemoved(
const QModelIndex &
parent,
int start,
int end)
740 Q_ASSERT(
parent.isValid() ?
parent.model() == q->sourceModel() :
true);
757 #include "kidentityproxymodel.moc" int rowCount(const QModelIndex &parent=QModelIndex()) const
bool removeRows(int row, int count, const QModelIndex &parent=QModelIndex())
virtual void resetInternalData()
The KIdentityProxyModel class proxies its source model unmodified.
bool insertColumns(int column, int count, const QModelIndex &parent=QModelIndex())
virtual bool canFetchMore(const QModelIndex &parent) const
virtual void fetchMore(const QModelIndex &parent)
virtual QMimeData * mimeData(const QModelIndexList &indexes) const
virtual QStringList mimeTypes() const
virtual ~KIdentityProxyModel()
int columnCount(const QModelIndex &parent=QModelIndex()) const
QItemSelection mapSelectionFromSource(const QItemSelection &selection) const
QModelIndex index(int row, int column, const QModelIndex &parent=QModelIndex()) const
virtual Qt::DropActions supportedDropActions() const
QModelIndex mapToSource(const QModelIndex &proxyIndex) const
QModelIndex mapFromSource(const QModelIndex &sourceIndex) const
bool removeColumns(int column, int count, const QModelIndex &parent=QModelIndex())
void setSourceModel(QAbstractItemModel *sourceModel)
QItemSelection mapSelectionToSource(const QItemSelection &selection) const
KIdentityProxyModel(QObject *parent=0)
KIdentityProxyModelPrivate *const d_ptr
bool dropMimeData(const QMimeData *data, Qt::DropAction action, int row, int column, const QModelIndex &parent)
QModelIndexList match(const QModelIndex &start, int role, const QVariant &value, int hits=1, Qt::MatchFlags flags=Qt::MatchFlags(Qt::MatchStartsWith|Qt::MatchWrap)) const
const KShortcut & end()
Goto end of the document.
bool insertRows(int row, int count, const QModelIndex &parent=QModelIndex())
QModelIndex parent(const QModelIndex &child) const