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
83
84
85
86
87
90
91
92
93
94
97
98
99
100
101
108QQuickHeaderViewBasePrivate::QQuickHeaderViewBasePrivate()
109 : QQuickTableViewPrivate()
113QQuickHeaderViewBasePrivate::~QQuickHeaderViewBasePrivate()
117void QQuickHeaderViewBasePrivate::init()
119 Q_Q(QQuickHeaderViewBase);
120 m_headerDataProxyModel.m_headerView = q;
121 setSizePolicy(orientation() == Qt::Horizontal ? QLayoutPolicy::Preferred : QLayoutPolicy::Fixed,
122 orientation() == Qt::Horizontal ? QLayoutPolicy::Fixed : QLayoutPolicy::Preferred);
123 q->setSyncDirection(orientation());
126const QPointer<QQuickItem> QQuickHeaderViewBasePrivate::delegateItemAt(
int row,
int col)
const
128 return loadedTableItem(QPoint(col, row))->item;
131QVariant QQuickHeaderViewBasePrivate::modelImpl()
const
135 if (m_headerDataProxyModel.sourceModel())
136 return QVariant::fromValue(&m_headerDataProxyModel);
139 return QQuickTableViewPrivate::modelImpl();
142void QQuickHeaderViewBasePrivate::setModelImpl(
const QVariant &newModel)
144 m_modelExplicitlySet = newModel.isValid();
146 auto asTableModel = [](QAbstractItemModel *model) -> QAbstractItemModel* {
147 if (qobject_cast<QAbstractTableModel *>(model))
156 if (model && QByteArrayView(model->metaObject()->className()) ==
"QQmlTableModel")
161 if (
auto qabstracttablemodel = asTableModel(qaim(newModel))) {
162 if (qabstracttablemodel != m_headerDataProxyModel.sourceModel()) {
163 m_headerDataProxyModel.setSourceModel(qabstracttablemodel);
164 assignedModel = QVariant::fromValue(std::addressof(m_headerDataProxyModel));
165 scheduleRebuildTable(QQuickTableViewPrivate::RebuildOption::All);
166 emit q_func()->modelChanged();
171 m_headerDataProxyModel.setSourceModel(
nullptr);
172 QQuickTableViewPrivate::setModelImpl(newModel);
175void QQuickHeaderViewBasePrivate::syncModel()
177 if (!m_modelExplicitlySet && assignedSyncView) {
182 auto syncView_d = QQuickTableViewPrivate::get(assignedSyncView);
183 auto syncViewModelAsQaim = qaim(syncView_d->assignedModel);
184 if (syncViewModelAsQaim != m_headerDataProxyModel.sourceModel()) {
185 m_headerDataProxyModel.setSourceModel(syncViewModelAsQaim);
186 assignedModel = QVariant::fromValue(std::addressof(m_headerDataProxyModel));
187 emit q_func()->modelChanged();
191 QQuickTableViewPrivate::syncModel();
197 isTransposed =
false;
198 const auto aim = model->abstractItemModel();
199 if (orientation() == Qt::Horizontal)
200 isTransposed = !aim || aim->columnCount() == 1;
202 if (m_textRole.isEmpty() && aim)
203 m_textRole = QLatin1String(
"display");
206void QQuickHeaderViewBasePrivate::syncSyncView()
208 if (assignedSyncDirection != orientation()) {
209 qmlWarning(q_func()) <<
"Setting syncDirection other than Qt::"
210 << QVariant::fromValue(orientation()).toString()
212 assignedSyncDirection = orientation();
214 QQuickTableViewPrivate::syncSyncView();
217QAbstractItemModel *QQuickHeaderViewBasePrivate::selectionSourceModel()
224 return &m_headerDataProxyModel;
227void QQuickHeaderViewBasePrivate::initItemCallback(
int modelIndex, QObject *object)
229 Q_Q(QQuickHeaderViewBase);
231 QQuickTableViewPrivate::initItemCallback(modelIndex, object);
233 auto item = qobject_cast<QQuickItem *>(object);
237 QQmlDelegateModelItem *modelItem = tableModel->getModelItem(modelIndex);
239 setRequiredProperty(kRequiredProperty_headerView, QVariant::fromValue(q),
240 modelIndex, item,
true);
241 setRequiredProperty(kRequiredProperty_model, QVariant::fromValue(modelItem->modelObject()),
242 modelIndex, item,
true);
245int QQuickHeaderViewBasePrivate::logicalRowIndex(
const int visualIndex)
const
247 return (m_headerDataProxyModel.orientation() == Qt::Horizontal) ? visualIndex : QQuickTableViewPrivate::logicalRowIndex(visualIndex);
250int QQuickHeaderViewBasePrivate::logicalColumnIndex(
const int visualIndex)
const
252 return (m_headerDataProxyModel.orientation() == Qt::Vertical) ? visualIndex : QQuickTableViewPrivate::logicalColumnIndex(visualIndex);
255int QQuickHeaderViewBasePrivate::visualRowIndex(
const int logicalIndex)
const
257 return (m_headerDataProxyModel.orientation() == Qt::Horizontal) ? logicalIndex : QQuickTableViewPrivate::visualRowIndex(logicalIndex);
260int QQuickHeaderViewBasePrivate::visualColumnIndex(
const int logicalIndex)
const
262 return (m_headerDataProxyModel.orientation() == Qt::Vertical) ? logicalIndex : QQuickTableViewPrivate::visualColumnIndex(logicalIndex);
265QQuickHeaderViewBase::QQuickHeaderViewBase(Qt::Orientation orient, QQuickItem *parent)
266 : QQuickTableView(*(
new QQuickHeaderViewBasePrivate), parent)
268 Q_D(QQuickHeaderViewBase);
269 d->setOrientation(orient);
273QQuickHeaderViewBase::QQuickHeaderViewBase(QQuickHeaderViewBasePrivate &dd, QQuickItem *parent)
274 : QQuickTableView(dd, parent)
276 Q_D(QQuickHeaderViewBase);
280QQuickHeaderViewBase::~QQuickHeaderViewBase()
284QString QQuickHeaderViewBase::textRole()
const
286 Q_D(
const QQuickHeaderViewBase);
287 return d->m_textRole;
290void QQuickHeaderViewBase::setTextRole(
const QString &role)
292 Q_D(QQuickHeaderViewBase);
293 if (d->m_textRole == role)
296 d->m_textRole = role;
297 emit textRoleChanged();
300Qt::Orientation QQuickHeaderViewBasePrivate::orientation()
const
302 return m_headerDataProxyModel.orientation();
305void QQuickHeaderViewBasePrivate::setOrientation(Qt::Orientation orientation)
307 if (QQuickHeaderViewBasePrivate::orientation() == orientation)
309 m_headerDataProxyModel.setOrientation(orientation);
312QQuickVerticalHeaderView::QQuickVerticalHeaderView(QQuickVerticalHeaderViewPrivate &dd, QQuickItem *parent)
313 : QQuickHeaderViewBase(dd, parent)
318
319
320
321
322
323QHeaderDataProxyModel::QHeaderDataProxyModel(QObject *parent)
324 : QAbstractItemModel(parent)
328QHeaderDataProxyModel::~QHeaderDataProxyModel() =
default;
330void QHeaderDataProxyModel::setSourceModel(QAbstractItemModel *newSourceModel)
332 if (m_model == newSourceModel)
335 disconnectFromModel();
336 m_model = newSourceModel;
341QModelIndex QHeaderDataProxyModel::index(
int row,
int column,
const QModelIndex &parent)
const
343 return hasIndex(row, column, parent) ? createIndex(row, column) : QModelIndex();
346QModelIndex QHeaderDataProxyModel::parent(
const QModelIndex &child)
const
349 return QModelIndex();
352QModelIndex QHeaderDataProxyModel::sibling(
int row,
int column,
const QModelIndex &)
const
354 return index(row, column);
357int QHeaderDataProxyModel::rowCount(
const QModelIndex &parent)
const
359 if (parent.isValid())
361 return m_model.isNull() ? -1 : (m_orientation == Qt::Horizontal ? 1 : m_model->rowCount(parent));
364int QHeaderDataProxyModel::columnCount(
const QModelIndex &parent)
const
366 if (parent.isValid())
368 return m_model.isNull() ? -1 : (m_orientation == Qt::Vertical ? 1 : m_model->columnCount(parent));
371QVariant QHeaderDataProxyModel::data(
const QModelIndex &index,
int role)
const
373 if (m_model.isNull() || !hasIndex(index.row(), index.column()))
375 auto section = m_orientation == Qt::Vertical ? index.row() : index.column();
376 return m_model->headerData(section, m_orientation, role);
379bool QHeaderDataProxyModel::setData(
const QModelIndex &index,
const QVariant &value,
int role)
381 if (!hasIndex(index.row(), index.column()))
383 auto section = m_orientation == Qt::Vertical ? index.row() : index.column();
384 auto ret = m_model->setHeaderData(section, m_orientation, value, role);
388bool QHeaderDataProxyModel::hasChildren(
const QModelIndex &parent)
const
390 if (!parent.isValid())
391 return rowCount(parent) > 0 && columnCount(parent) > 0;
395QHash<
int, QByteArray> QHeaderDataProxyModel::roleNames()
const
397 using namespace Qt::Literals::StringLiterals;
399 auto names = m_model ? m_model->roleNames() : QAbstractItemModel::roleNames();
401 QString textRole = m_headerView->textRole();
402 if (textRole.isEmpty())
403 textRole = u"display"_s;
404 if (!names.values().contains(textRole.toUtf8().constData())) {
405 qmlWarning(m_headerView).nospace() <<
"The 'textRole' property contains a role that doesn't exist in the model: "
406 << textRole <<
". Check your model's roleNames() implementation";
413QVariant QHeaderDataProxyModel::variantValue()
const
415 return QVariant::fromValue(
static_cast<QObject *>(
const_cast<QHeaderDataProxyModel *>(
this)));
418void QHeaderDataProxyModel::setOrientation(Qt::Orientation o)
420 if (o == m_orientation)
427Qt::Orientation QHeaderDataProxyModel::orientation()
const
429 return m_orientation;
432QPointer<QAbstractItemModel> QHeaderDataProxyModel::sourceModel()
const
437void QHeaderDataProxyModel::connectToModel()
439 if (m_model.isNull())
441 connect(m_model, &QAbstractItemModel::headerDataChanged,
442 this, [
this](Qt::Orientation orient,
int first,
int last) {
443 if (orient != orientation())
445 if (orient == Qt::Horizontal) {
446 emit dataChanged(createIndex(0, first), createIndex(0, last));
448 emit dataChanged(createIndex(first, 0), createIndex(last, 0));
451 connect(m_model, &QAbstractItemModel::modelAboutToBeReset,
452 this, &QHeaderDataProxyModel::modelAboutToBeReset, Qt::UniqueConnection);
453 connect(m_model, &QAbstractItemModel::modelReset,
454 this, &QHeaderDataProxyModel::modelReset, Qt::UniqueConnection);
455 connect(m_model, &QAbstractItemModel::rowsAboutToBeMoved,
456 this, &QHeaderDataProxyModel::rowsAboutToBeMoved, Qt::UniqueConnection);
457 connect(m_model, &QAbstractItemModel::rowsMoved,
458 this, &QHeaderDataProxyModel::rowsMoved, Qt::UniqueConnection);
459 connect(m_model, &QAbstractItemModel::rowsAboutToBeInserted,
460 this, &QHeaderDataProxyModel::rowsAboutToBeInserted, Qt::UniqueConnection);
461 connect(m_model, &QAbstractItemModel::rowsInserted,
462 this, &QHeaderDataProxyModel::rowsInserted, Qt::UniqueConnection);
463 connect(m_model, &QAbstractItemModel::rowsAboutToBeRemoved,
464 this, &QHeaderDataProxyModel::rowsAboutToBeRemoved, Qt::UniqueConnection);
465 connect(m_model, &QAbstractItemModel::rowsRemoved,
466 this, &QHeaderDataProxyModel::rowsRemoved, Qt::UniqueConnection);
467 connect(m_model, &QAbstractItemModel::columnsAboutToBeMoved,
468 this, &QHeaderDataProxyModel::columnsAboutToBeMoved, Qt::UniqueConnection);
469 connect(m_model, &QAbstractItemModel::columnsMoved,
470 this, &QHeaderDataProxyModel::columnsMoved, Qt::UniqueConnection);
471 connect(m_model, &QAbstractItemModel::columnsAboutToBeInserted,
472 this, &QHeaderDataProxyModel::columnsAboutToBeInserted, Qt::UniqueConnection);
473 connect(m_model, &QAbstractItemModel::columnsInserted,
474 this, &QHeaderDataProxyModel::columnsInserted, Qt::UniqueConnection);
475 connect(m_model, &QAbstractItemModel::columnsAboutToBeRemoved,
476 this, &QHeaderDataProxyModel::columnsAboutToBeRemoved, Qt::UniqueConnection);
477 connect(m_model, &QAbstractItemModel::columnsRemoved,
478 this, &QHeaderDataProxyModel::columnsRemoved, Qt::UniqueConnection);
479 connect(m_model, &QAbstractItemModel::layoutAboutToBeChanged,
480 this, &QHeaderDataProxyModel::layoutAboutToBeChanged, Qt::UniqueConnection);
481 connect(m_model, &QAbstractItemModel::layoutChanged,
482 this, &QHeaderDataProxyModel::layoutChanged, Qt::UniqueConnection);
485void QHeaderDataProxyModel::disconnectFromModel()
487 if (m_model.isNull())
489 m_model->disconnect(
this);
492QQuickHorizontalHeaderView::QQuickHorizontalHeaderView(QQuickItem *parent)
493 : QQuickHeaderViewBase(*(
new QQuickHorizontalHeaderViewPrivate), parent)
495 setFlickableDirection(FlickableDirection::HorizontalFlick);
496 setResizableColumns(
true);
499QQuickHorizontalHeaderView::~QQuickHorizontalHeaderView()
501#if QT_CONFIG(quick_draganddrop)
502 Q_D(QQuickHorizontalHeaderView);
503 d->destroySectionDragHandler();
507bool QQuickHorizontalHeaderView::movableColumns()
const
509 Q_D(
const QQuickHorizontalHeaderView);
510 return d->m_movableColumns;
513void QQuickHorizontalHeaderView::setMovableColumns(
bool movableColumns)
515 Q_D(QQuickHorizontalHeaderView);
516 if (d->m_movableColumns == movableColumns)
519 d->m_movableColumns = movableColumns;
521#if QT_CONFIG(quick_draganddrop)
522 if (d->m_movableColumns)
523 d->initSectionDragHandler(Qt::Horizontal);
525 d->destroySectionDragHandler();
528 emit movableColumnsChanged();
531bool QQuickHorizontalHeaderView::showSortIndicator()
const
533 Q_D(
const QQuickHorizontalHeaderView);
534 return d->showSortIndicator;
537void QQuickHorizontalHeaderView::setShowSortIndicator(
bool show)
539 Q_D(QQuickHorizontalHeaderView);
540 if (d->showSortIndicator == show)
543 d->showSortIndicator = show;
544 emit showSortIndicatorChanged();
547bool QQuickHorizontalHeaderView::sortIndicatorClearable()
const
549 Q_D(
const QQuickHorizontalHeaderView);
550 return d->sortIndicatorClearable;
553void QQuickHorizontalHeaderView::setSortIndicatorClearable(
bool clearable)
555 Q_D(QQuickHorizontalHeaderView);
556 if (d->sortIndicatorClearable == clearable)
559 d->sortIndicatorClearable = clearable;
560 emit sortIndicatorClearableChanged();
563QQuickVerticalHeaderView::QQuickVerticalHeaderView(QQuickItem *parent)
564 : QQuickHeaderViewBase(*(
new QQuickVerticalHeaderViewPrivate), parent)
566 setFlickableDirection(FlickableDirection::VerticalFlick);
567 setResizableRows(
true);
570QQuickVerticalHeaderView::~QQuickVerticalHeaderView()
572#if QT_CONFIG(quick_draganddrop)
573 Q_D(QQuickVerticalHeaderView);
574 d->destroySectionDragHandler();
578bool QQuickVerticalHeaderView::movableRows()
const
580 Q_D(
const QQuickVerticalHeaderView);
581 return d->m_movableRows ;
584void QQuickVerticalHeaderView::setMovableRows(
bool movableRows)
586 Q_D(QQuickVerticalHeaderView);
587 if (d->m_movableRows == movableRows)
590 d->m_movableRows = movableRows;
592#if QT_CONFIG(quick_draganddrop)
593 if (d->m_movableRows)
594 d->initSectionDragHandler(Qt::Vertical);
596 d->destroySectionDragHandler();
599 emit movableRowsChanged();
602QQuickHorizontalHeaderViewPrivate::QQuickHorizontalHeaderViewPrivate()
604 setOrientation(Qt::Horizontal);
607QQuickHorizontalHeaderViewPrivate::~QQuickHorizontalHeaderViewPrivate() =
default;
609void QQuickHorizontalHeaderViewPrivate::executeTap(
const QQuickHandlerPoint &point)
611 Q_Q(QQuickHorizontalHeaderView);
613 QQuickTableViewPrivate::executeTap(point);
615 const QPoint cell = q->cellAtPosition(point.position());
616 const int visualColumn = cell.x();
617 const int logicalColumn = logicalColumnIndex(visualColumn);
619 if (logicalColumn < 0)
622 emit q->headerClicked(logicalColumn);
624 if (!assignedSyncView)
627 QQuickTableViewPrivate::get(assignedSyncView)->requestSort(logicalColumn, sortIndicatorClearable);
630QQuickVerticalHeaderViewPrivate::QQuickVerticalHeaderViewPrivate()
632 setOrientation(Qt::Vertical);
635QQuickVerticalHeaderViewPrivate::~QQuickVerticalHeaderViewPrivate() =
default;
639#include "moc_qquickheaderview_p_p.cpp"
641#include "moc_qquickheaderview_p.cpp"