blob: 42579f628c450b2f5f588ccded39ebd220d79cc4 [file] [log] [blame]
/****************************************************************************
**
** Copyright (C) 2016 The Qt Company Ltd.
** Contact: https://www.qt.io/licensing/
**
** This file is part of the Qt Data Visualization module of the Qt Toolkit.
**
** $QT_BEGIN_LICENSE:GPL$
** Commercial License Usage
** Licensees holding valid commercial Qt licenses may use this file in
** accordance with the commercial license agreement provided with the
** Software or, alternatively, in accordance with the terms contained in
** a written agreement between you and The Qt Company. For licensing terms
** and conditions see https://www.qt.io/terms-conditions. For further
** information use the contact form at https://www.qt.io/contact-us.
**
** GNU General Public License Usage
** Alternatively, this file may be used under the terms of the GNU
** General Public License version 3 or (at your option) any later version
** approved by the KDE Free Qt Foundation. The licenses are as published by
** the Free Software Foundation and appearing in the file LICENSE.GPL3
** included in the packaging of this file. Please review the following
** information to ensure the GNU General Public License requirements will
** be met: https://www.gnu.org/licenses/gpl-3.0.html.
**
** $QT_END_LICENSE$
**
****************************************************************************/
#include "qabstract3dseries_p.h"
#include "qabstractdataproxy_p.h"
#include "abstract3dcontroller_p.h"
QT_BEGIN_NAMESPACE_DATAVISUALIZATION
/*!
* \class QAbstract3DSeries
* \inmodule QtDataVisualization
* \brief The QAbstract3DSeries class is a base class for all data series.
* \since QtDataVisualization 1.0
*
* There are inherited classes for each supported series type: QBar3DSeries,
* QScatter3DSeries, and QSurface3DSeries.
*
* For more information, see \l{Qt Data Visualization Data Handling}.
*/
/*!
* \class QAbstract3DSeriesChangeBitField
* \internal
*/
/*!
* \class QAbstract3DSeriesThemeOverrideBitField
* \internal
*/
/*!
* \qmltype Abstract3DSeries
* \inqmlmodule QtDataVisualization
* \since QtDataVisualization 1.0
* \ingroup datavisualization_qml
* \instantiates QAbstract3DSeries
* \brief A base type for all data series.
*
* This type is uncreatable, but contains properties that are exposed via the
* following subtypes: Bar3DSeries, Scatter3DSeries, and Surface3DSeries.
*
* For more information, see \l{Qt Data Visualization Data Handling}.
*/
/*!
* \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.
*/
/*!
* \enum QAbstract3DSeries::Mesh
*
* Predefined mesh types. All styles are not usable with all visualization types.
*
* \value MeshUserDefined
* User defined mesh, set via QAbstract3DSeries::userDefinedMesh property.
* \value MeshBar
* Basic rectangular bar.
* \value MeshCube
* Basic cube.
* \value MeshPyramid
* Four-sided pyramid.
* \value MeshCone
* Basic cone.
* \value MeshCylinder
* Basic cylinder.
* \value MeshBevelBar
* Slightly beveled (rounded) rectangular bar.
* \value MeshBevelCube
* Slightly beveled (rounded) cube.
* \value MeshSphere
* Sphere.
* \value MeshMinimal
* The minimal 3D mesh: a triangular pyramid. Usable only with Q3DScatter.
* \value MeshArrow
* Arrow pointing upwards.
* \value MeshPoint
* 2D point. Usable only with Q3DScatter.
* Shadows do not affect this style. Color style Q3DTheme::ColorStyleObjectGradient
* is not supported by this style.
*/
/*!
* \qmlproperty Abstract3DSeries.SeriesType Abstract3DSeries::type
* The type of the series. One of the QAbstract3DSeries::SeriesType values.
*
*/
/*!
* \qmlproperty string Abstract3DSeries::itemLabelFormat
*
* The 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: Bar3DSeries, Scatter3DSeries, Surface3DSeries.
*/
/*!
* \qmlproperty bool Abstract3DSeries::visible
* Sets the visibility of the series. If \c false, the series is not rendered.
*/
/*!
* \qmlproperty Abstract3DSeries.Mesh Abstract3DSeries::mesh
*
* Sets the mesh of the items in the series, or the selection pointer in case of
* Surface3DSeries. If the mesh is \l{QAbstract3DSeries::MeshUserDefined}{Abstract3DSeries.MeshUserDefined},
* then the userDefinedMesh property must also be set for items to render properly.
* The default value depends on the graph type.
*
* \sa QAbstract3DSeries::Mesh
*/
/*!
* \qmlproperty bool Abstract3DSeries::meshSmooth
*
* If \c true, smooth versions of predefined meshes set via the \l mesh property are used.
* This property does not affect custom meshes used when the mesh is set to
* \l{QAbstract3DSeries::MeshUserDefined}{Abstract3DSeries.MeshUserDefined}.
* Defaults to \c{false}.
*/
/*!
* \qmlproperty quaternion Abstract3DSeries::meshRotation
*
* Sets the mesh rotation that is applied to all items of the series.
* The 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 the y-axis.
* Surface3DSeries applies the rotation only to the selection pointer.
* Defaults to no rotation.
*/
/*!
* \qmlproperty string Abstract3DSeries::userDefinedMesh
*
* Sets the filename for a user defined custom mesh for objects that is used when \l mesh
* is \l{QAbstract3DSeries::MeshUserDefined}{Abstract3DSeries.MeshUserDefined}.
* \note The file needs to be in the Wavefront OBJ format and include
* vertices, normals, and UVs. It also needs to be in triangles.
*/
/*!
* \qmlproperty Theme3D.ColorStyle Abstract3DSeries::colorStyle
*
* Sets the color style for the series.
*
* \sa {Theme3D::colorStyle}{Theme3D.colorStyle}
*/
/*!
* \qmlproperty color Abstract3DSeries::baseColor
*
* Sets the base color of the series.
*
* \sa colorStyle, {Theme3D::baseColors}{Theme3D.baseColors}
*/
/*!
* \qmlproperty ColorGradient Abstract3DSeries::baseGradient
*
* Sets the base gradient of the series.
*
* \sa colorStyle, {Theme3D::baseGradients}{Theme3D.baseGradients}
*/
/*!
* \qmlproperty color Abstract3DSeries::singleHighlightColor
*
* Sets the single item highlight color of the series.
*
* \sa colorStyle, {Theme3D::singleHighlightColor}{Theme3D.singleHighlightColor}
*/
/*!
* \qmlproperty ColorGradient Abstract3DSeries::singleHighlightGradient
*
* Sets the single item highlight gradient of the series.
*
* \sa colorStyle, {Theme3D::singleHighlightGradient}{Theme3D.singleHighlightGradient}
*/
/*!
* \qmlproperty color Abstract3DSeries::multiHighlightColor
*
* Sets the multiple item highlight color of the series.
*
* \sa colorStyle, {Theme3D::multiHighlightColor}{Theme3D.multiHighlightColor}
*/
/*!
* \qmlproperty ColorGradient Abstract3DSeries::multiHighlightGradient
*
* Sets the multiple item highlight gradient of the series.
*
* \sa colorStyle, {Theme3D::multiHighlightGradient}{Theme3D.multiHighlightGradient}
*/
/*!
* \qmlproperty string Abstract3DSeries::name
*
* The series name.
* It can be used in item label format with the tag \c{@seriesName}.
*
* \sa itemLabelFormat
*/
/*!
* \qmlproperty string Abstract3DSeries::itemLabel
* \since QtDataVisualization 1.1
*
* The formatted item label. If there is no selected item or the selected item is not
* visible, returns an empty string.
*
* \sa itemLabelFormat
*/
/*!
* \qmlproperty bool Abstract3DSeries::itemLabelVisible
* \since QtDataVisualization 1.1
*
* If \c true, item labels are drawn as floating labels in the graph. Otherwise,
* item labels are not drawn. To show the item label in an external control,
* this property is set to \c false. Defaults to \c true.
*
* \sa itemLabelFormat, itemLabel
*/
/*!
* \qmlmethod void Abstract3DSeries::setMeshAxisAndAngle(vector3d axis, real angle)
*
* A convenience function to construct a mesh rotation quaternion from \a axis
* and \a angle.
*
* \sa meshRotation
*/
/*!
* \internal
*/
QAbstract3DSeries::QAbstract3DSeries(QAbstract3DSeriesPrivate *d, QObject *parent) :
QObject(parent),
d_ptr(d)
{
}
/*!
* Deletes the abstract 3D series.
*/
QAbstract3DSeries::~QAbstract3DSeries()
{
}
/*!
* \property QAbstract3DSeries::type
*
* \brief The type of the series.
*/
QAbstract3DSeries::SeriesType QAbstract3DSeries::type() const
{
return d_ptr->m_type;
}
/*!
* \property QAbstract3DSeries::itemLabelFormat
*
* \brief The 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: QBar3DSeries, QScatter3DSeries, QSurface3DSeries.
*/
void QAbstract3DSeries::setItemLabelFormat(const QString &format)
{
if (d_ptr->m_itemLabelFormat != format) {
d_ptr->setItemLabelFormat(format);
emit itemLabelFormatChanged(format);
}
}
QString QAbstract3DSeries::itemLabelFormat() const
{
return d_ptr->m_itemLabelFormat;
}
/*!
* \property QAbstract3DSeries::visible
*
* \brief The visibility of the series.
*
* If this property is \c false, the series is not rendered.
* Defaults to \c{true}.
*/
void QAbstract3DSeries::setVisible(bool visible)
{
if (d_ptr->m_visible != visible) {
d_ptr->setVisible(visible);
emit visibilityChanged(visible);
}
}
bool QAbstract3DSeries::isVisible() const
{
return d_ptr->m_visible;
}
/*!
* \property QAbstract3DSeries::mesh
*
* \brief The mesh of the items in the series.
*
* For QSurface3DSeries, this property holds the selection pointer.
*
* If the mesh is MeshUserDefined, then the userDefinedMesh property
* must also be set for items to render properly. The default value depends on the graph type.
*/
void QAbstract3DSeries::setMesh(QAbstract3DSeries::Mesh mesh)
{
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) {
d_ptr->setMesh(mesh);
emit meshChanged(mesh);
}
}
QAbstract3DSeries::Mesh QAbstract3DSeries::mesh() const
{
return d_ptr->m_mesh;
}
/*!
* \property QAbstract3DSeries::meshSmooth
*
* \brief Whether smooth versions of predefined meshes are used.
*
* If \c true, smooth versions set via the \l mesh property are used.
* This property does not affect custom meshes used when the mesh is set to
* MeshUserDefined. Defaults to \c{false}.
*/
void QAbstract3DSeries::setMeshSmooth(bool enable)
{
if (d_ptr->m_meshSmooth != enable) {
d_ptr->setMeshSmooth(enable);
emit meshSmoothChanged(enable);
}
}
bool QAbstract3DSeries::isMeshSmooth() const
{
return d_ptr->m_meshSmooth;
}
/*!
* \property QAbstract3DSeries::meshRotation
*
* \brief The mesh rotation that is applied to all items of the series.
*
* The 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 the 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;
}
/*!
* A convenience function to construct a mesh rotation quaternion from
* \a axis and \a angle.
*
* \sa meshRotation
*/
void QAbstract3DSeries::setMeshAxisAndAngle(const QVector3D &axis, float angle)
{
setMeshRotation(QQuaternion::fromAxisAndAngle(axis, angle));
}
/*!
* \property QAbstract3DSeries::userDefinedMesh
*
* \brief The filename for a user defined custom mesh for objects.
*
* The custom mesh is used when \l mesh is MeshUserDefined.
* \note The file needs to be in the Wavefront OBJ format and include
* vertices, normals, and UVs. It also needs to be in triangles.
*/
void QAbstract3DSeries::setUserDefinedMesh(const QString &fileName)
{
if (d_ptr->m_userDefinedMesh != fileName) {
d_ptr->setUserDefinedMesh(fileName);
emit userDefinedMeshChanged(fileName);
}
}
QString QAbstract3DSeries::userDefinedMesh() const
{
return d_ptr->m_userDefinedMesh;
}
/*!
* \property QAbstract3DSeries::colorStyle
*
* \brief The color style for the series.
*
* \sa Q3DTheme::ColorStyle
*/
void QAbstract3DSeries::setColorStyle(Q3DTheme::ColorStyle style)
{
if (d_ptr->m_colorStyle != style) {
d_ptr->setColorStyle(style);
emit colorStyleChanged(style);
}
d_ptr->m_themeTracker.colorStyleOverride = true;
}
Q3DTheme::ColorStyle QAbstract3DSeries::colorStyle() const
{
return d_ptr->m_colorStyle;
}
/*!
* \property QAbstract3DSeries::baseColor
*
* \brief The base color of the series.
*
* \sa colorStyle, Q3DTheme::baseColors
*/
void QAbstract3DSeries::setBaseColor(const QColor &color)
{
if (d_ptr->m_baseColor != color) {
d_ptr->setBaseColor(color);
emit baseColorChanged(color);
}
d_ptr->m_themeTracker.baseColorOverride = true;
}
QColor QAbstract3DSeries::baseColor() const
{
return d_ptr->m_baseColor;
}
/*!
* \property QAbstract3DSeries::baseGradient
*
* \brief The base gradient of the series.
*
* \sa colorStyle, Q3DTheme::baseGradients
*/
void QAbstract3DSeries::setBaseGradient(const QLinearGradient &gradient)
{
if (d_ptr->m_baseGradient != gradient) {
d_ptr->setBaseGradient(gradient);
emit baseGradientChanged(gradient);
}
d_ptr->m_themeTracker.baseGradientOverride = true;
}
QLinearGradient QAbstract3DSeries::baseGradient() const
{
return d_ptr->m_baseGradient;
}
/*!
* \property QAbstract3DSeries::singleHighlightColor
*
* \brief The single item highlight color of the series.
*
* \sa colorStyle, Q3DTheme::singleHighlightColor
*/
void QAbstract3DSeries::setSingleHighlightColor(const QColor &color)
{
if (d_ptr->m_singleHighlightColor != color) {
d_ptr->setSingleHighlightColor(color);
emit singleHighlightColorChanged(color);
}
d_ptr->m_themeTracker.singleHighlightColorOverride = true;
}
QColor QAbstract3DSeries::singleHighlightColor() const
{
return d_ptr->m_singleHighlightColor;
}
/*!
* \property QAbstract3DSeries::singleHighlightGradient
*
* \brief The single item highlight gradient of the series.
*
* \sa colorStyle, Q3DTheme::singleHighlightGradient
*/
void QAbstract3DSeries::setSingleHighlightGradient(const QLinearGradient &gradient)
{
if (d_ptr->m_singleHighlightGradient != gradient) {
d_ptr->setSingleHighlightGradient(gradient);
emit singleHighlightGradientChanged(gradient);
}
d_ptr->m_themeTracker.singleHighlightGradientOverride = true;
}
QLinearGradient QAbstract3DSeries::singleHighlightGradient() const
{
return d_ptr->m_singleHighlightGradient;
}
/*!
* \property QAbstract3DSeries::multiHighlightColor
*
* \brief The multiple item highlight color of the series.
*
* \sa colorStyle, Q3DTheme::multiHighlightColor
*/
void QAbstract3DSeries::setMultiHighlightColor(const QColor &color)
{
if (d_ptr->m_multiHighlightColor != color) {
d_ptr->setMultiHighlightColor(color);
emit multiHighlightColorChanged(color);
}
d_ptr->m_themeTracker.multiHighlightColorOverride = true;
}
QColor QAbstract3DSeries::multiHighlightColor() const
{
return d_ptr->m_multiHighlightColor;
}
/*!
* \property QAbstract3DSeries::multiHighlightGradient
*
* \brief The multiple item highlight gradient of the series.
*
* \sa colorStyle, Q3DTheme::multiHighlightGradient
*/
void QAbstract3DSeries::setMultiHighlightGradient(const QLinearGradient &gradient)
{
if (d_ptr->m_multiHighlightGradient != gradient) {
d_ptr->setMultiHighlightGradient(gradient);
emit multiHighlightGradientChanged(gradient);
}
d_ptr->m_themeTracker.multiHighlightGradientOverride = true;
}
QLinearGradient QAbstract3DSeries::multiHighlightGradient() const
{
return d_ptr->m_multiHighlightGradient;
}
/*!
* \property QAbstract3DSeries::name
*
* \brief The series name.
*
* The series name can be used in item label format with the tag \c{@seriesName}.
*
* \sa itemLabelFormat
*/
void QAbstract3DSeries::setName(const QString &name)
{
if (d_ptr->m_name != name) {
d_ptr->setName(name);
emit nameChanged(name);
}
}
QString QAbstract3DSeries::name() const
{
return d_ptr->m_name;
}
/*!
* \property QAbstract3DSeries::itemLabel
* \since QtDataVisualization 1.1
*
* \brief The formatted item label.
*
* If there is no selected item or the selected item is not
* visible, returns an empty string.
*
* \sa itemLabelFormat
*/
QString QAbstract3DSeries::itemLabel() const
{
return d_ptr->itemLabel();
}
/*!
* \property QAbstract3DSeries::itemLabelVisible
* \since QtDataVisualization 1.1
*
* \brief The visibility of item labels in the graph.
*
* If \c true, item labels are drawn as floating labels in the graph. Otherwise,
* item labels are not drawn. To show the item label in an external control,
* this property is set to \c false. Defaults to \c true.
*
* \sa itemLabelFormat, itemLabel
*/
void QAbstract3DSeries::setItemLabelVisible(bool visible)
{
if (d_ptr->m_itemLabelVisible != visible) {
d_ptr->setItemLabelVisible(visible);
emit itemLabelVisibilityChanged(visible);
}
}
bool QAbstract3DSeries::isItemLabelVisible() const
{
return d_ptr->m_itemLabelVisible;
}
// 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),
m_mesh(QAbstract3DSeries::MeshCube),
m_meshSmooth(false),
m_colorStyle(Q3DTheme::ColorStyleUniform),
m_baseColor(Qt::black),
m_singleHighlightColor(Qt::black),
m_multiHighlightColor(Qt::black),
m_itemLabelDirty(true),
m_itemLabelVisible(true)
{
}
QAbstract3DSeriesPrivate::~QAbstract3DSeriesPrivate()
{
}
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);
m_controller->markDataDirty();
}
}
void QAbstract3DSeriesPrivate::setController(Abstract3DController *controller)
{
connectControllerAndProxy(controller);
m_controller = controller;
q_ptr->setParent(controller);
markItemLabelDirty();
}
void QAbstract3DSeriesPrivate::setItemLabelFormat(const QString &format)
{
m_itemLabelFormat = format;
markItemLabelDirty();
}
void QAbstract3DSeriesPrivate::setVisible(bool visible)
{
m_visible = visible;
markItemLabelDirty();
}
void QAbstract3DSeriesPrivate::setMesh(QAbstract3DSeries::Mesh mesh)
{
m_mesh = mesh;
m_changeTracker.meshChanged = true;
if (m_controller) {
m_controller->markSeriesVisualsDirty();
if (m_controller->optimizationHints().testFlag(QAbstract3DGraph::OptimizationStatic))
m_controller->markDataDirty();
}
}
void QAbstract3DSeriesPrivate::setMeshSmooth(bool enable)
{
m_meshSmooth = enable;
m_changeTracker.meshSmoothChanged = true;
if (m_controller) {
m_controller->markSeriesVisualsDirty();
if (m_controller->optimizationHints().testFlag(QAbstract3DGraph::OptimizationStatic))
m_controller->markDataDirty();
}
}
void QAbstract3DSeriesPrivate::setMeshRotation(const QQuaternion &rotation)
{
m_meshRotation = rotation;
m_changeTracker.meshRotationChanged = true;
if (m_controller) {
m_controller->markSeriesVisualsDirty();
if (m_controller->optimizationHints().testFlag(QAbstract3DGraph::OptimizationStatic))
m_controller->markDataDirty();
}
}
void QAbstract3DSeriesPrivate::setUserDefinedMesh(const QString &meshFile)
{
m_userDefinedMesh = meshFile;
m_changeTracker.userDefinedMeshChanged = true;
if (m_controller) {
m_controller->markSeriesVisualsDirty();
if (m_controller->optimizationHints().testFlag(QAbstract3DGraph::OptimizationStatic))
m_controller->markDataDirty();
}
}
void QAbstract3DSeriesPrivate::setColorStyle(Q3DTheme::ColorStyle style)
{
m_colorStyle = style;
m_changeTracker.colorStyleChanged = true;
if (m_controller)
m_controller->markSeriesVisualsDirty();
}
void QAbstract3DSeriesPrivate::setBaseColor(const QColor &color)
{
m_baseColor = color;
m_changeTracker.baseColorChanged = true;
if (m_controller)
m_controller->markSeriesVisualsDirty();
}
void QAbstract3DSeriesPrivate::setBaseGradient(const QLinearGradient &gradient)
{
m_baseGradient = gradient;
m_changeTracker.baseGradientChanged = true;
if (m_controller)
m_controller->markSeriesVisualsDirty();
}
void QAbstract3DSeriesPrivate::setSingleHighlightColor(const QColor &color)
{
m_singleHighlightColor = color;
m_changeTracker.singleHighlightColorChanged = true;
if (m_controller)
m_controller->markSeriesVisualsDirty();
}
void QAbstract3DSeriesPrivate::setSingleHighlightGradient(const QLinearGradient &gradient)
{
m_singleHighlightGradient = gradient;
m_changeTracker.singleHighlightGradientChanged = true;
if (m_controller)
m_controller->markSeriesVisualsDirty();
}
void QAbstract3DSeriesPrivate::setMultiHighlightColor(const QColor &color)
{
m_multiHighlightColor = color;
m_changeTracker.multiHighlightColorChanged = true;
if (m_controller)
m_controller->markSeriesVisualsDirty();
}
void QAbstract3DSeriesPrivate::setMultiHighlightGradient(const QLinearGradient &gradient)
{
m_multiHighlightGradient = gradient;
m_changeTracker.multiHighlightGradientChanged = true;
if (m_controller)
m_controller->markSeriesVisualsDirty();
}
void QAbstract3DSeriesPrivate::setName(const QString &name)
{
m_name = name;
markItemLabelDirty();
m_changeTracker.nameChanged = true;
}
void QAbstract3DSeriesPrivate::resetToTheme(const Q3DTheme &theme, int seriesIndex, bool force)
{
int themeIndex = seriesIndex;
if (force || !m_themeTracker.colorStyleOverride) {
q_ptr->setColorStyle(theme.colorStyle());
m_themeTracker.colorStyleOverride = false;
}
if (force || !m_themeTracker.baseColorOverride) {
if (theme.baseColors().size() <= seriesIndex)
themeIndex = seriesIndex % theme.baseColors().size();
q_ptr->setBaseColor(theme.baseColors().at(themeIndex));
m_themeTracker.baseColorOverride = false;
}
if (force || !m_themeTracker.baseGradientOverride) {
if (theme.baseGradients().size() <= seriesIndex)
themeIndex = seriesIndex % theme.baseGradients().size();
q_ptr->setBaseGradient(theme.baseGradients().at(themeIndex));
m_themeTracker.baseGradientOverride = false;
}
if (force || !m_themeTracker.singleHighlightColorOverride) {
q_ptr->setSingleHighlightColor(theme.singleHighlightColor());
m_themeTracker.singleHighlightColorOverride = false;
}
if (force || !m_themeTracker.singleHighlightGradientOverride) {
q_ptr->setSingleHighlightGradient(theme.singleHighlightGradient());
m_themeTracker.singleHighlightGradientOverride = false;
}
if (force || !m_themeTracker.multiHighlightColorOverride) {
q_ptr->setMultiHighlightColor(theme.multiHighlightColor());
m_themeTracker.multiHighlightColorOverride = false;
}
if (force || !m_themeTracker.multiHighlightGradientOverride) {
q_ptr->setMultiHighlightGradient(theme.multiHighlightGradient());
m_themeTracker.multiHighlightGradientOverride = false;
}
}
QString QAbstract3DSeriesPrivate::itemLabel()
{
if (m_itemLabelDirty) {
QString oldLabel = m_itemLabel;
if (m_controller && m_visible)
createItemLabel();
else
m_itemLabel = QString();
m_itemLabelDirty = false;
if (oldLabel != m_itemLabel)
emit q_ptr->itemLabelChanged(m_itemLabel);
}
return m_itemLabel;
}
void QAbstract3DSeriesPrivate::markItemLabelDirty()
{
m_itemLabelDirty = true;
m_changeTracker.itemLabelChanged = true;
if (m_controller)
m_controller->markSeriesVisualsDirty();
}
void QAbstract3DSeriesPrivate::setItemLabelVisible(bool visible)
{
m_itemLabelVisible = visible;
markItemLabelDirty();
m_changeTracker.itemLabelVisibilityChanged = true;
}
QT_END_NAMESPACE_DATAVISUALIZATION