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() || !hasIndex(index.row(), index.column()))
354 auto section = m_orientation == Qt::Vertical ? index.row() : index.column();
355 return m_model->headerData(section, m_orientation, role);
358bool QHeaderDataProxyModel::setData(
const QModelIndex &index,
const QVariant &value,
int role)
360 if (!hasIndex(index.row(), index.column()))
362 auto section = m_orientation == Qt::Vertical ? index.row() : index.column();
363 auto ret = m_model->setHeaderData(section, m_orientation, value, role);
367bool QHeaderDataProxyModel::hasChildren(
const QModelIndex &parent)
const
369 if (!parent.isValid())
370 return rowCount(parent) > 0 && columnCount(parent) > 0;
374QHash<
int, QByteArray> QHeaderDataProxyModel::roleNames()
const
376 using namespace Qt::Literals::StringLiterals;
378 auto names = m_model ? m_model->roleNames() : QAbstractItemModel::roleNames();
380 QString textRole = m_headerView->textRole();
381 if (textRole.isEmpty())
382 textRole = u"display"_s;
383 if (!names.values().contains(textRole.toUtf8().constData())) {
384 qmlWarning(m_headerView).nospace() <<
"The 'textRole' property contains a role that doesn't exist in the model: "
385 << textRole <<
". Check your model's roleNames() implementation";
392QVariant QHeaderDataProxyModel::variantValue()
const
394 return QVariant::fromValue(
static_cast<QObject *>(
const_cast<QHeaderDataProxyModel *>(
this)));
397void QHeaderDataProxyModel::setOrientation(Qt::Orientation o)
399 if (o == m_orientation)
406Qt::Orientation QHeaderDataProxyModel::orientation()
const
408 return m_orientation;
411QPointer<QAbstractItemModel> QHeaderDataProxyModel::sourceModel()
const
416void QHeaderDataProxyModel::connectToModel()
418 if (m_model.isNull())
420 connect(m_model, &QAbstractItemModel::headerDataChanged,
421 this, [
this](Qt::Orientation orient,
int first,
int last) {
422 if (orient != orientation())
424 if (orient == Qt::Horizontal) {
425 emit dataChanged(createIndex(0, first), createIndex(0, last));
427 emit dataChanged(createIndex(first, 0), createIndex(last, 0));
430 connect(m_model, &QAbstractItemModel::modelAboutToBeReset,
431 this, &QHeaderDataProxyModel::modelAboutToBeReset, Qt::UniqueConnection);
432 connect(m_model, &QAbstractItemModel::modelReset,
433 this, &QHeaderDataProxyModel::modelReset, Qt::UniqueConnection);
434 connect(m_model, &QAbstractItemModel::rowsAboutToBeMoved,
435 this, &QHeaderDataProxyModel::rowsAboutToBeMoved, Qt::UniqueConnection);
436 connect(m_model, &QAbstractItemModel::rowsMoved,
437 this, &QHeaderDataProxyModel::rowsMoved, Qt::UniqueConnection);
438 connect(m_model, &QAbstractItemModel::rowsAboutToBeInserted,
439 this, &QHeaderDataProxyModel::rowsAboutToBeInserted, Qt::UniqueConnection);
440 connect(m_model, &QAbstractItemModel::rowsInserted,
441 this, &QHeaderDataProxyModel::rowsInserted, Qt::UniqueConnection);
442 connect(m_model, &QAbstractItemModel::rowsAboutToBeRemoved,
443 this, &QHeaderDataProxyModel::rowsAboutToBeRemoved, Qt::UniqueConnection);
444 connect(m_model, &QAbstractItemModel::rowsRemoved,
445 this, &QHeaderDataProxyModel::rowsRemoved, Qt::UniqueConnection);
446 connect(m_model, &QAbstractItemModel::columnsAboutToBeMoved,
447 this, &QHeaderDataProxyModel::columnsAboutToBeMoved, Qt::UniqueConnection);
448 connect(m_model, &QAbstractItemModel::columnsMoved,
449 this, &QHeaderDataProxyModel::columnsMoved, Qt::UniqueConnection);
450 connect(m_model, &QAbstractItemModel::columnsAboutToBeInserted,
451 this, &QHeaderDataProxyModel::columnsAboutToBeInserted, Qt::UniqueConnection);
452 connect(m_model, &QAbstractItemModel::columnsInserted,
453 this, &QHeaderDataProxyModel::columnsInserted, Qt::UniqueConnection);
454 connect(m_model, &QAbstractItemModel::columnsAboutToBeRemoved,
455 this, &QHeaderDataProxyModel::columnsAboutToBeRemoved, Qt::UniqueConnection);
456 connect(m_model, &QAbstractItemModel::columnsRemoved,
457 this, &QHeaderDataProxyModel::columnsRemoved, Qt::UniqueConnection);
458 connect(m_model, &QAbstractItemModel::layoutAboutToBeChanged,
459 this, &QHeaderDataProxyModel::layoutAboutToBeChanged, Qt::UniqueConnection);
460 connect(m_model, &QAbstractItemModel::layoutChanged,
461 this, &QHeaderDataProxyModel::layoutChanged, Qt::UniqueConnection);
464void QHeaderDataProxyModel::disconnectFromModel()
466 if (m_model.isNull())
468 m_model->disconnect(
this);
471QQuickHorizontalHeaderView::QQuickHorizontalHeaderView(QQuickItem *parent)
472 : QQuickHeaderViewBase(*(
new QQuickHorizontalHeaderViewPrivate), parent)
474 setFlickableDirection(FlickableDirection::HorizontalFlick);
475 setResizableColumns(
true);
478QQuickHorizontalHeaderView::~QQuickHorizontalHeaderView()
480#if QT_CONFIG(quick_draganddrop)
481 Q_D(QQuickHorizontalHeaderView);
482 d->destroySectionDragHandler();
486bool QQuickHorizontalHeaderView::movableColumns()
const
488 Q_D(
const QQuickHorizontalHeaderView);
489 return d->m_movableColumns;
492void QQuickHorizontalHeaderView::setMovableColumns(
bool movableColumns)
494 Q_D(QQuickHorizontalHeaderView);
495 if (d->m_movableColumns == movableColumns)
498 d->m_movableColumns = movableColumns;
500#if QT_CONFIG(quick_draganddrop)
501 if (d->m_movableColumns)
502 d->initSectionDragHandler(Qt::Horizontal);
504 d->destroySectionDragHandler();
507 emit movableColumnsChanged();
510QQuickVerticalHeaderView::QQuickVerticalHeaderView(QQuickItem *parent)
511 : QQuickHeaderViewBase(*(
new QQuickVerticalHeaderViewPrivate), parent)
513 setFlickableDirection(FlickableDirection::VerticalFlick);
514 setResizableRows(
true);
517QQuickVerticalHeaderView::~QQuickVerticalHeaderView()
519#if QT_CONFIG(quick_draganddrop)
520 Q_D(QQuickVerticalHeaderView);
521 d->destroySectionDragHandler();
525bool QQuickVerticalHeaderView::movableRows()
const
527 Q_D(
const QQuickVerticalHeaderView);
528 return d->m_movableRows ;
531void QQuickVerticalHeaderView::setMovableRows(
bool movableRows)
533 Q_D(QQuickVerticalHeaderView);
534 if (d->m_movableRows == movableRows)
537 d->m_movableRows = movableRows;
539#if QT_CONFIG(quick_draganddrop)
540 if (d->m_movableRows)
541 d->initSectionDragHandler(Qt::Vertical);
543 d->destroySectionDragHandler();
546 emit movableRowsChanged();
549QQuickHorizontalHeaderViewPrivate::QQuickHorizontalHeaderViewPrivate()
551 setOrientation(Qt::Horizontal);
554QQuickHorizontalHeaderViewPrivate::~QQuickHorizontalHeaderViewPrivate() =
default;
556QQuickVerticalHeaderViewPrivate::QQuickVerticalHeaderViewPrivate()
558 setOrientation(Qt::Vertical);
561QQuickVerticalHeaderViewPrivate::~QQuickVerticalHeaderViewPrivate() =
default;
565#include "moc_qquickheaderview_p_p.cpp"
567#include "moc_qquickheaderview_p.cpp"