59void QAbstractProxyModelPrivate::emitHeaderDataChanged()
61 Q_Q(QAbstractProxyModel);
63 if (updateHorizontalHeader) {
64 if (
auto columnCount = q->columnCount(); columnCount > 0)
65 emit q->headerDataChanged(Qt::Horizontal, 0, columnCount - 1);
68 if (updateVerticalHeader) {
69 if (
auto rowCount = q->rowCount(); rowCount > 0)
70 emit q->headerDataChanged(Qt::Vertical, 0, rowCount - 1);
73 updateHorizontalHeader =
false;
74 updateVerticalHeader =
false;
77void QAbstractProxyModelPrivate::scheduleHeaderUpdate(Qt::Orientation orientation)
79 const bool isUpdateScheduled = updateHorizontalHeader || updateVerticalHeader;
81 if (orientation == Qt::Horizontal && !updateHorizontalHeader)
82 updateHorizontalHeader =
true;
83 else if (orientation == Qt::Vertical && !updateVerticalHeader)
84 updateVerticalHeader =
true;
88 if (!isUpdateScheduled) {
89 Q_Q(QAbstractProxyModel);
90 QMetaObject::invokeMethod(q, [
this]() { emitHeaderDataChanged(); }, Qt::QueuedConnection);
175void QAbstractProxyModel::setSourceModel(QAbstractItemModel *sourceModel)
177 Q_D(QAbstractProxyModel);
178 d->model.removeBindingUnlessInWrapper();
181 const QAbstractItemModel *currentModel = d->model.valueBypassingBindings();
182 if (!sourceModel && currentModel == QAbstractItemModelPrivate::staticEmptyModel())
184 static const struct {
185 const char *signalName;
186 const char *slotName;
187 } connectionTable[] = {
189 { SIGNAL(destroyed()), SLOT(_q_sourceModelDestroyed()) },
190 { SIGNAL(rowsAboutToBeInserted(QModelIndex,
int,
int)), SLOT(_q_sourceModelRowsAboutToBeInserted(QModelIndex,
int,
int)) },
191 { SIGNAL(rowsInserted(QModelIndex,
int,
int)), SLOT(_q_sourceModelRowsInserted(QModelIndex,
int,
int)) },
192 { SIGNAL(rowsRemoved(QModelIndex,
int,
int)), SLOT(_q_sourceModelRowsRemoved(QModelIndex,
int,
int)) },
193 { SIGNAL(columnsAboutToBeInserted(QModelIndex,
int,
int)), SLOT(_q_sourceModelColumnsAboutToBeInserted(QModelIndex,
int,
int)) },
194 { SIGNAL(columnsInserted(QModelIndex,
int,
int)), SLOT(_q_sourceModelColumnsInserted(QModelIndex,
int,
int)) },
195 { SIGNAL(columnsRemoved(QModelIndex,
int,
int)), SLOT(_q_sourceModelColumnsRemoved(QModelIndex,
int,
int)) }
199 if (sourceModel != currentModel) {
201 for (
const auto &c : connectionTable)
202 disconnect(currentModel, c.signalName,
this, c.slotName);
206 d->model.setValueBypassingBindings(sourceModel);
207 for (
const auto &c : connectionTable)
208 connect(sourceModel, c.signalName,
this, c.slotName);
210 d->model.setValueBypassingBindings(QAbstractItemModelPrivate::staticEmptyModel());
275QItemSelection QAbstractProxyModel::mapSelectionToSource(
const QItemSelection &proxySelection)
const
277 QModelIndexList proxyIndexes = proxySelection.indexes();
278 QItemSelection sourceSelection;
279 for (
int i = 0; i < proxyIndexes.size(); ++i) {
280 const QModelIndex proxyIdx = mapToSource(proxyIndexes.at(i));
281 if (!proxyIdx.isValid())
283 sourceSelection << QItemSelectionRange(proxyIdx);
285 return sourceSelection;
293QItemSelection QAbstractProxyModel::mapSelectionFromSource(
const QItemSelection &sourceSelection)
const
295 QModelIndexList sourceIndexes = sourceSelection.indexes();
296 QItemSelection proxySelection;
297 for (
int i = 0; i < sourceIndexes.size(); ++i) {
298 const QModelIndex srcIdx = mapFromSource(sourceIndexes.at(i));
299 if (!srcIdx.isValid())
301 proxySelection << QItemSelectionRange(srcIdx);
303 return proxySelection;
318QVariant QAbstractProxyModel::headerData(
int section, Qt::Orientation orientation,
int role)
const
320 Q_D(
const QAbstractProxyModel);
321 int sourceSection = section;
322 if (orientation == Qt::Horizontal) {
323 if (rowCount() > 0) {
324 const QModelIndex proxyIndex = index(0, section);
325 sourceSection = mapToSource(proxyIndex).column();
328 if (columnCount() > 0) {
329 const QModelIndex proxyIndex = index(section, 0);
330 sourceSection = mapToSource(proxyIndex).row();
333 return d->model->headerData(sourceSection, orientation, role);
375bool QAbstractProxyModel::setHeaderData(
int section, Qt::Orientation orientation,
const QVariant &value,
int role)
377 Q_D(QAbstractProxyModel);
379 if (orientation == Qt::Horizontal) {
380 const QModelIndex proxyIndex = index(0, section);
381 sourceSection = mapToSource(proxyIndex).column();
383 const QModelIndex proxyIndex = index(section, 0);
384 sourceSection = mapToSource(proxyIndex).row();
386 return d->model->setHeaderData(sourceSection, orientation, value, role);
429void QAbstractProxyModel::sort(
int column, Qt::SortOrder order)
431 Q_D(QAbstractProxyModel);
432 d->model->sort(column, order);
464QMimeData* QAbstractProxyModel::mimeData(
const QModelIndexList &indexes)
const
466 Q_D(
const QAbstractProxyModel);
467 QModelIndexList list;
468 list.reserve(indexes.size());
469 for (
const QModelIndex &index : indexes)
470 list << mapToSource(index);
471 return d->model->mimeData(list);
474void QAbstractProxyModelPrivate::mapDropCoordinatesToSource(
int row,
int column,
const QModelIndex &parent,
475 int *sourceRow,
int *sourceColumn, QModelIndex *sourceParent)
const
477 Q_Q(
const QAbstractProxyModel);
480 if (row == -1 && column == -1) {
481 *sourceParent = q->mapToSource(parent);
482 }
else if (row == q->rowCount(parent)) {
483 *sourceParent = q->mapToSource(parent);
484 *sourceRow = model->rowCount(*sourceParent);
486 QModelIndex proxyIndex = q->index(row, column, parent);
487 QModelIndex sourceIndex = q->mapToSource(proxyIndex);
488 *sourceRow = sourceIndex.row();
489 *sourceColumn = sourceIndex.column();
490 *sourceParent = sourceIndex.parent();
498bool QAbstractProxyModel::canDropMimeData(
const QMimeData *data, Qt::DropAction action,
499 int row,
int column,
const QModelIndex &parent)
const
501 Q_D(
const QAbstractProxyModel);
502 int sourceDestinationRow;
503 int sourceDestinationColumn;
504 QModelIndex sourceParent;
505 d->mapDropCoordinatesToSource(row, column, parent, &sourceDestinationRow, &sourceDestinationColumn, &sourceParent);
506 return d->model->canDropMimeData(data, action, sourceDestinationRow, sourceDestinationColumn, sourceParent);
513bool QAbstractProxyModel::dropMimeData(
const QMimeData *data, Qt::DropAction action,
514 int row,
int column,
const QModelIndex &parent)
516 Q_D(QAbstractProxyModel);
517 int sourceDestinationRow;
518 int sourceDestinationColumn;
519 QModelIndex sourceParent;
520 d->mapDropCoordinatesToSource(row, column, parent, &sourceDestinationRow, &sourceDestinationColumn, &sourceParent);
521 return d->model->dropMimeData(data, action, sourceDestinationRow, sourceDestinationColumn, sourceParent);