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>
14QTransposeProxyModelPrivate::QTransposeProxyModelPrivate()
17QTransposeProxyModelPrivate::~QTransposeProxyModelPrivate()
20QModelIndex QTransposeProxyModelPrivate::uncheckedMapToSource(
const QModelIndex &proxyIndex)
const
22 if (!model || !proxyIndex.isValid())
24 Q_Q(
const QTransposeProxyModel);
25 return q->createSourceIndex(proxyIndex.column(), proxyIndex.row(), proxyIndex.internalPointer());
28QModelIndex QTransposeProxyModelPrivate::uncheckedMapFromSource(
const QModelIndex &sourceIndex)
const
30 if (!model || !sourceIndex.isValid())
32 Q_Q(
const QTransposeProxyModel);
33 return q->createIndex(sourceIndex.column(), sourceIndex.row(), sourceIndex.internalPointer());
36void QTransposeProxyModelPrivate::onLayoutChanged(
const QList<QPersistentModelIndex> &parents, QAbstractItemModel::LayoutChangeHint hint)
38 Q_Q(QTransposeProxyModel);
39 Q_ASSERT(layoutChangeProxyIndexes.size() == layoutChangePersistentIndexes.size());
40 QModelIndexList toList;
41 toList.reserve(layoutChangePersistentIndexes.size());
42 for (
const QPersistentModelIndex &persistIdx : std::as_const(layoutChangePersistentIndexes))
43 toList << q->mapFromSource(persistIdx);
44 q->changePersistentIndexList(layoutChangeProxyIndexes, toList);
45 layoutChangeProxyIndexes.clear();
46 layoutChangePersistentIndexes.clear();
47 QList<QPersistentModelIndex> proxyParents;
48 proxyParents.reserve(parents.size());
49 for (
const QPersistentModelIndex &srcParent : parents)
50 proxyParents << q->mapFromSource(srcParent);
51 QAbstractItemModel::LayoutChangeHint proxyHint = QAbstractItemModel::NoLayoutChangeHint;
52 if (hint == QAbstractItemModel::VerticalSortHint)
53 proxyHint = QAbstractItemModel::HorizontalSortHint;
54 else if (hint == QAbstractItemModel::HorizontalSortHint)
55 proxyHint = QAbstractItemModel::VerticalSortHint;
56 emit q->layoutChanged(proxyParents, proxyHint);
59void QTransposeProxyModelPrivate::onLayoutAboutToBeChanged(
const QList<QPersistentModelIndex> &sourceParents, QAbstractItemModel::LayoutChangeHint hint)
61 Q_Q(QTransposeProxyModel);
62 QList<QPersistentModelIndex> proxyParents;
63 proxyParents.reserve(sourceParents.size());
64 for (
const QPersistentModelIndex &parent : sourceParents) {
65 if (!parent.isValid()) {
66 proxyParents << QPersistentModelIndex();
69 const QModelIndex mappedParent = q->mapFromSource(parent);
70 Q_ASSERT(mappedParent.isValid());
71 proxyParents << mappedParent;
73 QAbstractItemModel::LayoutChangeHint proxyHint = QAbstractItemModel::NoLayoutChangeHint;
74 if (hint == QAbstractItemModel::VerticalSortHint)
75 proxyHint = QAbstractItemModel::HorizontalSortHint;
76 else if (hint == QAbstractItemModel::HorizontalSortHint)
77 proxyHint = QAbstractItemModel::VerticalSortHint;
78 emit q->layoutAboutToBeChanged(proxyParents, proxyHint);
79 const QModelIndexList proxyPersistentIndexes = q->persistentIndexList();
80 layoutChangeProxyIndexes.clear();
81 layoutChangePersistentIndexes.clear();
82 layoutChangeProxyIndexes.reserve(proxyPersistentIndexes.size());
83 layoutChangePersistentIndexes.reserve(proxyPersistentIndexes.size());
84 for (
const QModelIndex &proxyPersistentIndex : proxyPersistentIndexes) {
85 layoutChangeProxyIndexes << proxyPersistentIndex;
86 Q_ASSERT(proxyPersistentIndex.isValid());
87 const QPersistentModelIndex srcPersistentIndex = q->mapToSource(proxyPersistentIndex);
88 Q_ASSERT(srcPersistentIndex.isValid());
89 layoutChangePersistentIndexes << srcPersistentIndex;
93void QTransposeProxyModelPrivate::onDataChanged(
const QModelIndex &topLeft,
const QModelIndex &bottomRight,
94 const QList<
int> &roles)
96 Q_Q(QTransposeProxyModel);
97 emit q->dataChanged(q->mapFromSource(topLeft), q->mapFromSource(bottomRight), roles);
100void QTransposeProxyModelPrivate::onHeaderDataChanged(Qt::Orientation orientation,
int first,
int last)
102 Q_Q(QTransposeProxyModel);
103 emit q->headerDataChanged(orientation == Qt::Horizontal ? Qt::Vertical : Qt::Horizontal, first, last);
106void QTransposeProxyModelPrivate::onColumnsAboutToBeInserted(
const QModelIndex &parent,
int first,
int last)
108 Q_Q(QTransposeProxyModel);
109 q->beginInsertRows(q->mapFromSource(parent), first, last);
112void QTransposeProxyModelPrivate::onColumnsAboutToBeRemoved(
const QModelIndex &parent,
int first,
int last)
114 Q_Q(QTransposeProxyModel);
115 q->beginRemoveRows(q->mapFromSource(parent), first, last);
118void QTransposeProxyModelPrivate::onColumnsAboutToBeMoved(
const QModelIndex &sourceParent,
int sourceStart,
int sourceEnd,
const QModelIndex &destinationParent,
int destinationColumn)
120 Q_Q(QTransposeProxyModel);
121 q->beginMoveRows(q->mapFromSource(sourceParent), sourceStart, sourceEnd, q->mapFromSource(destinationParent), destinationColumn);
124void QTransposeProxyModelPrivate::onRowsAboutToBeInserted(
const QModelIndex &parent,
int first,
int last)
126 Q_Q(QTransposeProxyModel);
127 q->beginInsertColumns(q->mapFromSource(parent), first, last);
130void QTransposeProxyModelPrivate::onRowsAboutToBeRemoved(
const QModelIndex &parent,
int first,
int last)
132 Q_Q(QTransposeProxyModel);
133 q->beginRemoveColumns(q->mapFromSource(parent), first, last);
136void QTransposeProxyModelPrivate::onRowsAboutToBeMoved(
const QModelIndex &sourceParent,
int sourceStart,
int sourceEnd,
const QModelIndex &destinationParent,
int destinationRow)
138 Q_Q(QTransposeProxyModel);
139 q->beginMoveColumns(q->mapFromSource(sourceParent), sourceStart, sourceEnd, q->mapFromSource(destinationParent), destinationRow);
143
144
145
146
147
148
149
150
151
154
155
156QTransposeProxyModel::QTransposeProxyModel(QObject* parent)
157 : QAbstractProxyModel(*
new QTransposeProxyModelPrivate, parent)
161
162
163QTransposeProxyModel::~QTransposeProxyModel() =
default;
166
167
168QTransposeProxyModel::QTransposeProxyModel(QTransposeProxyModelPrivate &dd, QObject *parent)
169 : QAbstractProxyModel(dd, parent)
173
174
175void QTransposeProxyModel::setSourceModel(QAbstractItemModel* newSourceModel)
177 Q_D(QTransposeProxyModel);
178 if (newSourceModel == d->model)
182 for (QMetaObject::Connection &discIter : d->sourceConnections)
183 disconnect(discIter);
185 QAbstractProxyModel::setSourceModel(newSourceModel);
187 using namespace std::placeholders;
188 d->sourceConnections = std::array{
189 connect(d->model, &QAbstractItemModel::modelAboutToBeReset,
this, &QTransposeProxyModel::beginResetModel),
190 connect(d->model, &QAbstractItemModel::modelReset,
this, &QTransposeProxyModel::endResetModel),
191 connect(d->model, &QAbstractItemModel::dataChanged,
this, std::bind(&QTransposeProxyModelPrivate::onDataChanged, d, _1, _2, _3)),
192 connect(d->model, &QAbstractItemModel::headerDataChanged,
this, std::bind(&QTransposeProxyModelPrivate::onHeaderDataChanged, d, _1, _2, _3)),
193 connect(d->model, &QAbstractItemModel::columnsAboutToBeInserted,
this, std::bind(&QTransposeProxyModelPrivate::onColumnsAboutToBeInserted, d, _1, _2, _3)),
194 connect(d->model, &QAbstractItemModel::columnsAboutToBeMoved,
this, std::bind(&QTransposeProxyModelPrivate::onColumnsAboutToBeMoved, d, _1, _2, _3, _4, _5)),
195 connect(d->model, &QAbstractItemModel::columnsAboutToBeRemoved,
this, std::bind(&QTransposeProxyModelPrivate::onColumnsAboutToBeRemoved, d, _1, _2, _3)),
196 connect(d->model, &QAbstractItemModel::columnsInserted,
this, &QTransposeProxyModel::endInsertRows),
197 connect(d->model, &QAbstractItemModel::columnsRemoved,
this, &QTransposeProxyModel::endRemoveRows),
198 connect(d->model, &QAbstractItemModel::columnsMoved,
this, &QTransposeProxyModel::endMoveRows),
199 connect(d->model, &QAbstractItemModel::rowsAboutToBeInserted,
this, std::bind(&QTransposeProxyModelPrivate::onRowsAboutToBeInserted, d, _1, _2, _3)),
200 connect(d->model, &QAbstractItemModel::rowsAboutToBeMoved,
this, std::bind(&QTransposeProxyModelPrivate::onRowsAboutToBeMoved, d, _1, _2, _3, _4, _5)),
201 connect(d->model, &QAbstractItemModel::rowsAboutToBeRemoved,
this, std::bind(&QTransposeProxyModelPrivate::onRowsAboutToBeRemoved, d, _1, _2, _3)),
202 connect(d->model, &QAbstractItemModel::rowsInserted,
this, &QTransposeProxyModel::endInsertColumns),
203 connect(d->model, &QAbstractItemModel::rowsRemoved,
this, &QTransposeProxyModel::endRemoveColumns),
204 connect(d->model, &QAbstractItemModel::rowsMoved,
this, &QTransposeProxyModel::endMoveColumns),
205 connect(d->model, &QAbstractItemModel::layoutAboutToBeChanged,
this, std::bind(&QTransposeProxyModelPrivate::onLayoutAboutToBeChanged, d, _1, _2)),
206 connect(d->model, &QAbstractItemModel::layoutChanged,
this, std::bind(&QTransposeProxyModelPrivate::onLayoutChanged, d, _1, _2))
213
214
215int QTransposeProxyModel::rowCount(
const QModelIndex &parent)
const
217 Q_D(
const QTransposeProxyModel);
220 Q_ASSERT(checkIndex(parent));
221 return d->model->columnCount(mapToSource(parent));
225
226
227int QTransposeProxyModel::columnCount(
const QModelIndex &parent)
const
229 Q_D(
const QTransposeProxyModel);
232 Q_ASSERT(checkIndex(parent));
233 return d->model->rowCount(mapToSource(parent));
237
238
239QVariant QTransposeProxyModel::headerData(
int section, Qt::Orientation orientation,
int role)
const
241 Q_D(
const QTransposeProxyModel);
244 return d->model->headerData(section, orientation == Qt::Horizontal ? Qt::Vertical : Qt::Horizontal, role);
248
249
250bool QTransposeProxyModel::setHeaderData(
int section, Qt::Orientation orientation,
const QVariant &value,
int role)
252 Q_D(QTransposeProxyModel);
255 return d->model->setHeaderData(section, orientation == Qt::Horizontal ? Qt::Vertical : Qt::Horizontal, value, role);
259
260
261bool QTransposeProxyModel::setItemData(
const QModelIndex &index,
const QMap<
int, QVariant> &roles)
263 Q_D(QTransposeProxyModel);
264 Q_ASSERT(checkIndex(index));
265 if (!d->model || !index.isValid())
267 return d->model->setItemData(mapToSource(index), roles);
271
272
273QSize QTransposeProxyModel::span(
const QModelIndex &index)
const
275 Q_D(
const QTransposeProxyModel);
276 Q_ASSERT(checkIndex(index));
277 if (!d->model || !index.isValid())
279 return d->model->span(mapToSource(index)).transposed();
283
284
285QMap<
int, QVariant> QTransposeProxyModel::itemData(
const QModelIndex &index)
const
287 Q_D(
const QTransposeProxyModel);
289 return QMap<
int, QVariant>();
290 Q_ASSERT(checkIndex(index));
291 return d->model->itemData(mapToSource(index));
295
296
297QModelIndex QTransposeProxyModel::mapFromSource(
const QModelIndex &sourceIndex)
const
299 Q_D(
const QTransposeProxyModel);
300 if (!d->model || !sourceIndex.isValid())
301 return QModelIndex();
302 Q_ASSERT(d->model->checkIndex(sourceIndex));
303 return d->uncheckedMapFromSource(sourceIndex);
307
308
309QModelIndex QTransposeProxyModel::mapToSource(
const QModelIndex &proxyIndex)
const
311 Q_D(
const QTransposeProxyModel);
312 Q_ASSERT(checkIndex(proxyIndex));
313 if (!d->model || !proxyIndex.isValid())
314 return QModelIndex();
315 return d->uncheckedMapToSource(proxyIndex);
319
320
321QModelIndex QTransposeProxyModel::parent(
const QModelIndex &index)
const
323 Q_D(
const QTransposeProxyModel);
324 Q_ASSERT(checkIndex(index, CheckIndexOption::DoNotUseParent));
325 if (!d->model || !index.isValid())
326 return QModelIndex();
327 return d->uncheckedMapFromSource(d->uncheckedMapToSource(index).parent());
331
332
333QModelIndex QTransposeProxyModel::index(
int row,
int column,
const QModelIndex &parent)
const
335 Q_D(
const QTransposeProxyModel);
336 Q_ASSERT(checkIndex(parent));
338 return QModelIndex();
339 return mapFromSource(d->model->index(column, row, mapToSource(parent)));
343
344
345bool QTransposeProxyModel::insertRows(
int row,
int count,
const QModelIndex &parent)
347 Q_D(QTransposeProxyModel);
348 Q_ASSERT(checkIndex(parent));
351 return d->model->insertColumns(row, count, mapToSource(parent));
355
356
357bool QTransposeProxyModel::removeRows(
int row,
int count,
const QModelIndex &parent)
359 Q_D(QTransposeProxyModel);
360 Q_ASSERT(checkIndex(parent));
363 return d->model->removeColumns(row, count, mapToSource(parent));
367
368
369bool QTransposeProxyModel::moveRows(
const QModelIndex &sourceParent,
int sourceRow,
int count,
const QModelIndex &destinationParent,
int destinationChild)
371 Q_D(QTransposeProxyModel);
372 Q_ASSERT(checkIndex(sourceParent));
373 Q_ASSERT(checkIndex(destinationParent));
376 return d->model->moveColumns(mapToSource(sourceParent), sourceRow, count, mapToSource(destinationParent), destinationChild);
380
381
382bool QTransposeProxyModel::insertColumns(
int column,
int count,
const QModelIndex &parent)
384 Q_D(QTransposeProxyModel);
385 Q_ASSERT(checkIndex(parent));
388 return d->model->insertRows(column, count, mapToSource(parent));
392
393
394bool QTransposeProxyModel::removeColumns(
int column,
int count,
const QModelIndex &parent)
396 Q_D(QTransposeProxyModel);
397 Q_ASSERT(checkIndex(parent));
400 return d->model->removeRows(column, count, mapToSource(parent));
404
405
406bool QTransposeProxyModel::moveColumns(
const QModelIndex &sourceParent,
int sourceRow,
int count,
const QModelIndex &destinationParent,
int destinationChild)
408 Q_D(QTransposeProxyModel);
409 Q_ASSERT(checkIndex(sourceParent));
410 Q_ASSERT(checkIndex(destinationParent));
413 return d->model->moveRows(mapToSource(sourceParent), sourceRow, count, mapToSource(destinationParent), destinationChild);
417
418
419
420void QTransposeProxyModel::sort(
int column, Qt::SortOrder order)
429#include "moc_qtransposeproxymodel.cpp"
Combined button and popup list for selecting options.