From 71b501d31ae7c5d3aab987b54acccecce1136896 Mon Sep 17 00:00:00 2001 From: Miikka Heikkinen Date: Fri, 24 Jan 2014 13:45:18 +0200 Subject: Added series rotation and bar item rotation support MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Task-number: QTRD-2654 Change-Id: I864d33bc173b35b8680eddb402bdf1817ecb031f Reviewed-by: Tomi Korpipää --- src/datavisualization/data/barrenderitem.cpp | 3 +- src/datavisualization/data/barrenderitem_p.h | 8 +++- src/datavisualization/data/qabstract3dseries.cpp | 47 +++++++++++++++++++++++- src/datavisualization/data/qabstract3dseries.h | 6 +++ src/datavisualization/data/qabstract3dseries_p.h | 4 ++ src/datavisualization/data/qbardataitem.cpp | 27 +++++++++++++- src/datavisualization/data/qbardataitem.h | 8 +++- src/datavisualization/data/qscatterdataitem.cpp | 5 +++ src/datavisualization/data/scatterrenderitem.cpp | 1 + 9 files changed, 101 insertions(+), 8 deletions(-) (limited to 'src/datavisualization/data') diff --git a/src/datavisualization/data/barrenderitem.cpp b/src/datavisualization/data/barrenderitem.cpp index 1bb1271d..a558e1fd 100644 --- a/src/datavisualization/data/barrenderitem.cpp +++ b/src/datavisualization/data/barrenderitem.cpp @@ -39,6 +39,7 @@ BarRenderItem::BarRenderItem(const BarRenderItem &other) m_sliceLabel = other.m_sliceLabel; m_sliceLabelItem = 0; m_seriesIndex = other.m_seriesIndex; + m_rotation = other.m_rotation; } BarRenderItem::~BarRenderItem() @@ -60,7 +61,7 @@ void BarRenderItem::setSliceLabel(const QString &label) m_sliceLabel = label; } -QString &BarRenderItem::sliceLabel() +const QString &BarRenderItem::sliceLabel() const { return m_sliceLabel; } diff --git a/src/datavisualization/data/barrenderitem_p.h b/src/datavisualization/data/barrenderitem_p.h index 7704d65e..66c9c460 100644 --- a/src/datavisualization/data/barrenderitem_p.h +++ b/src/datavisualization/data/barrenderitem_p.h @@ -67,12 +67,15 @@ public: // Formatted label for item. void setSliceLabel(const QString &label); - QString &sliceLabel(); // Formats label if not previously formatted + const QString &sliceLabel() const; // Formats label if not previously formatted // Series index in visual series that this item belongs to. // This is only utilized by slicing, so it may not be up to date on all items. inline void setSeriesIndex(int seriesIndex) { m_seriesIndex = seriesIndex; } - inline int seriesIndex() { return m_seriesIndex; } + inline int seriesIndex() const { return m_seriesIndex; } + + inline void setRotation(const QQuaternion &rotation) { m_rotation = rotation; } + inline const QQuaternion &rotation() const { return m_rotation; } protected: float m_value; @@ -81,6 +84,7 @@ protected: QString m_sliceLabel; LabelItem *m_sliceLabelItem; int m_seriesIndex; + QQuaternion m_rotation; friend class QBarDataItem; }; diff --git a/src/datavisualization/data/qabstract3dseries.cpp b/src/datavisualization/data/qabstract3dseries.cpp index a3f766a8..d80879f0 100644 --- a/src/datavisualization/data/qabstract3dseries.cpp +++ b/src/datavisualization/data/qabstract3dseries.cpp @@ -141,6 +141,18 @@ QT_BEGIN_NAMESPACE_DATAVISUALIZATION * Defaults to \c false. */ +/*! + * \qmlproperty quaternion Abstract3DSeries::meshRotation + * + * Sets the mesh \a rotation that is applied to all items of the series. + * The \a rotation should be a normalized quaternion. + * For those series types that support item specific rotation, the rotations are + * multiplied together. + * Bar3DSeries ignores any rotation that is not around Y-axis. + * Surface3DSeries applies the rotation only to the selection pointer. + * Defaults to no rotation. + */ + /*! * \qmlproperty string Abstract3DSeries::userDefinedMesh * @@ -303,7 +315,8 @@ bool QAbstract3DSeries::isVisible() const */ void QAbstract3DSeries::setMesh(QAbstract3DSeries::Mesh mesh) { - if ((mesh == QAbstract3DSeries::MeshPoint || mesh == QAbstract3DSeries::MeshMinimal) + if ((mesh == QAbstract3DSeries::MeshPoint || mesh == QAbstract3DSeries::MeshMinimal + || mesh == QAbstract3DSeries::MeshArrow) && type() != QAbstract3DSeries::SeriesTypeScatter) { qWarning() << "Specified style is only supported for QScatter3DSeries."; } else if (d_ptr->m_mesh != mesh) { @@ -337,6 +350,30 @@ bool QAbstract3DSeries::isMeshSmooth() const return d_ptr->m_meshSmooth; } +/*! + * \property QAbstract3DSeries::meshRotation + * + * Sets the mesh \a rotation that is applied to all items of the series. + * The \a rotation should be a normalized QQuaternion. + * For those series types that support item specific rotation, the rotations are + * multiplied together. + * QBar3DSeries ignores any rotation that is not around Y-axis. + * QSurface3DSeries applies the rotation only to the selection pointer. + * Defaults to no rotation. + */ +void QAbstract3DSeries::setMeshRotation(const QQuaternion &rotation) +{ + if (d_ptr->m_meshRotation != rotation) { + d_ptr->setMeshRotation(rotation); + emit meshRotationChanged(rotation); + } +} + +QQuaternion QAbstract3DSeries::meshRotation() const +{ + return d_ptr->m_meshRotation; +} + /*! * \property QAbstract3DSeries::userDefinedMesh * @@ -608,6 +645,14 @@ void QAbstract3DSeriesPrivate::setMeshSmooth(bool enable) m_controller->markSeriesVisualsDirty(); } +void QAbstract3DSeriesPrivate::setMeshRotation(const QQuaternion &rotation) +{ + m_meshRotation = rotation; + m_changeTracker.meshRotationChanged = true; + if (m_controller) + m_controller->markSeriesVisualsDirty(); +} + void QAbstract3DSeriesPrivate::setUserDefinedMesh(const QString &meshFile) { m_userDefinedMesh = meshFile; diff --git a/src/datavisualization/data/qabstract3dseries.h b/src/datavisualization/data/qabstract3dseries.h index df6dada8..5e7fe016 100644 --- a/src/datavisualization/data/qabstract3dseries.h +++ b/src/datavisualization/data/qabstract3dseries.h @@ -23,6 +23,7 @@ #include #include #include +#include QT_BEGIN_NAMESPACE_DATAVISUALIZATION @@ -38,6 +39,7 @@ class QT_DATAVISUALIZATION_EXPORT QAbstract3DSeries : public QObject Q_PROPERTY(bool visible READ isVisible WRITE setVisible NOTIFY visibilityChanged) Q_PROPERTY(Mesh mesh READ mesh WRITE setMesh NOTIFY meshChanged) Q_PROPERTY(bool meshSmooth READ isMeshSmooth WRITE setMeshSmooth NOTIFY meshSmoothChanged) + Q_PROPERTY(QQuaternion meshRotation READ meshRotation WRITE setMeshRotation NOTIFY meshRotationChanged) Q_PROPERTY(QString userDefinedMesh READ userDefinedMesh WRITE setUserDefinedMesh NOTIFY userDefinedMeshChanged) Q_PROPERTY(QtDataVisualization::Q3DTheme::ColorStyle colorStyle READ colorStyle WRITE setColorStyle NOTIFY colorStyleChanged) Q_PROPERTY(QColor baseColor READ baseColor WRITE setBaseColor NOTIFY baseColorChanged) @@ -91,6 +93,9 @@ public: void setMeshSmooth(bool enable); bool isMeshSmooth() const; + void setMeshRotation(const QQuaternion &rotation); + QQuaternion meshRotation() const; + void setUserDefinedMesh(const QString &fileName); QString userDefinedMesh() const; @@ -117,6 +122,7 @@ signals: void visibilityChanged(bool visible); void meshChanged(Mesh mesh); void meshSmoothChanged(bool enabled); + void meshRotationChanged(QQuaternion rotation); void userDefinedMeshChanged(QString fileName); void colorStyleChanged(Q3DTheme::ColorStyle style); void baseColorChanged(QColor color); diff --git a/src/datavisualization/data/qabstract3dseries_p.h b/src/datavisualization/data/qabstract3dseries_p.h index f1bc1f95..565d35a2 100644 --- a/src/datavisualization/data/qabstract3dseries_p.h +++ b/src/datavisualization/data/qabstract3dseries_p.h @@ -42,6 +42,7 @@ struct QAbstract3DSeriesChangeBitField { bool itemLabelFormatChanged : 1; bool meshChanged : 1; bool meshSmoothChanged : 1; + bool meshRotationChanged : 1; bool userDefinedMeshChanged : 1; bool colorStyleChanged : 1; bool baseColorChanged : 1; @@ -56,6 +57,7 @@ struct QAbstract3DSeriesChangeBitField { : itemLabelFormatChanged(true), meshChanged(true), meshSmoothChanged(true), + meshRotationChanged(true), userDefinedMeshChanged(true), colorStyleChanged(true), baseColorChanged(true), @@ -106,6 +108,7 @@ public: void setVisible(bool visible); void setMesh(QAbstract3DSeries::Mesh mesh); void setMeshSmooth(bool enable); + void setMeshRotation(const QQuaternion &rotation); void setUserDefinedMesh(const QString &meshFile); void setColorStyle(Q3DTheme::ColorStyle style); @@ -129,6 +132,7 @@ public: Abstract3DController *m_controller; QAbstract3DSeries::Mesh m_mesh; bool m_meshSmooth; + QQuaternion m_meshRotation; QString m_userDefinedMesh; Q3DTheme::ColorStyle m_colorStyle; diff --git a/src/datavisualization/data/qbardataitem.cpp b/src/datavisualization/data/qbardataitem.cpp index 3e8ebee2..eb14c7f9 100644 --- a/src/datavisualization/data/qbardataitem.cpp +++ b/src/datavisualization/data/qbardataitem.cpp @@ -37,7 +37,8 @@ QT_BEGIN_NAMESPACE_DATAVISUALIZATION */ QBarDataItem::QBarDataItem() : d_ptr(0), // private data doesn't exist by default (optimization) - m_value(0.0f) + m_value(0.0f), + m_angle(0.0f) { } @@ -46,7 +47,18 @@ QBarDataItem::QBarDataItem() */ QBarDataItem::QBarDataItem(float value) : d_ptr(0), - m_value(value) + m_value(value), + m_angle(0.0f) +{ +} + +/*! + * Constructs QBarDataItem with \a value and \a angle + */ +QBarDataItem::QBarDataItem(float value, float angle) + : d_ptr(0), + m_value(value), + m_angle(angle) { } @@ -72,6 +84,7 @@ QBarDataItem::~QBarDataItem() QBarDataItem &QBarDataItem::operator=(const QBarDataItem &other) { m_value = other.m_value; + m_angle = other.m_angle; if (other.d_ptr) createExtraData(); else @@ -89,6 +102,16 @@ QBarDataItem &QBarDataItem::operator=(const QBarDataItem &other) * \return value of this data item. */ +/*! + * \fn void QBarDataItem::setRotation(float angle) + * Sets rotation \a angle in degrees for this data item. + */ + +/*! + * \fn float QBarDataItem::rotation() const + * \return rotation angle in degrees for this data item. + */ + /*! * \internal */ diff --git a/src/datavisualization/data/qbardataitem.h b/src/datavisualization/data/qbardataitem.h index 57a14efb..f16a21b7 100644 --- a/src/datavisualization/data/qbardataitem.h +++ b/src/datavisualization/data/qbardataitem.h @@ -30,13 +30,16 @@ class QT_DATAVISUALIZATION_EXPORT QBarDataItem public: QBarDataItem(); QBarDataItem(float value); + QBarDataItem(float value, float angle); QBarDataItem(const QBarDataItem &other); ~QBarDataItem(); QBarDataItem &operator=(const QBarDataItem &other); - void setValue(float value) { m_value = value; } - float value() const { return m_value; } + inline void setValue(float value) { m_value = value; } + inline float value() const { return m_value; } + inline void setRotation(float angle) { m_angle = angle; } + inline float rotation() const { return m_angle; } protected: virtual void createExtraData(); @@ -45,6 +48,7 @@ protected: private: float m_value; + float m_angle; }; QT_END_NAMESPACE_DATAVISUALIZATION diff --git a/src/datavisualization/data/qscatterdataitem.cpp b/src/datavisualization/data/qscatterdataitem.cpp index d4641c7f..b8b85381 100644 --- a/src/datavisualization/data/qscatterdataitem.cpp +++ b/src/datavisualization/data/qscatterdataitem.cpp @@ -72,6 +72,7 @@ QScatterDataItem::~QScatterDataItem() QScatterDataItem &QScatterDataItem::operator=(const QScatterDataItem &other) { m_position = other.m_position; + m_rotation = other.m_rotation; if (other.d_ptr) createExtraData(); @@ -94,11 +95,15 @@ QScatterDataItem &QScatterDataItem::operator=(const QScatterDataItem &other) /*! * \fn void QScatterDataItem::setRotation(const QQuaternion &rotation) * Sets \a rotation to this data item. + * The \a rotation should be a normalized QQuaternion. + * If the series also has rotation, item and series rotations are multiplied together. + * Defaults to no rotation. */ /*! * \fn QQuaternion QScatterDataItem::rotation() const * \return rotation of this data item. + * \sa setRotation() */ /*! diff --git a/src/datavisualization/data/scatterrenderitem.cpp b/src/datavisualization/data/scatterrenderitem.cpp index 635f11cb..236893a8 100644 --- a/src/datavisualization/data/scatterrenderitem.cpp +++ b/src/datavisualization/data/scatterrenderitem.cpp @@ -33,6 +33,7 @@ ScatterRenderItem::ScatterRenderItem(const ScatterRenderItem &other) m_visible(false) { m_position = other.m_position; + m_rotation = other.m_rotation; } ScatterRenderItem::~ScatterRenderItem() -- cgit v1.2.3