6#include <private/qtransposeproxymodel_p.h>
7#include <QtCore/qlist.h>
8#include <QtCore/qmetaobject.h>
9#include <QtCore/qsize.h>
10#include <QtCore/qmap.h>
14QModelIndex QTransposeProxyModelPrivate::uncheckedMapToSource(
const QModelIndex &proxyIndex)
const
16 if (!model || !proxyIndex.isValid())
18 Q_Q(
const QTransposeProxyModel);
19 return q->createSourceIndex(proxyIndex.column(), proxyIndex.row(), proxyIndex.internalPointer());
22QModelIndex QTransposeProxyModelPrivate::uncheckedMapFromSource(
const QModelIndex &sourceIndex)
const
24 if (!model || !sourceIndex.isValid())
26 Q_Q(
const QTransposeProxyModel);
27 return q->createIndex(sourceIndex.column(), sourceIndex.row(), sourceIndex.internalPointer());
30void QTransposeProxyModelPrivate::onLayoutChanged(
const QList<QPersistentModelIndex> &parents, QAbstractItemModel::LayoutChangeHint hint)
32 Q_Q(QTransposeProxyModel);
33 Q_ASSERT(layoutChangeProxyIndexes.size() == layoutChangePersistentIndexes.size());
34 QModelIndexList toList;
35 toList.reserve(layoutChangePersistentIndexes.size());
36 for (
const QPersistentModelIndex &persistIdx : std::as_const(layoutChangePersistentIndexes))
37 toList << q->mapFromSource(persistIdx);
38 q->changePersistentIndexList(layoutChangeProxyIndexes, toList);
39 layoutChangeProxyIndexes.clear();
40 layoutChangePersistentIndexes.clear();
41 QList<QPersistentModelIndex> proxyParents;
42 proxyParents.reserve(parents.size());
43 for (
const QPersistentModelIndex &srcParent : parents)
44 proxyParents << q->mapFromSource(srcParent);
45 QAbstractItemModel::LayoutChangeHint proxyHint = QAbstractItemModel::NoLayoutChangeHint;
46 if (hint == QAbstractItemModel::VerticalSortHint)
47 proxyHint = QAbstractItemModel::HorizontalSortHint;
48 else if (hint == QAbstractItemModel::HorizontalSortHint)
49 proxyHint = QAbstractItemModel::VerticalSortHint;
50 emit q->layoutChanged(proxyParents, proxyHint);
53void QTransposeProxyModelPrivate::onLayoutAboutToBeChanged(
const QList<QPersistentModelIndex> &sourceParents, QAbstractItemModel::LayoutChangeHint hint)
55 Q_Q(QTransposeProxyModel);
56 QList<QPersistentModelIndex> proxyParents;
57 proxyParents.reserve(sourceParents.size());
58 for (
const QPersistentModelIndex &parent : sourceParents) {
59 if (!parent.isValid()) {
60 proxyParents << QPersistentModelIndex();
63 const QModelIndex mappedParent = q->mapFromSource(parent);
64 Q_ASSERT(mappedParent.isValid());
65 proxyParents << mappedParent;
67 QAbstractItemModel::LayoutChangeHint proxyHint = QAbstractItemModel::NoLayoutChangeHint;
68 if (hint == QAbstractItemModel::VerticalSortHint)
69 proxyHint = QAbstractItemModel::HorizontalSortHint;
70 else if (hint == QAbstractItemModel::HorizontalSortHint)
71 proxyHint = QAbstractItemModel::VerticalSortHint;
72 emit q->layoutAboutToBeChanged(proxyParents, proxyHint);
73 const QModelIndexList proxyPersistentIndexes = q->persistentIndexList();
74 layoutChangeProxyIndexes.clear();
75 layoutChangePersistentIndexes.clear();
76 layoutChangeProxyIndexes.reserve(proxyPersistentIndexes.size());
77 layoutChangePersistentIndexes.reserve(proxyPersistentIndexes.size());
78 for (
const QModelIndex &proxyPersistentIndex : proxyPersistentIndexes) {
79 layoutChangeProxyIndexes << proxyPersistentIndex;
80 Q_ASSERT(proxyPersistentIndex.isValid());
81 const QPersistentModelIndex srcPersistentIndex = q->mapToSource(proxyPersistentIndex);
82 Q_ASSERT(srcPersistentIndex.isValid());
83 layoutChangePersistentIndexes << srcPersistentIndex;
87void QTransposeProxyModelPrivate::onDataChanged(
const QModelIndex &topLeft,
const QModelIndex &bottomRight,
88 const QList<
int> &roles)
90 Q_Q(QTransposeProxyModel);
91 emit q->dataChanged(q->mapFromSource(topLeft), q->mapFromSource(bottomRight), roles);
94void QTransposeProxyModelPrivate::onHeaderDataChanged(Qt::Orientation orientation,
int first,
int last)
96 Q_Q(QTransposeProxyModel);
97 emit q->headerDataChanged(orientation == Qt::Horizontal ? Qt::Vertical : Qt::Horizontal, first, last);
100void QTransposeProxyModelPrivate::onColumnsAboutToBeInserted(
const QModelIndex &parent,
int first,
int last)
102 Q_Q(QTransposeProxyModel);
103 q->beginInsertRows(q->mapFromSource(parent), first, last);
106void QTransposeProxyModelPrivate::onColumnsAboutToBeRemoved(
const QModelIndex &parent,
int first,
int last)
108 Q_Q(QTransposeProxyModel);
109 q->beginRemoveRows(q->mapFromSource(parent), first, last);
112void QTransposeProxyModelPrivate::onColumnsAboutToBeMoved(
const QModelIndex &sourceParent,
int sourceStart,
int sourceEnd,
const QModelIndex &destinationParent,
int destinationColumn)
114 Q_Q(QTransposeProxyModel);
115 q->beginMoveRows(q->mapFromSource(sourceParent), sourceStart, sourceEnd, q->mapFromSource(destinationParent), destinationColumn);
118void QTransposeProxyModelPrivate::onRowsAboutToBeInserted(
const QModelIndex &parent,
int first,
int last)
120 Q_Q(QTransposeProxyModel);
121 q->beginInsertColumns(q->mapFromSource(parent), first, last);
124void QTransposeProxyModelPrivate::onRowsAboutToBeRemoved(
const QModelIndex &parent,
int first,
int last)
126 Q_Q(QTransposeProxyModel);
127 q->beginRemoveColumns(q->mapFromSource(parent), first, last);
130void QTransposeProxyModelPrivate::onRowsAboutToBeMoved(
const QModelIndex &sourceParent,
int sourceStart,
int sourceEnd,
const QModelIndex &destinationParent,
int destinationRow)
132 Q_Q(QTransposeProxyModel);
133 q->beginMoveColumns(q->mapFromSource(sourceParent), sourceStart, sourceEnd, q->mapFromSource(destinationParent), destinationRow);
137
138
139
140
141
142
143
144
145
148
149
150QTransposeProxyModel::QTransposeProxyModel(QObject* parent)
151 : QAbstractProxyModel(*
new QTransposeProxyModelPrivate, parent)
155
156
157QTransposeProxyModel::~QTransposeProxyModel() =
default;
160
161
162QTransposeProxyModel::QTransposeProxyModel(QTransposeProxyModelPrivate &dd, QObject *parent)
163 : QAbstractProxyModel(dd, parent)
167
168
169void QTransposeProxyModel::setSourceModel(QAbstractItemModel* newSourceModel)
171 Q_D(QTransposeProxyModel);
172 if (newSourceModel == d->model)
176 for (
const QMetaObject::Connection& discIter : std::as_const(d->sourceConnections))
177 disconnect(discIter);
179 d->sourceConnections.clear();
180 QAbstractProxyModel::setSourceModel(newSourceModel);
182 using namespace std::placeholders;
183 d->sourceConnections = QList<QMetaObject::Connection>{
184 connect(d->model, &QAbstractItemModel::modelAboutToBeReset,
this, &QTransposeProxyModel::beginResetModel),
185 connect(d->model, &QAbstractItemModel::modelReset,
this, &QTransposeProxyModel::endResetModel),
186 connect(d->model, &QAbstractItemModel::dataChanged,
this, std::bind(&QTransposeProxyModelPrivate::onDataChanged, d, _1, _2, _3)),
187 connect(d->model, &QAbstractItemModel::headerDataChanged,
this, std::bind(&QTransposeProxyModelPrivate::onHeaderDataChanged, d, _1, _2, _3)),
188 connect(d->model, &QAbstractItemModel::columnsAboutToBeInserted,
this, std::bind(&QTransposeProxyModelPrivate::onColumnsAboutToBeInserted, d, _1, _2, _3)),
189 connect(d->model, &QAbstractItemModel::columnsAboutToBeMoved,
this, std::bind(&QTransposeProxyModelPrivate::onColumnsAboutToBeMoved, d, _1, _2, _3, _4, _5)),
190 connect(d->model, &QAbstractItemModel::columnsAboutToBeRemoved,
this, std::bind(&QTransposeProxyModelPrivate::onColumnsAboutToBeRemoved, d, _1, _2, _3)),
191 connect(d->model, &QAbstractItemModel::columnsInserted,
this, &QTransposeProxyModel::endInsertRows),
192 connect(d->model, &QAbstractItemModel::columnsRemoved,
this, &QTransposeProxyModel::endRemoveRows),
193 connect(d->model, &QAbstractItemModel::columnsMoved,
this, &QTransposeProxyModel::endMoveRows),
194 connect(d->model, &QAbstractItemModel::rowsAboutToBeInserted,
this, std::bind(&QTransposeProxyModelPrivate::onRowsAboutToBeInserted, d, _1, _2, _3)),
195 connect(d->model, &QAbstractItemModel::rowsAboutToBeMoved,
this, std::bind(&QTransposeProxyModelPrivate::onRowsAboutToBeMoved, d, _1, _2, _3, _4, _5)),
196 connect(d->model, &QAbstractItemModel::rowsAboutToBeRemoved,
this, std::bind(&QTransposeProxyModelPrivate::onRowsAboutToBeRemoved, d, _1, _2, _3)),
197 connect(d->model, &QAbstractItemModel::rowsInserted,
this, &QTransposeProxyModel::endInsertColumns),
198 connect(d->model, &QAbstractItemModel::rowsRemoved,
this, &QTransposeProxyModel::endRemoveColumns),
199 connect(d->model, &QAbstractItemModel::rowsMoved,
this, &QTransposeProxyModel::endMoveColumns),
200 connect(d->model, &QAbstractItemModel::layoutAboutToBeChanged,
this, std::bind(&QTransposeProxyModelPrivate::onLayoutAboutToBeChanged, d, _1, _2)),
201 connect(d->model, &QAbstractItemModel::layoutChanged,
this, std::bind(&QTransposeProxyModelPrivate::onLayoutChanged, d, _1, _2))
208
209
210int QTransposeProxyModel::rowCount(
const QModelIndex &parent)
const
212 Q_D(
const QTransposeProxyModel);
215 Q_ASSERT(checkIndex(parent));
216 return d->model->columnCount(mapToSource(parent));
220
221
222int QTransposeProxyModel::columnCount(
const QModelIndex &parent)
const
224 Q_D(
const QTransposeProxyModel);
227 Q_ASSERT(checkIndex(parent));
228 return d->model->rowCount(mapToSource(parent));
232
233
234QVariant QTransposeProxyModel::headerData(
int section, Qt::Orientation orientation,
int role)
const
236 Q_D(
const QTransposeProxyModel);
239 return d->model->headerData(section, orientation == Qt::Horizontal ? Qt::Vertical : Qt::Horizontal, role);
243
244
245bool QTransposeProxyModel::setHeaderData(
int section, Qt::Orientation orientation,
const QVariant &value,
int role)
247 Q_D(QTransposeProxyModel);
250 return d->model->setHeaderData(section, orientation == Qt::Horizontal ? Qt::Vertical : Qt::Horizontal, value, role);
254
255
256bool QTransposeProxyModel::setItemData(
const QModelIndex &index,
const QMap<
int, QVariant> &roles)
258 Q_D(QTransposeProxyModel);
259 Q_ASSERT(checkIndex(index));
260 if (!d->model || !index.isValid())
262 return d->model->setItemData(mapToSource(index), roles);
266
267
268QSize QTransposeProxyModel::span(
const QModelIndex &index)
const
270 Q_D(
const QTransposeProxyModel);
271 Q_ASSERT(checkIndex(index));
272 if (!d->model || !index.isValid())
274 return d->model->span(mapToSource(index)).transposed();
278
279
280QMap<
int, QVariant> QTransposeProxyModel::itemData(
const QModelIndex &index)
const
282 Q_D(
const QTransposeProxyModel);
284 return QMap<
int, QVariant>();
285 Q_ASSERT(checkIndex(index));
286 return d->model->itemData(mapToSource(index));
290
291
292QModelIndex QTransposeProxyModel::mapFromSource(
const QModelIndex &sourceIndex)
const
294 Q_D(
const QTransposeProxyModel);
295 if (!d->model || !sourceIndex.isValid())
296 return QModelIndex();
297 Q_ASSERT(d->model->checkIndex(sourceIndex));
298 return d->uncheckedMapFromSource(sourceIndex);
302
303
304QModelIndex QTransposeProxyModel::mapToSource(
const QModelIndex &proxyIndex)
const
306 Q_D(
const QTransposeProxyModel);
307 Q_ASSERT(checkIndex(proxyIndex));
308 if (!d->model || !proxyIndex.isValid())
309 return QModelIndex();
310 return d->uncheckedMapToSource(proxyIndex);
314
315
316QModelIndex QTransposeProxyModel::parent(
const QModelIndex &index)
const
318 Q_D(
const QTransposeProxyModel);
319 Q_ASSERT(checkIndex(index, CheckIndexOption::DoNotUseParent));
320 if (!d->model || !index.isValid())
321 return QModelIndex();
322 return d->uncheckedMapFromSource(d->uncheckedMapToSource(index).parent());
326
327
328QModelIndex QTransposeProxyModel::index(
int row,
int column,
const QModelIndex &parent)
const
330 Q_D(
const QTransposeProxyModel);
331 Q_ASSERT(checkIndex(parent));
333 return QModelIndex();
334 return mapFromSource(d->model->index(column, row, mapToSource(parent)));
338
339
340bool QTransposeProxyModel::insertRows(
int row,
int count,
const QModelIndex &parent)
342 Q_D(QTransposeProxyModel);
343 Q_ASSERT(checkIndex(parent));
346 return d->model->insertColumns(row, count, mapToSource(parent));
350
351
352bool QTransposeProxyModel::removeRows(
int row,
int count,
const QModelIndex &parent)
354 Q_D(QTransposeProxyModel);
355 Q_ASSERT(checkIndex(parent));
358 return d->model->removeColumns(row, count, mapToSource(parent));
362
363
364bool QTransposeProxyModel::moveRows(
const QModelIndex &sourceParent,
int sourceRow,
int count,
const QModelIndex &destinationParent,
int destinationChild)
366 Q_D(QTransposeProxyModel);
367 Q_ASSERT(checkIndex(sourceParent));
368 Q_ASSERT(checkIndex(destinationParent));
371 return d->model->moveColumns(mapToSource(sourceParent), sourceRow, count, mapToSource(destinationParent), destinationChild);
375
376
377bool QTransposeProxyModel::insertColumns(
int column,
int count,
const QModelIndex &parent)
379 Q_D(QTransposeProxyModel);
380 Q_ASSERT(checkIndex(parent));
383 return d->model->insertRows(column, count, mapToSource(parent));
387
388
389bool QTransposeProxyModel::removeColumns(
int column,
int count,
const QModelIndex &parent)
391 Q_D(QTransposeProxyModel);
392 Q_ASSERT(checkIndex(parent));
395 return d->model->removeRows(column, count, mapToSource(parent));
399
400
401bool QTransposeProxyModel::moveColumns(
const QModelIndex &sourceParent,
int sourceRow,
int count,
const QModelIndex &destinationParent,
int destinationChild)
403 Q_D(QTransposeProxyModel);
404 Q_ASSERT(checkIndex(sourceParent));
405 Q_ASSERT(checkIndex(destinationParent));
408 return d->model->moveRows(mapToSource(sourceParent), sourceRow, count, mapToSource(destinationParent), destinationChild);
412
413
414
415void QTransposeProxyModel::sort(
int column, Qt::SortOrder order)
424#include "moc_qtransposeproxymodel.cpp"