diff options
author | Miikka Heikkinen <miikka.heikkinen@digia.com> | 2013-11-26 14:53:50 +0200 |
---|---|---|
committer | Miikka Heikkinen <miikka.heikkinen@digia.com> | 2013-11-27 11:29:30 +0200 |
commit | 7c942cc0f497fe7e61ce6a10fce45771c0858e09 (patch) | |
tree | aab5d2285b8e583f3565e305e0818a49503cf95c /src/datavisualization | |
parent | e029d0ea1d486dd3dbbfa4519a2125da202f22e4 (diff) |
Integrated item model mappings to item model proxies
Separate mapping object was redundant.
Task-number: QTRD-2564
Change-Id: I6b1a23ba52dbb184f46df0fdd64184eeb145c0c3
Reviewed-by: Mika Salmela <mika.salmela@digia.com>
Diffstat (limited to 'src/datavisualization')
32 files changed, 1088 insertions, 1967 deletions
diff --git a/src/datavisualization/data/abstractitemmodelhandler.cpp b/src/datavisualization/data/abstractitemmodelhandler.cpp index 0ad0ac0b..41f520a4 100644 --- a/src/datavisualization/data/abstractitemmodelhandler.cpp +++ b/src/datavisualization/data/abstractitemmodelhandler.cpp @@ -17,14 +17,12 @@ ****************************************************************************/ #include "abstractitemmodelhandler_p.h" -#include "qabstractdatamapping.h" #include <QTimer> QT_DATAVISUALIZATION_BEGIN_NAMESPACE AbstractItemModelHandler::AbstractItemModelHandler(QObject *parent) : QObject(parent), - m_activeMapping(0), resolvePending(0) { m_resolveTimer.setSingleShot(true); @@ -38,33 +36,37 @@ AbstractItemModelHandler::~AbstractItemModelHandler() void AbstractItemModelHandler::setItemModel(const QAbstractItemModel *itemModel) { - if (!m_itemModel.isNull()) - QObject::disconnect(m_itemModel, 0, this, 0); - - m_itemModel = itemModel; - - if (!m_itemModel.isNull()) { - QObject::connect(m_itemModel.data(), &QAbstractItemModel::columnsInserted, - this, &AbstractItemModelHandler::handleColumnsInserted); - QObject::connect(m_itemModel.data(), &QAbstractItemModel::columnsMoved, - this, &AbstractItemModelHandler::handleColumnsMoved); - QObject::connect(m_itemModel.data(), &QAbstractItemModel::columnsRemoved, - this, &AbstractItemModelHandler::handleColumnsRemoved); - QObject::connect(m_itemModel.data(), &QAbstractItemModel::dataChanged, - this, &AbstractItemModelHandler::handleDataChanged); - QObject::connect(m_itemModel.data(), &QAbstractItemModel::layoutChanged, - this, &AbstractItemModelHandler::handleLayoutChanged); - QObject::connect(m_itemModel.data(), &QAbstractItemModel::modelReset, - this, &AbstractItemModelHandler::handleModelReset); - QObject::connect(m_itemModel.data(), &QAbstractItemModel::rowsInserted, - this, &AbstractItemModelHandler::handleRowsInserted); - QObject::connect(m_itemModel.data(), &QAbstractItemModel::rowsMoved, - this, &AbstractItemModelHandler::handleRowsMoved); - QObject::connect(m_itemModel.data(), &QAbstractItemModel::rowsRemoved, - this, &AbstractItemModelHandler::handleRowsRemoved); + if (itemModel != m_itemModel.data()) { + if (!m_itemModel.isNull()) + QObject::disconnect(m_itemModel, 0, this, 0); + + m_itemModel = itemModel; + + if (!m_itemModel.isNull()) { + QObject::connect(m_itemModel.data(), &QAbstractItemModel::columnsInserted, + this, &AbstractItemModelHandler::handleColumnsInserted); + QObject::connect(m_itemModel.data(), &QAbstractItemModel::columnsMoved, + this, &AbstractItemModelHandler::handleColumnsMoved); + QObject::connect(m_itemModel.data(), &QAbstractItemModel::columnsRemoved, + this, &AbstractItemModelHandler::handleColumnsRemoved); + QObject::connect(m_itemModel.data(), &QAbstractItemModel::dataChanged, + this, &AbstractItemModelHandler::handleDataChanged); + QObject::connect(m_itemModel.data(), &QAbstractItemModel::layoutChanged, + this, &AbstractItemModelHandler::handleLayoutChanged); + QObject::connect(m_itemModel.data(), &QAbstractItemModel::modelReset, + this, &AbstractItemModelHandler::handleModelReset); + QObject::connect(m_itemModel.data(), &QAbstractItemModel::rowsInserted, + this, &AbstractItemModelHandler::handleRowsInserted); + QObject::connect(m_itemModel.data(), &QAbstractItemModel::rowsMoved, + this, &AbstractItemModelHandler::handleRowsMoved); + QObject::connect(m_itemModel.data(), &QAbstractItemModel::rowsRemoved, + this, &AbstractItemModelHandler::handleRowsRemoved); + } + if (!m_resolveTimer.isActive()) + m_resolveTimer.start(0); + + emit itemModelChanged(itemModel); } - if (!m_resolveTimer.isActive()) - m_resolveTimer.start(0); } const QAbstractItemModel *AbstractItemModelHandler::itemModel() const @@ -72,59 +74,6 @@ const QAbstractItemModel *AbstractItemModelHandler::itemModel() const return m_itemModel.data(); } -void AbstractItemModelHandler::setActiveMapping(QAbstractDataMapping *mapping) -{ - if (m_activeMapping) - QObject::disconnect(m_activeMapping, 0, this, 0); - - if (mapping) - addMapping(mapping); - - m_activeMapping = mapping; - - if (m_activeMapping) { - QObject::connect(m_activeMapping, &QAbstractDataMapping::mappingChanged, - this, &AbstractItemModelHandler::handleMappingChanged); - } - - if (!m_resolveTimer.isActive()) - m_resolveTimer.start(0); -} - -QAbstractDataMapping *AbstractItemModelHandler::activeMapping() const -{ - return m_activeMapping; -} - -void AbstractItemModelHandler::addMapping(QAbstractDataMapping *mapping) -{ - Q_ASSERT(mapping); - AbstractItemModelHandler *owner = qobject_cast<AbstractItemModelHandler *>(mapping->parent()); - if (owner != this) { - Q_ASSERT_X(!owner, "addMapping", "Mapping already attached to a proxy."); - mapping->setParent(this); - } - if (!m_mappings.contains(mapping)) - m_mappings.append(mapping); -} - -void AbstractItemModelHandler::releaseMapping(QAbstractDataMapping *mapping) -{ - if (mapping && m_mappings.contains(mapping)) { - // If the mapping is in use, clear the existing mapping - if (m_activeMapping == mapping) - setActiveMapping(0); - - m_mappings.removeAll(mapping); - mapping->setParent(0); - } -} - -QList<QAbstractDataMapping *> AbstractItemModelHandler::mappings() const -{ - return m_mappings; -} - void AbstractItemModelHandler::handleColumnsInserted(const QModelIndex &parent, int start, int end) { diff --git a/src/datavisualization/data/abstractitemmodelhandler_p.h b/src/datavisualization/data/abstractitemmodelhandler_p.h index fbaaa1f9..b4d55b4a 100644 --- a/src/datavisualization/data/abstractitemmodelhandler_p.h +++ b/src/datavisualization/data/abstractitemmodelhandler_p.h @@ -36,8 +36,6 @@ QT_DATAVISUALIZATION_BEGIN_NAMESPACE -class QAbstractDataMapping; - class AbstractItemModelHandler : public QObject { Q_OBJECT @@ -47,11 +45,6 @@ public: virtual void setItemModel(const QAbstractItemModel *itemModel); virtual const QAbstractItemModel *itemModel() const; - virtual void setActiveMapping(QAbstractDataMapping *mapping); - virtual QAbstractDataMapping *activeMapping() const; - virtual void addMapping(QAbstractDataMapping *mapping); - virtual void releaseMapping(QAbstractDataMapping *mapping); - virtual QList<QAbstractDataMapping *> mappings() const; public slots: virtual void handleColumnsInserted(const QModelIndex &parent, int start, int end); @@ -72,14 +65,15 @@ public slots: virtual void handleMappingChanged(); virtual void handlePendingResolve(); +signals: + void itemModelChanged(const QAbstractItemModel *itemModel); + protected: virtual void resolveModel() = 0; QPointer<const QAbstractItemModel> m_itemModel; // Not owned - QAbstractDataMapping *m_activeMapping; bool resolvePending; QTimer m_resolveTimer; - QList<QAbstractDataMapping *> m_mappings; private: Q_DISABLE_COPY(AbstractItemModelHandler) diff --git a/src/datavisualization/data/baritemmodelhandler.cpp b/src/datavisualization/data/baritemmodelhandler.cpp index cbe19c43..b67a3d8a 100644 --- a/src/datavisualization/data/baritemmodelhandler.cpp +++ b/src/datavisualization/data/baritemmodelhandler.cpp @@ -17,7 +17,6 @@ ****************************************************************************/ #include "baritemmodelhandler_p.h" -#include "qitemmodelbardatamapping_p.h" QT_DATAVISUALIZATION_BEGIN_NAMESPACE @@ -36,14 +35,13 @@ BarItemModelHandler::~BarItemModelHandler() // Resolve entire item model into QBarDataArray. void BarItemModelHandler::resolveModel() { - QItemModelBarDataMapping *mapping = static_cast<QItemModelBarDataMapping *>(m_activeMapping); - if (m_itemModel.isNull() || !mapping) { + if (m_itemModel.isNull()) { m_proxy->resetArray(0); return; } - if (!mapping->useModelCategories() - && (mapping->rowRole().isEmpty() || mapping->columnRole().isEmpty())) { + if (!m_proxy->useModelCategories() + && (m_proxy->rowRole().isEmpty() || m_proxy->columnRole().isEmpty())) { m_proxy->resetArray(0); return; } @@ -54,11 +52,11 @@ void BarItemModelHandler::resolveModel() QHash<int, QByteArray> roleHash = m_itemModel->roleNames(); // Default to display role if no mapping - int valueRole = roleHash.key(mapping->valueRole().toLatin1(), Qt::DisplayRole); + int valueRole = roleHash.key(m_proxy->valueRole().toLatin1(), Qt::DisplayRole); int rowCount = m_itemModel->rowCount(); int columnCount = m_itemModel->columnCount(); - if (mapping->useModelCategories()) { + if (m_proxy->useModelCategories()) { // If dimensions have changed, recreate the array if (m_proxyArray != m_proxy->array() || columnCount != m_columnCount || rowCount != m_proxyArray->size()) { @@ -79,11 +77,11 @@ void BarItemModelHandler::resolveModel() columnLabels << m_itemModel->headerData(i, Qt::Horizontal).toString(); m_columnCount = columnCount; } else { - int rowRole = roleHash.key(mapping->rowRole().toLatin1()); - int columnRole = roleHash.key(mapping->columnRole().toLatin1()); + int rowRole = roleHash.key(m_proxy->rowRole().toLatin1()); + int columnRole = roleHash.key(m_proxy->columnRole().toLatin1()); - bool generateRows = mapping->autoRowCategories(); - bool generateColumns = mapping->autoColumnCategories(); + bool generateRows = m_proxy->autoRowCategories(); + bool generateColumns = m_proxy->autoColumnCategories(); QStringList rowList; QStringList columnList; // For detecting duplicates in categories generation, using QHashes should be faster than @@ -112,14 +110,14 @@ void BarItemModelHandler::resolveModel() } if (generateRows) - mapping->dptr()->m_rowCategories = rowList; + m_proxy->dptr()->m_rowCategories = rowList; else - rowList = mapping->rowCategories(); + rowList = m_proxy->rowCategories(); if (generateColumns) - mapping->dptr()->m_columnCategories = columnList; + m_proxy->dptr()->m_columnCategories = columnList; else - columnList = mapping->columnCategories(); + columnList = m_proxy->columnCategories(); // If dimensions have changed, recreate the array if (m_proxyArray != m_proxy->array() || columnList.size() != m_columnCount diff --git a/src/datavisualization/data/baritemmodelhandler_p.h b/src/datavisualization/data/baritemmodelhandler_p.h index 54b45f2e..99192b55 100644 --- a/src/datavisualization/data/baritemmodelhandler_p.h +++ b/src/datavisualization/data/baritemmodelhandler_p.h @@ -30,7 +30,7 @@ #define BARITEMMODELHANDLER_P_H #include "abstractitemmodelhandler_p.h" -#include "qitemmodelbardataproxy.h" +#include "qitemmodelbardataproxy_p.h" QT_DATAVISUALIZATION_BEGIN_NAMESPACE diff --git a/src/datavisualization/data/data.pri b/src/datavisualization/data/data.pri index 66ad0e3b..6ebfed6b 100644 --- a/src/datavisualization/data/data.pri +++ b/src/datavisualization/data/data.pri @@ -8,8 +8,6 @@ HEADERS += \ $$PWD/barrenderitem_p.h \ $$PWD/qbardataitem.h \ $$PWD/qbardataitem_p.h \ - $$PWD/qitemmodelbardatamapping.h \ - $$PWD/qitemmodelbardatamapping_p.h \ $$PWD/qitemmodelbardataproxy_p.h \ $$PWD/qitemmodelbardataproxy.h \ $$PWD/scatterrenderitem_p.h \ @@ -17,21 +15,15 @@ HEADERS += \ $$PWD/qscatterdataitem_p.h \ $$PWD/qscatterdataproxy.h \ $$PWD/qscatterdataproxy_p.h \ - $$PWD/qitemmodelscatterdatamapping.h \ - $$PWD/qitemmodelscatterdatamapping_p.h \ $$PWD/qitemmodelscatterdataproxy.h \ $$PWD/qitemmodelscatterdataproxy_p.h \ $$PWD/abstractitemmodelhandler_p.h \ $$PWD/baritemmodelhandler_p.h \ - $$PWD/qabstractdatamapping.h \ - $$PWD/qabstractdatamapping_p.h \ $$PWD/scatteritemmodelhandler_p.h \ $$PWD/qsurfacedataproxy.h \ $$PWD/qsurfacedataproxy_p.h \ $$PWD/qheightmapsurfacedataproxy.h \ $$PWD/qheightmapsurfacedataproxy_p.h \ - $$PWD/qitemmodelsurfacedatamapping.h \ - $$PWD/qitemmodelsurfacedatamapping_p.h \ $$PWD/qitemmodelsurfacedataproxy.h \ $$PWD/qitemmodelsurfacedataproxy_p.h \ $$PWD/surfaceitemmodelhandler_p.h \ @@ -53,20 +45,16 @@ SOURCES += \ $$PWD/abstractrenderitem.cpp \ $$PWD/barrenderitem.cpp \ $$PWD/qbardataitem.cpp \ - $$PWD/qitemmodelbardatamapping.cpp \ $$PWD/qitemmodelbardataproxy.cpp \ $$PWD/scatterrenderitem.cpp \ $$PWD/qscatterdataitem.cpp \ $$PWD/qscatterdataproxy.cpp \ - $$PWD/qitemmodelscatterdatamapping.cpp \ $$PWD/qitemmodelscatterdataproxy.cpp \ $$PWD/abstractitemmodelhandler.cpp \ $$PWD/baritemmodelhandler.cpp \ - $$PWD/qabstractdatamapping.cpp \ $$PWD/scatteritemmodelhandler.cpp \ $$PWD/qsurfacedataproxy.cpp \ $$PWD/qheightmapsurfacedataproxy.cpp \ - $$PWD/qitemmodelsurfacedatamapping.cpp \ $$PWD/qitemmodelsurfacedataproxy.cpp \ $$PWD/surfaceitemmodelhandler.cpp \ $$PWD/qsurfacedataitem.cpp \ diff --git a/src/datavisualization/data/qabstractdatamapping.cpp b/src/datavisualization/data/qabstractdatamapping.cpp deleted file mode 100644 index a0698810..00000000 --- a/src/datavisualization/data/qabstractdatamapping.cpp +++ /dev/null @@ -1,71 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2013 Digia Plc -** All rights reserved. -** For any questions to Digia, please use contact form at http://qt.digia.com -** -** This file is part of the QtDataVisualization module. -** -** Licensees holding valid Qt Enterprise licenses may use this file in -** accordance with the Qt Enterprise License Agreement provided with the -** Software or, alternatively, in accordance with the terms contained in -** a written agreement between you and Digia. -** -** If you have questions regarding the use of this file, please use -** contact form at http://qt.digia.com -** -****************************************************************************/ - -#include "qabstractdatamapping_p.h" - -QT_DATAVISUALIZATION_BEGIN_NAMESPACE - -/*! - * \class QAbstractDataMapping - * \inmodule QtDataVisualization - * \brief Abstract base class for QtDataVisualization data mapping classes. - * \since Qt Data Visualization 1.0 - * - * Data mapping classes provide a way to map data from an external data source to one of - * QtDataVisualization data proxies. - * \sa QItemModelBarDataMapping, QItemModelScatterDataMapping - */ - -/*! - * \internal - */ -QAbstractDataMapping::QAbstractDataMapping(QAbstractDataMappingPrivate *d, QObject *parent) - : QObject(parent), - d_ptr(d) -{ -} - -/*! - * Destroys QAbstractDataMapping. - */ -QAbstractDataMapping::~QAbstractDataMapping() -{ -} - -/*! - * \fn void QAbstractDataMapping::mappingChanged() - * - * Emitted when any mapping has changed. - */ - -// QItemModelBarDataMappingPrivate - -QAbstractDataMappingPrivate::QAbstractDataMappingPrivate(QAbstractDataMapping *q, - QAbstractDataProxy::DataType type) - : QObject(0), - q_ptr(q), - m_type(type) -{ -} - -QAbstractDataMappingPrivate::~QAbstractDataMappingPrivate() -{ -} - -QT_DATAVISUALIZATION_END_NAMESPACE - diff --git a/src/datavisualization/data/qabstractdatamapping.h b/src/datavisualization/data/qabstractdatamapping.h deleted file mode 100644 index eb892cb7..00000000 --- a/src/datavisualization/data/qabstractdatamapping.h +++ /dev/null @@ -1,53 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2013 Digia Plc -** All rights reserved. -** For any questions to Digia, please use contact form at http://qt.digia.com -** -** This file is part of the QtDataVisualization module. -** -** Licensees holding valid Qt Enterprise licenses may use this file in -** accordance with the Qt Enterprise License Agreement provided with the -** Software or, alternatively, in accordance with the terms contained in -** a written agreement between you and Digia. -** -** If you have questions regarding the use of this file, please use -** contact form at http://qt.digia.com -** -****************************************************************************/ - -#ifndef QABSTRACTDATAMAPPING_H -#define QABSTRACTDATAMAPPING_H - -#include <QtDataVisualization/qdatavisualizationenums.h> -#include <QtDataVisualization/qabstractdataproxy.h> - -QT_DATAVISUALIZATION_BEGIN_NAMESPACE - -class QAbstractDataMappingPrivate; - -class QT_DATAVISUALIZATION_EXPORT QAbstractDataMapping : public QObject -{ - Q_OBJECT - -public: - explicit QAbstractDataMapping(QAbstractDataMappingPrivate *d, QObject *parent = 0); - virtual ~QAbstractDataMapping(); - -signals: - void mappingChanged(); - -private: - QScopedPointer<QAbstractDataMappingPrivate> d_ptr; - - Q_DISABLE_COPY(QAbstractDataMapping) - - friend class QItemModelBarDataMapping; - friend class QItemModelScatterDataMapping; - friend class QItemModelSurfaceDataMapping; -}; - - -QT_DATAVISUALIZATION_END_NAMESPACE - -#endif diff --git a/src/datavisualization/data/qabstractdatamapping_p.h b/src/datavisualization/data/qabstractdatamapping_p.h deleted file mode 100644 index 39012237..00000000 --- a/src/datavisualization/data/qabstractdatamapping_p.h +++ /dev/null @@ -1,50 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2013 Digia Plc -** All rights reserved. -** For any questions to Digia, please use contact form at http://qt.digia.com -** -** This file is part of the QtDataVisualization module. -** -** Licensees holding valid Qt Enterprise licenses may use this file in -** accordance with the Qt Enterprise License Agreement provided with the -** Software or, alternatively, in accordance with the terms contained in -** a written agreement between you and Digia. -** -** If you have questions regarding the use of this file, please use -** contact form at http://qt.digia.com -** -****************************************************************************/ - -// -// W A R N I N G -// ------------- -// -// This file is not part of the QtDataVisualization API. It exists purely as an -// implementation detail. This header file may change from version to -// version without notice, or even be removed. -// -// We mean it. - -#include "qabstractdatamapping.h" - -#ifndef QABSTRACTDATAMAPPING_P_H -#define QABSTRACTDATAMAPPING_P_H - -QT_DATAVISUALIZATION_BEGIN_NAMESPACE - -class QAbstractDataMappingPrivate : public QObject -{ - Q_OBJECT -public: - QAbstractDataMappingPrivate(QAbstractDataMapping *q, QAbstractDataProxy::DataType type); - virtual ~QAbstractDataMappingPrivate(); - -private: - QAbstractDataMapping *q_ptr; - QAbstractDataProxy::DataType m_type; -}; - -QT_DATAVISUALIZATION_END_NAMESPACE - -#endif diff --git a/src/datavisualization/data/qitemmodelbardatamapping.cpp b/src/datavisualization/data/qitemmodelbardatamapping.cpp deleted file mode 100644 index 0e92680f..00000000 --- a/src/datavisualization/data/qitemmodelbardatamapping.cpp +++ /dev/null @@ -1,407 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2013 Digia Plc -** All rights reserved. -** For any questions to Digia, please use contact form at http://qt.digia.com -** -** This file is part of the QtDataVisualization module. -** -** Licensees holding valid Qt Enterprise licenses may use this file in -** accordance with the Qt Enterprise License Agreement provided with the -** Software or, alternatively, in accordance with the terms contained in -** a written agreement between you and Digia. -** -** If you have questions regarding the use of this file, please use -** contact form at http://qt.digia.com -** -****************************************************************************/ - -#include "qitemmodelbardatamapping_p.h" - -QT_DATAVISUALIZATION_BEGIN_NAMESPACE - -/*! - * \class QItemModelBarDataMapping - * \inmodule QtDataVisualization - * \brief Item model mapping for Q3DBars. - * \since Qt Data Visualization 1.0 - * - * QItemModelBarDataMapping is used to map roles of QAbstractItemModel to rows, columns, and values - * of Q3DBars. There are three ways to use QItemModelBarDataMapping: - * - * 1) If useModelCategories property is set to true, QItemModelBarDataMapping will map rows and - * columns of QAbstractItemModel to rows and columns of Q3DBars, and uses the value returned for - * Qt::DisplayRole as bar value by default. - * The value role to be used can be redefined if Qt::DisplayRole is not suitable. - * - * 2) For models that do not have data already neatly sorted into rows and columns, such as - * QAbstractListModel based models, you can define a role from the model to map for each of row, - * column and value. - * - * 3) If you do not want to include all data contained in the model, or the autogenerated rows and - * columns are not ordered as you wish, you can specify which rows and columns should be included - * and in which order by defining an explicit list of categories for either or both of rows and - * columns. - * - * For example, assume that you have a custom QAbstractItemModel for storing various monthly values - * related to a business. - * Each item in the model has the roles "year", "month", "income", and "expenses". - * You could do the following to display the data in a bar graph: - * - * \snippet doc_src_qtdatavisualization.cpp 3 - * - * \sa QItemModelBarDataProxy, {Qt Data Visualization Data Handling} - */ - -/*! - * \qmltype BarDataMapping - * \inqmlmodule QtDataVisualization - * \since QtDataVisualization 1.0 - * \ingroup datavisualization_qml - * \instantiates QItemModelBarDataMapping - * \brief Item model mapping for Bars3D. - * - * This type is used to map roles of AbstractItemModel to rows, columns, and values of Bars3D. For - * a more complete description, see QItemModelBarDataMapping. - * - * Usage example: - * - * \snippet doc_src_qmldatavisualization.cpp 4 - * - * \sa ItemModelBarDataProxy, {Qt Data Visualization Data Handling} - */ - -/*! - * \qmlproperty string BarDataMapping::rowRole - * The row role of the mapping. - */ - -/*! - * \qmlproperty string BarDataMapping::columnRole - * The column role of the mapping. - */ - -/*! - * \qmlproperty string BarDataMapping::valueRole - * The value role of the mapping. - */ - -/*! - * \qmlproperty list BarDataMapping::rowCategories - * The row categories of the mapping. Only items with row roles that are found in this list are - * included when the data is resolved. The rows are ordered in the same order as they are in this list. - */ - -/*! - * \qmlproperty list BarDataMapping::columnCategories - * The column categories of the mapping. Only items with column roles that are found in this list are - * included when the data is resolved. The columns are ordered in the same order as they are in this list. - */ - -/*! - * \qmlproperty list BarDataMapping::useModelCategories - * When set to true, the mapping ignores row and column roles and categories, and uses - * the rows and columns from the model instead. Defaults to false. - */ - -/*! - * \qmlproperty list BarDataMapping::autoRowCategories - * When set to true, the mapping ignores any explicitly set row categories - * and overwrites them with automatically generated ones whenever the - * data from the model is resolved. Defaults to true. - */ - -/*! - * \qmlproperty list BarDataMapping::autoColumnCategories - * When set to true, the mapping ignores any explicitly set column categories - * and overwrites them with automatically generated ones whenever the - * data from model is resolved. Defaults to true. - */ - -/*! - * Constructs QItemModelBarDataMapping with the given \a parent. - */ -QItemModelBarDataMapping::QItemModelBarDataMapping(QObject *parent) - : QAbstractDataMapping(new QItemModelBarDataMappingPrivate(this), parent) -{ -} - -/*! - * Constructs QItemModelBarDataMapping with \a valueRole and the given \a parent. - * This constructor is meant to be used with models that have data properly sorted - * in rows and columns already, so it also sets useModelCategories property to true. - */ -QItemModelBarDataMapping::QItemModelBarDataMapping(const QString &valueRole, QObject *parent) - : QAbstractDataMapping(new QItemModelBarDataMappingPrivate(this), parent) -{ - dptr()->m_valueRole = valueRole; - dptr()->m_useModelCategories = true; -} - -/*! - * Constructs QItemModelBarDataMapping with \a rowRole, \a columnRole, \a valueRole - * and the given \a parent. - */ -QItemModelBarDataMapping::QItemModelBarDataMapping(const QString &rowRole, - const QString &columnRole, - const QString &valueRole, - QObject *parent) - : QAbstractDataMapping(new QItemModelBarDataMappingPrivate(this), parent) -{ - dptr()->m_rowRole = rowRole; - dptr()->m_columnRole = columnRole; - dptr()->m_valueRole = valueRole; -} - -/*! - * Constructs QItemModelBarDataMapping with \a rowRole, \a columnRole, \a valueRole, - * \a rowCategories, \a columnCategories and the given \a parent. This constructor - * also sets autoRowCategories and autoColumnCategories to false. - */ -QItemModelBarDataMapping::QItemModelBarDataMapping(const QString &rowRole, - const QString &columnRole, - const QString &valueRole, - const QStringList &rowCategories, - const QStringList &columnCategories, - QObject *parent) - : QAbstractDataMapping(new QItemModelBarDataMappingPrivate(this), parent) -{ - dptr()->m_rowRole = rowRole; - dptr()->m_columnRole = columnRole; - dptr()->m_valueRole = valueRole; - dptr()->m_rowCategories = rowCategories; - dptr()->m_columnCategories = columnCategories; - dptr()->m_autoRowCategories = false; - dptr()->m_autoColumnCategories = false; -} - -/*! - * Destroys QItemModelBarDataMapping. - */ -QItemModelBarDataMapping::~QItemModelBarDataMapping() -{ -} - -/*! - * \property QItemModelBarDataMapping::rowRole - * - * Defines the row role for the mapping. - */ -void QItemModelBarDataMapping::setRowRole(const QString &role) -{ - if (dptr()->m_rowRole != role) { - dptr()->m_rowRole = role; - emit mappingChanged(); - } -} - -QString QItemModelBarDataMapping::rowRole() const -{ - return dptrc()->m_rowRole; -} - -/*! - * \property QItemModelBarDataMapping::columnRole - * - * Defines the column role for the mapping. - */ -void QItemModelBarDataMapping::setColumnRole(const QString &role) -{ - if (dptr()->m_columnRole != role) { - dptr()->m_columnRole = role; - emit mappingChanged(); - } -} - -QString QItemModelBarDataMapping::columnRole() const -{ - return dptrc()->m_columnRole; -} - -/*! - * \property QItemModelBarDataMapping::valueRole - * - * Defines the value role for the mapping. - */ -void QItemModelBarDataMapping::setValueRole(const QString &role) -{ - if (dptr()->m_valueRole != role) { - dptr()->m_valueRole = role; - emit mappingChanged(); - } -} - -QString QItemModelBarDataMapping::valueRole() const -{ - return dptrc()->m_valueRole; -} - -/*! - * \property QItemModelBarDataMapping::rowCategories - * - * Defines the row categories for the mapping. - */ -void QItemModelBarDataMapping::setRowCategories(const QStringList &categories) -{ - if (dptr()->m_rowCategories != categories) { - dptr()->m_rowCategories = categories; - emit mappingChanged(); - } -} - -QStringList QItemModelBarDataMapping::rowCategories() const -{ - return dptrc()->m_rowCategories; -} - -/*! - * \property QItemModelBarDataMapping::columnCategories - * - * Defines the column categories for the mapping. - */ -void QItemModelBarDataMapping::setColumnCategories(const QStringList &categories) -{ - if (dptr()->m_columnCategories != categories) { - dptr()->m_columnCategories = categories; - emit mappingChanged(); - } -} - -QStringList QItemModelBarDataMapping::columnCategories() const -{ - return dptrc()->m_columnCategories; -} - -/*! - * \property QItemModelBarDataMapping::useModelCategories - * - * When set to true, the mapping ignores row and column roles and categories, and uses - * the rows and columns from the model instead. Defaults to false. - */ -void QItemModelBarDataMapping::setUseModelCategories(bool enable) -{ - if (dptr()->m_useModelCategories != enable) { - dptr()->m_useModelCategories = enable; - emit mappingChanged(); - } -} - -bool QItemModelBarDataMapping::useModelCategories() const -{ - return dptrc()->m_useModelCategories; -} - -/*! - * \property QItemModelBarDataMapping::autoRowCategories - * - * When set to true, the mapping ignores any explicitly set row categories - * and overwrites them with automatically generated ones whenever the - * data from model is resolved. Defaults to true. - */ -void QItemModelBarDataMapping::setAutoRowCategories(bool enable) -{ - if (dptr()->m_autoRowCategories != enable) { - dptr()->m_autoRowCategories = enable; - emit mappingChanged(); - } -} - -bool QItemModelBarDataMapping::autoRowCategories() const -{ - return dptrc()->m_autoRowCategories; -} - -/*! - * \property QItemModelBarDataMapping::autoColumnCategories - * - * When set to true, the mapping ignores any explicitly set column categories - * and overwrites them with automatically generated ones whenever the - * data from model is resolved. Defaults to true. - */ -void QItemModelBarDataMapping::setAutoColumnCategories(bool enable) -{ - if (dptr()->m_autoColumnCategories != enable) { - dptr()->m_autoColumnCategories = enable; - emit mappingChanged(); - } -} - -bool QItemModelBarDataMapping::autoColumnCategories() const -{ - return dptrc()->m_autoColumnCategories; -} - -/*! - * Changes \a rowRole, \a columnRole, \a valueRole, \a rowCategories and \a columnCategories to the - * mapping. - */ -void QItemModelBarDataMapping::remap(const QString &rowRole, - const QString &columnRole, - const QString &valueRole, - const QStringList &rowCategories, - const QStringList &columnCategories) -{ - dptr()->m_rowRole = rowRole; - dptr()->m_columnRole = columnRole; - dptr()->m_valueRole = valueRole; - dptr()->m_rowCategories = rowCategories; - dptr()->m_columnCategories = columnCategories; - - emit mappingChanged(); -} - -/*! - * /return index of the specified \a category in row categories list. - * If the row categories list is empty, -1 is returned. - * \note If the automatic row categories generation is in use, this method will - * not return a valid index before the data in the model is resolved for the first time. - */ -int QItemModelBarDataMapping::rowCategoryIndex(const QString &category) -{ - return dptr()->m_rowCategories.indexOf(category); -} - -/*! - * /return index of the specified \a category in column categories list. - * If the category is not found, -1 is returned. - * \note If the automatic column categories generation is in use, this method will - * not return a valid index before the data in the model is resolved for the first time. - */ -int QItemModelBarDataMapping::columnCategoryIndex(const QString &category) -{ - return dptr()->m_columnCategories.indexOf(category); -} - -/*! - * \internal - */ -QItemModelBarDataMappingPrivate *QItemModelBarDataMapping::dptr() -{ - return static_cast<QItemModelBarDataMappingPrivate *>(d_ptr.data()); -} - -/*! - * \internal - */ -const QItemModelBarDataMappingPrivate *QItemModelBarDataMapping::dptrc() const -{ - return static_cast<const QItemModelBarDataMappingPrivate *>(d_ptr.data()); -} - -// QItemModelBarDataMappingPrivate - -QItemModelBarDataMappingPrivate::QItemModelBarDataMappingPrivate(QItemModelBarDataMapping *q) - : QAbstractDataMappingPrivate(q, QAbstractDataProxy::DataTypeBar), - m_useModelCategories(false), - m_autoRowCategories(true), - m_autoColumnCategories(true) -{ -} - -QItemModelBarDataMappingPrivate::~QItemModelBarDataMappingPrivate() -{ -} - - -QT_DATAVISUALIZATION_END_NAMESPACE - diff --git a/src/datavisualization/data/qitemmodelbardatamapping.h b/src/datavisualization/data/qitemmodelbardatamapping.h deleted file mode 100644 index a5ef33b8..00000000 --- a/src/datavisualization/data/qitemmodelbardatamapping.h +++ /dev/null @@ -1,90 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2013 Digia Plc -** All rights reserved. -** For any questions to Digia, please use contact form at http://qt.digia.com -** -** This file is part of the QtDataVisualization module. -** -** Licensees holding valid Qt Enterprise licenses may use this file in -** accordance with the Qt Enterprise License Agreement provided with the -** Software or, alternatively, in accordance with the terms contained in -** a written agreement between you and Digia. -** -** If you have questions regarding the use of this file, please use -** contact form at http://qt.digia.com -** -****************************************************************************/ - -#ifndef QITEMMODELBARDATAMAPPING_H -#define QITEMMODELBARDATAMAPPING_H - -#include <QtDataVisualization/qdatavisualizationenums.h> -#include <QtDataVisualization/qabstractdatamapping.h> -#include <QStringList> - -QT_DATAVISUALIZATION_BEGIN_NAMESPACE - -class QItemModelBarDataMappingPrivate; - -class QT_DATAVISUALIZATION_EXPORT QItemModelBarDataMapping : public QAbstractDataMapping -{ - Q_OBJECT - Q_PROPERTY(QString rowRole READ rowRole WRITE setRowRole) - Q_PROPERTY(QString columnRole READ columnRole WRITE setColumnRole) - Q_PROPERTY(QString valueRole READ valueRole WRITE setValueRole) - Q_PROPERTY(QStringList rowCategories READ rowCategories WRITE setRowCategories) - Q_PROPERTY(QStringList columnCategories READ columnCategories WRITE setColumnCategories) - Q_PROPERTY(bool useModelCategories READ useModelCategories WRITE setUseModelCategories) - Q_PROPERTY(bool autoRowCategories READ autoRowCategories WRITE setAutoRowCategories) - Q_PROPERTY(bool autoColumnCategories READ autoColumnCategories WRITE setAutoColumnCategories) - -public: - explicit QItemModelBarDataMapping(QObject *parent = 0); - QItemModelBarDataMapping(const QString &valueRole, QObject *parent = 0); - QItemModelBarDataMapping(const QString &rowRole, const QString &columnRole, - const QString &valueRole, QObject *parent = 0); - QItemModelBarDataMapping(const QString &rowRole, const QString &columnRole, - const QString &valueRole, const QStringList &rowCategories, - const QStringList &columnCategories, QObject *parent = 0); - virtual ~QItemModelBarDataMapping(); - - void setRowRole(const QString &role); - QString rowRole() const; - void setColumnRole(const QString &role); - QString columnRole() const; - void setValueRole(const QString &role); - QString valueRole() const; - - void setRowCategories(const QStringList &categories); - QStringList rowCategories() const; - void setColumnCategories(const QStringList &categories); - QStringList columnCategories() const; - - void setUseModelCategories(bool enable); - bool useModelCategories() const; - void setAutoRowCategories(bool enable); - bool autoRowCategories() const; - void setAutoColumnCategories(bool enable); - bool autoColumnCategories() const; - - void remap(const QString &rowRole, const QString &columnRole, - const QString &valueRole, const QStringList &rowCategories, - const QStringList &columnCategories); - - Q_INVOKABLE int rowCategoryIndex(const QString& category); - Q_INVOKABLE int columnCategoryIndex(const QString& category); - -protected: - QItemModelBarDataMappingPrivate *dptr(); - const QItemModelBarDataMappingPrivate *dptrc() const; - -private: - Q_DISABLE_COPY(QItemModelBarDataMapping) - - friend class BarItemModelHandler; -}; - -QT_DATAVISUALIZATION_END_NAMESPACE - -#endif diff --git a/src/datavisualization/data/qitemmodelbardatamapping_p.h b/src/datavisualization/data/qitemmodelbardatamapping_p.h deleted file mode 100644 index 90a17fdb..00000000 --- a/src/datavisualization/data/qitemmodelbardatamapping_p.h +++ /dev/null @@ -1,63 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2013 Digia Plc -** All rights reserved. -** For any questions to Digia, please use contact form at http://qt.digia.com -** -** This file is part of the QtDataVisualization module. -** -** Licensees holding valid Qt Enterprise licenses may use this file in -** accordance with the Qt Enterprise License Agreement provided with the -** Software or, alternatively, in accordance with the terms contained in -** a written agreement between you and Digia. -** -** If you have questions regarding the use of this file, please use -** contact form at http://qt.digia.com -** -****************************************************************************/ - -// -// W A R N I N G -// ------------- -// -// This file is not part of the QtDataVisualization API. It exists purely as an -// implementation detail. This header file may change from version to -// version without notice, or even be removed. -// -// We mean it. - -#include "qitemmodelbardatamapping.h" -#include "qabstractdatamapping_p.h" - -#ifndef QITEMMODELBARDATAMAPPING_P_H -#define QITEMMODELBARDATAMAPPING_P_H - -QT_DATAVISUALIZATION_BEGIN_NAMESPACE - -class QItemModelBarDataMappingPrivate : public QAbstractDataMappingPrivate -{ - Q_OBJECT -public: - QItemModelBarDataMappingPrivate(QItemModelBarDataMapping *q); - virtual ~QItemModelBarDataMappingPrivate(); - -private: - QString m_rowRole; - QString m_columnRole; - QString m_valueRole; - - // For row/column items, sort items into these categories. Other categories are ignored. - QStringList m_rowCategories; - QStringList m_columnCategories; - - bool m_useModelCategories; - bool m_autoRowCategories; - bool m_autoColumnCategories; - - friend class QItemModelBarDataMapping; - friend class BarItemModelHandler; -}; - -QT_DATAVISUALIZATION_END_NAMESPACE - -#endif diff --git a/src/datavisualization/data/qitemmodelbardataproxy.cpp b/src/datavisualization/data/qitemmodelbardataproxy.cpp index a28e05e1..71bb6c75 100644 --- a/src/datavisualization/data/qitemmodelbardataproxy.cpp +++ b/src/datavisualization/data/qitemmodelbardataproxy.cpp @@ -29,13 +29,36 @@ QT_DATAVISUALIZATION_BEGIN_NAMESPACE * \since Qt Data Visualization 1.0 * * QItemModelBarDataProxy allows you to use QAbstractItemModel derived models as a data source - * for Q3DBars. It uses QItemModelBarDataMapping instance to map data from the model to Q3DBars - * graph. + * for Q3DBars. It uses the defined mappings to map data from the model to rows, columns, and + * values of Q3DBars graph. * - * The data is resolved asynchronously whenever the mapping or the model changes. + * The data is resolved asynchronously whenever mappings or the model changes. * QBarDataProxy::arrayReset() is emitted when the data has been resolved. * - * \sa QItemModelBarDataMapping, {Qt Data Visualization Data Handling} + * There are three ways to use mappings: + * + * 1) If useModelCategories property is set to true, this proxy will map rows and + * columns of QAbstractItemModel directly to rows and columns of Q3DBars, and uses the value + * returned for Qt::DisplayRole as bar value by default. + * The value role to be used can be redefined if Qt::DisplayRole is not suitable. + * + * 2) For models that do not have data already neatly sorted into rows and columns, such as + * QAbstractListModel based models, you can define a role from the model to map for each of row, + * column and value. + * + * 3) If you do not want to include all data contained in the model, or the autogenerated rows and + * columns are not ordered as you wish, you can specify which rows and columns should be included + * and in which order by defining an explicit list of categories for either or both of rows and + * columns. + * + * For example, assume that you have a custom QAbstractItemModel for storing various monthly values + * related to a business. + * Each item in the model has the roles "year", "month", "income", and "expenses". + * You could do the following to display the data in a bar graph: + * + * \snippet doc_src_qtdatavisualization.cpp 3 + * + * \sa {Qt Data Visualization Data Handling} */ /*! @@ -52,11 +75,13 @@ QT_DATAVISUALIZATION_BEGIN_NAMESPACE * Data is resolved asynchronously whenever the mapping or the model changes. * QBarDataProxy::arrayReset() is emitted when the data has been resolved. * + * For more details, see QItemModelBarDataProxy documentation. + * * Usage example: * * \snippet doc_src_qmldatavisualization.cpp 7 * - * \sa BarDataProxy, BarDataMapping, {Qt Data Visualization Data Handling} + * \sa BarDataProxy, {Qt Data Visualization Data Handling} */ /*! @@ -65,30 +90,133 @@ QT_DATAVISUALIZATION_BEGIN_NAMESPACE */ /*! - * \qmlproperty list ItemModelBarDataProxy::activeMapping - * The active mapping. Modifying a mapping that is set to the proxy will trigger data set - * re-resolving. + * \qmlproperty string ItemModelBarDataProxy::rowRole + * The row role of the mapping. + */ + +/*! + * \qmlproperty string ItemModelBarDataProxy::columnRole + * The column role of the mapping. + */ + +/*! + * \qmlproperty string ItemModelBarDataProxy::valueRole + * The value role of the mapping. + */ + +/*! + * \qmlproperty list ItemModelBarDataProxy::rowCategories + * The row categories of the mapping. Only items with row roles that are found in this list are + * included when the data is resolved. The rows are ordered in the same order as they are in this list. + */ + +/*! + * \qmlproperty list ItemModelBarDataProxy::columnCategories + * The column categories of the mapping. Only items with column roles that are found in this list are + * included when the data is resolved. The columns are ordered in the same order as they are in this list. + */ + +/*! + * \qmlproperty list ItemModelBarDataProxy::useModelCategories + * When set to true, the mapping ignores row and column roles and categories, and uses + * the rows and columns from the model instead. Row and column headers are used for row and column + * labels. Defaults to false. + */ + +/*! + * \qmlproperty list ItemModelBarDataProxy::autoRowCategories + * When set to true, the mapping ignores any explicitly set row categories + * and overwrites them with automatically generated ones whenever the + * data from the model is resolved. Defaults to true. + */ + +/*! + * \qmlproperty list ItemModelBarDataProxy::autoColumnCategories + * When set to true, the mapping ignores any explicitly set column categories + * and overwrites them with automatically generated ones whenever the + * data from model is resolved. Defaults to true. */ /*! - * Constructs QItemModelBarDataProxy. + * Constructs QItemModelBarDataProxy with optional \a parent. */ -QItemModelBarDataProxy::QItemModelBarDataProxy() : - QBarDataProxy(new QItemModelBarDataProxyPrivate(this)) +QItemModelBarDataProxy::QItemModelBarDataProxy(QObject *parent) + : QBarDataProxy(new QItemModelBarDataProxyPrivate(this), parent) { + connectItemModelHandler(); } /*! - * Constructs QItemModelBarDataProxy with \a itemModel and \a mapping. Proxy takes ownership of the - * \a mapping, but doesn't take ownership of the \a itemModel, as typically item models are owned - * by other controls. + * Constructs QItemModelBarDataProxy with \a itemModel and optional \a parent. Proxy doesn't take + * ownership of the \a itemModel, as typically item models are owned by other controls. + */ +QItemModelBarDataProxy::QItemModelBarDataProxy(const QAbstractItemModel *itemModel, QObject *parent) + : QBarDataProxy(new QItemModelBarDataProxyPrivate(this), parent) +{ + setItemModel(itemModel); + connectItemModelHandler(); +} + +/*! + * Constructs QItemModelBarDataProxy with \a itemModel and optional \a parent. Proxy doesn't take + * ownership of the \a itemModel, as typically item models are owned by other controls. + * The value role is set to \a valueRole. + * This constructor is meant to be used with models that have data properly sorted + * in rows and columns already, so it also sets useModelCategories property to true. + */ +QItemModelBarDataProxy::QItemModelBarDataProxy(const QAbstractItemModel *itemModel, + const QString &valueRole, QObject *parent) + : QBarDataProxy(new QItemModelBarDataProxyPrivate(this), parent) +{ + dptr()->m_itemModelHandler->setItemModel(itemModel); + dptr()->m_valueRole = valueRole; + dptr()->m_useModelCategories = true; + connectItemModelHandler(); +} + +/*! + * Constructs QItemModelBarDataProxy with \a itemModel and optional \a parent. Proxy doesn't take + * ownership of the \a itemModel, as typically item models are owned by other controls. + * The role mappings are set with \a rowRole, \a columnRole, and \a valueRole. + */ +QItemModelBarDataProxy::QItemModelBarDataProxy(const QAbstractItemModel *itemModel, + const QString &rowRole, + const QString &columnRole, + const QString &valueRole, QObject *parent) + : QBarDataProxy(new QItemModelBarDataProxyPrivate(this), parent) +{ + dptr()->m_itemModelHandler->setItemModel(itemModel); + dptr()->m_rowRole = rowRole; + dptr()->m_columnRole = columnRole; + dptr()->m_valueRole = valueRole; + connectItemModelHandler(); +} + +/*! + * Constructs QItemModelBarDataProxy with \a itemModel and optional \a parent. Proxy doesn't take + * ownership of the \a itemModel, as typically item models are owned by other controls. + * The role mappings are set with \a rowRole, \a columnRole, and \a valueRole. + * Row and column categories are set with \a rowCategories and \a columnCategories. + * This constructor also sets autoRowCategories and autoColumnCategories to false. */ QItemModelBarDataProxy::QItemModelBarDataProxy(const QAbstractItemModel *itemModel, - QItemModelBarDataMapping *mapping) : - QBarDataProxy(new QItemModelBarDataProxyPrivate(this)) + const QString &rowRole, + const QString &columnRole, + const QString &valueRole, + const QStringList &rowCategories, + const QStringList &columnCategories, + QObject *parent) + : QBarDataProxy(new QItemModelBarDataProxyPrivate(this), parent) { dptr()->m_itemModelHandler->setItemModel(itemModel); - dptr()->m_itemModelHandler->setActiveMapping(mapping); + dptr()->m_rowRole = rowRole; + dptr()->m_columnRole = columnRole; + dptr()->m_valueRole = valueRole; + dptr()->m_rowCategories = rowCategories; + dptr()->m_columnCategories = columnCategories; + dptr()->m_autoRowCategories = false; + dptr()->m_autoColumnCategories = false; + connectItemModelHandler(); } /*! @@ -115,50 +243,191 @@ const QAbstractItemModel *QItemModelBarDataProxy::itemModel() const } /*! - * \property QItemModelBarDataProxy::activeMapping + * \property QItemModelBarDataProxy::rowRole + * + * Defines the row role for the mapping. + */ +void QItemModelBarDataProxy::setRowRole(const QString &role) +{ + if (dptr()->m_rowRole != role) { + dptr()->m_rowRole = role; + emit rowRoleChanged(role); + } +} + +QString QItemModelBarDataProxy::rowRole() const +{ + return dptrc()->m_rowRole; +} + +/*! + * \property QItemModelBarDataProxy::columnRole * - * Defines data mapping. Proxy takes ownership of the \a mapping. - * Modifying a mapping that is set to the proxy will trigger data set re-resolving. + * Defines the column role for the mapping. */ -void QItemModelBarDataProxy::setActiveMapping(QItemModelBarDataMapping *mapping) +void QItemModelBarDataProxy::setColumnRole(const QString &role) { - dptr()->m_itemModelHandler->setActiveMapping(mapping); + if (dptr()->m_columnRole != role) { + dptr()->m_columnRole = role; + emit columnRoleChanged(role); + } } -QItemModelBarDataMapping *QItemModelBarDataProxy::activeMapping() const +QString QItemModelBarDataProxy::columnRole() const { - return static_cast<QItemModelBarDataMapping *>(dptrc()->m_itemModelHandler->activeMapping()); + return dptrc()->m_columnRole; } /*! - * Transfers the ownership of the \a mapping to this proxy. The mapping is not taken to use yet. - * \sa setActiveMapping(), releaseMapping() + * \property QItemModelBarDataProxy::valueRole + * + * Defines the value role for the mapping. + */ +void QItemModelBarDataProxy::setValueRole(const QString &role) +{ + if (dptr()->m_valueRole != role) { + dptr()->m_valueRole = role; + emit valueRoleChanged(role); + } +} + +QString QItemModelBarDataProxy::valueRole() const +{ + return dptrc()->m_valueRole; +} + +/*! + * \property QItemModelBarDataProxy::rowCategories + * + * Defines the row categories for the mapping. + */ +void QItemModelBarDataProxy::setRowCategories(const QStringList &categories) +{ + if (dptr()->m_rowCategories != categories) { + dptr()->m_rowCategories = categories; + emit rowCategoriesChanged(categories); + } +} + +QStringList QItemModelBarDataProxy::rowCategories() const +{ + return dptrc()->m_rowCategories; +} + +/*! + * \property QItemModelBarDataProxy::columnCategories + * + * Defines the column categories for the mapping. + */ +void QItemModelBarDataProxy::setColumnCategories(const QStringList &categories) +{ + if (dptr()->m_columnCategories != categories) { + dptr()->m_columnCategories = categories; + emit columnCategoriesChanged(categories); + } +} + +QStringList QItemModelBarDataProxy::columnCategories() const +{ + return dptrc()->m_columnCategories; +} + +/*! + * \property QItemModelBarDataProxy::useModelCategories + * + * When set to true, the mapping ignores row and column roles and categories, and uses + * the rows and columns from the model instead. Defaults to false. */ -void QItemModelBarDataProxy::addMapping(QItemModelBarDataMapping *mapping) +void QItemModelBarDataProxy::setUseModelCategories(bool enable) { - dptr()->m_itemModelHandler->addMapping(mapping); + if (dptr()->m_useModelCategories != enable) { + dptr()->m_useModelCategories = enable; + emit useModelCategoriesChanged(enable); + } +} + +bool QItemModelBarDataProxy::useModelCategories() const +{ + return dptrc()->m_useModelCategories; +} + +/*! + * \property QItemModelBarDataProxy::autoRowCategories + * + * When set to true, the mapping ignores any explicitly set row categories + * and overwrites them with automatically generated ones whenever the + * data from model is resolved. Defaults to true. + */ +void QItemModelBarDataProxy::setAutoRowCategories(bool enable) +{ + if (dptr()->m_autoRowCategories != enable) { + dptr()->m_autoRowCategories = enable; + emit autoRowCategoriesChanged(enable); + } +} + +bool QItemModelBarDataProxy::autoRowCategories() const +{ + return dptrc()->m_autoRowCategories; +} + +/*! + * \property QItemModelBarDataProxy::autoColumnCategories + * + * When set to true, the mapping ignores any explicitly set column categories + * and overwrites them with automatically generated ones whenever the + * data from model is resolved. Defaults to true. + */ +void QItemModelBarDataProxy::setAutoColumnCategories(bool enable) +{ + if (dptr()->m_autoColumnCategories != enable) { + dptr()->m_autoColumnCategories = enable; + emit autoColumnCategoriesChanged(enable); + } +} + +bool QItemModelBarDataProxy::autoColumnCategories() const +{ + return dptrc()->m_autoColumnCategories; } /*! - * Releases the ownership of the \a mapping back to the caller. If the mapping was the currently - * active one, no mapping remains active after this call. + * Changes \a rowRole, \a columnRole, \a valueRole, \a rowCategories and \a columnCategories to the + * mapping. */ -void QItemModelBarDataProxy::releaseMapping(QItemModelBarDataMapping *mapping) +void QItemModelBarDataProxy::remap(const QString &rowRole, + const QString &columnRole, + const QString &valueRole, + const QStringList &rowCategories, + const QStringList &columnCategories) { - dptr()->m_itemModelHandler->releaseMapping(mapping); + setRowRole(rowRole); + setColumnRole(columnRole); + setValueRole(valueRole); + setRowCategories(rowCategories); + setColumnCategories(columnCategories); } /*! - * \return list of mappings owned by the proxy. + * /return index of the specified \a category in row categories list. + * If the row categories list is empty, -1 is returned. + * \note If the automatic row categories generation is in use, this method will + * not return a valid index before the data in the model is resolved for the first time. */ -QList<QItemModelBarDataMapping *> QItemModelBarDataProxy::mappings() const +int QItemModelBarDataProxy::rowCategoryIndex(const QString &category) { - QList<QItemModelBarDataMapping *> retList; - QList<QAbstractDataMapping *> abstractList = dptrc()->m_itemModelHandler->mappings(); - foreach (QAbstractDataMapping *mapping, abstractList) - retList.append(static_cast<QItemModelBarDataMapping *>(mapping)); + return dptr()->m_rowCategories.indexOf(category); +} - return retList; +/*! + * /return index of the specified \a category in column categories list. + * If the category is not found, -1 is returned. + * \note If the automatic column categories generation is in use, this method will + * not return a valid index before the data in the model is resolved for the first time. + */ +int QItemModelBarDataProxy::columnCategoryIndex(const QString &category) +{ + return dptr()->m_columnCategories.indexOf(category); } /*! @@ -177,11 +446,36 @@ const QItemModelBarDataProxyPrivate *QItemModelBarDataProxy::dptrc() const return static_cast<const QItemModelBarDataProxyPrivate *>(d_ptr.data()); } +void QItemModelBarDataProxy::connectItemModelHandler() +{ + QObject::connect(dptr()->m_itemModelHandler, &BarItemModelHandler::itemModelChanged, + this, &QItemModelBarDataProxy::itemModelChanged); + QObject::connect(this, &QItemModelBarDataProxy::rowRoleChanged, + dptr()->m_itemModelHandler, &AbstractItemModelHandler::handleMappingChanged); + QObject::connect(this, &QItemModelBarDataProxy::columnRoleChanged, + dptr()->m_itemModelHandler, &AbstractItemModelHandler::handleMappingChanged); + QObject::connect(this, &QItemModelBarDataProxy::valueRoleChanged, + dptr()->m_itemModelHandler, &AbstractItemModelHandler::handleMappingChanged); + QObject::connect(this, &QItemModelBarDataProxy::rowCategoriesChanged, + dptr()->m_itemModelHandler, &AbstractItemModelHandler::handleMappingChanged); + QObject::connect(this, &QItemModelBarDataProxy::columnCategoriesChanged, + dptr()->m_itemModelHandler, &AbstractItemModelHandler::handleMappingChanged); + QObject::connect(this, &QItemModelBarDataProxy::useModelCategoriesChanged, + dptr()->m_itemModelHandler, &AbstractItemModelHandler::handleMappingChanged); + QObject::connect(this, &QItemModelBarDataProxy::autoRowCategoriesChanged, + dptr()->m_itemModelHandler, &AbstractItemModelHandler::handleMappingChanged); + QObject::connect(this, &QItemModelBarDataProxy::autoColumnCategoriesChanged, + dptr()->m_itemModelHandler, &AbstractItemModelHandler::handleMappingChanged); +} + // QItemModelBarDataProxyPrivate QItemModelBarDataProxyPrivate::QItemModelBarDataProxyPrivate(QItemModelBarDataProxy *q) : QBarDataProxyPrivate(q), - m_itemModelHandler(new BarItemModelHandler(q)) + m_itemModelHandler(new BarItemModelHandler(q)), + m_useModelCategories(false), + m_autoRowCategories(true), + m_autoColumnCategories(true) { } diff --git a/src/datavisualization/data/qitemmodelbardataproxy.h b/src/datavisualization/data/qitemmodelbardataproxy.h index 2a96f0c8..81c46926 100644 --- a/src/datavisualization/data/qitemmodelbardataproxy.h +++ b/src/datavisualization/data/qitemmodelbardataproxy.h @@ -20,7 +20,6 @@ #define QITEMMODELBARDATAPROXY_H #include <QtDataVisualization/qbardataproxy.h> -#include <QtDataVisualization/qitemmodelbardatamapping.h> #include <QAbstractItemModel> #include <QStringList> @@ -31,30 +30,79 @@ class QItemModelBarDataProxyPrivate; class QT_DATAVISUALIZATION_EXPORT QItemModelBarDataProxy : public QBarDataProxy { Q_OBJECT - Q_PROPERTY(const QAbstractItemModel* itemModel READ itemModel WRITE setItemModel) - Q_PROPERTY(QItemModelBarDataMapping* activeMapping READ activeMapping WRITE setActiveMapping) + Q_PROPERTY(const QAbstractItemModel* itemModel READ itemModel WRITE setItemModel NOTIFY itemModelChanged) + Q_PROPERTY(QString rowRole READ rowRole WRITE setRowRole NOTIFY rowRoleChanged) + Q_PROPERTY(QString columnRole READ columnRole WRITE setColumnRole NOTIFY columnRoleChanged) + Q_PROPERTY(QString valueRole READ valueRole WRITE setValueRole NOTIFY valueRoleChanged) + Q_PROPERTY(QStringList rowCategories READ rowCategories WRITE setRowCategories NOTIFY rowCategoriesChanged) + Q_PROPERTY(QStringList columnCategories READ columnCategories WRITE setColumnCategories NOTIFY columnCategoriesChanged) + Q_PROPERTY(bool useModelCategories READ useModelCategories WRITE setUseModelCategories NOTIFY useModelCategoriesChanged) + Q_PROPERTY(bool autoRowCategories READ autoRowCategories WRITE setAutoRowCategories NOTIFY autoRowCategoriesChanged) + Q_PROPERTY(bool autoColumnCategories READ autoColumnCategories WRITE setAutoColumnCategories NOTIFY autoColumnCategoriesChanged) public: - explicit QItemModelBarDataProxy(); - explicit QItemModelBarDataProxy(const QAbstractItemModel *itemModel, - QItemModelBarDataMapping *mapping); + explicit QItemModelBarDataProxy(QObject *parent = 0); + QItemModelBarDataProxy(const QAbstractItemModel *itemModel, QObject *parent = 0); + QItemModelBarDataProxy(const QAbstractItemModel *itemModel, const QString &valueRole, + QObject *parent = 0); + QItemModelBarDataProxy(const QAbstractItemModel *itemModel, const QString &rowRole, + const QString &columnRole, const QString &valueRole, + QObject *parent = 0); + QItemModelBarDataProxy(const QAbstractItemModel *itemModel, const QString &rowRole, + const QString &columnRole, const QString &valueRole, + const QStringList &rowCategories, const QStringList &columnCategories, + QObject *parent = 0); virtual ~QItemModelBarDataProxy(); void setItemModel(const QAbstractItemModel *itemModel); const QAbstractItemModel *itemModel() const; - void setActiveMapping(QItemModelBarDataMapping *mapping); - QItemModelBarDataMapping *activeMapping() const; - void addMapping(QItemModelBarDataMapping *mapping); - void releaseMapping(QItemModelBarDataMapping *mapping); - QList<QItemModelBarDataMapping *> mappings() const; + void setRowRole(const QString &role); + QString rowRole() const; + void setColumnRole(const QString &role); + QString columnRole() const; + void setValueRole(const QString &role); + QString valueRole() const; + + void setRowCategories(const QStringList &categories); + QStringList rowCategories() const; + void setColumnCategories(const QStringList &categories); + QStringList columnCategories() const; + + void setUseModelCategories(bool enable); + bool useModelCategories() const; + void setAutoRowCategories(bool enable); + bool autoRowCategories() const; + void setAutoColumnCategories(bool enable); + bool autoColumnCategories() const; + + void remap(const QString &rowRole, const QString &columnRole, + const QString &valueRole, const QStringList &rowCategories, + const QStringList &columnCategories); + + Q_INVOKABLE int rowCategoryIndex(const QString& category); + Q_INVOKABLE int columnCategoryIndex(const QString& category); + +signals: + void itemModelChanged(const QAbstractItemModel* itemModel); + void rowRoleChanged(QString role); + void columnRoleChanged(QString role); + void valueRoleChanged(QString role); + void rowCategoriesChanged(QStringList categories); + void columnCategoriesChanged(QStringList categories); + void useModelCategoriesChanged(bool enable); + void autoRowCategoriesChanged(bool enable); + void autoColumnCategoriesChanged(bool enable); protected: QItemModelBarDataProxyPrivate *dptr(); const QItemModelBarDataProxyPrivate *dptrc() const; private: + void connectItemModelHandler(); Q_DISABLE_COPY(QItemModelBarDataProxy) + + friend class BarItemModelHandler; }; QT_DATAVISUALIZATION_END_NAMESPACE diff --git a/src/datavisualization/data/qitemmodelbardataproxy_p.h b/src/datavisualization/data/qitemmodelbardataproxy_p.h index fc646f0d..6f71429c 100644 --- a/src/datavisualization/data/qitemmodelbardataproxy_p.h +++ b/src/datavisualization/data/qitemmodelbardataproxy_p.h @@ -31,8 +31,6 @@ #include "qitemmodelbardataproxy.h" #include "qbardataproxy_p.h" -#include <QPointer> -#include <QTimer> QT_DATAVISUALIZATION_BEGIN_NAMESPACE @@ -50,6 +48,19 @@ private: BarItemModelHandler *m_itemModelHandler; + QString m_rowRole; + QString m_columnRole; + QString m_valueRole; + + // For row/column items, sort items into these categories. Other categories are ignored. + QStringList m_rowCategories; + QStringList m_columnCategories; + + bool m_useModelCategories; + bool m_autoRowCategories; + bool m_autoColumnCategories; + + friend class BarItemModelHandler; friend class QItemModelBarDataProxy; }; diff --git a/src/datavisualization/data/qitemmodelscatterdatamapping.cpp b/src/datavisualization/data/qitemmodelscatterdatamapping.cpp deleted file mode 100644 index 3d94d0ce..00000000 --- a/src/datavisualization/data/qitemmodelscatterdatamapping.cpp +++ /dev/null @@ -1,200 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2013 Digia Plc -** All rights reserved. -** For any questions to Digia, please use contact form at http://qt.digia.com -** -** This file is part of the QtDataVisualization module. -** -** Licensees holding valid Qt Enterprise licenses may use this file in -** accordance with the Qt Enterprise License Agreement provided with the -** Software or, alternatively, in accordance with the terms contained in -** a written agreement between you and Digia. -** -** If you have questions regarding the use of this file, please use -** contact form at http://qt.digia.com -** -****************************************************************************/ - -#include "qitemmodelscatterdatamapping_p.h" - -QT_DATAVISUALIZATION_BEGIN_NAMESPACE - -/*! - * \class QItemModelScatterDataMapping - * \inmodule QtDataVisualization - * \brief Item model mapping for Q3DScatter. - * \since Qt Data Visualization 1.0 - * - * QItemModelScatterDataMapping is used to map roles of QAbstractItemModel to the XYZ-values - * of Q3DScatter points. - * - * QItemModelScatterDataMapping ignores rows and columns of the QAbstractItemModel and treats - * all items equally. It requires the model to provide at least three roles for the data items - * that can be mapped to X, Y, and Z-values for the scatter points. - * - * For example, assume that you have a custom QAbstractItemModel for storing various measurements - * done on material samples, providing data for roles such as "density", "hardness", and - * "conductivity". You could visualize these properties on a scatter graph: - * - * \snippet doc_src_qtdatavisualization.cpp 4 - * - * \sa QItemModelScatterDataProxy, {Qt Data Visualization Data Handling} - */ - -/*! - * \qmltype ScatterDataMapping - * \inqmlmodule QtDataVisualization - * \since QtDataVisualization 1.0 - * \ingroup datavisualization_qml - * \instantiates QItemModelScatterDataMapping - * \brief Item model mapping for Scatter3D. - * - * This type is used to map roles of AbstractItemModel to the XYZ-values of Scatter3D points. For - * a more complete description, see QItemModelScatterDataMapping. - * - * Usage example: - * - * \snippet doc_src_qmldatavisualization.cpp 5 - * - * \sa ItemModelScatterDataProxy, {Qt Data Visualization Data Handling} - */ - -/*! - * \qmlproperty string ScatterDataMapping::xPosRole - * The X position role of the mapping. - */ - -/*! - * \qmlproperty string ScatterDataMapping::yPosRole - * The Y position role of the mapping. - */ - -/*! - * \qmlproperty string ScatterDataMapping::zPosRole - * The Z position role of the mapping. - */ - -/*! - * Constructs QItemModelScatterDataMapping with the given \a parent. - */ -QItemModelScatterDataMapping::QItemModelScatterDataMapping(QObject *parent) - : QAbstractDataMapping(new QItemModelScatterDataMappingPrivate(this), parent) -{ -} - -/*! - * Constructs QItemModelScatterDataMapping with \a xPosRole, \a yPosRole, \a zPosRole - * and the given \a parent. - */ -QItemModelScatterDataMapping::QItemModelScatterDataMapping(const QString &xPosRole, - const QString &yPosRole, - const QString &zPosRole, - QObject *parent) - : QAbstractDataMapping(new QItemModelScatterDataMappingPrivate(this), parent) -{ - dptr()->m_xPosRole = xPosRole; - dptr()->m_yPosRole = yPosRole; - dptr()->m_zPosRole = zPosRole; -} - -/*! - * Destroys QItemModelScatterDataMapping. - */ -QItemModelScatterDataMapping::~QItemModelScatterDataMapping() -{ -} - -/*! - * \property QItemModelScatterDataMapping::xPosRole - * - * Defines the X position role for the mapping. - */ -void QItemModelScatterDataMapping::setXPosRole(const QString &role) -{ - dptr()->m_xPosRole = role; - emit mappingChanged(); -} - -QString QItemModelScatterDataMapping::xPosRole() const -{ - return dptrc()->m_xPosRole; -} - -/*! - * \property QItemModelScatterDataMapping::yPosRole - * - * Defines the Y position role for the mapping. - */ -void QItemModelScatterDataMapping::setYPosRole(const QString &role) -{ - dptr()->m_yPosRole = role; - emit mappingChanged(); -} - -QString QItemModelScatterDataMapping::yPosRole() const -{ - return dptrc()->m_yPosRole; -} - -/*! - * \property QItemModelScatterDataMapping::zPosRole - * - * Defines the Z position role for the mapping. - */ -void QItemModelScatterDataMapping::setZPosRole(const QString &role) -{ - dptr()->m_zPosRole = role; - emit mappingChanged(); -} - -QString QItemModelScatterDataMapping::zPosRole() const -{ - return dptrc()->m_zPosRole; -} - -/*! - * Changes \a xPosRole, \a yPosRole and \a zPosRole to the mapping. - * - * Emits mappingChanged() signal after remapping. - */ -void QItemModelScatterDataMapping::remap(const QString &xPosRole, const QString &yPosRole, - const QString &zPosRole) -{ - dptr()->m_xPosRole = xPosRole; - dptr()->m_yPosRole = yPosRole; - dptr()->m_zPosRole = zPosRole; - - emit mappingChanged(); -} - -/*! - * \internal - */ -QItemModelScatterDataMappingPrivate *QItemModelScatterDataMapping::dptr() -{ - return static_cast<QItemModelScatterDataMappingPrivate *>(d_ptr.data()); -} - -/*! - * \internal - */ -const QItemModelScatterDataMappingPrivate *QItemModelScatterDataMapping::dptrc() const -{ - return static_cast<const QItemModelScatterDataMappingPrivate *>(d_ptr.data()); -} - -// QItemModelScatterDataMappingPrivate - -QItemModelScatterDataMappingPrivate::QItemModelScatterDataMappingPrivate( - QItemModelScatterDataMapping *q) - : QAbstractDataMappingPrivate(q, QAbstractDataProxy::DataTypeScatter) -{ -} - -QItemModelScatterDataMappingPrivate::~QItemModelScatterDataMappingPrivate() -{ -} - -QT_DATAVISUALIZATION_END_NAMESPACE - diff --git a/src/datavisualization/data/qitemmodelscatterdatamapping.h b/src/datavisualization/data/qitemmodelscatterdatamapping.h deleted file mode 100644 index 62f2fefc..00000000 --- a/src/datavisualization/data/qitemmodelscatterdatamapping.h +++ /dev/null @@ -1,62 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2013 Digia Plc -** All rights reserved. -** For any questions to Digia, please use contact form at http://qt.digia.com -** -** This file is part of the QtDataVisualization module. -** -** Licensees holding valid Qt Enterprise licenses may use this file in -** accordance with the Qt Enterprise License Agreement provided with the -** Software or, alternatively, in accordance with the terms contained in -** a written agreement between you and Digia. -** -** If you have questions regarding the use of this file, please use -** contact form at http://qt.digia.com -** -****************************************************************************/ - -#ifndef QITEMMODELSCATTERDATAMAPPING_H -#define QITEMMODELSCATTERDATAMAPPING_H - -#include <QtDataVisualization/qdatavisualizationenums.h> -#include <QtDataVisualization/qabstractdatamapping.h> -#include <QObject> - -QT_DATAVISUALIZATION_BEGIN_NAMESPACE - -class QItemModelScatterDataMappingPrivate; - -class QT_DATAVISUALIZATION_EXPORT QItemModelScatterDataMapping : public QAbstractDataMapping -{ - Q_OBJECT - Q_PROPERTY(QString xPosRole READ xPosRole WRITE setXPosRole) - Q_PROPERTY(QString yPosRole READ yPosRole WRITE setYPosRole) - Q_PROPERTY(QString zPosRole READ zPosRole WRITE setZPosRole) - -public: - explicit QItemModelScatterDataMapping(QObject *parent = 0); - QItemModelScatterDataMapping(const QString &xPosRole, const QString &yPosRole, - const QString &zPosRole, QObject *parent = 0); - virtual ~QItemModelScatterDataMapping(); - - void setXPosRole(const QString &role); - QString xPosRole() const; - void setYPosRole(const QString &role); - QString yPosRole() const; - void setZPosRole(const QString &role); - QString zPosRole() const; - - void remap(const QString &xPosRole, const QString &yPosRole, const QString &zPosRole); - -protected: - QItemModelScatterDataMappingPrivate *dptr(); - const QItemModelScatterDataMappingPrivate *dptrc() const; - -private: - Q_DISABLE_COPY(QItemModelScatterDataMapping) -}; - -QT_DATAVISUALIZATION_END_NAMESPACE - -#endif diff --git a/src/datavisualization/data/qitemmodelscatterdatamapping_p.h b/src/datavisualization/data/qitemmodelscatterdatamapping_p.h deleted file mode 100644 index 62ff42b4..00000000 --- a/src/datavisualization/data/qitemmodelscatterdatamapping_p.h +++ /dev/null @@ -1,56 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2013 Digia Plc -** All rights reserved. -** For any questions to Digia, please use contact form at http://qt.digia.com -** -** This file is part of the QtDataVisualization module. -** -** Licensees holding valid Qt Enterprise licenses may use this file in -** accordance with the Qt Enterprise License Agreement provided with the -** Software or, alternatively, in accordance with the terms contained in -** a written agreement between you and Digia. -** -** If you have questions regarding the use of this file, please use -** contact form at http://qt.digia.com -** -****************************************************************************/ - -// -// W A R N I N G -// ------------- -// -// This file is not part of the QtDataVisualization API. It exists purely as an -// implementation detail. This header file may change from version to -// version without notice, or even be removed. -// -// We mean it. - -#ifndef QITEMMODELSCATTERDATAMAPPING_P_H -#define QITEMMODELSCATTERDATAMAPPING_P_H - -#include "qitemmodelscatterdatamapping.h" -#include "qabstractdatamapping_p.h" - -QT_DATAVISUALIZATION_BEGIN_NAMESPACE - -class QItemModelScatterDataMappingPrivate : public QAbstractDataMappingPrivate -{ - Q_OBJECT -public: - QItemModelScatterDataMappingPrivate(QItemModelScatterDataMapping *q); - virtual ~QItemModelScatterDataMappingPrivate(); - -private: - //QString m_labelRole; - QString m_xPosRole; - QString m_yPosRole; - QString m_zPosRole; - //QString m_valueRole; - - friend class QItemModelScatterDataMapping; -}; - -QT_DATAVISUALIZATION_END_NAMESPACE - -#endif diff --git a/src/datavisualization/data/qitemmodelscatterdataproxy.cpp b/src/datavisualization/data/qitemmodelscatterdataproxy.cpp index 5536a105..471033e8 100644 --- a/src/datavisualization/data/qitemmodelscatterdataproxy.cpp +++ b/src/datavisualization/data/qitemmodelscatterdataproxy.cpp @@ -29,11 +29,21 @@ QT_DATAVISUALIZATION_BEGIN_NAMESPACE * \since Qt Data Visualization 1.0 * * QItemModelScatterDataProxy allows you to use QAbstractItemModel derived models as a data source - * for Q3DScatter. It maps roles defined in QItemModelScatterDataMapping to roles in the model. + * for Q3DScatter. It maps roles of QAbstractItemModel to the XYZ-values of Q3DScatter points. * * The data is resolved asynchronously whenever the mapping or the model changes. * QScatterDataProxy::arrayReset() is emitted when the data has been resolved. * + * Mapping ignores rows and columns of the QAbstractItemModel and treats + * all items equally. It requires the model to provide at least three roles for the data items + * that can be mapped to X, Y, and Z-values for the scatter points. + * + * For example, assume that you have a custom QAbstractItemModel for storing various measurements + * done on material samples, providing data for roles such as "density", "hardness", and + * "conductivity". You could visualize these properties on a scatter graph using this proxy: + * + * \snippet doc_src_qtdatavisualization.cpp 4 + * * \sa {Qt Data Visualization Data Handling} */ @@ -51,11 +61,13 @@ QT_DATAVISUALIZATION_BEGIN_NAMESPACE * The data is resolved asynchronously whenever the mapping or the model changes. * QScatterDataProxy::arrayReset() is emitted when the data has been resolved. * + * For more details, see QItemModelScatterDataProxy documentation. + * * Usage example: * * \snippet doc_src_qmldatavisualization.cpp 8 * - * \sa ScatterDataProxy, ScatterDataMapping, {Qt Data Visualization Data Handling} + * \sa ScatterDataProxy, {Qt Data Visualization Data Handling} */ /*! @@ -64,29 +76,59 @@ QT_DATAVISUALIZATION_BEGIN_NAMESPACE */ /*! - * \qmlproperty list ItemModelScatterDataProxy::activeMapping - * The active mapping. Modifying a mapping that is set to the proxy will trigger data set - * re-resolving. + * \qmlproperty string ItemModelScatterDataProxy::xPosRole + * The X position role of the mapping. */ /*! - * Constructs QItemModelScatterDataProxy. + * \qmlproperty string ItemModelScatterDataProxy::yPosRole + * The Y position role of the mapping. */ -QItemModelScatterDataProxy::QItemModelScatterDataProxy() : - QScatterDataProxy(new QItemModelScatterDataProxyPrivate(this)) + +/*! + * \qmlproperty string ItemModelScatterDataProxy::zPosRole + * The Z position role of the mapping. + */ + +/*! + * Constructs QItemModelScatterDataProxy with optional \a parent. + */ +QItemModelScatterDataProxy::QItemModelScatterDataProxy(QObject *parent) + : QScatterDataProxy(new QItemModelScatterDataProxyPrivate(this), parent) { + connectItemModelHandler(); } /*! - * Constructs QItemModelScatterDataProxy with \a itemModel and \a mapping. Does not take ownership - * of the model or the mapping, but does connect to them to listen for changes. + * Constructs QItemModelScatterDataProxy with \a itemModel and optional \a parent. Proxy doesn't take + * ownership of the \a itemModel, as typically item models are owned by other controls. */ QItemModelScatterDataProxy::QItemModelScatterDataProxy(const QAbstractItemModel *itemModel, - QItemModelScatterDataMapping *mapping) : - QScatterDataProxy(new QItemModelScatterDataProxyPrivate(this)) + QObject *parent) + : QScatterDataProxy(new QItemModelScatterDataProxyPrivate(this), parent) { dptr()->m_itemModelHandler->setItemModel(itemModel); - dptr()->m_itemModelHandler->setActiveMapping(mapping); + connectItemModelHandler(); +} + +/*! + * Constructs QItemModelScatterDataProxy with \a itemModel and optional \a parent. Proxy doesn't take + * ownership of the \a itemModel, as typically item models are owned by other controls. + * The xPosRole property is set to \a xPosRole, yPosRole property to \a yPosRole, and zPosRole property + * to \a zPosRole. + */ +QItemModelScatterDataProxy::QItemModelScatterDataProxy(const QAbstractItemModel *itemModel, + const QString &xPosRole, + const QString &yPosRole, + const QString &zPosRole, + QObject *parent) + : QScatterDataProxy(new QItemModelScatterDataProxyPrivate(this), parent) +{ + dptr()->m_itemModelHandler->setItemModel(itemModel); + dptr()->m_xPosRole = xPosRole; + dptr()->m_yPosRole = yPosRole; + dptr()->m_zPosRole = zPosRole; + connectItemModelHandler(); } /*! @@ -113,50 +155,68 @@ const QAbstractItemModel *QItemModelScatterDataProxy::itemModel() const } /*! - * \property QItemModelScatterDataProxy::activeMapping + * \property QItemModelScatterDataProxy::xPosRole * - * Defines the data mapping. The proxy takes ownership of the \a mapping. - * Modifying a mapping that is set to the proxy will trigger data set re-resolving. + * Defines the X position role for the mapping. */ -void QItemModelScatterDataProxy::setActiveMapping(QItemModelScatterDataMapping *mapping) +void QItemModelScatterDataProxy::setXPosRole(const QString &role) { - dptr()->m_itemModelHandler->setActiveMapping(mapping); + if (dptr()->m_xPosRole != role) { + dptr()->m_xPosRole = role; + emit xPosRoleChanged(role); + } } -QItemModelScatterDataMapping *QItemModelScatterDataProxy::activeMapping() const +QString QItemModelScatterDataProxy::xPosRole() const { - return static_cast<QItemModelScatterDataMapping *>(dptrc()->m_itemModelHandler->activeMapping()); + return dptrc()->m_xPosRole; } /*! - * Transfers the ownership of the \a mapping to this proxy. The mapping is not taken to use yet. - * \sa setActiveMapping(), releaseMapping() + * \property QItemModelScatterDataProxy::yPosRole + * + * Defines the Y position role for the mapping. */ -void QItemModelScatterDataProxy::addMapping(QItemModelScatterDataMapping *mapping) +void QItemModelScatterDataProxy::setYPosRole(const QString &role) { - dptr()->m_itemModelHandler->addMapping(mapping); + if (dptr()->m_yPosRole != role) { + dptr()->m_yPosRole = role; + emit yPosRoleChanged(role); + } +} + +QString QItemModelScatterDataProxy::yPosRole() const +{ + return dptrc()->m_yPosRole; } /*! - * Releases the ownership of the \a mapping back to the caller. If the mapping was the currently - * active one, no mapping remains active after this call. + * \property QItemModelScatterDataProxy::zPosRole + * + * Defines the Z position role for the mapping. */ -void QItemModelScatterDataProxy::releaseMapping(QItemModelScatterDataMapping *mapping) +void QItemModelScatterDataProxy::setZPosRole(const QString &role) { - dptr()->m_itemModelHandler->releaseMapping(mapping); + if (dptr()->m_zPosRole != role) { + dptr()->m_zPosRole = role; + emit zPosRoleChanged(role); + } +} + +QString QItemModelScatterDataProxy::zPosRole() const +{ + return dptrc()->m_zPosRole; } /*! - * \return list of mappings owned by the proxy. + * Changes \a xPosRole, \a yPosRole and \a zPosRole mapping. */ -QList<QItemModelScatterDataMapping *> QItemModelScatterDataProxy::mappings() const +void QItemModelScatterDataProxy::remap(const QString &xPosRole, const QString &yPosRole, + const QString &zPosRole) { - QList<QItemModelScatterDataMapping *> retList; - QList<QAbstractDataMapping *> abstractList = dptrc()->m_itemModelHandler->mappings(); - foreach (QAbstractDataMapping *mapping, abstractList) - retList.append(static_cast<QItemModelScatterDataMapping *>(mapping)); - - return retList; + setXPosRole(xPosRole); + setYPosRole(yPosRole); + setZPosRole(zPosRole); } /*! @@ -175,6 +235,18 @@ const QItemModelScatterDataProxyPrivate *QItemModelScatterDataProxy::dptrc() con return static_cast<const QItemModelScatterDataProxyPrivate *>(d_ptr.data()); } +void QItemModelScatterDataProxy::connectItemModelHandler() +{ + QObject::connect(dptr()->m_itemModelHandler, &ScatterItemModelHandler::itemModelChanged, + this, &QItemModelScatterDataProxy::itemModelChanged); + QObject::connect(this, &QItemModelScatterDataProxy::xPosRoleChanged, + dptr()->m_itemModelHandler, &AbstractItemModelHandler::handleMappingChanged); + QObject::connect(this, &QItemModelScatterDataProxy::yPosRoleChanged, + dptr()->m_itemModelHandler, &AbstractItemModelHandler::handleMappingChanged); + QObject::connect(this, &QItemModelScatterDataProxy::zPosRoleChanged, + dptr()->m_itemModelHandler, &AbstractItemModelHandler::handleMappingChanged); +} + // QItemModelScatterDataProxyPrivate QItemModelScatterDataProxyPrivate::QItemModelScatterDataProxyPrivate(QItemModelScatterDataProxy *q) diff --git a/src/datavisualization/data/qitemmodelscatterdataproxy.h b/src/datavisualization/data/qitemmodelscatterdataproxy.h index 891950c1..7c63ce2a 100644 --- a/src/datavisualization/data/qitemmodelscatterdataproxy.h +++ b/src/datavisualization/data/qitemmodelscatterdataproxy.h @@ -20,7 +20,6 @@ #define QITEMMODELSCATTERDATAPROXY_H #include <QtDataVisualization/qscatterdataproxy.h> -#include <QtDataVisualization/qitemmodelscatterdatamapping.h> #include <QAbstractItemModel> #include <QStringList> @@ -31,30 +30,46 @@ class QItemModelScatterDataProxyPrivate; class QT_DATAVISUALIZATION_EXPORT QItemModelScatterDataProxy : public QScatterDataProxy { Q_OBJECT - Q_PROPERTY(const QAbstractItemModel* itemModel READ itemModel WRITE setItemModel) - Q_PROPERTY(QItemModelScatterDataMapping* activeMapping READ activeMapping WRITE setActiveMapping) + Q_PROPERTY(const QAbstractItemModel* itemModel READ itemModel WRITE setItemModel NOTIFY itemModelChanged) + Q_PROPERTY(QString xPosRole READ xPosRole WRITE setXPosRole NOTIFY xPosRoleChanged) + Q_PROPERTY(QString yPosRole READ yPosRole WRITE setYPosRole NOTIFY yPosRoleChanged) + Q_PROPERTY(QString zPosRole READ zPosRole WRITE setZPosRole NOTIFY zPosRoleChanged) public: - explicit QItemModelScatterDataProxy(); - explicit QItemModelScatterDataProxy(const QAbstractItemModel *itemModel, - QItemModelScatterDataMapping *mapping); + explicit QItemModelScatterDataProxy(QObject *parent = 0); + QItemModelScatterDataProxy(const QAbstractItemModel *itemModel, QObject *parent = 0); + QItemModelScatterDataProxy(const QAbstractItemModel *itemModel, + const QString &xPosRole, const QString &yPosRole, + const QString &zPosRole, QObject *parent = 0); virtual ~QItemModelScatterDataProxy(); void setItemModel(const QAbstractItemModel *itemModel); const QAbstractItemModel *itemModel() const; - void setActiveMapping(QItemModelScatterDataMapping *mapping); - QItemModelScatterDataMapping *activeMapping() const; - void addMapping(QItemModelScatterDataMapping *mapping); - void releaseMapping(QItemModelScatterDataMapping *mapping); - QList<QItemModelScatterDataMapping *> mappings() const; + void setXPosRole(const QString &role); + QString xPosRole() const; + void setYPosRole(const QString &role); + QString yPosRole() const; + void setZPosRole(const QString &role); + QString zPosRole() const; + + void remap(const QString &xPosRole, const QString &yPosRole, const QString &zPosRole); + +signals: + void itemModelChanged(const QAbstractItemModel* itemModel); + void xPosRoleChanged(QString role); + void yPosRoleChanged(QString role); + void zPosRoleChanged(QString role); protected: QItemModelScatterDataProxyPrivate *dptr(); const QItemModelScatterDataProxyPrivate *dptrc() const; private: + void connectItemModelHandler(); Q_DISABLE_COPY(QItemModelScatterDataProxy) + + friend class ScatterItemModelHandler; }; QT_DATAVISUALIZATION_END_NAMESPACE diff --git a/src/datavisualization/data/qitemmodelscatterdataproxy_p.h b/src/datavisualization/data/qitemmodelscatterdataproxy_p.h index 854062a3..43ab0ac2 100644 --- a/src/datavisualization/data/qitemmodelscatterdataproxy_p.h +++ b/src/datavisualization/data/qitemmodelscatterdataproxy_p.h @@ -31,8 +31,6 @@ #include "qitemmodelscatterdataproxy.h" #include "qscatterdataproxy_p.h" -#include <QPointer> -#include <QTimer> QT_DATAVISUALIZATION_BEGIN_NAMESPACE @@ -49,7 +47,11 @@ private: QItemModelScatterDataProxy *qptr(); ScatterItemModelHandler *m_itemModelHandler; + QString m_xPosRole; + QString m_yPosRole; + QString m_zPosRole; + friend class ScatterItemModelHandler; friend class QItemModelScatterDataProxy; }; diff --git a/src/datavisualization/data/qitemmodelsurfacedatamapping.cpp b/src/datavisualization/data/qitemmodelsurfacedatamapping.cpp deleted file mode 100644 index bfe62c6d..00000000 --- a/src/datavisualization/data/qitemmodelsurfacedatamapping.cpp +++ /dev/null @@ -1,411 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2013 Digia Plc -** All rights reserved. -** For any questions to Digia, please use contact form at http://qt.digia.com -** -** This file is part of the QtDataVisualization module. -** -** Licensees holding valid Qt Enterprise licenses may use this file in -** accordance with the Qt Enterprise License Agreement provided with the -** Software or, alternatively, in accordance with the terms contained in -** a written agreement between you and Digia. -** -** If you have questions regarding the use of this file, please use -** contact form at http://qt.digia.com -** -****************************************************************************/ - -#include "qitemmodelsurfacedatamapping_p.h" - -QT_DATAVISUALIZATION_BEGIN_NAMESPACE - -/*! - * \class QItemModelSurfaceDataMapping - * \inmodule QtDataVisualization - * \brief Item model mapping for Q3DSurface. - * \since Qt Data Visualization 1.0 - * - * QItemModelSurfaceDataMapping is used to map roles of QAbstractItemModel to rows, columns, and values - * of Q3DSurface. There are three ways to use QItemModelSurfaceDataMapping: - * - * 1) If useModelCategories property is set to true, QItemModelSurfaceDataMapping will map rows and - * columns of QAbstractItemModel to rows and columns of Q3DSurface, and uses the value returned for - * Qt::DisplayRole as bar value by default. - * The value role to be used can be redefined if Qt::DisplayRole is not suitable. - * - * 2) For models that do not have data already neatly sorted into rows and columns, such as - * QAbstractListModel based models, you can define a role from the model to map for each of row, - * column and value. - * - * 3) If you do not want to include all data contained in the model, or the autogenerated rows and - * columns are not ordered as you wish, you can specify which rows and columns should be included - * and in which order by defining an explicit list of categories for either or both of rows and - * columns. - * - * For example, assume that you have a custom QAbstractItemModel storing surface topography data. - * Each item in the model has the roles "longitude", "latitude", and "height". The item model already - * contains the data properly sorted so that longitudes and latitudes are first encountered in - * correct order, which enables us to utilize the row and column category autogeneration. - * You could do the following to display the data in a surface graph: - * - * \snippet doc_src_qtdatavisualization.cpp 5 - * - * \sa QItemModelSurfaceDataProxy, {Qt Data Visualization Data Handling} - */ - -/*! - * \qmltype SurfaceDataMapping - * \inqmlmodule QtDataVisualization - * \since QtDataVisualization 1.0 - * \ingroup datavisualization_qml - * \instantiates QItemModelSurfaceDataMapping - * \brief Item model mapping for Surface3D. - * - * This type is used to map roles of AbstractItemModel to rows, columns, and values of Surface3D. - * For a more complete description, see QItemModelSurfaceDataMapping. - * - * Usage example: - * - * \snippet doc_src_qmldatavisualization.cpp 6 - * - * \sa ItemModelSurfaceDataProxy, {Qt Data Visualization Data Handling} - */ - -/*! - * \qmlproperty string SurfaceDataMapping::rowRole - * The row role of the mapping. - */ - -/*! - * \qmlproperty string SurfaceDataMapping::columnRole - * The column role of the mapping. - */ - -/*! - * \qmlproperty string SurfaceDataMapping::valueRole - * The value role of the mapping. - */ - -/*! - * \qmlproperty list SurfaceDataMapping::rowCategories - * The row categories of the mapping. Only items with row roles that are found in this list are - * included when data is resolved. The rows are ordered in the same order as they are in this list. - */ - -/*! - * \qmlproperty list SurfaceDataMapping::columnCategories - * The column categories of the mapping. Only items with column roles that are found in this list are - * included when data is resolved. The columns are ordered in the same order as they are in this list. - */ - -/*! - * \qmlproperty list SurfaceDataMapping::useModelCategories - * When set to true, the mapping ignores row and column roles and categories, and uses - * the rows and columns from the model instead. Defaults to false. - */ - -/*! - * \qmlproperty list SurfaceDataMapping::autoRowCategories - * When set to true, the mapping ignores any explicitly set row categories - * and overwrites them with automatically generated ones whenever the - * data from model is resolved. Proxy minimum and maximum row values are also - * autogenerated from data when this is set to true. Defaults to true. - */ - -/*! - * \qmlproperty list SurfaceDataMapping::autoColumnCategories - * When set to true, the mapping ignores any explicitly set column categories - * and overwrites them with automatically generated ones whenever the - * data from model is resolved. Proxy minimum and maximum column values are also - * autogenerated from data when this is set to true. Defaults to true. - */ - -/*! - * Constructs QItemModelSurfaceDataMapping with the given \a parent. - */ -QItemModelSurfaceDataMapping::QItemModelSurfaceDataMapping(QObject *parent) - : QAbstractDataMapping(new QItemModelSurfaceDataMappingPrivate(this), parent) -{ -} - -/*! - * Constructs QItemModelSurfaceDataMapping with \a valueRole and the given \a parent. - * This constructor is meant to be used with models that have data properly sorted - * in rows and columns already, so it also sets useModelCategories property to true. - */ -QItemModelSurfaceDataMapping::QItemModelSurfaceDataMapping(const QString &valueRole, QObject *parent) - : QAbstractDataMapping(new QItemModelSurfaceDataMappingPrivate(this), parent) -{ - dptr()->m_valueRole = valueRole; - dptr()->m_useModelCategories = true; -} - -/*! - * Constructs QItemModelSurfaceDataMapping with \a rowRole, \a columnRole, \a valueRole, - * and the given \a parent. - */ -QItemModelSurfaceDataMapping::QItemModelSurfaceDataMapping(const QString &rowRole, - const QString &columnRole, - const QString &valueRole, - QObject *parent) - : QAbstractDataMapping(new QItemModelSurfaceDataMappingPrivate(this), parent) -{ - dptr()->m_rowRole = rowRole; - dptr()->m_columnRole = columnRole; - dptr()->m_valueRole = valueRole; -} - -/*! - * Constructs QItemModelSurfaceDataMapping with \a rowRole, \a columnRole, \a valueRole, - * \a rowCategories, \a columnCategories, and the given \a parent. This constructor - * also sets autoRowCategories and autoColumnCategories to false. - */ -QItemModelSurfaceDataMapping::QItemModelSurfaceDataMapping(const QString &rowRole, - const QString &columnRole, - const QString &valueRole, - const QStringList &rowCategories, - const QStringList &columnCategories, - QObject *parent) - : QAbstractDataMapping(new QItemModelSurfaceDataMappingPrivate(this), parent) -{ - dptr()->m_rowRole = rowRole; - dptr()->m_columnRole = columnRole; - dptr()->m_valueRole = valueRole; - dptr()->m_rowCategories = rowCategories; - dptr()->m_columnCategories = columnCategories; - dptr()->m_autoRowCategories = false; - dptr()->m_autoColumnCategories = false; -} - -/*! - * Destroys QItemModelSurfaceDataMapping. - */ -QItemModelSurfaceDataMapping::~QItemModelSurfaceDataMapping() -{ -} - -/*! - * \property QItemModelSurfaceDataMapping::rowRole - * - * Defines the row role for the mapping. - */ -void QItemModelSurfaceDataMapping::setRowRole(const QString &role) -{ - if (dptr()->m_rowRole != role) { - dptr()->m_rowRole = role; - emit mappingChanged(); - } -} - -QString QItemModelSurfaceDataMapping::rowRole() const -{ - return dptrc()->m_rowRole; -} - -/*! - * \property QItemModelSurfaceDataMapping::columnRole - * - * Defines the column role for the mapping. - */ -void QItemModelSurfaceDataMapping::setColumnRole(const QString &role) -{ - if (dptr()->m_columnRole != role) { - dptr()->m_columnRole = role; - emit mappingChanged(); - } -} - -QString QItemModelSurfaceDataMapping::columnRole() const -{ - return dptrc()->m_columnRole; -} - -/*! - * \property QItemModelSurfaceDataMapping::valueRole - * - * Defines the value role for the mapping. - */ -void QItemModelSurfaceDataMapping::setValueRole(const QString &role) -{ - if (dptr()->m_valueRole != role) { - dptr()->m_valueRole = role; - emit mappingChanged(); - } -} - -QString QItemModelSurfaceDataMapping::valueRole() const -{ - return dptrc()->m_valueRole; -} - -/*! - * \property QItemModelSurfaceDataMapping::rowCategories - * - * Defines the row categories for the mapping. - */ -void QItemModelSurfaceDataMapping::setRowCategories(const QStringList &categories) -{ - if (dptr()->m_rowCategories != categories) { - dptr()->m_rowCategories = categories; - emit mappingChanged(); - } -} - -QStringList QItemModelSurfaceDataMapping::rowCategories() const -{ - return dptrc()->m_rowCategories; -} - -/*! - * \property QItemModelSurfaceDataMapping::columnCategories - * - * Defines the column categories for the mapping. - */ -void QItemModelSurfaceDataMapping::setColumnCategories(const QStringList &categories) -{ - if (dptr()->m_columnCategories != categories) { - dptr()->m_columnCategories = categories; - emit mappingChanged(); - } -} - -QStringList QItemModelSurfaceDataMapping::columnCategories() const -{ - return dptrc()->m_columnCategories; -} - -/*! - * \property QItemModelSurfaceDataMapping::useModelCategories - * - * When set to true, the mapping ignores row and column roles and categories, and uses - * the rows and columns from the model instead. Defaults to false. - */ -void QItemModelSurfaceDataMapping::setUseModelCategories(bool enable) -{ - if (dptr()->m_useModelCategories != enable) { - dptr()->m_useModelCategories = enable; - emit mappingChanged(); - } -} - -bool QItemModelSurfaceDataMapping::useModelCategories() const -{ - return dptrc()->m_useModelCategories; -} - -/*! - * \property QItemModelSurfaceDataMapping::autoRowCategories - * - * When set to true, the mapping ignores any explicitly set row categories - * and overwrites them with automatically generated ones whenever the - * data from model is resolved. Proxy minimum and maximum row values are also - * autogenerated from data when this is set to true. Defaults to true. - */ -void QItemModelSurfaceDataMapping::setAutoRowCategories(bool enable) -{ - if (dptr()->m_autoRowCategories != enable) { - dptr()->m_autoRowCategories = enable; - emit mappingChanged(); - } -} - -bool QItemModelSurfaceDataMapping::autoRowCategories() const -{ - return dptrc()->m_autoRowCategories; -} - -/*! - * \property QItemModelSurfaceDataMapping::autoColumnCategories - * - * When set to true, the mapping ignores any explicitly set column categories - * and overwrites them with automatically generated ones whenever the - * data from model is resolved. Proxy minimum and maximum column values are also - * autogenerated from data when this is set to true. Defaults to true. - */ -void QItemModelSurfaceDataMapping::setAutoColumnCategories(bool enable) -{ - if (dptr()->m_autoColumnCategories != enable) { - dptr()->m_autoColumnCategories = enable; - emit mappingChanged(); - } -} - -bool QItemModelSurfaceDataMapping::autoColumnCategories() const -{ - return dptrc()->m_autoColumnCategories; -} - -/*! - * Changes \a rowRole, \a columnRole, \a valueRole, \a rowCategories and \a columnCategories to the - * mapping. - */ -void QItemModelSurfaceDataMapping::remap(const QString &rowRole, - const QString &columnRole, - const QString &valueRole, - const QStringList &rowCategories, - const QStringList &columnCategories) -{ - dptr()->m_rowRole = rowRole; - dptr()->m_columnRole = columnRole; - dptr()->m_valueRole = valueRole; - dptr()->m_rowCategories = rowCategories; - dptr()->m_columnCategories = columnCategories; - - emit mappingChanged(); -} - -/*! - * /return index of the specified \a category in row categories list. - * If the row categories list is empty, -1 is returned. - * \note If the automatic row categories generation is in use, this method will - * not return a valid index before the data in the model is resolved for the first time. - */ -int QItemModelSurfaceDataMapping::rowCategoryIndex(const QString &category) -{ - return dptr()->m_rowCategories.indexOf(category); -} - -/*! - * /return index of the specified \a category in column categories list. - * \note If the automatic column categories generation is in use, this method will - * not return a valid index before the data in the model is resolved for the first time. - */ -int QItemModelSurfaceDataMapping::columnCategoryIndex(const QString &category) -{ - return dptr()->m_columnCategories.indexOf(category); -} - -/*! - * \internal - */ -QItemModelSurfaceDataMappingPrivate *QItemModelSurfaceDataMapping::dptr() -{ - return static_cast<QItemModelSurfaceDataMappingPrivate *>(d_ptr.data()); -} - -/*! - * \internal - */ -const QItemModelSurfaceDataMappingPrivate *QItemModelSurfaceDataMapping::dptrc() const -{ - return static_cast<const QItemModelSurfaceDataMappingPrivate *>(d_ptr.data()); -} - -// QItemModelSurfaceDataMappingPrivate - -QItemModelSurfaceDataMappingPrivate::QItemModelSurfaceDataMappingPrivate(QItemModelSurfaceDataMapping *q) - : QAbstractDataMappingPrivate(q, QAbstractDataProxy::DataTypeSurface), - m_useModelCategories(false), - m_autoRowCategories(true), - m_autoColumnCategories(true) -{ -} - -QItemModelSurfaceDataMappingPrivate::~QItemModelSurfaceDataMappingPrivate() -{ -} - - -QT_DATAVISUALIZATION_END_NAMESPACE - diff --git a/src/datavisualization/data/qitemmodelsurfacedatamapping.h b/src/datavisualization/data/qitemmodelsurfacedatamapping.h deleted file mode 100644 index 7e8817bf..00000000 --- a/src/datavisualization/data/qitemmodelsurfacedatamapping.h +++ /dev/null @@ -1,90 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2013 Digia Plc -** All rights reserved. -** For any questions to Digia, please use contact form at http://qt.digia.com -** -** This file is part of the QtDataVisualization module. -** -** Licensees holding valid Qt Enterprise licenses may use this file in -** accordance with the Qt Enterprise License Agreement provided with the -** Software or, alternatively, in accordance with the terms contained in -** a written agreement between you and Digia. -** -** If you have questions regarding the use of this file, please use -** contact form at http://qt.digia.com -** -****************************************************************************/ - -#ifndef QITEMMODELSURFACEDATAMAPPING_H -#define QITEMMODELSURFACEDATAMAPPING_H - -#include <QtDataVisualization/qdatavisualizationenums.h> -#include <QtDataVisualization/qabstractdatamapping.h> -#include <QStringList> - -QT_DATAVISUALIZATION_BEGIN_NAMESPACE - -class QItemModelSurfaceDataMappingPrivate; - -class QT_DATAVISUALIZATION_EXPORT QItemModelSurfaceDataMapping : public QAbstractDataMapping -{ - Q_OBJECT - Q_PROPERTY(QString rowRole READ rowRole WRITE setRowRole) - Q_PROPERTY(QString columnRole READ columnRole WRITE setColumnRole) - Q_PROPERTY(QString valueRole READ valueRole WRITE setValueRole) - Q_PROPERTY(QStringList rowCategories READ rowCategories WRITE setRowCategories) - Q_PROPERTY(QStringList columnCategories READ columnCategories WRITE setColumnCategories) - Q_PROPERTY(bool useModelCategories READ useModelCategories WRITE setUseModelCategories) - Q_PROPERTY(bool autoRowCategories READ autoRowCategories WRITE setAutoRowCategories) - Q_PROPERTY(bool autoColumnCategories READ autoColumnCategories WRITE setAutoColumnCategories) - -public: - explicit QItemModelSurfaceDataMapping(QObject *parent = 0); - QItemModelSurfaceDataMapping(const QString &valueRole, QObject *parent = 0); - QItemModelSurfaceDataMapping(const QString &rowRole, const QString &columnRole, - const QString &valueRole, QObject *parent = 0); - QItemModelSurfaceDataMapping(const QString &rowRole, const QString &columnRole, - const QString &valueRole, const QStringList &rowCategories, - const QStringList &columnCategories, QObject *parent = 0); - virtual ~QItemModelSurfaceDataMapping(); - - void setRowRole(const QString &role); - QString rowRole() const; - void setColumnRole(const QString &role); - QString columnRole() const; - void setValueRole(const QString &role); - QString valueRole() const; - - void setRowCategories(const QStringList &categories); - QStringList rowCategories() const; - void setColumnCategories(const QStringList &categories); - QStringList columnCategories() const; - - void setUseModelCategories(bool enable); - bool useModelCategories() const; - void setAutoRowCategories(bool enable); - bool autoRowCategories() const; - void setAutoColumnCategories(bool enable); - bool autoColumnCategories() const; - - void remap(const QString &rowRole, const QString &columnRole, - const QString &valueRole, const QStringList &rowCategories, - const QStringList &columnCategories); - - Q_INVOKABLE int rowCategoryIndex(const QString& category); - Q_INVOKABLE int columnCategoryIndex(const QString& category); - -protected: - QItemModelSurfaceDataMappingPrivate *dptr(); - const QItemModelSurfaceDataMappingPrivate *dptrc() const; - -private: - Q_DISABLE_COPY(QItemModelSurfaceDataMapping) - - friend class SurfaceItemModelHandler; -}; - -QT_DATAVISUALIZATION_END_NAMESPACE - -#endif diff --git a/src/datavisualization/data/qitemmodelsurfacedatamapping_p.h b/src/datavisualization/data/qitemmodelsurfacedatamapping_p.h deleted file mode 100644 index 9896f868..00000000 --- a/src/datavisualization/data/qitemmodelsurfacedatamapping_p.h +++ /dev/null @@ -1,63 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2013 Digia Plc -** All rights reserved. -** For any questions to Digia, please use contact form at http://qt.digia.com -** -** This file is part of the QtDataVisualization module. -** -** Licensees holding valid Qt Enterprise licenses may use this file in -** accordance with the Qt Enterprise License Agreement provided with the -** Software or, alternatively, in accordance with the terms contained in -** a written agreement between you and Digia. -** -** If you have questions regarding the use of this file, please use -** contact form at http://qt.digia.com -** -****************************************************************************/ - -// -// W A R N I N G -// ------------- -// -// This file is not part of the QtDataVisualization API. It exists purely as an -// implementation detail. This header file may change from version to -// version without notice, or even be removed. -// -// We mean it. - -#include "qitemmodelsurfacedatamapping.h" -#include "qabstractdatamapping_p.h" - -#ifndef QITEMMODELSURFACEDATAMAPPING_P_H -#define QITEMMODELSURFACEDATAMAPPING_P_H - -QT_DATAVISUALIZATION_BEGIN_NAMESPACE - -class QItemModelSurfaceDataMappingPrivate : public QAbstractDataMappingPrivate -{ - Q_OBJECT -public: - QItemModelSurfaceDataMappingPrivate(QItemModelSurfaceDataMapping *q); - virtual ~QItemModelSurfaceDataMappingPrivate(); - -private: - QString m_rowRole; - QString m_columnRole; - QString m_valueRole; - - // For row/column items, sort items into these categories. Other categories are ignored. - QStringList m_rowCategories; - QStringList m_columnCategories; - - bool m_useModelCategories; - bool m_autoRowCategories; - bool m_autoColumnCategories; - - friend class QItemModelSurfaceDataMapping; - friend class SurfaceItemModelHandler; -}; - -QT_DATAVISUALIZATION_END_NAMESPACE - -#endif diff --git a/src/datavisualization/data/qitemmodelsurfacedataproxy.cpp b/src/datavisualization/data/qitemmodelsurfacedataproxy.cpp index 75032930..920878d5 100644 --- a/src/datavisualization/data/qitemmodelsurfacedataproxy.cpp +++ b/src/datavisualization/data/qitemmodelsurfacedataproxy.cpp @@ -31,11 +31,36 @@ QT_DATAVISUALIZATION_BEGIN_NAMESPACE * \since Qt Data Visualization 1.0 * * QItemModelSurfaceDataProxy allows you to use QAbstractItemModel derived models as a data source - * for Q3DSurface. It maps roles defined in QItemModelSurfaceDataMapping to roles in the model. + * for Q3DSurface. It uses the defined mappings to map data from the model to rows, columns, and + * values of Q3DSurface graph. * * Data is resolved asynchronously whenever the mapping or the model changes. * QSurfaceDataProxy::arrayReset() is emitted when the data has been resolved. * + * There are three ways to use mappings: + * + * 1) If useModelCategories property is set to true, this proxy will map rows and + * columns of QAbstractItemModel to rows and columns of Q3DSurface, and uses the value returned for + * Qt::DisplayRole as bar value by default. + * The value role to be used can be redefined if Qt::DisplayRole is not suitable. + * + * 2) For models that do not have data already neatly sorted into rows and columns, such as + * QAbstractListModel based models, you can define a role from the model to map for each of row, + * column and value. + * + * 3) If you do not want to include all data contained in the model, or the autogenerated rows and + * columns are not ordered as you wish, you can specify which rows and columns should be included + * and in which order by defining an explicit list of categories for either or both of rows and + * columns. + * + * For example, assume that you have a custom QAbstractItemModel storing surface topography data. + * Each item in the model has the roles "longitude", "latitude", and "height". The item model already + * contains the data properly sorted so that longitudes and latitudes are first encountered in + * correct order, which enables us to utilize the row and column category autogeneration. + * You could do the following to display the data in a surface graph: + * + * \snippet doc_src_qtdatavisualization.cpp 5 + * * \sa {Qt Data Visualization Data Handling} */ @@ -53,11 +78,13 @@ QT_DATAVISUALIZATION_BEGIN_NAMESPACE * Data is resolved asynchronously whenever the mapping or the model changes. * QSurfaceDataProxy::arrayReset() is emitted when the data has been resolved. * + * For more details, see QItemModelSurfaceDataProxy documentation. + * * Usage example: * * \snippet doc_src_qmldatavisualization.cpp 9 * - * \sa SurfaceDataProxy, SurfaceDataMapping, {Qt Data Visualization Data Handling} + * \sa SurfaceDataProxy, {Qt Data Visualization Data Handling} */ /*! @@ -66,29 +93,140 @@ QT_DATAVISUALIZATION_BEGIN_NAMESPACE */ /*! - * \qmlproperty list ItemModelSurfaceDataProxy::activeMapping - * The active mapping. Modifying a mapping that is set to the proxy will trigger data set - * re-resolving. + * \qmlproperty string ItemModelSurfaceDataProxy::rowRole + * The row role of the mapping. + * In addition to defining which row the data belongs to, the value indicated by row role + * is also set as the Z-coordinate value of the QSurfaceDataItem when model data is resolved. */ /*! - * Constructs QItemModelSurfaceDataProxy. + * \qmlproperty string ItemModelSurfaceDataProxy::columnRole + * The column role of the mapping. + * In addition to defining which column the data belongs to, the value indicated by column role + * is also set as the X-coordinate value of the QSurfaceDataItem when model data is resolved. */ -QItemModelSurfaceDataProxy::QItemModelSurfaceDataProxy() : - QSurfaceDataProxy(new QItemModelSurfaceDataProxyPrivate(this)) + +/*! + * \qmlproperty string ItemModelSurfaceDataProxy::valueRole + * The value role of the mapping. + * The value indicated by value role is set as Y-coodrinate value of the + * QSurfaceDataItem when model data is resolved. + */ + +/*! + * \qmlproperty list ItemModelSurfaceDataProxy::rowCategories + * The row categories of the mapping. Only items with row roles that are found in this list are + * included when data is resolved. The rows are ordered in the same order as they are in this list. + */ + +/*! + * \qmlproperty list ItemModelSurfaceDataProxy::columnCategories + * The column categories of the mapping. Only items with column roles that are found in this list are + * included when data is resolved. The columns are ordered in the same order as they are in this list. + */ + +/*! + * \qmlproperty list ItemModelSurfaceDataProxy::useModelCategories + * When set to true, the mapping ignores row and column roles and categories, and uses + * the rows and columns from the model instead. Defaults to false. + */ + +/*! + * \qmlproperty list ItemModelSurfaceDataProxy::autoRowCategories + * When set to true, the mapping ignores any explicitly set row categories + * and overwrites them with automatically generated ones whenever the + * data from model is resolved. Proxy minimum and maximum row values are also + * autogenerated from data when this is set to true. Defaults to true. + */ + +/*! + * \qmlproperty list ItemModelSurfaceDataProxy::autoColumnCategories + * When set to true, the mapping ignores any explicitly set column categories + * and overwrites them with automatically generated ones whenever the + * data from model is resolved. Proxy minimum and maximum column values are also + * autogenerated from data when this is set to true. Defaults to true. + */ + +/*! + * Constructs QItemModelSurfaceDataProxy with optional \a parent. + */ +QItemModelSurfaceDataProxy::QItemModelSurfaceDataProxy(QObject *parent) + : QSurfaceDataProxy(new QItemModelSurfaceDataProxyPrivate(this), parent) { + connectItemModelHandler(); } /*! - * Constructs QItemModelSurfaceDataProxy with \a itemModel and \a mapping. Does not take ownership - * of the model or the mapping, but does connect to them to listen for changes. + * Constructs QItemModelSurfaceDataProxy with \a itemModel and optional \a parent. Proxy doesn't take + * ownership of the \a itemModel, as typically item models are owned by other controls. + */ +QItemModelSurfaceDataProxy::QItemModelSurfaceDataProxy(const QAbstractItemModel *itemModel, QObject *parent) + : QSurfaceDataProxy(new QItemModelSurfaceDataProxyPrivate(this), parent) +{ + dptr()->m_itemModelHandler->setItemModel(itemModel); + connectItemModelHandler(); +} + +/*! + * Constructs QItemModelSurfaceDataProxy with \a itemModel and optional \a parent. Proxy doesn't take + * ownership of the \a itemModel, as typically item models are owned by other controls. + * The value role is set to \a valueRole. + * This constructor is meant to be used with models that have data properly sorted + * in rows and columns already, so it also sets useModelCategories property to true. + */ +QItemModelSurfaceDataProxy::QItemModelSurfaceDataProxy(const QAbstractItemModel *itemModel, + const QString &valueRole, QObject *parent) + : QSurfaceDataProxy(new QItemModelSurfaceDataProxyPrivate(this), parent) +{ + dptr()->m_itemModelHandler->setItemModel(itemModel); + dptr()->m_valueRole = valueRole; + dptr()->m_useModelCategories = true; + connectItemModelHandler(); +} + +/*! + * Constructs QItemModelSurfaceDataProxy with \a itemModel and optional \a parent. Proxy doesn't take + * ownership of the \a itemModel, as typically item models are owned by other controls. + * The role mappings are set with \a rowRole, \a columnRole, and \a valueRole. + */ +QItemModelSurfaceDataProxy::QItemModelSurfaceDataProxy(const QAbstractItemModel *itemModel, + const QString &rowRole, + const QString &columnRole, + const QString &valueRole, QObject *parent) + : QSurfaceDataProxy(new QItemModelSurfaceDataProxyPrivate(this), parent) +{ + dptr()->m_itemModelHandler->setItemModel(itemModel); + dptr()->m_rowRole = rowRole; + dptr()->m_columnRole = columnRole; + dptr()->m_valueRole = valueRole; + connectItemModelHandler(); +} + +/*! + * Constructs QItemModelSurfaceDataProxy with \a itemModel and optional \a parent. Proxy doesn't take + * ownership of the \a itemModel, as typically item models are owned by other controls. + * The role mappings are set with \a rowRole, \a columnRole, and \a valueRole. + * Row and column categories are set with \a rowCategories and \a columnCategories. + * This constructor also sets autoRowCategories and autoColumnCategories to false. */ QItemModelSurfaceDataProxy::QItemModelSurfaceDataProxy(const QAbstractItemModel *itemModel, - QItemModelSurfaceDataMapping *mapping) : - QSurfaceDataProxy(new QItemModelSurfaceDataProxyPrivate(this)) + const QString &rowRole, + const QString &columnRole, + const QString &valueRole, + const QStringList &rowCategories, + const QStringList &columnCategories, + QObject *parent) + : QSurfaceDataProxy(new QItemModelSurfaceDataProxyPrivate(this), parent) { dptr()->m_itemModelHandler->setItemModel(itemModel); - dptr()->m_itemModelHandler->setActiveMapping(mapping); + dptr()->m_rowRole = rowRole; + dptr()->m_columnRole = columnRole; + dptr()->m_valueRole = valueRole; + dptr()->m_rowCategories = rowCategories; + dptr()->m_columnCategories = columnCategories; + dptr()->m_autoRowCategories = false; + dptr()->m_autoColumnCategories = false; + connectItemModelHandler(); } /*! @@ -115,50 +253,191 @@ const QAbstractItemModel *QItemModelSurfaceDataProxy::itemModel() const } /*! - * \property QItemModelSurfaceDataProxy::activeMapping + * \property QItemModelSurfaceDataProxy::rowRole * - * Defines data mapping. Proxy takes ownership of the \a mapping. - * Modifying a mapping that is set to the proxy will trigger data set re-resolving. + * Defines the row role for the mapping. */ -void QItemModelSurfaceDataProxy::setActiveMapping(QItemModelSurfaceDataMapping *mapping) +void QItemModelSurfaceDataProxy::setRowRole(const QString &role) { - dptr()->m_itemModelHandler->setActiveMapping(mapping); + if (dptr()->m_rowRole != role) { + dptr()->m_rowRole = role; + emit rowRoleChanged(role); + } } -QItemModelSurfaceDataMapping *QItemModelSurfaceDataProxy::activeMapping() const +QString QItemModelSurfaceDataProxy::rowRole() const { - return static_cast<QItemModelSurfaceDataMapping *>(dptrc()->m_itemModelHandler->activeMapping()); + return dptrc()->m_rowRole; } /*! - * Transfers the ownership of the \a mapping to this proxy. The mapping is not taken to use yet. - * \sa setActiveMapping(), releaseMapping() + * \property QItemModelSurfaceDataProxy::columnRole + * + * Defines the column role for the mapping. */ -void QItemModelSurfaceDataProxy::addMapping(QItemModelSurfaceDataMapping *mapping) +void QItemModelSurfaceDataProxy::setColumnRole(const QString &role) +{ + if (dptr()->m_columnRole != role) { + dptr()->m_columnRole = role; + emit columnRoleChanged(role); + } +} + +QString QItemModelSurfaceDataProxy::columnRole() const { - dptr()->m_itemModelHandler->addMapping(mapping); + return dptrc()->m_columnRole; } /*! - * Releases the ownership of the \a mapping back to the caller. If the mapping was the currently - * active one, no mapping remains active after this call. + * \property QItemModelSurfaceDataProxy::valueRole + * + * Defines the value role for the mapping. */ -void QItemModelSurfaceDataProxy::releaseMapping(QItemModelSurfaceDataMapping *mapping) +void QItemModelSurfaceDataProxy::setValueRole(const QString &role) { - dptr()->m_itemModelHandler->releaseMapping(mapping); + if (dptr()->m_valueRole != role) { + dptr()->m_valueRole = role; + emit valueRoleChanged(role); + } +} + +QString QItemModelSurfaceDataProxy::valueRole() const +{ + return dptrc()->m_valueRole; } /*! - * \return list of mappings owned by the proxy. + * \property QItemModelSurfaceDataProxy::rowCategories + * + * Defines the row categories for the mapping. */ -QList<QItemModelSurfaceDataMapping *> QItemModelSurfaceDataProxy::mappings() const +void QItemModelSurfaceDataProxy::setRowCategories(const QStringList &categories) { - QList<QItemModelSurfaceDataMapping *> retList; - QList<QAbstractDataMapping *> abstractList = dptrc()->m_itemModelHandler->mappings(); - foreach (QAbstractDataMapping *mapping, abstractList) - retList.append(static_cast<QItemModelSurfaceDataMapping *>(mapping)); + if (dptr()->m_rowCategories != categories) { + dptr()->m_rowCategories = categories; + emit rowCategoriesChanged(categories); + } +} + +QStringList QItemModelSurfaceDataProxy::rowCategories() const +{ + return dptrc()->m_rowCategories; +} + +/*! + * \property QItemModelSurfaceDataProxy::columnCategories + * + * Defines the column categories for the mapping. + */ +void QItemModelSurfaceDataProxy::setColumnCategories(const QStringList &categories) +{ + if (dptr()->m_columnCategories != categories) { + dptr()->m_columnCategories = categories; + emit columnCategoriesChanged(categories); + } +} + +QStringList QItemModelSurfaceDataProxy::columnCategories() const +{ + return dptrc()->m_columnCategories; +} + +/*! + * \property QItemModelSurfaceDataProxy::useModelCategories + * + * When set to true, the mapping ignores row and column roles and categories, and uses + * the rows and columns from the model instead. Defaults to false. + */ +void QItemModelSurfaceDataProxy::setUseModelCategories(bool enable) +{ + if (dptr()->m_useModelCategories != enable) { + dptr()->m_useModelCategories = enable; + emit useModelCategoriesChanged(enable); + } +} + +bool QItemModelSurfaceDataProxy::useModelCategories() const +{ + return dptrc()->m_useModelCategories; +} + +/*! + * \property QItemModelSurfaceDataProxy::autoRowCategories + * + * When set to true, the mapping ignores any explicitly set row categories + * and overwrites them with automatically generated ones whenever the + * data from model is resolved. Defaults to true. + */ +void QItemModelSurfaceDataProxy::setAutoRowCategories(bool enable) +{ + if (dptr()->m_autoRowCategories != enable) { + dptr()->m_autoRowCategories = enable; + emit autoRowCategoriesChanged(enable); + } +} - return retList; +bool QItemModelSurfaceDataProxy::autoRowCategories() const +{ + return dptrc()->m_autoRowCategories; +} + +/*! + * \property QItemModelSurfaceDataProxy::autoColumnCategories + * + * When set to true, the mapping ignores any explicitly set column categories + * and overwrites them with automatically generated ones whenever the + * data from model is resolved. Defaults to true. + */ +void QItemModelSurfaceDataProxy::setAutoColumnCategories(bool enable) +{ + if (dptr()->m_autoColumnCategories != enable) { + dptr()->m_autoColumnCategories = enable; + emit autoColumnCategoriesChanged(enable); + } +} + +bool QItemModelSurfaceDataProxy::autoColumnCategories() const +{ + return dptrc()->m_autoColumnCategories; +} + +/*! + * Changes \a rowRole, \a columnRole, \a valueRole, \a rowCategories and \a columnCategories to the + * mapping. + */ +void QItemModelSurfaceDataProxy::remap(const QString &rowRole, + const QString &columnRole, + const QString &valueRole, + const QStringList &rowCategories, + const QStringList &columnCategories) +{ + setRowRole(rowRole); + setColumnRole(columnRole); + setValueRole(valueRole); + setRowCategories(rowCategories); + setColumnCategories(columnCategories); +} + +/*! + * /return index of the specified \a category in row categories list. + * If the row categories list is empty, -1 is returned. + * \note If the automatic row categories generation is in use, this method will + * not return a valid index before the data in the model is resolved for the first time. + */ +int QItemModelSurfaceDataProxy::rowCategoryIndex(const QString &category) +{ + return dptr()->m_rowCategories.indexOf(category); +} + +/*! + * /return index of the specified \a category in column categories list. + * If the category is not found, -1 is returned. + * \note If the automatic column categories generation is in use, this method will + * not return a valid index before the data in the model is resolved for the first time. + */ +int QItemModelSurfaceDataProxy::columnCategoryIndex(const QString &category) +{ + return dptr()->m_columnCategories.indexOf(category); } /*! @@ -177,11 +456,36 @@ const QItemModelSurfaceDataProxyPrivate *QItemModelSurfaceDataProxy::dptrc() con return static_cast<const QItemModelSurfaceDataProxyPrivate *>(d_ptr.data()); } +void QItemModelSurfaceDataProxy::connectItemModelHandler() +{ + QObject::connect(dptr()->m_itemModelHandler, &SurfaceItemModelHandler::itemModelChanged, + this, &QItemModelSurfaceDataProxy::itemModelChanged); + QObject::connect(this, &QItemModelSurfaceDataProxy::rowRoleChanged, + dptr()->m_itemModelHandler, &AbstractItemModelHandler::handleMappingChanged); + QObject::connect(this, &QItemModelSurfaceDataProxy::columnRoleChanged, + dptr()->m_itemModelHandler, &AbstractItemModelHandler::handleMappingChanged); + QObject::connect(this, &QItemModelSurfaceDataProxy::valueRoleChanged, + dptr()->m_itemModelHandler, &AbstractItemModelHandler::handleMappingChanged); + QObject::connect(this, &QItemModelSurfaceDataProxy::rowCategoriesChanged, + dptr()->m_itemModelHandler, &AbstractItemModelHandler::handleMappingChanged); + QObject::connect(this, &QItemModelSurfaceDataProxy::columnCategoriesChanged, + dptr()->m_itemModelHandler, &AbstractItemModelHandler::handleMappingChanged); + QObject::connect(this, &QItemModelSurfaceDataProxy::useModelCategoriesChanged, + dptr()->m_itemModelHandler, &AbstractItemModelHandler::handleMappingChanged); + QObject::connect(this, &QItemModelSurfaceDataProxy::autoRowCategoriesChanged, + dptr()->m_itemModelHandler, &AbstractItemModelHandler::handleMappingChanged); + QObject::connect(this, &QItemModelSurfaceDataProxy::autoColumnCategoriesChanged, + dptr()->m_itemModelHandler, &AbstractItemModelHandler::handleMappingChanged); +} + // QItemModelSurfaceDataProxyPrivate QItemModelSurfaceDataProxyPrivate::QItemModelSurfaceDataProxyPrivate(QItemModelSurfaceDataProxy *q) : QSurfaceDataProxyPrivate(q), - m_itemModelHandler(new SurfaceItemModelHandler(q)) + m_itemModelHandler(new SurfaceItemModelHandler(q)), + m_useModelCategories(false), + m_autoRowCategories(true), + m_autoColumnCategories(true) { } diff --git a/src/datavisualization/data/qitemmodelsurfacedataproxy.h b/src/datavisualization/data/qitemmodelsurfacedataproxy.h index 080bf54b..843fa3af 100644 --- a/src/datavisualization/data/qitemmodelsurfacedataproxy.h +++ b/src/datavisualization/data/qitemmodelsurfacedataproxy.h @@ -20,7 +20,6 @@ #define QITEMMODELSURFACEDATAPROXY_H #include <QtDataVisualization/qsurfacedataproxy.h> -#include <QtDataVisualization/qitemmodelsurfacedatamapping.h> #include <QAbstractItemModel> #include <QStringList> @@ -31,30 +30,79 @@ class QItemModelSurfaceDataProxyPrivate; class QT_DATAVISUALIZATION_EXPORT QItemModelSurfaceDataProxy : public QSurfaceDataProxy { Q_OBJECT - Q_PROPERTY(const QAbstractItemModel* itemModel READ itemModel WRITE setItemModel) - Q_PROPERTY(QItemModelSurfaceDataMapping* activeMapping READ activeMapping WRITE setActiveMapping) + Q_PROPERTY(const QAbstractItemModel* itemModel READ itemModel WRITE setItemModel NOTIFY itemModelChanged) + Q_PROPERTY(QString rowRole READ rowRole WRITE setRowRole NOTIFY rowRoleChanged) + Q_PROPERTY(QString columnRole READ columnRole WRITE setColumnRole NOTIFY columnRoleChanged) + Q_PROPERTY(QString valueRole READ valueRole WRITE setValueRole NOTIFY valueRoleChanged) + Q_PROPERTY(QStringList rowCategories READ rowCategories WRITE setRowCategories NOTIFY rowCategoriesChanged) + Q_PROPERTY(QStringList columnCategories READ columnCategories WRITE setColumnCategories NOTIFY columnCategoriesChanged) + Q_PROPERTY(bool useModelCategories READ useModelCategories WRITE setUseModelCategories NOTIFY useModelCategoriesChanged) + Q_PROPERTY(bool autoRowCategories READ autoRowCategories WRITE setAutoRowCategories NOTIFY autoRowCategoriesChanged) + Q_PROPERTY(bool autoColumnCategories READ autoColumnCategories WRITE setAutoColumnCategories NOTIFY autoColumnCategoriesChanged) public: - explicit QItemModelSurfaceDataProxy(); - explicit QItemModelSurfaceDataProxy(const QAbstractItemModel *itemModel, - QItemModelSurfaceDataMapping *mapping); + explicit QItemModelSurfaceDataProxy(QObject *parent = 0); + QItemModelSurfaceDataProxy(const QAbstractItemModel *itemModel, QObject *parent = 0); + QItemModelSurfaceDataProxy(const QAbstractItemModel *itemModel, const QString &valueRole, + QObject *parent = 0); + QItemModelSurfaceDataProxy(const QAbstractItemModel *itemModel, const QString &rowRole, + const QString &columnRole, const QString &valueRole, + QObject *parent = 0); + QItemModelSurfaceDataProxy(const QAbstractItemModel *itemModel, const QString &rowRole, + const QString &columnRole, const QString &valueRole, + const QStringList &rowCategories, const QStringList &columnCategories, + QObject *parent = 0); virtual ~QItemModelSurfaceDataProxy(); void setItemModel(const QAbstractItemModel *itemModel); const QAbstractItemModel *itemModel() const; - void setActiveMapping(QItemModelSurfaceDataMapping *mapping); - QItemModelSurfaceDataMapping *activeMapping() const; - void addMapping(QItemModelSurfaceDataMapping *mapping); - void releaseMapping(QItemModelSurfaceDataMapping *mapping); - QList<QItemModelSurfaceDataMapping *> mappings() const; + void setRowRole(const QString &role); + QString rowRole() const; + void setColumnRole(const QString &role); + QString columnRole() const; + void setValueRole(const QString &role); + QString valueRole() const; + + void setRowCategories(const QStringList &categories); + QStringList rowCategories() const; + void setColumnCategories(const QStringList &categories); + QStringList columnCategories() const; + + void setUseModelCategories(bool enable); + bool useModelCategories() const; + void setAutoRowCategories(bool enable); + bool autoRowCategories() const; + void setAutoColumnCategories(bool enable); + bool autoColumnCategories() const; + + void remap(const QString &rowRole, const QString &columnRole, + const QString &valueRole, const QStringList &rowCategories, + const QStringList &columnCategories); + + Q_INVOKABLE int rowCategoryIndex(const QString& category); + Q_INVOKABLE int columnCategoryIndex(const QString& category); + +signals: + void itemModelChanged(const QAbstractItemModel* itemModel); + void rowRoleChanged(QString role); + void columnRoleChanged(QString role); + void valueRoleChanged(QString role); + void rowCategoriesChanged(QStringList categories); + void columnCategoriesChanged(QStringList categories); + void useModelCategoriesChanged(bool enable); + void autoRowCategoriesChanged(bool enable); + void autoColumnCategoriesChanged(bool enable); protected: QItemModelSurfaceDataProxyPrivate *dptr(); const QItemModelSurfaceDataProxyPrivate *dptrc() const; private: + void connectItemModelHandler(); Q_DISABLE_COPY(QItemModelSurfaceDataProxy) + + friend class SurfaceItemModelHandler; }; QT_DATAVISUALIZATION_END_NAMESPACE diff --git a/src/datavisualization/data/qitemmodelsurfacedataproxy_p.h b/src/datavisualization/data/qitemmodelsurfacedataproxy_p.h index ff9d13de..9af8d3ae 100644 --- a/src/datavisualization/data/qitemmodelsurfacedataproxy_p.h +++ b/src/datavisualization/data/qitemmodelsurfacedataproxy_p.h @@ -31,8 +31,6 @@ #include "qitemmodelsurfacedataproxy.h" #include "qsurfacedataproxy_p.h" -#include <QPointer> -#include <QTimer> QT_DATAVISUALIZATION_BEGIN_NAMESPACE @@ -50,6 +48,19 @@ private: SurfaceItemModelHandler *m_itemModelHandler; + QString m_rowRole; + QString m_columnRole; + QString m_valueRole; + + // For row/column items, sort items into these categories. Other categories are ignored. + QStringList m_rowCategories; + QStringList m_columnCategories; + + bool m_useModelCategories; + bool m_autoRowCategories; + bool m_autoColumnCategories; + + friend class SurfaceItemModelHandler; friend class QItemModelSurfaceDataProxy; }; diff --git a/src/datavisualization/data/scatteritemmodelhandler.cpp b/src/datavisualization/data/scatteritemmodelhandler.cpp index 34230ae0..a70b35b0 100644 --- a/src/datavisualization/data/scatteritemmodelhandler.cpp +++ b/src/datavisualization/data/scatteritemmodelhandler.cpp @@ -35,8 +35,7 @@ ScatterItemModelHandler::~ScatterItemModelHandler() // Resolve entire item model into QScatterDataArray. void ScatterItemModelHandler::resolveModel() { - QItemModelScatterDataMapping *mapping = static_cast<QItemModelScatterDataMapping *>(m_activeMapping); - if (m_itemModel.isNull() || !mapping) { + if (m_itemModel.isNull()) { m_proxy->resetArray(0); m_proxyArray = 0; return; @@ -45,9 +44,9 @@ void ScatterItemModelHandler::resolveModel() static const int noRoleIndex = -1; QHash<int, QByteArray> roleHash = m_itemModel->roleNames(); - const int xPosRole = roleHash.key(mapping->xPosRole().toLatin1(), noRoleIndex); - const int yPosRole = roleHash.key(mapping->yPosRole().toLatin1(), noRoleIndex); - const int zPosRole = roleHash.key(mapping->zPosRole().toLatin1(), noRoleIndex); + const int xPosRole = roleHash.key(m_proxy->xPosRole().toLatin1(), noRoleIndex); + const int yPosRole = roleHash.key(m_proxy->yPosRole().toLatin1(), noRoleIndex); + const int zPosRole = roleHash.key(m_proxy->zPosRole().toLatin1(), noRoleIndex); const int columnCount = m_itemModel->columnCount(); const int rowCount = m_itemModel->rowCount(); const int totalCount = rowCount * columnCount; diff --git a/src/datavisualization/data/scatteritemmodelhandler_p.h b/src/datavisualization/data/scatteritemmodelhandler_p.h index 9b8a19a2..72f8f76c 100644 --- a/src/datavisualization/data/scatteritemmodelhandler_p.h +++ b/src/datavisualization/data/scatteritemmodelhandler_p.h @@ -30,7 +30,7 @@ #define SCATTERITEMMODELHANDLER_P_H #include "abstractitemmodelhandler_p.h" -#include "qitemmodelscatterdataproxy.h" +#include "qitemmodelscatterdataproxy_p.h" QT_DATAVISUALIZATION_BEGIN_NAMESPACE diff --git a/src/datavisualization/data/surfaceitemmodelhandler.cpp b/src/datavisualization/data/surfaceitemmodelhandler.cpp index e602dedc..10b4ccc5 100644 --- a/src/datavisualization/data/surfaceitemmodelhandler.cpp +++ b/src/datavisualization/data/surfaceitemmodelhandler.cpp @@ -17,7 +17,6 @@ ****************************************************************************/ #include "surfaceitemmodelhandler_p.h" -#include "qitemmodelsurfacedatamapping_p.h" QT_DATAVISUALIZATION_BEGIN_NAMESPACE @@ -35,15 +34,14 @@ SurfaceItemModelHandler::~SurfaceItemModelHandler() // Resolve entire item model into QSurfaceDataArray. void SurfaceItemModelHandler::resolveModel() { - QItemModelSurfaceDataMapping *mapping = static_cast<QItemModelSurfaceDataMapping *>(m_activeMapping); - if (m_itemModel.isNull() || !mapping) { + if (m_itemModel.isNull()) { m_proxy->resetArray(0); m_proxyArray = 0; return; } - if (!mapping->useModelCategories() - && (mapping->rowRole().isEmpty() || mapping->columnRole().isEmpty())) { + if (!m_proxy->useModelCategories() + && (m_proxy->rowRole().isEmpty() || m_proxy->columnRole().isEmpty())) { m_proxy->resetArray(0); m_proxyArray = 0; return; @@ -52,11 +50,11 @@ void SurfaceItemModelHandler::resolveModel() QHash<int, QByteArray> roleHash = m_itemModel->roleNames(); // Default to display role if no mapping - int valueRole = roleHash.key(mapping->valueRole().toLatin1(), Qt::DisplayRole); + int valueRole = roleHash.key(m_proxy->valueRole().toLatin1(), Qt::DisplayRole); int rowCount = m_itemModel->rowCount(); int columnCount = m_itemModel->columnCount(); - if (mapping->useModelCategories()) { + if (m_proxy->useModelCategories()) { // If dimensions have changed, recreate the array if (m_proxyArray != m_proxy->array() || columnCount != m_proxy->columnCount() || rowCount != m_proxyArray->size()) { @@ -75,11 +73,11 @@ void SurfaceItemModelHandler::resolveModel() } } } else { - int rowRole = roleHash.key(mapping->rowRole().toLatin1()); - int columnRole = roleHash.key(mapping->columnRole().toLatin1()); + int rowRole = roleHash.key(m_proxy->rowRole().toLatin1()); + int columnRole = roleHash.key(m_proxy->columnRole().toLatin1()); - bool generateRows = mapping->autoRowCategories(); - bool generateColumns = mapping->autoColumnCategories(); + bool generateRows = m_proxy->autoRowCategories(); + bool generateColumns = m_proxy->autoColumnCategories(); QStringList rowList; QStringList columnList; @@ -109,14 +107,14 @@ void SurfaceItemModelHandler::resolveModel() } if (generateRows) - mapping->dptr()->m_rowCategories = rowList; + m_proxy->dptr()->m_rowCategories = rowList; else - rowList = mapping->rowCategories(); + rowList = m_proxy->rowCategories(); if (generateColumns) - mapping->dptr()->m_columnCategories = columnList; + m_proxy->dptr()->m_columnCategories = columnList; else - columnList = mapping->columnCategories(); + columnList = m_proxy->columnCategories(); // If dimensions have changed, recreate the array if (m_proxyArray != m_proxy->array() || columnList.size() != m_proxy->columnCount() diff --git a/src/datavisualization/data/surfaceitemmodelhandler_p.h b/src/datavisualization/data/surfaceitemmodelhandler_p.h index bcf642c5..de0d2885 100644 --- a/src/datavisualization/data/surfaceitemmodelhandler_p.h +++ b/src/datavisualization/data/surfaceitemmodelhandler_p.h @@ -30,7 +30,7 @@ #define SURFACEITEMMODELHANDLER_P_H #include "abstractitemmodelhandler_p.h" -#include "qitemmodelsurfacedataproxy.h" +#include "qitemmodelsurfacedataproxy_p.h" QT_DATAVISUALIZATION_BEGIN_NAMESPACE diff --git a/src/datavisualization/doc/snippets/doc_src_qmldatavisualization.cpp b/src/datavisualization/doc/snippets/doc_src_qmldatavisualization.cpp index 204e1cee..03f6e847 100644 --- a/src/datavisualization/doc/snippets/doc_src_qmldatavisualization.cpp +++ b/src/datavisualization/doc/snippets/doc_src_qmldatavisualization.cpp @@ -24,17 +24,27 @@ import QtDataVisualization 1.0 Bars3D { rows: 4 columns: 4 - dataProxy: barProxy // an ItemModelBarDataProxy barSpacing: Qt.size(0.5, 0.5) barSpacingRelative: false - itemLabelFormat: "@valueTitle for @colLabel, @rowLabel: @valueLabel" + + Bar3DSeries { + itemLabelFormat: "@valueTitle for @colLabel, @rowLabel: @valueLabel" + + ItemModelBarDataProxy { + itemModel: model // E.g. a list model defined elsewhere containing monthly expenses data. + // Mapping model roles to bar series rows, columns, and values. + rowRole: "year" + columnRole: "city" + valueRole: "expenses" + rowCategories: ["2010", "2011", "2012", "2013"] + columnCategories: ["Oulu", "Rauma", "Helsinki", "Tampere"] + } + } } //! [1] //! [2] Scatter3D { - dataProxy: scatterProxy // an ItemModelScatterDataProxy - itemLabelFormat: "X:@xLabel Y:@yLabel Z:@zLabel" axisX.segmentCount: 2 axisX.subSegmentCount: 2 axisX.labelFormat: "%.2f" @@ -44,12 +54,23 @@ Scatter3D { axisY.segmentCount: 3 axisY.subSegmentCount: 2 axisY.labelFormat: "%.2f" + + Scatter3DSeries { + itemLabelFormat: "X:@xLabel Y:@yLabel Z:@zLabel" + + ItemModelScatterDataProxy { + itemModel: model // E.g. a list model defined elsewhere containing point coordinates. + // Mapping model roles to scatter series item coordinates. + xPosRole: "xPos" + yPosRole: "yPos" + zPosRole: "zPos" + } + } } //! [2] //! [3] Surface3D { - dataProxy: surfaceProxy // an ItemModelSurfaceDataProxy axisX.min: 0.0 axisX.max: 10.0 axisZ.min: 0.0 @@ -64,58 +85,47 @@ Surface3D { axisZ.labelFormat: "%i" axisY.segmentCount: 5 axisY.labelFormat: "%.1f" + + Surface3DSeries { + ItemModelSurfaceDataProxy { + itemModel: model // E.g. a list model defined elsewhere containing population data. + // Mapping model roles to surface series rows, columns, and values. + rowRole: "longitude" + columnRole: "latitude" + valueRole: "pop_density" + } + } } //! [3] -//! [4] -BarDataMapping { - id: barMapping +//! [7] +ItemModelBarDataProxy { + itemModel: model // E.g. a list model defined elsewhere containing monthly expenses data. + // Mapping model roles to bar series rows, columns, and values. rowRole: "year" columnRole: "city" valueRole: "expenses" rowCategories: ["2010", "2011", "2012", "2013"] columnCategories: ["Oulu", "Rauma", "Helsinki", "Tampere"] } -//! [4] - -//! [5] -ScatterDataMapping { - id: scatterMapping - xPosRole: "xPos" - yPosRole: "yPos" - zPosRole: "zPos" -} -//! [5] - -//! [6] -SurfaceDataMapping { - id: surfaceMapping - rowRole: "latitude" - columnRole: "longitude" - valueRole: "population" -} -//! [6] - -//! [7] -ItemModelBarDataProxy { - id: barProxy - activeMapping: barMapping // a BarDataMapping - itemModel: dataModel // a ListModel -} //! [7] //! [8] ItemModelScatterDataProxy { - id: scatterProxy - activeMapping: scatterMapping // a ScatterDataMapping - itemModel: dataModel // a ListModel + itemModel: model // E.g. a list model defined elsewhere containing point coordinates. + // Mapping model roles to scatter series item coordinates. + xPosRole: "xPos" + yPosRole: "yPos" + zPosRole: "zPos" } //! [8] //! [9] ItemModelSurfaceDataProxy { - id: surfaceProxy - activeMapping: surfaceMapping // a SurfaceDataMapping - itemModel: dataModel // a ListModel + itemModel: model // E.g. a list model defined elsewhere containing population data. + // Mapping model roles to surface series rows, columns, and values. + rowRole: "longitude" + columnRole: "latitude" + valueRole: "pop_density" } //! [9] diff --git a/src/datavisualization/doc/snippets/doc_src_qtdatavisualization.cpp b/src/datavisualization/doc/snippets/doc_src_qtdatavisualization.cpp index e0a9fa58..35d75fcb 100644 --- a/src/datavisualization/doc/snippets/doc_src_qtdatavisualization.cpp +++ b/src/datavisualization/doc/snippets/doc_src_qtdatavisualization.cpp @@ -47,36 +47,32 @@ QStringList months; years << "2006" << "2007" << "2008" << "2009" << "2010" << "2011" << "2012"; months << "jan" << "feb" << "mar" << "apr" << "may" << "jun" << "jul" << "aug" << "sep" << "oct" << "nov" << "dec"; -QItemModelBarDataMapping *mapping = new QItemModelBarDataMapping(QStringLiteral("year"), // Row role - QStringLiteral("month"), // Column role - QStringLiteral("income"), // Value role - years, // Row categories - months); // Column categories - -QItemModelBarDataProxy *proxy = new QItemModelBarDataProxy(customModel, mapping); +QItemModelBarDataProxy *proxy = new QItemModelBarDataProxy(customModel, + QStringLiteral("year"), // Row role + QStringLiteral("month"), // Column role + QStringLiteral("income"), // Value role + years, // Row categories + months); // Column categories //... -// To display different data later, you can simply change the mapping of the current -// mapping object, or set another mapping object. -proxy->activeMapping()->setValueRole(QStringLiteral("expenses")); +// To display different data later, you can simply change the mapping. +proxy->setValueRole(QStringLiteral("expenses")); //! [3] //! [4] // Map "density" value to X-axis, "hardness" to Y-axis and "conductivity" to Z-axis. -QItemModelScatterDataMapping *mapping = new QItemModelScatterDataMapping(QStringLiteral("density"), - QStringLiteral("hardness"), - QStringLiteral("conductivity")) - -QItemModelScatterDataProxy *proxy = new QItemModelScatterDataProxy(customModel, mapping); +QItemModelScatterDataProxy *proxy = new QItemModelScatterDataProxy(customModel, + QStringLiteral("density"), + QStringLiteral("hardness"), + QStringLiteral("conductivity")); //! [4] //! [5] -QItemModelSurfaceDataMapping *mapping = new QItemModelSurfaceDataMapping(QStringLiteral("longitude"), // Row role - QStringLiteral("latitude"), // Column role - QStringLiteral("height")); // value role - -QItemModelSurfaceDataProxy *proxy = new QItemModelSurfaceDataProxy(customModel, mapping); +QItemModelSurfaceDataProxy *proxy = new QItemModelSurfaceDataProxy(customModel, + QStringLiteral("longitude"), // Row role + QStringLiteral("latitude"), // Column role + QStringLiteral("height")); // value role //! [5] //! [6] |