diff options
author | Miikka Heikkinen <miikka.heikkinen@digia.com> | 2013-11-11 13:22:54 +0200 |
---|---|---|
committer | Miikka Heikkinen <miikka.heikkinen@digia.com> | 2013-11-15 08:24:15 +0200 |
commit | 999ffa01d20f75a457da62d41c0fabfc32e5e1bb (patch) | |
tree | c5267f6831d5ff61444f85b2110f7150e20d3451 /src/datavisualization/data | |
parent | bbb874d0591215164b2030db60dc9d6a95f4c8fe (diff) |
Basic multiseries support
Task-number: QTRD-2548
Change-Id: Iba324c0e8be56f2b3f8f6c6a992883c134a51a9d
Reviewed-by: Tomi Korpipää <tomi.korpipaa@digia.com>
Reviewed-by: Mika Salmela <mika.salmela@digia.com>
Diffstat (limited to 'src/datavisualization/data')
25 files changed, 1438 insertions, 68 deletions
diff --git a/src/datavisualization/data/data.pri b/src/datavisualization/data/data.pri index 770d2bd1..66ad0e3b 100644 --- a/src/datavisualization/data/data.pri +++ b/src/datavisualization/data/data.pri @@ -36,7 +36,15 @@ HEADERS += \ $$PWD/qitemmodelsurfacedataproxy_p.h \ $$PWD/surfaceitemmodelhandler_p.h \ $$PWD/qsurfacedataitem.h \ - $$PWD/qsurfacedataitem_p.h + $$PWD/qsurfacedataitem_p.h \ + $$PWD/qabstract3dseries.h \ + $$PWD/qabstract3dseries_p.h \ + $$PWD/qbar3dseries.h \ + $$PWD/qbar3dseries_p.h \ + $$PWD/qscatter3dseries.h \ + $$PWD/qscatter3dseries_p.h \ + $$PWD/qsurface3dseries.h \ + $$PWD/qsurface3dseries_p.h SOURCES += \ $$PWD/labelitem.cpp \ @@ -61,4 +69,8 @@ SOURCES += \ $$PWD/qitemmodelsurfacedatamapping.cpp \ $$PWD/qitemmodelsurfacedataproxy.cpp \ $$PWD/surfaceitemmodelhandler.cpp \ - $$PWD/qsurfacedataitem.cpp + $$PWD/qsurfacedataitem.cpp \ + $$PWD/qabstract3dseries.cpp \ + $$PWD/qbar3dseries.cpp \ + $$PWD/qscatter3dseries.cpp \ + $$PWD/qsurface3dseries.cpp diff --git a/src/datavisualization/data/qabstract3dseries.cpp b/src/datavisualization/data/qabstract3dseries.cpp new file mode 100644 index 00000000..52d3fda1 --- /dev/null +++ b/src/datavisualization/data/qabstract3dseries.cpp @@ -0,0 +1,192 @@ +/**************************************************************************** +** +** 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 "qabstract3dseries.h" +#include "qabstract3dseries_p.h" +#include "qabstractdataproxy_p.h" +#include "abstract3dcontroller_p.h" + +QT_DATAVISUALIZATION_BEGIN_NAMESPACE + +/*! + * \class QAbstract3DSeries + * \inmodule QtDataVisualization + * \brief Base class for all QtDataVisualization data proxies. + * \since Qt Data Visualization 1.0 + * + * You use the visualization type specific inherited classes instead of the base class. + * \sa QBar3DSeries, QScatter3DSeries, QSurface3DSeries, {Qt Data Visualization Data Handling} + */ + +/*! + * \qmltype Abstract3DSeries + * \inqmlmodule QtDataVisualization + * \since QtDataVisualization 1.0 + * \ingroup datavisualization_qml + * \instantiates QAbstract3DSeries + * \brief Base type for all QtDataVisualization data proxies. + * + * This type is uncreatable, but contains properties that are exposed via subtypes. + * \sa Bar3DSeries, Scatter3DSeries, Surface3DSeries, {Qt Data Visualization Data Handling} + */ + +/*! + * \qmlproperty Abstract3DSeries.SeriesType Abstract3DSeries::type + * The type of the series. + */ + +/*! + * \qmlproperty string Abstract3DSeries::itemLabelFormat + * + * Label format for data items in this series. This format is used for single item labels, + * for example, when an item is selected. How the format is interpreted depends on series type. See + * each series class documentation for more information. + */ + +/*! + * \qmlproperty bool Abstract3DSeries::visible + * Sets the visibility of the series. If false, the series is not rendered. + */ + +/*! + * \enum QAbstract3DSeries::SeriesType + * + * Type of the series. + * + * \value SeriesTypeNone + * No series type. + * \value SeriesTypeBar + * Series type for Q3DBars. + * \value SeriesTypeScatter + * Series type for Q3DScatter. + * \value SeriesTypeSurface + * Series type for Q3DSurface. + */ + +/*! + * \internal + */ +QAbstract3DSeries::QAbstract3DSeries(QAbstract3DSeriesPrivate *d, QObject *parent) : + QObject(parent), + d_ptr(d) +{ +} + +/*! + * Destroys QAbstract3DSeries. + */ +QAbstract3DSeries::~QAbstract3DSeries() +{ +} + +/*! + * \property QAbstract3DSeries::type + * + * The type of the series. + */ +QAbstract3DSeries::SeriesType QAbstract3DSeries::type() const +{ + return d_ptr->m_type; +} + +/*! + * \property QAbstract3DSeries::itemLabelFormat + * + * Sets label \a format for data items in this series. This format is used for single item labels, + * for example, when an item is selected. How the format is interpreted depends on series type. See + * each series class documentation for more information. + * + * \sa QBar3DSeries, Q3DScatterSeries, Q3DSurfaceSeries + */ +void QAbstract3DSeries::setItemLabelFormat(const QString &format) +{ + if (format != itemLabelFormat()) { + d_ptr->setItemLabelFormat(format); + emit itemLabelFormatChanged(format); + } +} + +QString QAbstract3DSeries::itemLabelFormat() const +{ + return d_ptr->m_itemLabelFormat; +} + +/*! + * \property QAbstract3DSeries::visible + * + * Sets the visibility of the series. If \a visible is false, the series is not rendered. + * Defaults to true. + */ +void QAbstract3DSeries::setVisible(bool visible) +{ + d_ptr->m_visible = visible; + emit visibilityChanged(visible); +} + +bool QAbstract3DSeries::isVisible() const +{ + return d_ptr->m_visible; +} + +// QAbstract3DSeriesPrivate + +QAbstract3DSeriesPrivate::QAbstract3DSeriesPrivate(QAbstract3DSeries *q, QAbstract3DSeries::SeriesType type) + : QObject(0), + q_ptr(q), + m_type(type), + m_dataProxy(0), + m_visible(true), + m_controller(0) +{ +} + +QAbstract3DSeriesPrivate::~QAbstract3DSeriesPrivate() +{ +} + +void QAbstract3DSeriesPrivate::setItemLabelFormat(const QString &format) +{ + m_itemLabelFormat = format; +} + +QAbstractDataProxy *QAbstract3DSeriesPrivate::dataProxy() const +{ + return m_dataProxy; +} + +void QAbstract3DSeriesPrivate::setDataProxy(QAbstractDataProxy *proxy) +{ + Q_ASSERT(proxy && proxy != m_dataProxy && !proxy->d_ptr->series()); + + delete m_dataProxy; + m_dataProxy = proxy; + + proxy->d_ptr->setSeries(q_ptr); // also sets parent + + if (m_controller) + connectControllerAndProxy(m_controller); +} + +void QAbstract3DSeriesPrivate::setController(Abstract3DController *controller) +{ + connectControllerAndProxy(controller); + m_controller = controller; + q_ptr->setParent(controller); +} + +QT_DATAVISUALIZATION_END_NAMESPACE diff --git a/src/datavisualization/data/qabstract3dseries.h b/src/datavisualization/data/qabstract3dseries.h new file mode 100644 index 00000000..3f20a161 --- /dev/null +++ b/src/datavisualization/data/qabstract3dseries.h @@ -0,0 +1,86 @@ +/**************************************************************************** +** +** 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 QABSTRACT3DSERIES_H +#define QABSTRACT3DSERIES_H + +#include <QtDataVisualization/qdatavisualizationenums.h> +#include <QObject> +#include <QScopedPointer> + +QT_DATAVISUALIZATION_BEGIN_NAMESPACE + +class QAbstract3DSeriesPrivate; + +class QT_DATAVISUALIZATION_EXPORT QAbstract3DSeries : public QObject +{ + Q_OBJECT + Q_ENUMS(SeriesType) + Q_PROPERTY(SeriesType type READ type) + Q_PROPERTY(QString itemLabelFormat READ itemLabelFormat WRITE setItemLabelFormat NOTIFY itemLabelFormatChanged) + Q_PROPERTY(bool visible READ isVisible WRITE setVisible NOTIFY visibilityChanged) + +public: + enum SeriesType { + SeriesTypeNone = 0, + SeriesTypeBar = 1, + SeriesTypeScatter = 2, + SeriesTypeSurface = 4 + }; + +protected: + explicit QAbstract3DSeries(QAbstract3DSeriesPrivate *d, QObject *parent = 0); + +public: + virtual ~QAbstract3DSeries(); + + SeriesType type() const; + + void setItemLabelFormat(const QString &format); + QString itemLabelFormat() const; + + void setVisible(bool visible); + bool isVisible() const; + +signals: + void itemLabelFormatChanged(QString format); + void visibilityChanged(bool visible); + +protected: + QScopedPointer<QAbstract3DSeriesPrivate> d_ptr; + +// QDataVis::ColorStyle m_colorStyle; +// QColor m_objectColor; +// QLinearGradient m_objectGradient; +// QColor m_singleHighlightColor; +// QLinearGradient m_singleHighlightGradient; +// QColor m_multiHighlightColor; +// QLinearGradient m_multiHighlightGradient; + +private: + Q_DISABLE_COPY(QAbstract3DSeries) + + friend class Abstract3DController; + friend class Bars3DController; + friend class Surface3DController; + friend class Scatter3DController; +}; + +QT_DATAVISUALIZATION_END_NAMESPACE + +#endif diff --git a/src/datavisualization/data/qabstract3dseries_p.h b/src/datavisualization/data/qabstract3dseries_p.h new file mode 100644 index 00000000..478fe6bb --- /dev/null +++ b/src/datavisualization/data/qabstract3dseries_p.h @@ -0,0 +1,73 @@ +/**************************************************************************** +** +** 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 "datavisualizationglobal_p.h" +#include "qabstract3dseries.h" +#include <QString> + +#ifndef QABSTRACT3DSERIES_P_H +#define QABSTRACT3DSERIES_P_H + +QT_DATAVISUALIZATION_BEGIN_NAMESPACE + +class QAbstractDataProxy; +class Abstract3DController; + +class QAbstract3DSeriesPrivate : public QObject +{ + Q_OBJECT +public: + QAbstract3DSeriesPrivate(QAbstract3DSeries *q, QAbstract3DSeries::SeriesType type); + virtual ~QAbstract3DSeriesPrivate(); + + void setItemLabelFormat(const QString &format); + + QAbstractDataProxy *dataProxy() const; + virtual void setDataProxy(QAbstractDataProxy *proxy); + virtual void setController(Abstract3DController *controller); + virtual void connectControllerAndProxy(Abstract3DController *newController) = 0; + +protected: + QAbstract3DSeries *q_ptr; + QAbstract3DSeries::SeriesType m_type; + QString m_itemLabelFormat; + QAbstractDataProxy *m_dataProxy; + bool m_visible; + Abstract3DController *m_controller; + +private: + friend class QAbstract3DSeries; + friend class Abstract3DController; + friend class Bars3DController; + friend class Surface3DController; + friend class Scatter3DController; +}; + +QT_DATAVISUALIZATION_END_NAMESPACE + +#endif // QAbstract3DSeries_P_H diff --git a/src/datavisualization/data/qabstractdataproxy.cpp b/src/datavisualization/data/qabstractdataproxy.cpp index b44f365e..fa0934c3 100644 --- a/src/datavisualization/data/qabstractdataproxy.cpp +++ b/src/datavisualization/data/qabstractdataproxy.cpp @@ -18,6 +18,7 @@ #include "qabstractdataproxy.h" #include "qabstractdataproxy_p.h" +#include "qabstract3dseries_p.h" QT_DATAVISUALIZATION_BEGIN_NAMESPACE @@ -49,14 +50,6 @@ QT_DATAVISUALIZATION_BEGIN_NAMESPACE */ /*! - * \qmlproperty string AbstractDataProxy::itemLabelFormat - * - * Label format for data items in this proxy. This format is used for single item labels, - * for example, when an item is selected. How the format is interpreted depends on proxy type. See - * each proxy class documentation for more information. - */ - -/*! * \enum QAbstractDataProxy::DataType * * Data type of the proxy. @@ -97,44 +90,13 @@ QAbstractDataProxy::DataType QAbstractDataProxy::type() const return d_ptr->m_type; } -/*! - * \property QAbstractDataProxy::itemLabelFormat - * - * Sets label \a format for data items in this proxy. This format is used for single item labels, - * for example, when an item is selected. How the format is interpreted depends on proxy type. See - * each proxy class documentation for more information. - * - * \sa QBarDataProxy, QScatterDataProxy, QSurfaceDataProxy - */ -void QAbstractDataProxy::setItemLabelFormat(const QString &format) -{ - if (format != itemLabelFormat()) { - d_ptr->setItemLabelFormat(format); - emit itemLabelFormatChanged(format); - } -} - -/*! - * \return label format for data items in this proxy. - */ -QString QAbstractDataProxy::itemLabelFormat() const -{ - return d_ptr->m_itemLabelFormat; -} - -/*! - * \fn void QAbstractDataProxy::itemLabelFormatChanged(QString format) - * - * Emitted when label format changes. - */ - // QAbstractDataProxyPrivate QAbstractDataProxyPrivate::QAbstractDataProxyPrivate(QAbstractDataProxy *q, QAbstractDataProxy::DataType type) : QObject(0), q_ptr(q), m_type(type), - m_isDefaultProxy(false) + m_series(0) { } @@ -142,9 +104,10 @@ QAbstractDataProxyPrivate::~QAbstractDataProxyPrivate() { } -void QAbstractDataProxyPrivate::setItemLabelFormat(const QString &format) +void QAbstractDataProxyPrivate::setSeries(QAbstract3DSeries *series) { - m_itemLabelFormat = format; + setParent(series); + m_series = series; } QT_DATAVISUALIZATION_END_NAMESPACE diff --git a/src/datavisualization/data/qabstractdataproxy.h b/src/datavisualization/data/qabstractdataproxy.h index d7793824..b493052f 100644 --- a/src/datavisualization/data/qabstractdataproxy.h +++ b/src/datavisualization/data/qabstractdataproxy.h @@ -32,7 +32,6 @@ class QT_DATAVISUALIZATION_EXPORT QAbstractDataProxy : public QObject Q_OBJECT Q_ENUMS(DataType) Q_PROPERTY(DataType type READ type) - Q_PROPERTY(QString itemLabelFormat READ itemLabelFormat WRITE setItemLabelFormat NOTIFY itemLabelFormatChanged) public: enum DataType { @@ -50,22 +49,17 @@ public: DataType type() const; - void setItemLabelFormat(const QString &format); - QString itemLabelFormat() const; - -signals: - void itemLabelFormatChanged(QString format); - protected: QScopedPointer<QAbstractDataProxyPrivate> d_ptr; private: Q_DISABLE_COPY(QAbstractDataProxy) - friend class Abstract3DController; - friend class Bars3DController; - friend class Scatter3DController; - friend class Surface3DController; + friend class QAbstract3DSeriesPrivate; +// friend class Abstract3DController; +// friend class Bars3DController; +// friend class Scatter3DController; +// friend class Surface3DController; }; QT_DATAVISUALIZATION_END_NAMESPACE diff --git a/src/datavisualization/data/qabstractdataproxy_p.h b/src/datavisualization/data/qabstractdataproxy_p.h index 4aa1b678..90504ccb 100644 --- a/src/datavisualization/data/qabstractdataproxy_p.h +++ b/src/datavisualization/data/qabstractdataproxy_p.h @@ -35,6 +35,8 @@ QT_DATAVISUALIZATION_BEGIN_NAMESPACE +class QAbstract3DSeries; + class QAbstractDataProxyPrivate : public QObject { Q_OBJECT @@ -42,16 +44,13 @@ public: QAbstractDataProxyPrivate(QAbstractDataProxy *q, QAbstractDataProxy::DataType type); virtual ~QAbstractDataProxyPrivate(); - void setItemLabelFormat(const QString &format); - - inline bool isDefaultProxy() { return m_isDefaultProxy; } - inline void setDefaultProxy(bool isDefault) { m_isDefaultProxy = isDefault; } + inline QAbstract3DSeries *series() { return m_series; } + virtual void setSeries(QAbstract3DSeries *series); protected: QAbstractDataProxy *q_ptr; QAbstractDataProxy::DataType m_type; - QString m_itemLabelFormat; - bool m_isDefaultProxy; + QAbstract3DSeries *m_series; private: friend class QAbstractDataProxy; diff --git a/src/datavisualization/data/qbar3dseries.cpp b/src/datavisualization/data/qbar3dseries.cpp new file mode 100644 index 00000000..c04f8ca2 --- /dev/null +++ b/src/datavisualization/data/qbar3dseries.cpp @@ -0,0 +1,220 @@ +/**************************************************************************** +** +** 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 "qbar3dseries_p.h" +#include "bars3dcontroller_p.h" + +QT_DATAVISUALIZATION_BEGIN_NAMESPACE + +/*! + * \class QBar3DSeries + * \inmodule QtDataVisualization + * \brief Base series class for Q3DBars. + * \since Qt Data Visualization 1.0 + * + * QBar3DSeries manages the series specific visual elements, as well as series data + * (via data proxy). + * + * If no data proxy is set explicitly for the series, QBar3DSeries creates a default + * proxy. If any other proxy is set as active data proxy later, the default proxy and all data + * added to it are destroyed. + * + * QBar3DSeries optionally keeps track of row and column labels, which Q3DCategoryAxis can utilize + * to show axis labels. The row and column labels are stored in separate array from the data and + * row manipulation methods provide an alternate versions that don't affect the row labels. + * This enables the option of having row labels that relate to the position of the data in the + * array rather than the data itself. + * + * QBar3DSeries supports the following format tags for QAbstract3DSeries::setItemLabelFormat(): + * \table + * \row + * \li @rowTitle \li Title from row axis + * \row + * \li @colTitle \li Title from column axis + * \row + * \li @valueTitle \li Title from value axis + * \row + * \li @rowIdx \li Visible row index + * \row + * \li @colIdx \li Visible Column index + * \row + * \li @rowLabel \li Label from row axis + * \row + * \li @colLabel \li Label from column axis + * \row + * \li @valueLabel \li Item value formatted using the same format the value axis attached to the graph uses, + * see \l{Q3DValueAxis::setLabelFormat()} for more information. + * \row + * \li %<format spec> \li Item value in specified format. + * \endtable + * + * For example: + * \snippet doc_src_qtdatavisualization.cpp 1 + * + * \sa {Qt Data Visualization Data Handling} + */ + +/*! + * \qmltype Bar3DSeries + * \inqmlmodule QtDataVisualization + * \since QtDataVisualization 1.0 + * \ingroup datavisualization_qml + * \instantiates QBar3DSeries + * \inherits Abstract3DSeries + * \brief Base series type for Bars3D. + * + * This type manages the series specific visual elements, as well as series data + * (via data proxy). + * + * For more complete description, see QBar3DSeries. + * + * \sa {Qt Data Visualization Data Handling} + */ + + +/*! + * Constructs QBar3DSeries with the given \a parent. + */ +QBar3DSeries::QBar3DSeries(QObject *parent) : + QAbstract3DSeries(new QBar3DSeriesPrivate(this), parent) +{ + // Default proxy + dptr()->setDataProxy(new QBarDataProxy); +} + +QBar3DSeries::QBar3DSeries(QBarDataProxy *dataProxy, QObject *parent) : + QAbstract3DSeries(new QBar3DSeriesPrivate(this), parent) +{ + dptr()->setDataProxy(dataProxy); +} + +/*! + * \internal + */ +QBar3DSeries::QBar3DSeries(QBar3DSeriesPrivate *d, QObject *parent) : + QAbstract3DSeries(d, parent) +{ +} + +/*! + * Destroys QBar3DSeries. + */ +QBar3DSeries::~QBar3DSeries() +{ +} + +/*! + * \property QBar3DSeries::dataProxy + * + * This property holds the active data \a proxy. The series assumes ownership of any proxy set to + * it and deletes any previously set proxy when a new one is added. The \a proxy cannot be null or + * set to another series. + */ +void QBar3DSeries::setDataProxy(QBarDataProxy *proxy) +{ + d_ptr->setDataProxy(proxy); +} + +QBarDataProxy *QBar3DSeries::dataProxy() const +{ + return static_cast<QBarDataProxy *>(d_ptr->dataProxy()); +} + +/*! + * \internal + */ +QBar3DSeriesPrivate *QBar3DSeries::dptr() +{ + return static_cast<QBar3DSeriesPrivate *>(d_ptr.data()); +} + +/*! + * \internal + */ +const QBar3DSeriesPrivate *QBar3DSeries::dptrc() const +{ + return static_cast<const QBar3DSeriesPrivate *>(d_ptr.data()); +} + +// QBar3DSeriesPrivate + +QBar3DSeriesPrivate::QBar3DSeriesPrivate(QBar3DSeries *q) + : QAbstract3DSeriesPrivate(q, QAbstract3DSeries::SeriesTypeBar) +{ + m_itemLabelFormat = QStringLiteral("@valueTitle: @valueLabel"); +} + +QBar3DSeriesPrivate::~QBar3DSeriesPrivate() +{ +} + +QBar3DSeries *QBar3DSeriesPrivate::qptr() +{ + return static_cast<QBar3DSeries *>(q_ptr); +} + +void QBar3DSeriesPrivate::setDataProxy(QAbstractDataProxy *proxy) +{ + Q_ASSERT(proxy->type() == QAbstractDataProxy::DataTypeBar); + + QAbstract3DSeriesPrivate::setDataProxy(proxy); + + emit qptr()->dataProxyChanged(static_cast<QBarDataProxy *>(proxy)); +} + +void QBar3DSeriesPrivate::connectControllerAndProxy(Abstract3DController *newController) +{ + QBarDataProxy *barDataProxy = static_cast<QBarDataProxy *>(m_dataProxy); + + if (m_controller && barDataProxy) { + //Disconnect old controller/old proxy + QObject::disconnect(barDataProxy, 0, m_controller, 0); + QObject::disconnect(q_ptr, 0, m_controller, 0); + } + + if (newController && barDataProxy) { + Bars3DController *controller = static_cast<Bars3DController *>(newController); + + QObject::connect(barDataProxy, &QBarDataProxy::arrayReset, controller, + &Bars3DController::handleArrayReset); + QObject::connect(barDataProxy, &QBarDataProxy::rowsAdded, controller, + &Bars3DController::handleRowsAdded); + QObject::connect(barDataProxy, &QBarDataProxy::rowsChanged, controller, + &Bars3DController::handleRowsChanged); + QObject::connect(barDataProxy, &QBarDataProxy::rowsRemoved, controller, + &Bars3DController::handleRowsRemoved); + QObject::connect(barDataProxy, &QBarDataProxy::rowsInserted, controller, + &Bars3DController::handleRowsInserted); + QObject::connect(barDataProxy, &QBarDataProxy::itemChanged, controller, + &Bars3DController::handleItemChanged); + QObject::connect(barDataProxy, &QBarDataProxy::rowLabelsChanged, controller, + &Bars3DController::handleDataRowLabelsChanged); + QObject::connect(barDataProxy, &QBarDataProxy::columnLabelsChanged, controller, + &Bars3DController::handleDataColumnLabelsChanged); + + QObject::connect(q_ptr, &QAbstract3DSeries::visibilityChanged, controller, + &Abstract3DController::handleSeriesVisibilityChanged); + + // Always clear selection on proxy change + // TODO: setSelectedBar(noSelectionPoint()); + + newController->handleSeriesVisibilityChanged(m_visible); + } +} + +QT_DATAVISUALIZATION_END_NAMESPACE diff --git a/src/datavisualization/data/qbar3dseries.h b/src/datavisualization/data/qbar3dseries.h new file mode 100644 index 00000000..ebb37838 --- /dev/null +++ b/src/datavisualization/data/qbar3dseries.h @@ -0,0 +1,58 @@ +/**************************************************************************** +** +** 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 QBAR3DSERIES_H +#define QBAR3DSERIES_H + +#include <QtDataVisualization/qabstract3dseries.h> +#include <QtDataVisualization/qbardataproxy.h> + +QT_DATAVISUALIZATION_BEGIN_NAMESPACE + +class QBar3DSeriesPrivate; + +class QT_DATAVISUALIZATION_EXPORT QBar3DSeries : public QAbstract3DSeries +{ + Q_OBJECT + Q_PROPERTY(QBarDataProxy *dataProxy READ dataProxy WRITE setDataProxy NOTIFY dataProxyChanged) + +public: + explicit QBar3DSeries(QObject *parent = 0); + explicit QBar3DSeries(QBarDataProxy *dataProxy, QObject *parent = 0); + virtual ~QBar3DSeries(); + + void setDataProxy(QBarDataProxy *proxy); + QBarDataProxy *dataProxy() const; + +signals: + void dataProxyChanged(QBarDataProxy *proxy); + +protected: + explicit QBar3DSeries(QBar3DSeriesPrivate *d, QObject *parent = 0); + QBar3DSeriesPrivate *dptr(); + const QBar3DSeriesPrivate *dptrc() const; + +private: + Q_DISABLE_COPY(QBar3DSeries) + + friend class Bars3DController; +}; + +QT_DATAVISUALIZATION_END_NAMESPACE + +#endif diff --git a/src/datavisualization/data/qbar3dseries_p.h b/src/datavisualization/data/qbar3dseries_p.h new file mode 100644 index 00000000..3ed95a69 --- /dev/null +++ b/src/datavisualization/data/qbar3dseries_p.h @@ -0,0 +1,55 @@ +/**************************************************************************** +** +** 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 QBAR3DSERIES_P_H +#define QBAR3DSERIES_P_H + +#include "qbar3dseries.h" +#include "qabstract3dseries_p.h" + +QT_DATAVISUALIZATION_BEGIN_NAMESPACE + +class QBar3DSeriesPrivate : public QAbstract3DSeriesPrivate +{ + Q_OBJECT +public: + QBar3DSeriesPrivate(QBar3DSeries *q); + virtual ~QBar3DSeriesPrivate(); + + virtual void setDataProxy(QAbstractDataProxy *proxy); + virtual void connectControllerAndProxy(Abstract3DController *newController); +private: + QBar3DSeries *qptr(); + +private: + friend class QBar3DSeries; +}; + +QT_DATAVISUALIZATION_END_NAMESPACE + +#endif diff --git a/src/datavisualization/data/qbardataproxy.cpp b/src/datavisualization/data/qbardataproxy.cpp index 13517b4b..26c3a36a 100644 --- a/src/datavisualization/data/qbardataproxy.cpp +++ b/src/datavisualization/data/qbardataproxy.cpp @@ -18,6 +18,7 @@ #include "qbardataproxy.h" #include "qbardataproxy_p.h" +#include "qbar3dseries_p.h" QT_DATAVISUALIZATION_BEGIN_NAMESPACE @@ -110,6 +111,12 @@ QT_DATAVISUALIZATION_BEGIN_NAMESPACE */ /*! + * \qmlproperty Bar3DSeries BarDataProxy::series + * + * The series this proxy is attached to. + */ + +/*! * Constructs QBarDataProxy with the given \a parent. */ QBarDataProxy::QBarDataProxy(QObject *parent) : @@ -133,6 +140,16 @@ QBarDataProxy::~QBarDataProxy() } /*! + * \property QBarDataProxy::series + * + * The series this proxy is attached to. + */ +QBar3DSeries *QBarDataProxy::series() +{ + return static_cast<QBar3DSeries *>(d_ptr->series()); +} + +/*! * Clears the existing array and row and column labels. */ void QBarDataProxy::resetArray() @@ -482,7 +499,6 @@ QBarDataProxyPrivate::QBarDataProxyPrivate(QBarDataProxy *q) : QAbstractDataProxyPrivate(q, QAbstractDataProxy::DataTypeBar), m_dataArray(new QBarDataArray) { - m_itemLabelFormat = QStringLiteral("@valueTitle: @valueLabel"); } QBarDataProxyPrivate::~QBarDataProxyPrivate() @@ -704,4 +720,11 @@ QPair<GLfloat, GLfloat> QBarDataProxyPrivate::limitValues(int startRow, int endR return limits; } +void QBarDataProxyPrivate::setSeries(QAbstract3DSeries *series) +{ + QAbstractDataProxyPrivate::setSeries(series); + QBar3DSeries *barSeries = static_cast<QBar3DSeries *>(series); + emit qptr()->seriesChanged(barSeries); +} + QT_DATAVISUALIZATION_END_NAMESPACE diff --git a/src/datavisualization/data/qbardataproxy.h b/src/datavisualization/data/qbardataproxy.h index 758700df..e97e6a85 100644 --- a/src/datavisualization/data/qbardataproxy.h +++ b/src/datavisualization/data/qbardataproxy.h @@ -30,6 +30,7 @@ typedef QVector<QBarDataItem> QBarDataRow; typedef QList<QBarDataRow *> QBarDataArray; class QBarDataProxyPrivate; +class QBar3DSeries; class QT_DATAVISUALIZATION_EXPORT QBarDataProxy : public QAbstractDataProxy { @@ -38,6 +39,7 @@ class QT_DATAVISUALIZATION_EXPORT QBarDataProxy : public QAbstractDataProxy Q_PROPERTY(int rowCount READ rowCount) Q_PROPERTY(QStringList rowLabels READ rowLabels WRITE setRowLabels NOTIFY rowLabelsChanged) Q_PROPERTY(QStringList columnLabels READ columnLabels WRITE setColumnLabels NOTIFY columnLabelsChanged) + Q_PROPERTY(QBar3DSeries *series READ series NOTIFY seriesChanged) public: explicit QBarDataProxy(QObject *parent = 0); virtual ~QBarDataProxy(); @@ -51,6 +53,7 @@ public: * individual bar requires allocating additional data object for the bar. */ + QBar3DSeries *series(); int rowCount() const; QStringList rowLabels() const; @@ -113,6 +116,7 @@ signals: void rowLabelsChanged(); void columnLabelsChanged(); + void seriesChanged(QBar3DSeries *series); protected: explicit QBarDataProxy(QBarDataProxyPrivate *d, QObject *parent = 0); diff --git a/src/datavisualization/data/qbardataproxy_p.h b/src/datavisualization/data/qbardataproxy_p.h index 4d51bd5b..84726a02 100644 --- a/src/datavisualization/data/qbardataproxy_p.h +++ b/src/datavisualization/data/qbardataproxy_p.h @@ -56,6 +56,8 @@ public: QPair<GLfloat, GLfloat> limitValues(int startRow, int startColumn, int rowCount, int columnCount) const; + virtual void setSeries(QAbstract3DSeries *series); + private: QBarDataProxy *qptr(); void clearRow(int rowIndex); diff --git a/src/datavisualization/data/qscatter3dseries.cpp b/src/datavisualization/data/qscatter3dseries.cpp new file mode 100644 index 00000000..2fe61cff --- /dev/null +++ b/src/datavisualization/data/qscatter3dseries.cpp @@ -0,0 +1,204 @@ +/**************************************************************************** +** +** 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 "qscatter3dseries_p.h" +#include "scatter3dcontroller_p.h" + +QT_DATAVISUALIZATION_BEGIN_NAMESPACE + +/*! + * \class QScatter3DSeries + * \inmodule QtDataVisualization + * \brief Base series class for Q3DScatter. + * \since Qt Data Visualization 1.0 + * + * QScatter3DSeries manages the series specific visual elements, as well as series data + * (via data proxy). + * + * If no data proxy is set explicitly for the series, QScatter3DSeries creates a default + * proxy. If any other proxy is set as active data proxy later, the default proxy and all data + * added to it are destroyed. + * + * QScatter3DSeries supports the following format tags for QAbstract3DSeries::setItemLabelFormat(): + * \table + * \row + * \li @xTitle \li Title from X axis + * \row + * \li @yTitle \li Title from Y axis + * \row + * \li @zTitle \li Title from Z axis + * \row + * \li @xLabel \li Item value formatted using the same format the X axis attached to the graph uses, + * see \l{Q3DValueAxis::setLabelFormat()} for more information. + * \row + * \li @yLabel \li Item value formatted using the same format the Y axis attached to the graph uses, + * see \l{Q3DValueAxis::setLabelFormat()} for more information. + * \row + * \li @zLabel \li Item value formatted using the same format the Z axis attached to the graph uses, + * see \l{Q3DValueAxis::setLabelFormat()} for more information. + * \endtable + * + * For example: + * \snippet doc_src_qtdatavisualization.cpp 1 + * + * \sa {Qt Data Visualization Data Handling} + */ + +/*! + * \qmltype Scatter3DSeries + * \inqmlmodule QtDataVisualization + * \since QtDataVisualization 1.0 + * \ingroup datavisualization_qml + * \instantiates QScatter3DSeries + * \inherits Abstract3DSeries + * \brief Base series type for Scatter3D. + * + * This type manages the series specific visual elements, as well as series data + * (via data proxy). + * + * For more complete description, see QScatter3DSeries. + * + * \sa {Qt Data Visualization Data Handling} + */ + + +/*! + * Constructs QScatter3DSeries with the given \a parent. + */ +QScatter3DSeries::QScatter3DSeries(QObject *parent) : + QAbstract3DSeries(new QScatter3DSeriesPrivate(this), parent) +{ + // Default proxy + dptr()->setDataProxy(new QScatterDataProxy); +} + +QScatter3DSeries::QScatter3DSeries(QScatterDataProxy *dataProxy, QObject *parent) : + QAbstract3DSeries(new QScatter3DSeriesPrivate(this), parent) +{ + dptr()->setDataProxy(dataProxy); +} + +/*! + * \internal + */ +QScatter3DSeries::QScatter3DSeries(QScatter3DSeriesPrivate *d, QObject *parent) : + QAbstract3DSeries(d, parent) +{ +} + +/*! + * Destroys QScatter3DSeries. + */ +QScatter3DSeries::~QScatter3DSeries() +{ +} + +/*! + * \property QScatter3DSeries::dataProxy + * + * This property holds the active data \a proxy. The series assumes ownership of any proxy set to + * it and deletes any previously set proxy when a new one is added. The \a proxy cannot be null or + * set to another series. + */ +void QScatter3DSeries::setDataProxy(QScatterDataProxy *proxy) +{ + d_ptr->setDataProxy(proxy); +} + +QScatterDataProxy *QScatter3DSeries::dataProxy() const +{ + return static_cast<QScatterDataProxy *>(d_ptr->dataProxy()); +} + +/*! + * \internal + */ +QScatter3DSeriesPrivate *QScatter3DSeries::dptr() +{ + return static_cast<QScatter3DSeriesPrivate *>(d_ptr.data()); +} + +/*! + * \internal + */ +const QScatter3DSeriesPrivate *QScatter3DSeries::dptrc() const +{ + return static_cast<const QScatter3DSeriesPrivate *>(d_ptr.data()); +} + +// QScatter3DSeriesPrivate + +QScatter3DSeriesPrivate::QScatter3DSeriesPrivate(QScatter3DSeries *q) + : QAbstract3DSeriesPrivate(q, QAbstract3DSeries::SeriesTypeScatter) +{ + m_itemLabelFormat = QStringLiteral("@valueTitle: @valueLabel"); +} + +QScatter3DSeriesPrivate::~QScatter3DSeriesPrivate() +{ +} + +QScatter3DSeries *QScatter3DSeriesPrivate::qptr() +{ + return static_cast<QScatter3DSeries *>(q_ptr); +} + +void QScatter3DSeriesPrivate::setDataProxy(QAbstractDataProxy *proxy) +{ + Q_ASSERT(proxy->type() == QAbstractDataProxy::DataTypeScatter); + + QAbstract3DSeriesPrivate::setDataProxy(proxy); + + emit qptr()->dataProxyChanged(static_cast<QScatterDataProxy *>(proxy)); +} + +void QScatter3DSeriesPrivate::connectControllerAndProxy(Abstract3DController *newController) +{ + QScatterDataProxy *scatterDataProxy = static_cast<QScatterDataProxy *>(m_dataProxy); + + if (m_controller && scatterDataProxy) { + //Disconnect old controller/old proxy + QObject::disconnect(scatterDataProxy, 0, m_controller, 0); + QObject::disconnect(q_ptr, 0, m_controller, 0); + } + + if (newController && scatterDataProxy) { + Scatter3DController *controller = static_cast<Scatter3DController *>(newController); + + QObject::connect(scatterDataProxy, &QScatterDataProxy::arrayReset, + controller, &Scatter3DController::handleArrayReset); + QObject::connect(scatterDataProxy, &QScatterDataProxy::itemsAdded, + controller, &Scatter3DController::handleItemsAdded); + QObject::connect(scatterDataProxy, &QScatterDataProxy::itemsChanged, + controller, &Scatter3DController::handleItemsChanged); + QObject::connect(scatterDataProxy, &QScatterDataProxy::itemsRemoved, + controller, &Scatter3DController::handleItemsRemoved); + QObject::connect(scatterDataProxy, &QScatterDataProxy::itemsInserted, + controller, &Scatter3DController::handleItemsInserted); + + QObject::connect(q_ptr, &QAbstract3DSeries::visibilityChanged, controller, + &Abstract3DController::handleSeriesVisibilityChanged); + + // Always clear selection on proxy change + // TODO: setSelectedScatter(noSelectionPoint()); + + newController->handleSeriesVisibilityChanged(m_visible); + } +} + +QT_DATAVISUALIZATION_END_NAMESPACE diff --git a/src/datavisualization/data/qscatter3dseries.h b/src/datavisualization/data/qscatter3dseries.h new file mode 100644 index 00000000..bb24f79a --- /dev/null +++ b/src/datavisualization/data/qscatter3dseries.h @@ -0,0 +1,58 @@ +/**************************************************************************** +** +** 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 QSCATTER3DSERIES_H +#define QSCATTER3DSERIES_H + +#include <QtDataVisualization/qabstract3dseries.h> +#include <QtDataVisualization/qscatterdataproxy.h> + +QT_DATAVISUALIZATION_BEGIN_NAMESPACE + +class QScatter3DSeriesPrivate; + +class QT_DATAVISUALIZATION_EXPORT QScatter3DSeries : public QAbstract3DSeries +{ + Q_OBJECT + Q_PROPERTY(QScatterDataProxy *dataProxy READ dataProxy WRITE setDataProxy NOTIFY dataProxyChanged) + +public: + explicit QScatter3DSeries(QObject *parent = 0); + explicit QScatter3DSeries(QScatterDataProxy *dataProxy, QObject *parent = 0); + virtual ~QScatter3DSeries(); + + void setDataProxy(QScatterDataProxy *proxy); + QScatterDataProxy *dataProxy() const; + +signals: + void dataProxyChanged(QScatterDataProxy *proxy); + +protected: + explicit QScatter3DSeries(QScatter3DSeriesPrivate *d, QObject *parent = 0); + QScatter3DSeriesPrivate *dptr(); + const QScatter3DSeriesPrivate *dptrc() const; + +private: + Q_DISABLE_COPY(QScatter3DSeries) + + friend class Scatter3DController; +}; + +QT_DATAVISUALIZATION_END_NAMESPACE + +#endif diff --git a/src/datavisualization/data/qscatter3dseries_p.h b/src/datavisualization/data/qscatter3dseries_p.h new file mode 100644 index 00000000..001fb00c --- /dev/null +++ b/src/datavisualization/data/qscatter3dseries_p.h @@ -0,0 +1,55 @@ +/**************************************************************************** +** +** 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 QSCATTER3DSERIES_P_H +#define QSCATTER3DSERIES_P_H + +#include "qscatter3dseries.h" +#include "qabstract3dseries_p.h" + +QT_DATAVISUALIZATION_BEGIN_NAMESPACE + +class QScatter3DSeriesPrivate : public QAbstract3DSeriesPrivate +{ + Q_OBJECT +public: + QScatter3DSeriesPrivate(QScatter3DSeries *q); + virtual ~QScatter3DSeriesPrivate(); + + virtual void setDataProxy(QAbstractDataProxy *proxy); + virtual void connectControllerAndProxy(Abstract3DController *newController); +private: + QScatter3DSeries *qptr(); + +private: + friend class QScatter3DSeries; +}; + +QT_DATAVISUALIZATION_END_NAMESPACE + +#endif diff --git a/src/datavisualization/data/qscatterdataproxy.cpp b/src/datavisualization/data/qscatterdataproxy.cpp index 85cbb4eb..149cb1ae 100644 --- a/src/datavisualization/data/qscatterdataproxy.cpp +++ b/src/datavisualization/data/qscatterdataproxy.cpp @@ -18,6 +18,7 @@ #include "qscatterdataproxy.h" #include "qscatterdataproxy_p.h" +#include "qscatter3dseries_p.h" QT_DATAVISUALIZATION_BEGIN_NAMESPACE @@ -80,6 +81,12 @@ QT_DATAVISUALIZATION_BEGIN_NAMESPACE */ /*! + * \qmlproperty Scatter3DSeries ScatterDataProxy::series + * + * The series this proxy is attached to. + */ + +/*! * Constructs QScatterDataProxy with the given \a parent. */ QScatterDataProxy::QScatterDataProxy(QObject *parent) : @@ -103,6 +110,16 @@ QScatterDataProxy::~QScatterDataProxy() } /*! + * \property QScatterDataProxy::series + * + * The series this proxy is attached to. + */ +QScatter3DSeries *QScatterDataProxy::series() +{ + return static_cast<QScatter3DSeries *>(d_ptr->series()); +} + +/*! * Takes ownership of the \a newArray. Clears the existing array if the \a newArray is * different from the existing array. If it's the same array, this just triggers arrayReset() * signal. @@ -277,7 +294,6 @@ QScatterDataProxyPrivate::QScatterDataProxyPrivate(QScatterDataProxy *q) : QAbstractDataProxyPrivate(q, QAbstractDataProxy::DataTypeScatter), m_dataArray(new QScatterDataArray) { - m_itemLabelFormat = QStringLiteral("(@xLabel, @yLabel, @zLabel)"); } QScatterDataProxyPrivate::~QScatterDataProxyPrivate() @@ -346,7 +362,7 @@ void QScatterDataProxyPrivate::removeItems(int index, int removeCount) m_dataArray->remove(index, removeCount); } -void QScatterDataProxyPrivate::limitValues(QVector3D &minValues, QVector3D &maxValues) +void QScatterDataProxyPrivate::limitValues(QVector3D &minValues, QVector3D &maxValues) const { if (m_dataArray->isEmpty()) return; @@ -393,4 +409,16 @@ void QScatterDataProxyPrivate::limitValues(QVector3D &minValues, QVector3D &maxV maxValues.setZ(maxZ); } +void QScatterDataProxyPrivate::setSeries(QAbstract3DSeries *series) +{ + QAbstractDataProxyPrivate::setSeries(series); + QScatter3DSeries *scatterSeries = static_cast<QScatter3DSeries *>(series); + emit qptr()->seriesChanged(scatterSeries); +} + +QScatterDataProxy *QScatterDataProxyPrivate::qptr() +{ + return static_cast<QScatterDataProxy *>(q_ptr); +} + QT_DATAVISUALIZATION_END_NAMESPACE diff --git a/src/datavisualization/data/qscatterdataproxy.h b/src/datavisualization/data/qscatterdataproxy.h index 178bc900..e17154c0 100644 --- a/src/datavisualization/data/qscatterdataproxy.h +++ b/src/datavisualization/data/qscatterdataproxy.h @@ -27,12 +27,14 @@ QT_DATAVISUALIZATION_BEGIN_NAMESPACE typedef QVector<QScatterDataItem> QScatterDataArray; class QScatterDataProxyPrivate; +class QScatter3DSeries; class QT_DATAVISUALIZATION_EXPORT QScatterDataProxy : public QAbstractDataProxy { Q_OBJECT Q_PROPERTY(int itemCount READ itemCount) + Q_PROPERTY(QScatter3DSeries *series READ series NOTIFY seriesChanged) public: explicit QScatterDataProxy(QObject *parent = 0); @@ -46,6 +48,7 @@ public: * added in the future such as color requires allocating additional data object for the bar. */ + QScatter3DSeries *series(); int itemCount() const; const QScatterDataArray *array() const; const QScatterDataItem *itemAt(int index) const; @@ -69,6 +72,7 @@ signals: void itemsChanged(int startIndex, int count); void itemsRemoved(int startIndex, int count); void itemsInserted(int startIndex, int count); + void seriesChanged(QScatter3DSeries *series); protected: explicit QScatterDataProxy(QScatterDataProxyPrivate *d, QObject *parent = 0); diff --git a/src/datavisualization/data/qscatterdataproxy_p.h b/src/datavisualization/data/qscatterdataproxy_p.h index 24b5eb67..322c8937 100644 --- a/src/datavisualization/data/qscatterdataproxy_p.h +++ b/src/datavisualization/data/qscatterdataproxy_p.h @@ -51,9 +51,11 @@ public: void insertItems(int index, const QScatterDataArray &items); void removeItems(int index, int removeCount); - void limitValues(QVector3D &minValues, QVector3D &maxValues); + void limitValues(QVector3D &minValues, QVector3D &maxValues) const; + virtual void setSeries(QAbstract3DSeries *series); private: + QScatterDataProxy *qptr(); QScatterDataArray *m_dataArray; friend class QScatterDataProxy; diff --git a/src/datavisualization/data/qsurface3dseries.cpp b/src/datavisualization/data/qsurface3dseries.cpp new file mode 100644 index 00000000..a4622580 --- /dev/null +++ b/src/datavisualization/data/qsurface3dseries.cpp @@ -0,0 +1,196 @@ +/**************************************************************************** +** +** 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 "qsurface3dseries_p.h" +#include "surface3dcontroller_p.h" + +QT_DATAVISUALIZATION_BEGIN_NAMESPACE + +/*! + * \class QSurface3DSeries + * \inmodule QtDataVisualization + * \brief Base series class for Q3DSurface. + * \since Qt Data Visualization 1.0 + * + * QSurface3DSeries manages the series specific visual elements, as well as series data + * (via data proxy). + * + * If no data proxy is set explicitly for the series, QSurface3DSeries creates a default + * proxy. If any other proxy is set as active data proxy later, the default proxy and all data + * added to it are destroyed. + * + * QSurface3DSeries supports the following format tags for QAbstract3DSeries::setItemLabelFormat(): + * \table + * \row + * \li @xTitle \li Title from X axis + * \row + * \li @yTitle \li Title from Y axis + * \row + * \li @zTitle \li Title from Z axis + * \row + * \li @xLabel \li Item value formatted using the same format as the X axis attached to the graph uses, + * see \l{Q3DValueAxis::setLabelFormat()} for more information. + * \row + * \li @yLabel \li Item value formatted using the same format as the Y axis attached to the graph uses, + * see \l{Q3DValueAxis::setLabelFormat()} for more information. + * \row + * \li @zLabel \li Item value formatted using the same format as the Z axis attached to the graph uses, + * see \l{Q3DValueAxis::setLabelFormat()} for more information. + * \endtable + * + * For example: + * \snippet doc_src_qtdatavisualization.cpp 1 + * + * \sa {Qt Data Visualization Data Handling} + */ + +/*! + * \qmltype Surface3DSeries + * \inqmlmodule QtDataVisualization + * \since QtDataVisualization 1.0 + * \ingroup datavisualization_qml + * \instantiates QSurface3DSeries + * \inherits Abstract3DSeries + * \brief Base series type for Surfaces3D. + * + * This type manages the series specific visual elements, as well as series data + * (via data proxy). + * + * For more complete description, see QSurface3DSeries. + * + * \sa {Qt Data Visualization Data Handling} + */ + + +/*! + * Constructs QSurface3DSeries with the given \a parent. + */ +QSurface3DSeries::QSurface3DSeries(QObject *parent) : + QAbstract3DSeries(new QSurface3DSeriesPrivate(this), parent) +{ + // Default proxy + dptr()->setDataProxy(new QSurfaceDataProxy); +} + +QSurface3DSeries::QSurface3DSeries(QSurfaceDataProxy *dataProxy, QObject *parent) : + QAbstract3DSeries(new QSurface3DSeriesPrivate(this), parent) +{ + dptr()->setDataProxy(dataProxy); +} + +/*! + * \internal + */ +QSurface3DSeries::QSurface3DSeries(QSurface3DSeriesPrivate *d, QObject *parent) : + QAbstract3DSeries(d, parent) +{ +} + +/*! + * Destroys QSurface3DSeries. + */ +QSurface3DSeries::~QSurface3DSeries() +{ +} + +/*! + * \property QSurface3DSeries::dataProxy + * + * This property holds the active data \a proxy. The series assumes ownership of any proxy set to + * it and deletes any previously set proxy when a new one is added. The \a proxy cannot be null or + * set to another series. + */ +void QSurface3DSeries::setDataProxy(QSurfaceDataProxy *proxy) +{ + d_ptr->setDataProxy(proxy); +} + +QSurfaceDataProxy *QSurface3DSeries::dataProxy() const +{ + return static_cast<QSurfaceDataProxy *>(d_ptr->dataProxy()); +} + +/*! + * \internal + */ +QSurface3DSeriesPrivate *QSurface3DSeries::dptr() +{ + return static_cast<QSurface3DSeriesPrivate *>(d_ptr.data()); +} + +/*! + * \internal + */ +const QSurface3DSeriesPrivate *QSurface3DSeries::dptrc() const +{ + return static_cast<const QSurface3DSeriesPrivate *>(d_ptr.data()); +} + +// QSurface3DSeriesPrivate + +QSurface3DSeriesPrivate::QSurface3DSeriesPrivate(QSurface3DSeries *q) + : QAbstract3DSeriesPrivate(q, QAbstract3DSeries::SeriesTypeSurface) +{ + m_itemLabelFormat = QStringLiteral("(@xLabel, @yLabel, @zLabel)"); +} + +QSurface3DSeriesPrivate::~QSurface3DSeriesPrivate() +{ +} + +QSurface3DSeries *QSurface3DSeriesPrivate::qptr() +{ + return static_cast<QSurface3DSeries *>(q_ptr); +} + +void QSurface3DSeriesPrivate::setDataProxy(QAbstractDataProxy *proxy) +{ + Q_ASSERT(proxy->type() == QAbstractDataProxy::DataTypeSurface); + + QAbstract3DSeriesPrivate::setDataProxy(proxy); + + emit qptr()->dataProxyChanged(static_cast<QSurfaceDataProxy *>(proxy)); +} + +void QSurface3DSeriesPrivate::connectControllerAndProxy(Abstract3DController *newController) +{ + QSurfaceDataProxy *surfaceDataProxy = static_cast<QSurfaceDataProxy *>(m_dataProxy); + + if (m_controller && surfaceDataProxy) { + //Disconnect old controller/old proxy + QObject::disconnect(surfaceDataProxy, 0, m_controller, 0); + QObject::disconnect(q_ptr, 0, m_controller, 0); + } + + if (newController && surfaceDataProxy) { + Surface3DController *controller = static_cast<Surface3DController *>(newController); + + QObject::connect(surfaceDataProxy, &QSurfaceDataProxy::arrayReset, controller, + &Surface3DController::handleArrayReset); + + QObject::connect(q_ptr, &QAbstract3DSeries::visibilityChanged, controller, + &Abstract3DController::handleSeriesVisibilityChanged); + + // Always clear selection on proxy change + // TODO: setSelectedPoint(noSelectionPoint()); + + newController->handleSeriesVisibilityChanged(m_visible); + } +} + +QT_DATAVISUALIZATION_END_NAMESPACE diff --git a/src/datavisualization/data/qsurface3dseries.h b/src/datavisualization/data/qsurface3dseries.h new file mode 100644 index 00000000..db432e41 --- /dev/null +++ b/src/datavisualization/data/qsurface3dseries.h @@ -0,0 +1,58 @@ +/**************************************************************************** +** +** 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 QSURFACE3DSERIES_H +#define QSURFACE3DSERIES_H + +#include <QtDataVisualization/qabstract3dseries.h> +#include <QtDataVisualization/qsurfacedataproxy.h> + +QT_DATAVISUALIZATION_BEGIN_NAMESPACE + +class QSurface3DSeriesPrivate; + +class QT_DATAVISUALIZATION_EXPORT QSurface3DSeries : public QAbstract3DSeries +{ + Q_OBJECT + Q_PROPERTY(QSurfaceDataProxy *dataProxy READ dataProxy WRITE setDataProxy NOTIFY dataProxyChanged) + +public: + explicit QSurface3DSeries(QObject *parent = 0); + explicit QSurface3DSeries(QSurfaceDataProxy *dataProxy, QObject *parent = 0); + virtual ~QSurface3DSeries(); + + void setDataProxy(QSurfaceDataProxy *proxy); + QSurfaceDataProxy *dataProxy() const; + +signals: + void dataProxyChanged(QSurfaceDataProxy *proxy); + +protected: + explicit QSurface3DSeries(QSurface3DSeriesPrivate *d, QObject *parent = 0); + QSurface3DSeriesPrivate *dptr(); + const QSurface3DSeriesPrivate *dptrc() const; + +private: + Q_DISABLE_COPY(QSurface3DSeries) + + friend class Surface3DController; +}; + +QT_DATAVISUALIZATION_END_NAMESPACE + +#endif diff --git a/src/datavisualization/data/qsurface3dseries_p.h b/src/datavisualization/data/qsurface3dseries_p.h new file mode 100644 index 00000000..6e5d9337 --- /dev/null +++ b/src/datavisualization/data/qsurface3dseries_p.h @@ -0,0 +1,55 @@ +/**************************************************************************** +** +** 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 QSURFACE3DSERIES_P_H +#define QSURFACE3DSERIES_P_H + +#include "qsurface3dseries.h" +#include "qabstract3dseries_p.h" + +QT_DATAVISUALIZATION_BEGIN_NAMESPACE + +class QSurface3DSeriesPrivate : public QAbstract3DSeriesPrivate +{ + Q_OBJECT +public: + QSurface3DSeriesPrivate(QSurface3DSeries *q); + virtual ~QSurface3DSeriesPrivate(); + + virtual void setDataProxy(QAbstractDataProxy *proxy); + virtual void connectControllerAndProxy(Abstract3DController *newController); +private: + QSurface3DSeries *qptr(); + +private: + friend class QSurface3DSeries; +}; + +QT_DATAVISUALIZATION_END_NAMESPACE + +#endif diff --git a/src/datavisualization/data/qsurfacedataproxy.cpp b/src/datavisualization/data/qsurfacedataproxy.cpp index 7fe44464..e3c2714c 100644 --- a/src/datavisualization/data/qsurfacedataproxy.cpp +++ b/src/datavisualization/data/qsurfacedataproxy.cpp @@ -18,6 +18,7 @@ #include "qsurfacedataproxy.h" #include "qsurfacedataproxy_p.h" +#include "qsurface3dseries_p.h" QT_DATAVISUALIZATION_BEGIN_NAMESPACE @@ -94,6 +95,12 @@ QT_DATAVISUALIZATION_BEGIN_NAMESPACE */ /*! + * \qmlproperty Surface3DSeries SurfaceDataProxy::series + * + * The series this proxy is attached to. + */ + +/*! * Constructs QSurfaceDataProxy with the given \a parent. */ QSurfaceDataProxy::QSurfaceDataProxy(QObject *parent) : @@ -117,6 +124,16 @@ QSurfaceDataProxy::~QSurfaceDataProxy() } /*! + * \property QSurfaceDataProxy::series + * + * The series this proxy is attached to. + */ +QSurface3DSeries *QSurfaceDataProxy::series() +{ + return static_cast<QSurface3DSeries *>(d_ptr->series()); +} + +/*! * Takes ownership of the \a newArray. Clears the existing array if the \a newArray is * different from the existing array. If it's the same array, this just triggers arrayReset() * signal. @@ -203,7 +220,6 @@ QSurfaceDataProxyPrivate::QSurfaceDataProxyPrivate(QSurfaceDataProxy *q) : QAbstractDataProxyPrivate(q, QAbstractDataProxy::DataTypeSurface), m_dataArray(new QSurfaceDataArray) { - m_itemLabelFormat = QStringLiteral("@yLabel (@xLabel, @zLabel)"); } QSurfaceDataProxyPrivate::~QSurfaceDataProxyPrivate() @@ -227,7 +243,7 @@ QSurfaceDataProxy *QSurfaceDataProxyPrivate::qptr() return static_cast<QSurfaceDataProxy *>(q_ptr); } -void QSurfaceDataProxyPrivate::limitValues(QVector3D &minValues, QVector3D &maxValues) +void QSurfaceDataProxyPrivate::limitValues(QVector3D &minValues, QVector3D &maxValues) const { qreal min = 0.0; qreal max = 0.0; @@ -286,4 +302,11 @@ void QSurfaceDataProxyPrivate::clearArray() delete m_dataArray; } +void QSurfaceDataProxyPrivate::setSeries(QAbstract3DSeries *series) +{ + QAbstractDataProxyPrivate::setSeries(series); + QSurface3DSeries *surfaceSeries = static_cast<QSurface3DSeries *>(series); + emit qptr()->seriesChanged(surfaceSeries); +} + QT_DATAVISUALIZATION_END_NAMESPACE diff --git a/src/datavisualization/data/qsurfacedataproxy.h b/src/datavisualization/data/qsurfacedataproxy.h index 460fa437..ed594963 100644 --- a/src/datavisualization/data/qsurfacedataproxy.h +++ b/src/datavisualization/data/qsurfacedataproxy.h @@ -28,6 +28,7 @@ typedef QVector<QSurfaceDataItem> QSurfaceDataRow; typedef QList<QSurfaceDataRow *> QSurfaceDataArray; class QSurfaceDataProxyPrivate; +class QSurface3DSeries; class QT_DATAVISUALIZATION_EXPORT QSurfaceDataProxy : public QAbstractDataProxy { @@ -35,11 +36,13 @@ class QT_DATAVISUALIZATION_EXPORT QSurfaceDataProxy : public QAbstractDataProxy Q_PROPERTY(int rowCount READ rowCount) Q_PROPERTY(int columnCount READ columnCount) + Q_PROPERTY(QSurface3DSeries *series READ series NOTIFY seriesChanged) public: explicit QSurfaceDataProxy(QObject *parent = 0); virtual ~QSurfaceDataProxy(); + QSurface3DSeries *series(); int rowCount() const; int columnCount() const; const QSurfaceDataArray *array() const; @@ -49,6 +52,7 @@ public: signals: void arrayReset(); + void seriesChanged(QSurface3DSeries *series); protected: explicit QSurfaceDataProxy(QSurfaceDataProxyPrivate *d, QObject *parent = 0); diff --git a/src/datavisualization/data/qsurfacedataproxy_p.h b/src/datavisualization/data/qsurfacedataproxy_p.h index 4c8c2820..066df629 100644 --- a/src/datavisualization/data/qsurfacedataproxy_p.h +++ b/src/datavisualization/data/qsurfacedataproxy_p.h @@ -45,7 +45,9 @@ public: void resetArray(QSurfaceDataArray *newArray); - void limitValues(QVector3D &minValues, QVector3D &maxValues); + void limitValues(QVector3D &minValues, QVector3D &maxValues) const; + + virtual void setSeries(QAbstract3DSeries *series); protected: QSurfaceDataArray *m_dataArray; |