/**************************************************************************** ** ** 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