58void QAbstractProxyModelPrivate::emitHeaderDataChanged()
60 Q_Q(QAbstractProxyModel);
62 if (updateHorizontalHeader) {
63 if (
auto columnCount = q->columnCount(); columnCount > 0)
64 emit q->headerDataChanged(Qt::Horizontal, 0, columnCount - 1);
67 if (updateVerticalHeader) {
68 if (
auto rowCount = q->rowCount(); rowCount > 0)
69 emit q->headerDataChanged(Qt::Vertical, 0, rowCount - 1);
72 updateHorizontalHeader =
false;
73 updateVerticalHeader =
false;
76void QAbstractProxyModelPrivate::scheduleHeaderUpdate(Qt::Orientation orientation)
78 const bool isUpdateScheduled = updateHorizontalHeader || updateVerticalHeader;
80 if (orientation == Qt::Horizontal && !updateHorizontalHeader)
81 updateHorizontalHeader =
true;
82 else if (orientation == Qt::Vertical && !updateVerticalHeader)
83 updateVerticalHeader =
true;
87 if (!isUpdateScheduled) {
88 Q_Q(QAbstractProxyModel);
89 QMetaObject::invokeMethod(q, [
this]() { emitHeaderDataChanged(); }, Qt::QueuedConnection);
174void QAbstractProxyModel::setSourceModel(QAbstractItemModel *sourceModel)
176 Q_D(QAbstractProxyModel);
177 d->model.removeBindingUnlessInWrapper();
180 const QAbstractItemModel *currentModel = d->model.valueBypassingBindings();
181 if (!sourceModel && currentModel == QAbstractItemModelPrivate::staticEmptyModel())
183 static const struct {
184 const char *signalName;
185 const char *slotName;
186 } connectionTable[] = {
188 { SIGNAL(destroyed()), SLOT(_q_sourceModelDestroyed()) },
189 { SIGNAL(rowsAboutToBeInserted(QModelIndex,
int,
int)), SLOT(_q_sourceModelRowsAboutToBeInserted(QModelIndex,
int,
int)) },
190 { SIGNAL(rowsInserted(QModelIndex,
int,
int)), SLOT(_q_sourceModelRowsInserted(QModelIndex,
int,
int)) },
191 { SIGNAL(rowsRemoved(QModelIndex,
int,
int)), SLOT(_q_sourceModelRowsRemoved(QModelIndex,
int,
int)) },
192 { SIGNAL(columnsAboutToBeInserted(QModelIndex,
int,
int)), SLOT(_q_sourceModelColumnsAboutToBeInserted(QModelIndex,
int,
int)) },
193 { SIGNAL(columnsInserted(QModelIndex,
int,
int)), SLOT(_q_sourceModelColumnsInserted(QModelIndex,
int,
int)) },
194 { SIGNAL(columnsRemoved(QModelIndex,
int,
int)), SLOT(_q_sourceModelColumnsRemoved(QModelIndex,
int,
int)) }
198 if (sourceModel != currentModel) {
200 for (
const auto &c : connectionTable)
201 disconnect(currentModel, c.signalName,
this, c.slotName);
205 d->model.setValueBypassingBindings(sourceModel);
206 for (
const auto &c : connectionTable)
207 connect(sourceModel, c.signalName,
this, c.slotName);
209 d->model.setValueBypassingBindings(QAbstractItemModelPrivate::staticEmptyModel());
274QItemSelection QAbstractProxyModel::mapSelectionToSource(
const QItemSelection &proxySelection)
const
276 QModelIndexList proxyIndexes = proxySelection.indexes();
277 QItemSelection sourceSelection;
278 for (
int i = 0; i < proxyIndexes.size(); ++i) {
279 const QModelIndex proxyIdx = mapToSource(proxyIndexes.at(i));
280 if (!proxyIdx.isValid())
282 sourceSelection << QItemSelectionRange(proxyIdx);
284 return sourceSelection;
292QItemSelection QAbstractProxyModel::mapSelectionFromSource(
const QItemSelection &sourceSelection)
const
294 QModelIndexList sourceIndexes = sourceSelection.indexes();
295 QItemSelection proxySelection;
296 for (
int i = 0; i < sourceIndexes.size(); ++i) {
297 const QModelIndex srcIdx = mapFromSource(sourceIndexes.at(i));
298 if (!srcIdx.isValid())
300 proxySelection << QItemSelectionRange(srcIdx);
302 return proxySelection;
317QVariant QAbstractProxyModel::headerData(
int section, Qt::Orientation orientation,
int role)
const
319 Q_D(
const QAbstractProxyModel);
320 int sourceSection = section;
321 if (orientation == Qt::Horizontal) {
322 if (rowCount() > 0) {
323 const QModelIndex proxyIndex = index(0, section);
324 sourceSection = mapToSource(proxyIndex).column();
327 if (columnCount() > 0) {
328 const QModelIndex proxyIndex = index(section, 0);
329 sourceSection = mapToSource(proxyIndex).row();
332 return d->model->headerData(sourceSection, orientation, role);
374bool QAbstractProxyModel::setHeaderData(
int section, Qt::Orientation orientation,
const QVariant &value,
int role)
376 Q_D(QAbstractProxyModel);
378 if (orientation == Qt::Horizontal) {
379 const QModelIndex proxyIndex = index(0, section);
380 sourceSection = mapToSource(proxyIndex).column();
382 const QModelIndex proxyIndex = index(section, 0);
383 sourceSection = mapToSource(proxyIndex).row();
385 return d->model->setHeaderData(sourceSection, orientation, value, role);
428void QAbstractProxyModel::sort(
int column, Qt::SortOrder order)
430 Q_D(QAbstractProxyModel);
431 d->model->sort(column, order);
463QMimeData* QAbstractProxyModel::mimeData(
const QModelIndexList &indexes)
const
465 Q_D(
const QAbstractProxyModel);
466 QModelIndexList list;
467 list.reserve(indexes.size());
468 for (
const QModelIndex &index : indexes)
469 list << mapToSource(index);
470 return d->model->mimeData(list);
473void QAbstractProxyModelPrivate::mapDropCoordinatesToSource(
int row,
int column,
const QModelIndex &parent,
474 int *sourceRow,
int *sourceColumn, QModelIndex *sourceParent)
const
476 Q_Q(
const QAbstractProxyModel);
479 if (row == -1 && column == -1) {
480 *sourceParent = q->mapToSource(parent);
481 }
else if (row == q->rowCount(parent)) {
482 *sourceParent = q->mapToSource(parent);
483 *sourceRow = model->rowCount(*sourceParent);
485 QModelIndex proxyIndex = q->index(row, column, parent);
486 QModelIndex sourceIndex = q->mapToSource(proxyIndex);
487 *sourceRow = sourceIndex.row();
488 *sourceColumn = sourceIndex.column();
489 *sourceParent = sourceIndex.parent();
497bool QAbstractProxyModel::canDropMimeData(
const QMimeData *data, Qt::DropAction action,
498 int row,
int column,
const QModelIndex &parent)
const
500 Q_D(
const QAbstractProxyModel);
501 int sourceDestinationRow;
502 int sourceDestinationColumn;
503 QModelIndex sourceParent;
504 d->mapDropCoordinatesToSource(row, column, parent, &sourceDestinationRow, &sourceDestinationColumn, &sourceParent);
505 return d->model->canDropMimeData(data, action, sourceDestinationRow, sourceDestinationColumn, sourceParent);
512bool QAbstractProxyModel::dropMimeData(
const QMimeData *data, Qt::DropAction action,
513 int row,
int column,
const QModelIndex &parent)
515 Q_D(QAbstractProxyModel);
516 int sourceDestinationRow;
517 int sourceDestinationColumn;
518 QModelIndex sourceParent;
519 d->mapDropCoordinatesToSource(row, column, parent, &sourceDestinationRow, &sourceDestinationColumn, &sourceParent);
520 return d->model->dropMimeData(data, action, sourceDestinationRow, sourceDestinationColumn, sourceParent);