5#include <private/qtransposeproxymodel_p.h>
6#include <QtCore/qlist.h>
7#include <QtCore/qmetaobject.h>
8#include <QtCore/qsize.h>
9#include <QtCore/qmap.h>
13QModelIndex QTransposeProxyModelPrivate::uncheckedMapToSource(
const QModelIndex &proxyIndex)
const
15 if (!model || !proxyIndex.isValid())
17 Q_Q(
const QTransposeProxyModel);
18 return q->createSourceIndex(proxyIndex.column(), proxyIndex.row(), proxyIndex.internalPointer());
21QModelIndex QTransposeProxyModelPrivate::uncheckedMapFromSource(
const QModelIndex &sourceIndex)
const
23 if (!model || !sourceIndex.isValid())
25 Q_Q(
const QTransposeProxyModel);
26 return q->createIndex(sourceIndex.column(), sourceIndex.row(), sourceIndex.internalPointer());
29void QTransposeProxyModelPrivate::onLayoutChanged(
const QList<QPersistentModelIndex> &parents, QAbstractItemModel::LayoutChangeHint hint)
31 Q_Q(QTransposeProxyModel);
32 Q_ASSERT(layoutChangeProxyIndexes.size() == layoutChangePersistentIndexes.size());
33 QModelIndexList toList;
34 toList.reserve(layoutChangePersistentIndexes.size());
35 for (
const QPersistentModelIndex &persistIdx : std::as_const(layoutChangePersistentIndexes))
36 toList << q->mapFromSource(persistIdx);
37 q->changePersistentIndexList(layoutChangeProxyIndexes, toList);
38 layoutChangeProxyIndexes.clear();
39 layoutChangePersistentIndexes.clear();
40 QList<QPersistentModelIndex> proxyParents;
41 proxyParents.reserve(parents.size());
42 for (
const QPersistentModelIndex &srcParent : parents)
43 proxyParents << q->mapFromSource(srcParent);
44 QAbstractItemModel::LayoutChangeHint proxyHint = QAbstractItemModel::NoLayoutChangeHint;
45 if (hint == QAbstractItemModel::VerticalSortHint)
46 proxyHint = QAbstractItemModel::HorizontalSortHint;
47 else if (hint == QAbstractItemModel::HorizontalSortHint)
48 proxyHint = QAbstractItemModel::VerticalSortHint;
49 emit q->layoutChanged(proxyParents, proxyHint);
52void QTransposeProxyModelPrivate::onLayoutAboutToBeChanged(
const QList<QPersistentModelIndex> &sourceParents, QAbstractItemModel::LayoutChangeHint hint)
54 Q_Q(QTransposeProxyModel);
55 QList<QPersistentModelIndex> proxyParents;
56 proxyParents.reserve(sourceParents.size());
57 for (
const QPersistentModelIndex &parent : sourceParents) {
58 if (!parent.isValid()) {
59 proxyParents << QPersistentModelIndex();
62 const QModelIndex mappedParent = q->mapFromSource(parent);
63 Q_ASSERT(mappedParent.isValid());
64 proxyParents << mappedParent;
66 QAbstractItemModel::LayoutChangeHint proxyHint = QAbstractItemModel::NoLayoutChangeHint;
67 if (hint == QAbstractItemModel::VerticalSortHint)
68 proxyHint = QAbstractItemModel::HorizontalSortHint;
69 else if (hint == QAbstractItemModel::HorizontalSortHint)
70 proxyHint = QAbstractItemModel::VerticalSortHint;
71 emit q->layoutAboutToBeChanged(proxyParents, proxyHint);
72 const QModelIndexList proxyPersistentIndexes = q->persistentIndexList();
73 layoutChangeProxyIndexes.clear();
74 layoutChangePersistentIndexes.clear();
75 layoutChangeProxyIndexes.reserve(proxyPersistentIndexes.size());
76 layoutChangePersistentIndexes.reserve(proxyPersistentIndexes.size());
77 for (
const QModelIndex &proxyPersistentIndex : proxyPersistentIndexes) {
78 layoutChangeProxyIndexes << proxyPersistentIndex;
79 Q_ASSERT(proxyPersistentIndex.isValid());
80 const QPersistentModelIndex srcPersistentIndex = q->mapToSource(proxyPersistentIndex);
81 Q_ASSERT(srcPersistentIndex.isValid());
82 layoutChangePersistentIndexes << srcPersistentIndex;
86void QTransposeProxyModelPrivate::onDataChanged(
const QModelIndex &topLeft,
const QModelIndex &bottomRight,
87 const QList<
int> &roles)
89 Q_Q(QTransposeProxyModel);
90 emit q->dataChanged(q->mapFromSource(topLeft), q->mapFromSource(bottomRight), roles);
93void QTransposeProxyModelPrivate::onHeaderDataChanged(Qt::Orientation orientation,
int first,
int last)
95 Q_Q(QTransposeProxyModel);
96 emit q->headerDataChanged(orientation == Qt::Horizontal ? Qt::Vertical : Qt::Horizontal, first, last);
99void QTransposeProxyModelPrivate::onColumnsAboutToBeInserted(
const QModelIndex &parent,
int first,
int last)
101 Q_Q(QTransposeProxyModel);
102 q->beginInsertRows(q->mapFromSource(parent), first, last);
105void QTransposeProxyModelPrivate::onColumnsAboutToBeRemoved(
const QModelIndex &parent,
int first,
int last)
107 Q_Q(QTransposeProxyModel);
108 q->beginRemoveRows(q->mapFromSource(parent), first, last);
111void QTransposeProxyModelPrivate::onColumnsAboutToBeMoved(
const QModelIndex &sourceParent,
int sourceStart,
int sourceEnd,
const QModelIndex &destinationParent,
int destinationColumn)
113 Q_Q(QTransposeProxyModel);
114 q->beginMoveRows(q->mapFromSource(sourceParent), sourceStart, sourceEnd, q->mapFromSource(destinationParent), destinationColumn);
117void QTransposeProxyModelPrivate::onRowsAboutToBeInserted(
const QModelIndex &parent,
int first,
int last)
119 Q_Q(QTransposeProxyModel);
120 q->beginInsertColumns(q->mapFromSource(parent), first, last);
123void QTransposeProxyModelPrivate::onRowsAboutToBeRemoved(
const QModelIndex &parent,
int first,
int last)
125 Q_Q(QTransposeProxyModel);
126 q->beginRemoveColumns(q->mapFromSource(parent), first, last);
129void QTransposeProxyModelPrivate::onRowsAboutToBeMoved(
const QModelIndex &sourceParent,
int sourceStart,
int sourceEnd,
const QModelIndex &destinationParent,
int destinationRow)
131 Q_Q(QTransposeProxyModel);
132 q->beginMoveColumns(q->mapFromSource(sourceParent), sourceStart, sourceEnd, q->mapFromSource(destinationParent), destinationRow);
136
137
138
139
140
141
142
143
144
147
148
149QTransposeProxyModel::QTransposeProxyModel(QObject* parent)
150 : QAbstractProxyModel(*
new QTransposeProxyModelPrivate, parent)
154
155
156QTransposeProxyModel::~QTransposeProxyModel() =
default;
159
160
161QTransposeProxyModel::QTransposeProxyModel(QTransposeProxyModelPrivate &dd, QObject *parent)
162 : QAbstractProxyModel(dd, parent)
166
167
168void QTransposeProxyModel::setSourceModel(QAbstractItemModel* newSourceModel)
170 Q_D(QTransposeProxyModel);
171 if (newSourceModel == d->model)
175 for (
const QMetaObject::Connection& discIter : std::as_const(d->sourceConnections))
176 disconnect(discIter);
178 d->sourceConnections.clear();
179 QAbstractProxyModel::setSourceModel(newSourceModel);
181 using namespace std::placeholders;
182 d->sourceConnections = QList<QMetaObject::Connection>{
183 connect(d->model, &QAbstractItemModel::modelAboutToBeReset,
this, &QTransposeProxyModel::beginResetModel),
184 connect(d->model, &QAbstractItemModel::modelReset,
this, &QTransposeProxyModel::endResetModel),
185 connect(d->model, &QAbstractItemModel::dataChanged,
this, std::bind(&QTransposeProxyModelPrivate::onDataChanged, d, _1, _2, _3)),
186 connect(d->model, &QAbstractItemModel::headerDataChanged,
this, std::bind(&QTransposeProxyModelPrivate::onHeaderDataChanged, d, _1, _2, _3)),
187 connect(d->model, &QAbstractItemModel::columnsAboutToBeInserted,
this, std::bind(&QTransposeProxyModelPrivate::onColumnsAboutToBeInserted, d, _1, _2, _3)),
188 connect(d->model, &QAbstractItemModel::columnsAboutToBeMoved,
this, std::bind(&QTransposeProxyModelPrivate::onColumnsAboutToBeMoved, d, _1, _2, _3, _4, _5)),
189 connect(d->model, &QAbstractItemModel::columnsAboutToBeRemoved,
this, std::bind(&QTransposeProxyModelPrivate::onColumnsAboutToBeRemoved, d, _1, _2, _3)),
190 connect(d->model, &QAbstractItemModel::columnsInserted,
this, &QTransposeProxyModel::endInsertRows),
191 connect(d->model, &QAbstractItemModel::columnsRemoved,
this, &QTransposeProxyModel::endRemoveRows),
192 connect(d->model, &QAbstractItemModel::columnsMoved,
this, &QTransposeProxyModel::endMoveRows),
193 connect(d->model, &QAbstractItemModel::rowsAboutToBeInserted,
this, std::bind(&QTransposeProxyModelPrivate::onRowsAboutToBeInserted, d, _1, _2, _3)),
194 connect(d->model, &QAbstractItemModel::rowsAboutToBeMoved,
this, std::bind(&QTransposeProxyModelPrivate::onRowsAboutToBeMoved, d, _1, _2, _3, _4, _5)),
195 connect(d->model, &QAbstractItemModel::rowsAboutToBeRemoved,
this, std::bind(&QTransposeProxyModelPrivate::onRowsAboutToBeRemoved, d, _1, _2, _3)),
196 connect(d->model, &QAbstractItemModel::rowsInserted,
this, &QTransposeProxyModel::endInsertColumns),
197 connect(d->model, &QAbstractItemModel::rowsRemoved,
this, &QTransposeProxyModel::endRemoveColumns),
198 connect(d->model, &QAbstractItemModel::rowsMoved,
this, &QTransposeProxyModel::endMoveColumns),
199 connect(d->model, &QAbstractItemModel::layoutAboutToBeChanged,
this, std::bind(&QTransposeProxyModelPrivate::onLayoutAboutToBeChanged, d, _1, _2)),
200 connect(d->model, &QAbstractItemModel::layoutChanged,
this, std::bind(&QTransposeProxyModelPrivate::onLayoutChanged, d, _1, _2))
207
208
209int QTransposeProxyModel::rowCount(
const QModelIndex &parent)
const
211 Q_D(
const QTransposeProxyModel);
214 Q_ASSERT(checkIndex(parent));
215 return d->model->columnCount(mapToSource(parent));
219
220
221int QTransposeProxyModel::columnCount(
const QModelIndex &parent)
const
223 Q_D(
const QTransposeProxyModel);
226 Q_ASSERT(checkIndex(parent));
227 return d->model->rowCount(mapToSource(parent));
231
232
233QVariant QTransposeProxyModel::headerData(
int section, Qt::Orientation orientation,
int role)
const
235 Q_D(
const QTransposeProxyModel);
238 return d->model->headerData(section, orientation == Qt::Horizontal ? Qt::Vertical : Qt::Horizontal, role);
242
243
244bool QTransposeProxyModel::setHeaderData(
int section, Qt::Orientation orientation,
const QVariant &value,
int role)
246 Q_D(QTransposeProxyModel);
249 return d->model->setHeaderData(section, orientation == Qt::Horizontal ? Qt::Vertical : Qt::Horizontal, value, role);
253
254
255bool QTransposeProxyModel::setItemData(
const QModelIndex &index,
const QMap<
int, QVariant> &roles)
257 Q_D(QTransposeProxyModel);
258 Q_ASSERT(checkIndex(index));
259 if (!d->model || !index.isValid())
261 return d->model->setItemData(mapToSource(index), roles);
265
266
267QSize QTransposeProxyModel::span(
const QModelIndex &index)
const
269 Q_D(
const QTransposeProxyModel);
270 Q_ASSERT(checkIndex(index));
271 if (!d->model || !index.isValid())
273 return d->model->span(mapToSource(index)).transposed();
277
278
279QMap<
int, QVariant> QTransposeProxyModel::itemData(
const QModelIndex &index)
const
281 Q_D(
const QTransposeProxyModel);
283 return QMap<
int, QVariant>();
284 Q_ASSERT(checkIndex(index));
285 return d->model->itemData(mapToSource(index));
289
290
291QModelIndex QTransposeProxyModel::mapFromSource(
const QModelIndex &sourceIndex)
const
293 Q_D(
const QTransposeProxyModel);
294 if (!d->model || !sourceIndex.isValid())
295 return QModelIndex();
296 Q_ASSERT(d->model->checkIndex(sourceIndex));
297 return d->uncheckedMapFromSource(sourceIndex);
301
302
303QModelIndex QTransposeProxyModel::mapToSource(
const QModelIndex &proxyIndex)
const
305 Q_D(
const QTransposeProxyModel);
306 Q_ASSERT(checkIndex(proxyIndex));
307 if (!d->model || !proxyIndex.isValid())
308 return QModelIndex();
309 return d->uncheckedMapToSource(proxyIndex);
313
314
315QModelIndex QTransposeProxyModel::parent(
const QModelIndex &index)
const
317 Q_D(
const QTransposeProxyModel);
318 Q_ASSERT(checkIndex(index, CheckIndexOption::DoNotUseParent));
319 if (!d->model || !index.isValid())
320 return QModelIndex();
321 return d->uncheckedMapFromSource(d->uncheckedMapToSource(index).parent());
325
326
327QModelIndex QTransposeProxyModel::index(
int row,
int column,
const QModelIndex &parent)
const
329 Q_D(
const QTransposeProxyModel);
330 Q_ASSERT(checkIndex(parent));
332 return QModelIndex();
333 return mapFromSource(d->model->index(column, row, mapToSource(parent)));
337
338
339bool QTransposeProxyModel::insertRows(
int row,
int count,
const QModelIndex &parent)
341 Q_D(QTransposeProxyModel);
342 Q_ASSERT(checkIndex(parent));
345 return d->model->insertColumns(row, count, mapToSource(parent));
349
350
351bool QTransposeProxyModel::removeRows(
int row,
int count,
const QModelIndex &parent)
353 Q_D(QTransposeProxyModel);
354 Q_ASSERT(checkIndex(parent));
357 return d->model->removeColumns(row, count, mapToSource(parent));
361
362
363bool QTransposeProxyModel::moveRows(
const QModelIndex &sourceParent,
int sourceRow,
int count,
const QModelIndex &destinationParent,
int destinationChild)
365 Q_D(QTransposeProxyModel);
366 Q_ASSERT(checkIndex(sourceParent));
367 Q_ASSERT(checkIndex(destinationParent));
370 return d->model->moveColumns(mapToSource(sourceParent), sourceRow, count, mapToSource(destinationParent), destinationChild);
374
375
376bool QTransposeProxyModel::insertColumns(
int column,
int count,
const QModelIndex &parent)
378 Q_D(QTransposeProxyModel);
379 Q_ASSERT(checkIndex(parent));
382 return d->model->insertRows(column, count, mapToSource(parent));
386
387
388bool QTransposeProxyModel::removeColumns(
int column,
int count,
const QModelIndex &parent)
390 Q_D(QTransposeProxyModel);
391 Q_ASSERT(checkIndex(parent));
394 return d->model->removeRows(column, count, mapToSource(parent));
398
399
400bool QTransposeProxyModel::moveColumns(
const QModelIndex &sourceParent,
int sourceRow,
int count,
const QModelIndex &destinationParent,
int destinationChild)
402 Q_D(QTransposeProxyModel);
403 Q_ASSERT(checkIndex(sourceParent));
404 Q_ASSERT(checkIndex(destinationParent));
407 return d->model->moveRows(mapToSource(sourceParent), sourceRow, count, mapToSource(destinationParent), destinationChild);
411
412
413
414void QTransposeProxyModel::sort(
int column, Qt::SortOrder order)
423#include "moc_qtransposeproxymodel.cpp"
Combined button and popup list for selecting options.