70void QAbstractProxyModelPrivate::emitHeaderDataChanged()
72 Q_Q(QAbstractProxyModel);
74 if (updateHorizontalHeader) {
75 if (
auto columnCount = q->columnCount(); columnCount > 0)
76 emit q->headerDataChanged(Qt::Horizontal, 0, columnCount - 1);
79 if (updateVerticalHeader) {
80 if (
auto rowCount = q->rowCount(); rowCount > 0)
81 emit q->headerDataChanged(Qt::Vertical, 0, rowCount - 1);
84 updateHorizontalHeader =
false;
85 updateVerticalHeader =
false;
88void QAbstractProxyModelPrivate::scheduleHeaderUpdate(Qt::Orientation orientation)
90 const bool isUpdateScheduled = updateHorizontalHeader || updateVerticalHeader;
92 if (orientation == Qt::Horizontal && !updateHorizontalHeader)
93 updateHorizontalHeader =
true;
94 else if (orientation == Qt::Vertical && !updateVerticalHeader)
95 updateVerticalHeader =
true;
99 if (!isUpdateScheduled) {
100 Q_Q(QAbstractProxyModel);
101 QMetaObject::invokeMethod(q, [
this]() { emitHeaderDataChanged(); }, Qt::QueuedConnection);
186void QAbstractProxyModel::setSourceModel(QAbstractItemModel *sourceModel)
188 Q_D(QAbstractProxyModel);
189 d->model.removeBindingUnlessInWrapper();
192 const QAbstractItemModel *currentModel = d->model.valueBypassingBindings();
193 if (!sourceModel && currentModel == QAbstractItemModelPrivate::staticEmptyModel())
195 static const struct {
196 const char *signalName;
197 const char *slotName;
198 } connectionTable[] = {
200 { SIGNAL(destroyed()), SLOT(_q_sourceModelDestroyed()) },
201 { SIGNAL(rowsAboutToBeInserted(QModelIndex,
int,
int)), SLOT(_q_sourceModelRowsAboutToBeInserted(QModelIndex,
int,
int)) },
202 { SIGNAL(rowsInserted(QModelIndex,
int,
int)), SLOT(_q_sourceModelRowsInserted(QModelIndex,
int,
int)) },
203 { SIGNAL(rowsRemoved(QModelIndex,
int,
int)), SLOT(_q_sourceModelRowsRemoved(QModelIndex,
int,
int)) },
204 { SIGNAL(columnsAboutToBeInserted(QModelIndex,
int,
int)), SLOT(_q_sourceModelColumnsAboutToBeInserted(QModelIndex,
int,
int)) },
205 { SIGNAL(columnsInserted(QModelIndex,
int,
int)), SLOT(_q_sourceModelColumnsInserted(QModelIndex,
int,
int)) },
206 { SIGNAL(columnsRemoved(QModelIndex,
int,
int)), SLOT(_q_sourceModelColumnsRemoved(QModelIndex,
int,
int)) }
210 if (sourceModel != currentModel) {
212 for (
const auto &c : connectionTable)
213 disconnect(currentModel, c.signalName,
this, c.slotName);
217 d->model.setValueBypassingBindings(sourceModel);
218 for (
const auto &c : connectionTable)
219 connect(sourceModel, c.signalName,
this, c.slotName);
221 d->model.setValueBypassingBindings(QAbstractItemModelPrivate::staticEmptyModel());
286QItemSelection QAbstractProxyModel::mapSelectionToSource(
const QItemSelection &proxySelection)
const
288 QModelIndexList proxyIndexes = proxySelection.indexes();
289 QItemSelection sourceSelection;
290 for (
int i = 0; i < proxyIndexes.size(); ++i) {
291 const QModelIndex proxyIdx = mapToSource(proxyIndexes.at(i));
292 if (!proxyIdx.isValid())
294 sourceSelection << QItemSelectionRange(proxyIdx);
296 return sourceSelection;
304QItemSelection QAbstractProxyModel::mapSelectionFromSource(
const QItemSelection &sourceSelection)
const
306 QModelIndexList sourceIndexes = sourceSelection.indexes();
307 QItemSelection proxySelection;
308 for (
int i = 0; i < sourceIndexes.size(); ++i) {
309 const QModelIndex srcIdx = mapFromSource(sourceIndexes.at(i));
310 if (!srcIdx.isValid())
312 proxySelection << QItemSelectionRange(srcIdx);
314 return proxySelection;
329QVariant QAbstractProxyModel::headerData(
int section, Qt::Orientation orientation,
int role)
const
331 Q_D(
const QAbstractProxyModel);
332 int sourceSection = section;
333 if (orientation == Qt::Horizontal) {
334 if (rowCount() > 0) {
335 const QModelIndex proxyIndex = index(0, section);
336 sourceSection = mapToSource(proxyIndex).column();
339 if (columnCount() > 0) {
340 const QModelIndex proxyIndex = index(section, 0);
341 sourceSection = mapToSource(proxyIndex).row();
344 return d->model->headerData(sourceSection, orientation, role);
386bool QAbstractProxyModel::setHeaderData(
int section, Qt::Orientation orientation,
const QVariant &value,
int role)
388 Q_D(QAbstractProxyModel);
390 if (orientation == Qt::Horizontal) {
391 const QModelIndex proxyIndex = index(0, section);
392 sourceSection = mapToSource(proxyIndex).column();
394 const QModelIndex proxyIndex = index(section, 0);
395 sourceSection = mapToSource(proxyIndex).row();
397 return d->model->setHeaderData(sourceSection, orientation, value, role);
440void QAbstractProxyModel::sort(
int column, Qt::SortOrder order)
442 Q_D(QAbstractProxyModel);
443 d->model->sort(column, order);
475QMimeData* QAbstractProxyModel::mimeData(
const QModelIndexList &indexes)
const
477 Q_D(
const QAbstractProxyModel);
478 QModelIndexList list;
479 list.reserve(indexes.size());
480 for (
const QModelIndex &index : indexes)
481 list << mapToSource(index);
482 return d->model->mimeData(list);
485void QAbstractProxyModelPrivate::mapDropCoordinatesToSource(
int row,
int column,
const QModelIndex &parent,
486 int *sourceRow,
int *sourceColumn, QModelIndex *sourceParent)
const
488 Q_Q(
const QAbstractProxyModel);
491 if (row == -1 && column == -1) {
492 *sourceParent = q->mapToSource(parent);
493 }
else if (row == q->rowCount(parent)) {
494 *sourceParent = q->mapToSource(parent);
495 *sourceRow = model->rowCount(*sourceParent);
497 QModelIndex proxyIndex = q->index(row, column, parent);
498 QModelIndex sourceIndex = q->mapToSource(proxyIndex);
499 *sourceRow = sourceIndex.row();
500 *sourceColumn = sourceIndex.column();
501 *sourceParent = sourceIndex.parent();
509bool QAbstractProxyModel::canDropMimeData(
const QMimeData *data, Qt::DropAction action,
510 int row,
int column,
const QModelIndex &parent)
const
512 Q_D(
const QAbstractProxyModel);
513 int sourceDestinationRow;
514 int sourceDestinationColumn;
515 QModelIndex sourceParent;
516 d->mapDropCoordinatesToSource(row, column, parent, &sourceDestinationRow, &sourceDestinationColumn, &sourceParent);
517 return d->model->canDropMimeData(data, action, sourceDestinationRow, sourceDestinationColumn, sourceParent);
524bool QAbstractProxyModel::dropMimeData(
const QMimeData *data, Qt::DropAction action,
525 int row,
int column,
const QModelIndex &parent)
527 Q_D(QAbstractProxyModel);
528 int sourceDestinationRow;
529 int sourceDestinationColumn;
530 QModelIndex sourceParent;
531 d->mapDropCoordinatesToSource(row, column, parent, &sourceDestinationRow, &sourceDestinationColumn, &sourceParent);
532 return d->model->dropMimeData(data, action, sourceDestinationRow, sourceDestinationColumn, sourceParent);