aboutsummaryrefslogtreecommitdiffstats
path: root/src/quicktemplates2/qquickheaderview.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/quicktemplates2/qquickheaderview.cpp')
-rw-r--r--src/quicktemplates2/qquickheaderview.cpp520
1 files changed, 0 insertions, 520 deletions
diff --git a/src/quicktemplates2/qquickheaderview.cpp b/src/quicktemplates2/qquickheaderview.cpp
deleted file mode 100644
index 8671ac63..00000000
--- a/src/quicktemplates2/qquickheaderview.cpp
+++ /dev/null
@@ -1,520 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2020 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtQuick module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#include <QtQuickTemplates2/private/qquickheaderview_p_p.h>
-#include <algorithm>
-
-/*!
- \qmltype HorizontalHeaderView
- \inqmlmodule QtQuick.Controls
- \ingroup qtquickcontrols2-containers
- \inherits TableView
- \brief Provides a horizontal header view to accompany a \l TableView.
-
- A HorizontalHeaderView provides labeling of the columns of a \l TableView.
- To add a horizontal header to a TableView, bind the
- \l {HorizontalHeaderView::syncView} {syncView} property to the TableView:
-
- \snippet qtquickcontrols2-headerview-simple.qml horizontal
-
- The header displays data from the {syncView}'s model by default, but can
- also have its own model. If the model is a QAbstractTableModel, then
- the header will display the model's horizontal headerData(); otherwise,
- the model's data().
-*/
-
-/*!
- \qmltype VerticalHeaderView
- \inqmlmodule QtQuick.Controls
- \ingroup qtquickcontrols2-containers
- \inherits TableView
- \brief Provides a vertical header view to accompany a \l TableView.
-
- A VerticalHeaderView provides labeling of the rows of a \l TableView.
- To add a vertical header to a TableView, bind the
- \l {VerticalHeaderView::syncView} {syncView} property to the TableView:
-
- \snippet qtquickcontrols2-headerview-simple.qml vertical
-
- The header displays data from the {syncView}'s model by default, but can
- also have its own model. If the model is a QAbstractTableModel, then
- the header will display the model's vertical headerData(); otherwise,
- the model's data().
-*/
-
-/*!
- \qmlproperty TableView QtQuick::HorizontalHeaderView::syncView
-
- This property holds the TableView to synchronize with.
-
- Once this property is bound to another TableView, both header and table
- will synchronize with regard to column widths, column spacing, and flicking
- horizontally.
-
- If the \l model is not explicitly set, then the header will use the syncView's
- model to label the columns.
-
- \sa model TableView
-*/
-
-/*!
- \qmlproperty TableView QtQuick::VerticalHeaderView::syncView
-
- This property holds the TableView to synchronize with.
-
- Once this property is bound to another TableView, both header and table
- will synchronize with regard to row heights, row spacing, and flicking
- vertically.
-
- If the \l model is not explicitly set, then the header will use the syncView's
- model to label the rows.
-
- \sa model TableView
-*/
-
-/*!
- \qmlproperty QVariant QtQuick::HorizontalHeaderView::model
-
- This property holds the model providing data for the horizontal header view.
-
- When model is not explicitly set, the header will use the syncView's
- model once syncView is set.
-
- If model is a QAbstractTableModel, its horizontal headerData() will
- be accessed.
-
- If model is a QAbstractItemModel other than QAbstractTableModel, model's data()
- will be accessed.
-
- Otherwise, the behavior is same as setting TableView::model.
-
- \sa TableView {TableView::model} {model} QAbstractTableModel
-*/
-
-/*!
- \qmlproperty QVariant QtQuick::VerticalHeaderView::model
-
- This property holds the model providing data for the vertical header view.
-
- When model is not explicitly set, it will be synchronized with syncView's model
- once syncView is set.
-
- If model is a QAbstractTableModel, its vertical headerData() will
- be accessed.
-
- If model is a QAbstractItemModel other than QAbstractTableModel, model's data()
- will be accessed.
-
- Otherwise, the behavior is same as setting TableView::model.
-
- \sa TableView {TableView::model} {model} QAbstractTableModel
-*/
-
-/*!
- \qmlproperty QString QtQuick::HorizontalHeaderView::textRole
-
- This property holds the model role used to display text in each header cell.
-
- When the model has multiple roles, textRole can be set to determine which
- role should be displayed.
-
- If model is a QAbstractItemModel then it will default to "display"; otherwise
- it is empty.
-
- \sa QAbstractItemModel::roleNames()
-*/
-
-/*!
- \qmlproperty QString QtQuick::VerticalHeaderView::textRole
-
- This property holds the model role used to display text in each header cell.
-
- When the model has multiple roles, textRole can be set to determine which
- role should be displayed.
-
- If model is a QAbstractItemModel then it will default to "display"; otherwise
- it is empty.
-
- \sa QAbstractItemModel::roleNames()
-*/
-
-QT_BEGIN_NAMESPACE
-
-QQuickHeaderViewBasePrivate::QQuickHeaderViewBasePrivate()
- : QQuickTableViewPrivate()
-{
-}
-
-QQuickHeaderViewBasePrivate::~QQuickHeaderViewBasePrivate()
-{
-}
-
-const QPointer<QQuickItem> QQuickHeaderViewBasePrivate::delegateItemAt(int row, int col) const
-{
- return loadedTableItem(QPoint(col, row))->item;
-}
-
-QVariant QQuickHeaderViewBasePrivate::modelImpl() const
-{
- if (auto model = m_headerDataProxyModel.sourceModel())
- return QVariant::fromValue(model.data());
- if (auto model = m_transposeProxyModel.sourceModel())
- return QVariant::fromValue(model);
- return QQuickTableViewPrivate::modelImpl();
-}
-
-template <typename P, typename M>
-inline bool proxyModelSetter(QQuickHeaderViewBase *const q, P &proxyModel, M *model)
-{
- if (model) {
- if (model == proxyModel.sourceModel())
- return true;
- proxyModel.setSourceModel(model);
- const auto &modelVariant = QVariant::fromValue(std::addressof(proxyModel));
- bool isProxyModelChanged = (modelVariant != QQuickTableViewPrivate::get(q)->QQuickTableViewPrivate::modelImpl());
- QQuickTableViewPrivate::get(q)->QQuickTableViewPrivate::setModelImpl(modelVariant);
- //Necessary, since TableView's assigned model not changed, but proxy's source changed
- if (!isProxyModelChanged)
- emit q->modelChanged();
- return true;
- }
- proxyModel.setSourceModel(nullptr);
- return false;
-}
-
-void QQuickHeaderViewBasePrivate::setModelImpl(const QVariant &newModel)
-{
- Q_Q(QQuickHeaderViewBase);
- m_modelExplicitlySetByUser = true;
- // Case 1: newModel is QAbstractTableModel
- if (proxyModelSetter(q, m_headerDataProxyModel, newModel.value<QAbstractTableModel *>()))
- return;
- // Case 2: newModel is QAbstractItemModel but not QAbstractTableModel
- if (orientation() == Qt::Horizontal
- && proxyModelSetter(q, m_transposeProxyModel, newModel.value<QAbstractItemModel *>()))
- return;
-
- QQuickTableViewPrivate::setModelImpl(newModel);
-}
-
-void QQuickHeaderViewBasePrivate::syncModel()
-{
- Q_Q(QQuickHeaderViewBase);
-
- if (assignedSyncView && !m_modelExplicitlySetByUser) {
- auto newModel = assignedSyncView->model();
- if (auto m = newModel.value<QAbstractItemModel *>())
- proxyModelSetter(q, m_headerDataProxyModel, m);
- }
-
- QQuickTableViewPrivate::syncModel();
-
- isTransposed = false;
- const auto aim = model->abstractItemModel();
- if (orientation() == Qt::Horizontal) {
- // For models that are just a list or a number, and especially not a
- // table, we transpose the view when the orientation is horizontal.
- // The model (list) will then be laid out horizontally rather than
- // vertically, which is the otherwise the default.
- isTransposed = !aim || aim->columnCount() == 1;
- }
- if (m_textRole.isEmpty() && aim)
- m_textRole = QLatin1String("display");
-}
-
-void QQuickHeaderViewBasePrivate::syncSyncView()
-{
- Q_Q(QQuickHeaderViewBase);
- if (assignedSyncDirection != orientation()) {
- qmlWarning(q_func()) << "Setting syncDirection other than Qt::"
- << QVariant::fromValue(orientation()).toString()
- << " is invalid.";
- assignedSyncDirection = orientation();
- }
- if (assignedSyncView) {
- QBoolBlocker fixupGuard(inUpdateContentSize, true);
- if (orientation() == Qt::Horizontal) {
- q->setLeftMargin(assignedSyncView->leftMargin());
- q->setRightMargin(assignedSyncView->rightMargin());
- } else {
- q->setTopMargin(assignedSyncView->topMargin());
- q->setBottomMargin(assignedSyncView->bottomMargin());
- }
- }
- QQuickTableViewPrivate::syncSyncView();
-}
-
-QQuickHeaderViewBase::QQuickHeaderViewBase(Qt::Orientation orient, QQuickItem *parent)
- : QQuickTableView(*(new QQuickHeaderViewBasePrivate), parent)
-{
- d_func()->setOrientation(orient);
- setSyncDirection(orient);
-}
-
-QQuickHeaderViewBase::QQuickHeaderViewBase(QQuickHeaderViewBasePrivate &dd, QQuickItem *parent)
- : QQuickTableView(dd, parent)
-{
-}
-
-QQuickHeaderViewBase::~QQuickHeaderViewBase()
-{
-}
-
-QString QQuickHeaderViewBase::textRole() const
-{
- Q_D(const QQuickHeaderViewBase);
- return d->m_textRole;
-}
-
-void QQuickHeaderViewBase::setTextRole(const QString &role)
-{
- Q_D(QQuickHeaderViewBase);
- if (d->m_textRole == role)
- return;
-
- d->m_textRole = role;
- emit textRoleChanged();
-}
-
-Qt::Orientation QQuickHeaderViewBasePrivate::orientation() const
-{
- return m_headerDataProxyModel.orientation();
-}
-
-void QQuickHeaderViewBasePrivate::setOrientation(Qt::Orientation orientation)
-{
- if (QQuickHeaderViewBasePrivate::orientation() == orientation)
- return;
- m_headerDataProxyModel.setOrientation(orientation);
-}
-
-QQuickVerticalHeaderView::QQuickVerticalHeaderView(QQuickVerticalHeaderViewPrivate &dd, QQuickItem *parent)
- : QQuickHeaderViewBase(dd, parent)
-{
-}
-
-/*! \internal
- \class QHeaderDataProxyModel
- \brief
- QHeaderDataProxyModel is a proxy AbstractItemModel type that maps
- source model's headerData() to correspondent data()
- */
-QHeaderDataProxyModel::QHeaderDataProxyModel(QObject *parent)
- : QAbstractItemModel(parent)
-{
-}
-
-QHeaderDataProxyModel::~QHeaderDataProxyModel() = default;
-
-void QHeaderDataProxyModel::setSourceModel(QAbstractItemModel *newSourceModel)
-{
- if (m_model == newSourceModel)
- return;
- beginResetModel();
- disconnectFromModel();
- m_model = newSourceModel;
- connectToModel();
- endResetModel();
-}
-
-QModelIndex QHeaderDataProxyModel::index(int row, int column, const QModelIndex &parent) const
-{
- return hasIndex(row, column, parent) ? createIndex(row, column) : QModelIndex();
-}
-
-QModelIndex QHeaderDataProxyModel::parent(const QModelIndex &child) const
-{
- Q_UNUSED(child);
- return QModelIndex();
-}
-
-QModelIndex QHeaderDataProxyModel::sibling(int row, int column, const QModelIndex &) const
-{
- return index(row, column);
-}
-
-int QHeaderDataProxyModel::rowCount(const QModelIndex &parent) const
-{
- if (parent.isValid())
- return 0;
- return m_model.isNull() ? -1 : (m_orientation == Qt::Horizontal ? 1 : m_model->rowCount(parent));
-}
-
-int QHeaderDataProxyModel::columnCount(const QModelIndex &parent) const
-{
- if (parent.isValid())
- return 0;
- return m_model.isNull() ? -1 : (m_orientation == Qt::Vertical ? 1 : m_model->columnCount(parent));
-}
-
-QVariant QHeaderDataProxyModel::data(const QModelIndex &index, int role) const
-{
- if (m_model.isNull())
- return QVariant();
- if (!hasIndex(index.row(), index.column()))
- return QModelIndex();
- auto section = m_orientation == Qt::Vertical ? index.row() : index.column();
- return m_model->headerData(section, m_orientation, role);
-}
-
-bool QHeaderDataProxyModel::setData(const QModelIndex &index, const QVariant &value, int role)
-{
- if (!hasIndex(index.row(), index.column()))
- return false;
- auto section = m_orientation == Qt::Vertical ? index.row() : index.column();
- auto ret = m_model->setHeaderData(section, m_orientation, value, role);
- emit dataChanged(index, index, { role });
- return ret;
-}
-
-bool QHeaderDataProxyModel::hasChildren(const QModelIndex &parent) const
-{
- if (!parent.isValid())
- return rowCount(parent) > 0 && columnCount(parent) > 0;
- return false;
-}
-
-QVariant QHeaderDataProxyModel::variantValue() const
-{
- return QVariant::fromValue(static_cast<QObject *>(const_cast<QHeaderDataProxyModel *>(this)));
-}
-
-void QHeaderDataProxyModel::setOrientation(Qt::Orientation o)
-{
- if (o == m_orientation)
- return;
- beginResetModel();
- m_orientation = o;
- endResetModel();
-}
-
-Qt::Orientation QHeaderDataProxyModel::orientation() const
-{
- return m_orientation;
-}
-
-QPointer<QAbstractItemModel> QHeaderDataProxyModel::sourceModel() const
-{
- return m_model;
-}
-
-void QHeaderDataProxyModel::connectToModel()
-{
- if (m_model.isNull())
- return;
- connect(m_model, &QAbstractItemModel::headerDataChanged,
- [this](Qt::Orientation orient, int first, int last) {
- if (orient != orientation())
- return;
- if (orient == Qt::Horizontal) {
- emit dataChanged(createIndex(0, first), createIndex(0, last));
- } else {
- emit dataChanged(createIndex(first, 0), createIndex(last, 0));
- }
- });
- connect(m_model, &QAbstractItemModel::modelAboutToBeReset,
- this, &QHeaderDataProxyModel::modelAboutToBeReset, Qt::UniqueConnection);
- connect(m_model, &QAbstractItemModel::modelReset,
- this, &QHeaderDataProxyModel::modelReset, Qt::UniqueConnection);
- connect(m_model, &QAbstractItemModel::rowsAboutToBeMoved,
- this, &QHeaderDataProxyModel::rowsAboutToBeMoved, Qt::UniqueConnection);
- connect(m_model, &QAbstractItemModel::rowsMoved,
- this, &QHeaderDataProxyModel::rowsMoved, Qt::UniqueConnection);
- connect(m_model, &QAbstractItemModel::rowsAboutToBeInserted,
- this, &QHeaderDataProxyModel::rowsAboutToBeInserted, Qt::UniqueConnection);
- connect(m_model, &QAbstractItemModel::rowsInserted,
- this, &QHeaderDataProxyModel::rowsInserted, Qt::UniqueConnection);
- connect(m_model, &QAbstractItemModel::rowsAboutToBeRemoved,
- this, &QHeaderDataProxyModel::rowsAboutToBeRemoved, Qt::UniqueConnection);
- connect(m_model, &QAbstractItemModel::rowsRemoved,
- this, &QHeaderDataProxyModel::rowsRemoved, Qt::UniqueConnection);
- connect(m_model, &QAbstractItemModel::columnsAboutToBeMoved,
- this, &QHeaderDataProxyModel::columnsAboutToBeMoved, Qt::UniqueConnection);
- connect(m_model, &QAbstractItemModel::columnsMoved,
- this, &QHeaderDataProxyModel::columnsMoved, Qt::UniqueConnection);
- connect(m_model, &QAbstractItemModel::columnsAboutToBeInserted,
- this, &QHeaderDataProxyModel::columnsAboutToBeInserted, Qt::UniqueConnection);
- connect(m_model, &QAbstractItemModel::columnsInserted,
- this, &QHeaderDataProxyModel::columnsInserted, Qt::UniqueConnection);
- connect(m_model, &QAbstractItemModel::columnsAboutToBeRemoved,
- this, &QHeaderDataProxyModel::columnsAboutToBeRemoved, Qt::UniqueConnection);
- connect(m_model, &QAbstractItemModel::columnsRemoved,
- this, &QHeaderDataProxyModel::columnsRemoved, Qt::UniqueConnection);
- connect(m_model, &QAbstractItemModel::layoutAboutToBeChanged,
- this, &QHeaderDataProxyModel::layoutAboutToBeChanged, Qt::UniqueConnection);
- connect(m_model, &QAbstractItemModel::layoutChanged,
- this, &QHeaderDataProxyModel::layoutChanged, Qt::UniqueConnection);
-}
-
-void QHeaderDataProxyModel::disconnectFromModel()
-{
- if (m_model.isNull())
- return;
- m_model->disconnect(this);
-}
-
-QQuickHorizontalHeaderView::QQuickHorizontalHeaderView(QQuickItem *parent)
- : QQuickHeaderViewBase(Qt::Horizontal, parent)
-{
- setFlickableDirection(FlickableDirection::HorizontalFlick);
-}
-
-QQuickHorizontalHeaderView::~QQuickHorizontalHeaderView()
-{
-}
-
-QQuickVerticalHeaderView::QQuickVerticalHeaderView(QQuickItem *parent)
- : QQuickHeaderViewBase(Qt::Vertical, parent)
-{
- setFlickableDirection(FlickableDirection::VerticalFlick);
-}
-
-QQuickVerticalHeaderView::~QQuickVerticalHeaderView()
-{
-}
-
-QQuickHorizontalHeaderViewPrivate::QQuickHorizontalHeaderViewPrivate() = default;
-
-QQuickHorizontalHeaderViewPrivate::~QQuickHorizontalHeaderViewPrivate() = default;
-
-QQuickVerticalHeaderViewPrivate::QQuickVerticalHeaderViewPrivate() = default;
-
-QQuickVerticalHeaderViewPrivate::~QQuickVerticalHeaderViewPrivate() = default;
-
-QT_END_NAMESPACE