24#include <QtGui/QItemSelection>
25#include <QtCore/QStringList>
28class 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));
197 return sourceModel()->headerData(section, orientation, role);
206 return QModelIndex();
207 Q_ASSERT(parent.isValid() ? parent.model() ==
this :
true);
208 const QModelIndex sourceParent =
mapToSource(parent);
209 const QModelIndex sourceIndex = sourceModel()->index(row, column, sourceParent);
220 Q_ASSERT(parent.isValid() ? parent.model() ==
this :
true);
221 return sourceModel()->insertColumns(column, count,
mapToSource(parent));
231 Q_ASSERT(parent.isValid() ? parent.model() ==
this :
true);
232 return sourceModel()->insertRows(row, count,
mapToSource(parent));
240 if (!sourceModel() || !sourceIndex.isValid())
241 return QModelIndex();
243 Q_ASSERT(sourceIndex.model() == sourceModel());
244 return createIndex(sourceIndex.row(), sourceIndex.column(), sourceIndex.internalPointer());
252 QItemSelection proxySelection;
255 return proxySelection;
257 QItemSelection::const_iterator it = selection.constBegin();
258 const QItemSelection::const_iterator end = selection.constEnd();
259 for ( ; it != end; ++it) {
260 Q_ASSERT(it->model() == sourceModel());
262 proxySelection.append(range);
265 return proxySelection;
273 QItemSelection sourceSelection;
276 return sourceSelection;
278 QItemSelection::const_iterator it = selection.constBegin();
279 const QItemSelection::const_iterator end = selection.constEnd();
280 for ( ; it != end; ++it) {
281 Q_ASSERT(it->model() ==
this);
283 sourceSelection.append(range);
286 return sourceSelection;
289struct SourceModelIndex
292 : r(_r), c(_c), p(_p), m(_m)
297 operator QModelIndex() {
return reinterpret_cast<QModelIndex&
>(*this); }
309 if (!sourceModel() || !proxyIndex.isValid())
310 return QModelIndex();
311 Q_ASSERT(proxyIndex.model() ==
this);
312 return SourceModelIndex(proxyIndex.row(), proxyIndex.column(), proxyIndex.internalPointer(), sourceModel());
320 Q_ASSERT(start.isValid() ? start.model() ==
this :
true);
322 return QModelIndexList();
324 const QModelIndexList sourceList = sourceModel()->match(
mapToSource(start), role, value, hits, flags);
325 QModelIndexList::const_iterator it = sourceList.constBegin();
326 const QModelIndexList::const_iterator end = sourceList.constEnd();
327 QModelIndexList proxyList;
328 for ( ; it != end; ++it)
339 return sourceModel()->mimeTypes();
341 return QAbstractProxyModel::mimeTypes();
347 return QAbstractProxyModel::mimeData(indexes);
349 QModelIndexList proxyIndexes;
350 foreach(
const QModelIndex &
index, indexes)
353 return sourceModel()->mimeData(proxyIndexes);
363 return QModelIndex();
365 Q_ASSERT(child.isValid() ? child.model() ==
this :
true);
366 const QModelIndex sourceIndex =
mapToSource(child);
367 const QModelIndex sourceParent = sourceIndex.parent();
379 Q_ASSERT(parent.isValid() ? parent.model() ==
this :
true);
380 return sourceModel()->removeColumns(column, count,
mapToSource(parent));
391 Q_ASSERT(parent.isValid() ? parent.model() ==
this :
true);
392 return sourceModel()->removeRows(row, count,
mapToSource(parent));
402 Q_ASSERT(parent.isValid() ? parent.model() ==
this :
true);
403 return sourceModel()->rowCount(
mapToSource(parent));
414 disconnect(sourceModel, SIGNAL(rowsAboutToBeInserted(QModelIndex,
int,
int)),
415 this, SLOT(_k_sourceRowsAboutToBeInserted(QModelIndex,
int,
int)));
416 disconnect(sourceModel, SIGNAL(rowsInserted(QModelIndex,
int,
int)),
417 this, SLOT(_k_sourceRowsInserted(QModelIndex,
int,
int)));
418 disconnect(sourceModel, SIGNAL(rowsAboutToBeRemoved(QModelIndex,
int,
int)),
419 this, SLOT(_k_sourceRowsAboutToBeRemoved(QModelIndex,
int,
int)));
420 disconnect(sourceModel, SIGNAL(rowsRemoved(QModelIndex,
int,
int)),
421 this, SLOT(_k_sourceRowsRemoved(QModelIndex,
int,
int)));
422 disconnect(sourceModel, SIGNAL(rowsAboutToBeMoved(QModelIndex,
int,
int,QModelIndex,
int)),
423 this, SLOT(_k_sourceRowsAboutToBeMoved(QModelIndex,
int,
int,QModelIndex,
int)));
424 disconnect(sourceModel, SIGNAL(rowsMoved(QModelIndex,
int,
int,QModelIndex,
int)),
425 this, SLOT(_k_sourceRowsMoved(QModelIndex,
int,
int,QModelIndex,
int)));
426 disconnect(sourceModel, SIGNAL(columnsAboutToBeInserted(QModelIndex,
int,
int)),
427 this, SLOT(_k_sourceColumnsAboutToBeInserted(QModelIndex,
int,
int)));
428 disconnect(sourceModel, SIGNAL(columnsInserted(QModelIndex,
int,
int)),
429 this, SLOT(_k_sourceColumnsInserted(QModelIndex,
int,
int)));
430 disconnect(sourceModel, SIGNAL(columnsAboutToBeRemoved(QModelIndex,
int,
int)),
431 this, SLOT(_k_sourceColumnsAboutToBeRemoved(QModelIndex,
int,
int)));
432 disconnect(sourceModel, SIGNAL(columnsRemoved(QModelIndex,
int,
int)),
433 this, SLOT(_k_sourceColumnsRemoved(QModelIndex,
int,
int)));
434 disconnect(sourceModel, SIGNAL(columnsAboutToBeMoved(QModelIndex,
int,
int,QModelIndex,
int)),
435 this, SLOT(_k_sourceColumnsAboutToBeMoved(QModelIndex,
int,
int,QModelIndex,
int)));
436 disconnect(sourceModel, SIGNAL(columnsMoved(QModelIndex,
int,
int,QModelIndex,
int)),
437 this, SLOT(_k_sourceColumnsMoved(QModelIndex,
int,
int,QModelIndex,
int)));
438 disconnect(sourceModel, SIGNAL(modelAboutToBeReset()),
439 this, SLOT(_k_sourceModelAboutToBeReset()));
442 disconnect(sourceModel, SIGNAL(modelReset()),
443 this, SLOT(_k_sourceModelReset()));
444 disconnect(sourceModel, SIGNAL(dataChanged(QModelIndex,QModelIndex)),
445 this, SLOT(_k_sourceDataChanged(QModelIndex,QModelIndex)));
446 disconnect(sourceModel, SIGNAL(headerDataChanged(Qt::Orientation,
int,
int)),
447 this, SLOT(_k_sourceHeaderDataChanged(Qt::Orientation,
int,
int)));
448 disconnect(sourceModel, SIGNAL(layoutAboutToBeChanged()),
449 this, SLOT(_k_sourceLayoutAboutToBeChanged()));
450 disconnect(sourceModel, SIGNAL(layoutChanged()),
451 this, SLOT(_k_sourceLayoutChanged()));
456 disconnect(sourceModel, SIGNAL(destroyed()),
457 this, SLOT(_k_sourceModelDestroyed()));
460 QAbstractProxyModel::setSourceModel(sourceModel);
463 connect(sourceModel, SIGNAL(rowsAboutToBeInserted(QModelIndex,
int,
int)),
464 SLOT(_k_sourceRowsAboutToBeInserted(QModelIndex,
int,
int)));
465 connect(sourceModel, SIGNAL(rowsInserted(QModelIndex,
int,
int)),
466 SLOT(_k_sourceRowsInserted(QModelIndex,
int,
int)));
467 connect(sourceModel, SIGNAL(rowsAboutToBeRemoved(QModelIndex,
int,
int)),
468 SLOT(_k_sourceRowsAboutToBeRemoved(QModelIndex,
int,
int)));
469 connect(sourceModel, SIGNAL(rowsRemoved(QModelIndex,
int,
int)),
470 SLOT(_k_sourceRowsRemoved(QModelIndex,
int,
int)));
471 connect(sourceModel, SIGNAL(rowsAboutToBeMoved(QModelIndex,
int,
int,QModelIndex,
int)),
472 SLOT(_k_sourceRowsAboutToBeMoved(QModelIndex,
int,
int,QModelIndex,
int)));
473 connect(sourceModel, SIGNAL(rowsMoved(QModelIndex,
int,
int,QModelIndex,
int)),
474 SLOT(_k_sourceRowsMoved(QModelIndex,
int,
int,QModelIndex,
int)));
475 connect(sourceModel, SIGNAL(columnsAboutToBeInserted(QModelIndex,
int,
int)),
476 SLOT(_k_sourceColumnsAboutToBeInserted(QModelIndex,
int,
int)));
477 connect(sourceModel, SIGNAL(columnsInserted(QModelIndex,
int,
int)),
478 SLOT(_k_sourceColumnsInserted(QModelIndex,
int,
int)));
479 connect(sourceModel, SIGNAL(columnsAboutToBeRemoved(QModelIndex,
int,
int)),
480 SLOT(_k_sourceColumnsAboutToBeRemoved(QModelIndex,
int,
int)));
481 connect(sourceModel, SIGNAL(columnsRemoved(QModelIndex,
int,
int)),
482 SLOT(_k_sourceColumnsRemoved(QModelIndex,
int,
int)));
483 connect(sourceModel, SIGNAL(columnsAboutToBeMoved(QModelIndex,
int,
int,QModelIndex,
int)),
484 SLOT(_k_sourceColumnsAboutToBeMoved(QModelIndex,
int,
int,QModelIndex,
int)));
485 connect(sourceModel, SIGNAL(columnsMoved(QModelIndex,
int,
int,QModelIndex,
int)),
486 SLOT(_k_sourceColumnsMoved(QModelIndex,
int,
int,QModelIndex,
int)));
487 connect(sourceModel, SIGNAL(modelAboutToBeReset()),
488 SLOT(_k_sourceModelAboutToBeReset()));
491 connect(sourceModel, SIGNAL(modelReset()),
492 SLOT(_k_sourceModelReset()));
493 connect(sourceModel, SIGNAL(dataChanged(QModelIndex,QModelIndex)),
494 SLOT(_k_sourceDataChanged(QModelIndex,QModelIndex)));
495 connect(sourceModel, SIGNAL(headerDataChanged(Qt::Orientation,
int,
int)),
496 SLOT(_k_sourceHeaderDataChanged(Qt::Orientation,
int,
int)));
497 connect(sourceModel, SIGNAL(layoutAboutToBeChanged()),
498 SLOT(_k_sourceLayoutAboutToBeChanged()));
499 connect(sourceModel, SIGNAL(layoutChanged()),
500 SLOT(_k_sourceLayoutChanged()));
506 connect(sourceModel, SIGNAL(destroyed()),
507 SLOT(_k_sourceModelDestroyed()));
516 return sourceModel()->supportedDropActions();
518 return QAbstractProxyModel::supportedDropActions();
521void KIdentityProxyModelPrivate::_k_sourceColumnsAboutToBeInserted(
const QModelIndex &parent,
int start,
int end)
524 Q_ASSERT(parent.isValid() ? parent.model() == q->sourceModel() :
true);
525 q->beginInsertColumns(q->mapFromSource(parent), start, end);
528void KIdentityProxyModelPrivate::_k_sourceColumnsAboutToBeMoved(
const QModelIndex &sourceParent,
int sourceStart,
int sourceEnd,
const QModelIndex &destParent,
int dest)
531 Q_ASSERT(sourceParent.isValid() ? sourceParent.model() == q->sourceModel() :
true);
532 Q_ASSERT(destParent.isValid() ? destParent.model() == q->sourceModel() :
true);
533 q->beginMoveColumns(q->mapFromSource(sourceParent), sourceStart, sourceEnd, q->mapFromSource(destParent), dest);
536void KIdentityProxyModelPrivate::_k_sourceColumnsAboutToBeRemoved(
const QModelIndex &parent,
int start,
int end)
539 Q_ASSERT(parent.isValid() ? parent.model() == q->sourceModel() :
true);
540 q->beginRemoveColumns(q->mapFromSource(parent), start, end);
543void KIdentityProxyModelPrivate::_k_sourceColumnsInserted(
const QModelIndex &parent,
int start,
int end)
546 Q_ASSERT(parent.isValid() ? parent.model() == q->sourceModel() :
true);
550 q->endInsertColumns();
553void KIdentityProxyModelPrivate::_k_sourceColumnsMoved(
const QModelIndex &sourceParent,
int sourceStart,
int sourceEnd,
const QModelIndex &destParent,
int dest)
556 Q_ASSERT(sourceParent.isValid() ? sourceParent.model() == q->sourceModel() :
true);
557 Q_ASSERT(destParent.isValid() ? destParent.model() == q->sourceModel() :
true);
558 Q_UNUSED(sourceParent)
559 Q_UNUSED(sourceStart)
566void KIdentityProxyModelPrivate::_k_sourceColumnsRemoved(
const QModelIndex &parent,
int start,
int end)
569 Q_ASSERT(parent.isValid() ? parent.model() == q->sourceModel() :
true);
573 q->endRemoveColumns();
576void KIdentityProxyModelPrivate::_k_sourceDataChanged(
const QModelIndex &topLeft,
const QModelIndex &bottomRight)
579 Q_ASSERT(topLeft.model() == q->sourceModel());
580 Q_ASSERT(bottomRight.model() == q->sourceModel());
581 q->dataChanged(q->mapFromSource(topLeft), q->mapFromSource(bottomRight));
584void KIdentityProxyModelPrivate::_k_sourceHeaderDataChanged(Qt::Orientation orientation,
int first,
int last)
587 q->headerDataChanged(orientation, first, last);
590void KIdentityProxyModelPrivate::_k_sourceLayoutAboutToBeChanged()
597 q->layoutAboutToBeChanged();
599 Q_FOREACH(
const QModelIndex &proxyPersistentIndex, q->persistentIndexList()) {
600 Q_ASSERT(proxyPersistentIndex.isValid());
601 const QPersistentModelIndex srcPersistentIndex = q->mapToSource(proxyPersistentIndex);
602 if (!srcPersistentIndex.isValid())
604 proxyIndexes << proxyPersistentIndex;
605 layoutChangePersistentIndexes << srcPersistentIndex;
609void KIdentityProxyModelPrivate::_k_sourceLayoutChanged()
616 for (
int i = 0; i < proxyIndexes.size(); ++i) {
617 const QModelIndex oldProxyIndex = proxyIndexes.at(i);
618 const QModelIndex newProxyIndex = q->mapFromSource(layoutChangePersistentIndexes.at(i));
619 if (oldProxyIndex != newProxyIndex)
620 q->changePersistentIndex(oldProxyIndex, newProxyIndex);
623 layoutChangePersistentIndexes.clear();
624 proxyIndexes.clear();
630void KIdentityProxyModelPrivate::_k_sourceChildrenLayoutsAboutToBeChanged(
const QModelIndex &parent1,
const QModelIndex &parent2)
633 Q_ASSERT(parent1.isValid() ? parent1.model() == q->sourceModel() :
true);
634 Q_ASSERT(parent2.isValid() ? parent2.model() == q->sourceModel() :
true);
637 ignoreNextLayoutAboutToBeChanged =
true;
639 const QModelIndex proxyParent1 = q->mapFromSource(parent1);
640 const QModelIndex proxyParent2 = q->mapFromSource(parent2);
642 emit q->layoutAboutToBeChanged();
644 if (q->persistentIndexList().isEmpty())
647 Q_FOREACH(
const QModelIndex &proxyPersistentIndex, q->persistentIndexList()) {
648 const QPersistentModelIndex srcPersistentIndex = q->mapToSource(proxyPersistentIndex);
649 Q_ASSERT(proxyPersistentIndex.isValid());
650 Q_ASSERT(srcPersistentIndex.isValid());
651 const QModelIndex idxParent = srcPersistentIndex.parent();
652 if (idxParent != parent1 && idxParent != parent2)
654 proxyIndexes << proxyPersistentIndex;
655 layoutChangePersistentIndexes << srcPersistentIndex;
659void KIdentityProxyModelPrivate::_k_sourceChildrenLayoutsChanged(
const QModelIndex &parent1,
const QModelIndex &parent2)
662 Q_ASSERT(parent1.isValid() ? parent1.model() == q->sourceModel() :
true);
663 Q_ASSERT(parent2.isValid() ? parent2.model() == q->sourceModel() :
true);
665 ignoreNextLayoutChanged =
true;
667 QModelIndexList oldList, newList;
668 for(
int i = 0; i < layoutChangePersistentIndexes.size(); ++i) {
669 const QModelIndex srcIdx = layoutChangePersistentIndexes.at(i);
670 const QModelIndex oldProxyIdx = proxyIndexes.at(i);
671 oldList << oldProxyIdx;
672 newList << q->mapFromSource(srcIdx);
674 q->changePersistentIndexList(oldList, newList);
675 layoutChangePersistentIndexes.clear();
676 proxyIndexes.clear();
678 const QModelIndex proxyParent1 = q->mapFromSource(parent1);
679 const QModelIndex proxyParent2 = q->mapFromSource(parent2);
681 emit q->layoutChanged();
685void KIdentityProxyModelPrivate::_k_sourceModelAboutToBeReset()
688 q->beginResetModel();
691void KIdentityProxyModelPrivate::_k_sourceModelReset()
697void KIdentityProxyModelPrivate::_k_sourceModelDestroyed()
703void KIdentityProxyModelPrivate::_k_sourceRowsAboutToBeInserted(
const QModelIndex &parent,
int start,
int end)
706 Q_ASSERT(parent.isValid() ? parent.model() == q->sourceModel() :
true);
707 q->beginInsertRows(q->mapFromSource(parent), start, end);
710void KIdentityProxyModelPrivate::_k_sourceRowsAboutToBeMoved(
const QModelIndex &sourceParent,
int sourceStart,
int sourceEnd,
const QModelIndex &destParent,
int dest)
713 Q_ASSERT(sourceParent.isValid() ? sourceParent.model() == q->sourceModel() :
true);
714 Q_ASSERT(destParent.isValid() ? destParent.model() == q->sourceModel() :
true);
715 q->beginMoveRows(q->mapFromSource(sourceParent), sourceStart, sourceEnd, q->mapFromSource(destParent), dest);
718void KIdentityProxyModelPrivate::_k_sourceRowsAboutToBeRemoved(
const QModelIndex &parent,
int start,
int end)
721 Q_ASSERT(parent.isValid() ? parent.model() == q->sourceModel() :
true);
722 q->beginRemoveRows(q->mapFromSource(parent), start, end);
725void KIdentityProxyModelPrivate::_k_sourceRowsInserted(
const QModelIndex &parent,
int start,
int end)
728 Q_ASSERT(parent.isValid() ? parent.model() == q->sourceModel() :
true);
735void KIdentityProxyModelPrivate::_k_sourceRowsMoved(
const QModelIndex &sourceParent,
int sourceStart,
int sourceEnd,
const QModelIndex &destParent,
int dest)
738 Q_ASSERT(sourceParent.isValid() ? sourceParent.model() == q->sourceModel() :
true);
739 Q_ASSERT(destParent.isValid() ? destParent.model() == q->sourceModel() :
true);
740 Q_UNUSED(sourceParent)
741 Q_UNUSED(sourceStart)
748void KIdentityProxyModelPrivate::_k_sourceRowsRemoved(
const QModelIndex &parent,
int start,
int end)
751 Q_ASSERT(parent.isValid() ? parent.model() == q->sourceModel() :
true);
768#include "kidentityproxymodel.moc"
The KIdentityProxyModel class proxies its source model unmodified.
virtual void resetInternalData()
virtual ~KIdentityProxyModel()
bool insertRows(int row, int count, const QModelIndex &parent=QModelIndex())
QModelIndex parent(const QModelIndex &child) const
virtual QMimeData * mimeData(const QModelIndexList &indexes) const
virtual bool canFetchMore(const QModelIndex &parent) const
QModelIndex mapFromSource(const QModelIndex &sourceIndex) const
bool removeColumns(int column, int count, const QModelIndex &parent=QModelIndex())
QModelIndex mapToSource(const QModelIndex &proxyIndex) const
virtual void fetchMore(const QModelIndex &parent)
bool insertColumns(int column, int count, const QModelIndex &parent=QModelIndex())
void setSourceModel(QAbstractItemModel *sourceModel)
bool removeRows(int row, int count, const QModelIndex &parent=QModelIndex())
QItemSelection mapSelectionToSource(const QItemSelection &selection) const
virtual QStringList mimeTypes() const
virtual Qt::DropActions supportedDropActions() const
QModelIndexList match(const QModelIndex &start, int role, const QVariant &value, int hits=1, Qt::MatchFlags flags=Qt::MatchFlags(Qt::MatchStartsWith|Qt::MatchWrap)) const
QModelIndex index(int row, int column, const QModelIndex &parent=QModelIndex()) const
QVariant headerData(int section, Qt::Orientation orientation, int role) const
KIdentityProxyModel(QObject *parent=0)
KIdentityProxyModelPrivate *const d_ptr
QItemSelection mapSelectionFromSource(const QItemSelection &selection) const
bool dropMimeData(const QMimeData *data, Qt::DropAction action, int row, int column, const QModelIndex &parent)
int rowCount(const QModelIndex &parent=QModelIndex()) const
int columnCount(const QModelIndex &parent=QModelIndex()) const