5#include <QtQuickTemplates2/private/qquickheaderview_p_p.h>
9
10
11
12
13
14
15
16
17
18
21
22
23
24
25
26
27
28
29
30
33
34
35
36
39
40
41
42
45
46
47
48
51
52
53
54
57
58
59
60
63
64
65
66
69
70
71
72
73
76
77
78
79
80
87QQuickHeaderViewBasePrivate::QQuickHeaderViewBasePrivate()
88 : QQuickTableViewPrivate()
92QQuickHeaderViewBasePrivate::~QQuickHeaderViewBasePrivate()
96void QQuickHeaderViewBasePrivate::init()
98 Q_Q(QQuickHeaderViewBase);
99 m_headerDataProxyModel.m_headerView = q;
100 setSizePolicy(orientation() == Qt::Horizontal ? QLayoutPolicy::Preferred : QLayoutPolicy::Fixed,
101 orientation() == Qt::Horizontal ? QLayoutPolicy::Fixed : QLayoutPolicy::Preferred);
102 q->setSyncDirection(orientation());
105const QPointer<QQuickItem> QQuickHeaderViewBasePrivate::delegateItemAt(
int row,
int col)
const
107 return loadedTableItem(QPoint(col, row))->item;
110QVariant QQuickHeaderViewBasePrivate::modelImpl()
const
114 if (m_headerDataProxyModel.sourceModel())
115 return QVariant::fromValue(&m_headerDataProxyModel);
118 return QQuickTableViewPrivate::modelImpl();
121void QQuickHeaderViewBasePrivate::setModelImpl(
const QVariant &newModel)
123 m_modelExplicitlySet = newModel.isValid();
125 auto asTableModel = [](QAbstractItemModel *model) -> QAbstractItemModel* {
126 if (qobject_cast<QAbstractTableModel *>(model))
135 if (model && QByteArrayView(model->metaObject()->className()) ==
"QQmlTableModel")
140 if (
auto qabstracttablemodel = asTableModel(qaim(newModel))) {
141 if (qabstracttablemodel != m_headerDataProxyModel.sourceModel()) {
142 m_headerDataProxyModel.setSourceModel(qabstracttablemodel);
143 assignedModel = QVariant::fromValue(std::addressof(m_headerDataProxyModel));
144 scheduleRebuildTable(QQuickTableViewPrivate::RebuildOption::All);
145 emit q_func()->modelChanged();
150 m_headerDataProxyModel.setSourceModel(
nullptr);
151 QQuickTableViewPrivate::setModelImpl(newModel);
154void QQuickHeaderViewBasePrivate::syncModel()
156 if (!m_modelExplicitlySet && assignedSyncView) {
161 auto syncView_d = QQuickTableViewPrivate::get(assignedSyncView);
162 auto syncViewModelAsQaim = qaim(syncView_d->assignedModel);
163 if (syncViewModelAsQaim != m_headerDataProxyModel.sourceModel()) {
164 m_headerDataProxyModel.setSourceModel(syncViewModelAsQaim);
165 assignedModel = QVariant::fromValue(std::addressof(m_headerDataProxyModel));
166 emit q_func()->modelChanged();
170 QQuickTableViewPrivate::syncModel();
176 isTransposed =
false;
177 const auto aim = model->abstractItemModel();
178 if (orientation() == Qt::Horizontal)
179 isTransposed = !aim || aim->columnCount() == 1;
181 if (m_textRole.isEmpty() && aim)
182 m_textRole = QLatin1String(
"display");
185void QQuickHeaderViewBasePrivate::syncSyncView()
187 if (assignedSyncDirection != orientation()) {
188 qmlWarning(q_func()) <<
"Setting syncDirection other than Qt::"
189 << QVariant::fromValue(orientation()).toString()
191 assignedSyncDirection = orientation();
193 QQuickTableViewPrivate::syncSyncView();
196QAbstractItemModel *QQuickHeaderViewBasePrivate::selectionSourceModel()
203 return &m_headerDataProxyModel;
206void QQuickHeaderViewBasePrivate::initItemCallback(
int modelIndex, QObject *object)
208 Q_Q(QQuickHeaderViewBase);
210 QQuickTableViewPrivate::initItemCallback(modelIndex, object);
212 auto item = qobject_cast<QQuickItem *>(object);
216 QQmlDelegateModelItem *modelItem = tableModel->getModelItem(modelIndex);
218 setRequiredProperty(kRequiredProperty_headerView, QVariant::fromValue(q),
219 modelIndex, item,
true);
220 setRequiredProperty(kRequiredProperty_model, QVariant::fromValue(modelItem->modelObject()),
221 modelIndex, item,
true);
224int QQuickHeaderViewBasePrivate::logicalRowIndex(
const int visualIndex)
const
226 return (m_headerDataProxyModel.orientation() == Qt::Horizontal) ? visualIndex : QQuickTableViewPrivate::logicalRowIndex(visualIndex);
229int QQuickHeaderViewBasePrivate::logicalColumnIndex(
const int visualIndex)
const
231 return (m_headerDataProxyModel.orientation() == Qt::Vertical) ? visualIndex : QQuickTableViewPrivate::logicalColumnIndex(visualIndex);
234int QQuickHeaderViewBasePrivate::visualRowIndex(
const int logicalIndex)
const
236 return (m_headerDataProxyModel.orientation() == Qt::Horizontal) ? logicalIndex : QQuickTableViewPrivate::visualRowIndex(logicalIndex);
239int QQuickHeaderViewBasePrivate::visualColumnIndex(
const int logicalIndex)
const
241 return (m_headerDataProxyModel.orientation() == Qt::Vertical) ? logicalIndex : QQuickTableViewPrivate::visualColumnIndex(logicalIndex);
244QQuickHeaderViewBase::QQuickHeaderViewBase(Qt::Orientation orient, QQuickItem *parent)
245 : QQuickTableView(*(
new QQuickHeaderViewBasePrivate), parent)
247 Q_D(QQuickHeaderViewBase);
248 d->setOrientation(orient);
252QQuickHeaderViewBase::QQuickHeaderViewBase(QQuickHeaderViewBasePrivate &dd, QQuickItem *parent)
253 : QQuickTableView(dd, parent)
255 Q_D(QQuickHeaderViewBase);
259QQuickHeaderViewBase::~QQuickHeaderViewBase()
263QString QQuickHeaderViewBase::textRole()
const
265 Q_D(
const QQuickHeaderViewBase);
266 return d->m_textRole;
269void QQuickHeaderViewBase::setTextRole(
const QString &role)
271 Q_D(QQuickHeaderViewBase);
272 if (d->m_textRole == role)
275 d->m_textRole = role;
276 emit textRoleChanged();
279Qt::Orientation QQuickHeaderViewBasePrivate::orientation()
const
281 return m_headerDataProxyModel.orientation();
284void QQuickHeaderViewBasePrivate::setOrientation(Qt::Orientation orientation)
286 if (QQuickHeaderViewBasePrivate::orientation() == orientation)
288 m_headerDataProxyModel.setOrientation(orientation);
291QQuickVerticalHeaderView::QQuickVerticalHeaderView(QQuickVerticalHeaderViewPrivate &dd, QQuickItem *parent)
292 : QQuickHeaderViewBase(dd, parent)
297
298
299
300
301
302QHeaderDataProxyModel::QHeaderDataProxyModel(QObject *parent)
303 : QAbstractItemModel(parent)
307QHeaderDataProxyModel::~QHeaderDataProxyModel() =
default;
309void QHeaderDataProxyModel::setSourceModel(QAbstractItemModel *newSourceModel)
311 if (m_model == newSourceModel)
314 disconnectFromModel();
315 m_model = newSourceModel;
320QModelIndex QHeaderDataProxyModel::index(
int row,
int column,
const QModelIndex &parent)
const
322 return hasIndex(row, column, parent) ? createIndex(row, column) : QModelIndex();
325QModelIndex QHeaderDataProxyModel::parent(
const QModelIndex &child)
const
328 return QModelIndex();
331QModelIndex QHeaderDataProxyModel::sibling(
int row,
int column,
const QModelIndex &)
const
333 return index(row, column);
336int QHeaderDataProxyModel::rowCount(
const QModelIndex &parent)
const
338 if (parent.isValid())
340 return m_model.isNull() ? -1 : (m_orientation == Qt::Horizontal ? 1 : m_model->rowCount(parent));
343int QHeaderDataProxyModel::columnCount(
const QModelIndex &parent)
const
345 if (parent.isValid())
347 return m_model.isNull() ? -1 : (m_orientation == Qt::Vertical ? 1 : m_model->columnCount(parent));
350QVariant QHeaderDataProxyModel::data(
const QModelIndex &index,
int role)
const
352 if (m_model.isNull())
354 if (!hasIndex(index.row(), index.column()))
355 return QModelIndex();
356 auto section = m_orientation == Qt::Vertical ? index.row() : index.column();
357 return m_model->headerData(section, m_orientation, role);
360bool QHeaderDataProxyModel::setData(
const QModelIndex &index,
const QVariant &value,
int role)
362 if (!hasIndex(index.row(), index.column()))
364 auto section = m_orientation == Qt::Vertical ? index.row() : index.column();
365 auto ret = m_model->setHeaderData(section, m_orientation, value, role);
366 emit dataChanged(index, index, { role });
370bool QHeaderDataProxyModel::hasChildren(
const QModelIndex &parent)
const
372 if (!parent.isValid())
373 return rowCount(parent) > 0 && columnCount(parent) > 0;
377QHash<
int, QByteArray> QHeaderDataProxyModel::roleNames()
const
379 using namespace Qt::Literals::StringLiterals;
381 auto names = m_model ? m_model->roleNames() : QAbstractItemModel::roleNames();
383 QString textRole = m_headerView->textRole();
384 if (textRole.isEmpty())
385 textRole = u"display"_s;
386 if (!names.values().contains(textRole.toUtf8().constData())) {
387 qmlWarning(m_headerView).nospace() <<
"The 'textRole' property contains a role that doesn't exist in the model: "
388 << textRole <<
". Check your model's roleNames() implementation";
395QVariant QHeaderDataProxyModel::variantValue()
const
397 return QVariant::fromValue(
static_cast<QObject *>(
const_cast<QHeaderDataProxyModel *>(
this)));
400void QHeaderDataProxyModel::setOrientation(Qt::Orientation o)
402 if (o == m_orientation)
409Qt::Orientation QHeaderDataProxyModel::orientation()
const
411 return m_orientation;
414QPointer<QAbstractItemModel> QHeaderDataProxyModel::sourceModel()
const
419void QHeaderDataProxyModel::connectToModel()
421 if (m_model.isNull())
423 connect(m_model, &QAbstractItemModel::headerDataChanged,
424 this, [
this](Qt::Orientation orient,
int first,
int last) {
425 if (orient != orientation())
427 if (orient == Qt::Horizontal) {
428 emit dataChanged(createIndex(0, first), createIndex(0, last));
430 emit dataChanged(createIndex(first, 0), createIndex(last, 0));
433 connect(m_model, &QAbstractItemModel::modelAboutToBeReset,
434 this, &QHeaderDataProxyModel::modelAboutToBeReset, Qt::UniqueConnection);
435 connect(m_model, &QAbstractItemModel::modelReset,
436 this, &QHeaderDataProxyModel::modelReset, Qt::UniqueConnection);
437 connect(m_model, &QAbstractItemModel::rowsAboutToBeMoved,
438 this, &QHeaderDataProxyModel::rowsAboutToBeMoved, Qt::UniqueConnection);
439 connect(m_model, &QAbstractItemModel::rowsMoved,
440 this, &QHeaderDataProxyModel::rowsMoved, Qt::UniqueConnection);
441 connect(m_model, &QAbstractItemModel::rowsAboutToBeInserted,
442 this, &QHeaderDataProxyModel::rowsAboutToBeInserted, Qt::UniqueConnection);
443 connect(m_model, &QAbstractItemModel::rowsInserted,
444 this, &QHeaderDataProxyModel::rowsInserted, Qt::UniqueConnection);
445 connect(m_model, &QAbstractItemModel::rowsAboutToBeRemoved,
446 this, &QHeaderDataProxyModel::rowsAboutToBeRemoved, Qt::UniqueConnection);
447 connect(m_model, &QAbstractItemModel::rowsRemoved,
448 this, &QHeaderDataProxyModel::rowsRemoved, Qt::UniqueConnection);
449 connect(m_model, &QAbstractItemModel::columnsAboutToBeMoved,
450 this, &QHeaderDataProxyModel::columnsAboutToBeMoved, Qt::UniqueConnection);
451 connect(m_model, &QAbstractItemModel::columnsMoved,
452 this, &QHeaderDataProxyModel::columnsMoved, Qt::UniqueConnection);
453 connect(m_model, &QAbstractItemModel::columnsAboutToBeInserted,
454 this, &QHeaderDataProxyModel::columnsAboutToBeInserted, Qt::UniqueConnection);
455 connect(m_model, &QAbstractItemModel::columnsInserted,
456 this, &QHeaderDataProxyModel::columnsInserted, Qt::UniqueConnection);
457 connect(m_model, &QAbstractItemModel::columnsAboutToBeRemoved,
458 this, &QHeaderDataProxyModel::columnsAboutToBeRemoved, Qt::UniqueConnection);
459 connect(m_model, &QAbstractItemModel::columnsRemoved,
460 this, &QHeaderDataProxyModel::columnsRemoved, Qt::UniqueConnection);
461 connect(m_model, &QAbstractItemModel::layoutAboutToBeChanged,
462 this, &QHeaderDataProxyModel::layoutAboutToBeChanged, Qt::UniqueConnection);
463 connect(m_model, &QAbstractItemModel::layoutChanged,
464 this, &QHeaderDataProxyModel::layoutChanged, Qt::UniqueConnection);
467void QHeaderDataProxyModel::disconnectFromModel()
469 if (m_model.isNull())
471 m_model->disconnect(
this);
474QQuickHorizontalHeaderView::QQuickHorizontalHeaderView(QQuickItem *parent)
475 : QQuickHeaderViewBase(*(
new QQuickHorizontalHeaderViewPrivate), parent)
477 setFlickableDirection(FlickableDirection::HorizontalFlick);
478 setResizableColumns(
true);
481QQuickHorizontalHeaderView::~QQuickHorizontalHeaderView()
483#if QT_CONFIG(quick_draganddrop)
484 Q_D(QQuickHorizontalHeaderView);
485 d->destroySectionDragHandler();
489bool QQuickHorizontalHeaderView::movableColumns()
const
491 Q_D(
const QQuickHorizontalHeaderView);
492 return d->m_movableColumns;
495void QQuickHorizontalHeaderView::setMovableColumns(
bool movableColumns)
497 Q_D(QQuickHorizontalHeaderView);
498 if (d->m_movableColumns == movableColumns)
501 d->m_movableColumns = movableColumns;
503#if QT_CONFIG(quick_draganddrop)
504 if (d->m_movableColumns)
505 d->initSectionDragHandler(Qt::Horizontal);
507 d->destroySectionDragHandler();
510 emit movableColumnsChanged();
513QQuickVerticalHeaderView::QQuickVerticalHeaderView(QQuickItem *parent)
514 : QQuickHeaderViewBase(*(
new QQuickVerticalHeaderViewPrivate), parent)
516 setFlickableDirection(FlickableDirection::VerticalFlick);
517 setResizableRows(
true);
520QQuickVerticalHeaderView::~QQuickVerticalHeaderView()
522#if QT_CONFIG(quick_draganddrop)
523 Q_D(QQuickVerticalHeaderView);
524 d->destroySectionDragHandler();
528bool QQuickVerticalHeaderView::movableRows()
const
530 Q_D(
const QQuickVerticalHeaderView);
531 return d->m_movableRows ;
534void QQuickVerticalHeaderView::setMovableRows(
bool movableRows)
536 Q_D(QQuickVerticalHeaderView);
537 if (d->m_movableRows == movableRows)
540 d->m_movableRows = movableRows;
542#if QT_CONFIG(quick_draganddrop)
543 if (d->m_movableRows)
544 d->initSectionDragHandler(Qt::Vertical);
546 d->destroySectionDragHandler();
549 emit movableRowsChanged();
552QQuickHorizontalHeaderViewPrivate::QQuickHorizontalHeaderViewPrivate()
554 setOrientation(Qt::Horizontal);
557QQuickHorizontalHeaderViewPrivate::~QQuickHorizontalHeaderViewPrivate() =
default;
559QQuickVerticalHeaderViewPrivate::QQuickVerticalHeaderViewPrivate()
561 setOrientation(Qt::Vertical);
564QQuickVerticalHeaderViewPrivate::~QQuickVerticalHeaderViewPrivate() =
default;
568#include "moc_qquickheaderview_p_p.cpp"
570#include "moc_qquickheaderview_p.cpp"