// Copyright (C) 2023 The Qt Company Ltd. // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only #include "qabstract3dseries_p.h" #include "qabstractdataproxy_p.h" #include "qquickgraphsitem_p.h" #include "utils_p.h" #include "qgraphs3dlogging_p.h" QT_BEGIN_NAMESPACE /*! * \class QAbstract3DSeries * \inmodule QtGraphs * \ingroup graphs_3D * \brief The QAbstract3DSeries class is a base class for all 3D data series. * * There are inherited classes for each supported series type: QBar3DSeries, * QScatter3DSeries, and QSurface3DSeries. * * For more information, see \l{Qt Graphs Data Handling with 3D}. */ /*! * \class QAbstract3DSeriesChangeBitField * \internal */ /*! * \class QAbstract3DSeriesThemeOverrideBitField * \internal */ /*! * \qmltype Abstract3DSeries * \qmlabstract * \inqmlmodule QtGraphs * \ingroup graphs_qml_3D * \nativetype QAbstract3DSeries * \brief A base type for all 3D data series. * * This abstract class serves as a base class for the following subtypes: * Bar3DSeries, Scatter3DSeries, and Surface3DSeries. * * For more information, see \l{Qt Graphs Data Handling with 3D}. */ /*! * \enum QAbstract3DSeries::SeriesType * * Type of the series. * * \value None * No series type. * \value Bar * Series type for Q3DBarsWidgetItem. * \value Scatter * Series type for Q3DScatterWidgetItem. * \value Surface * Series type for Q3DSurfaceWidgetItem. */ /*! * \enum QAbstract3DSeries::Mesh * * Predefined mesh types. All styles are not usable with all graphs types. * * \value UserDefined * User defined mesh, set via QAbstract3DSeries::userDefinedMesh property. * \value Bar * Basic rectangular bar. * \value Cube * Basic cube. * \value Pyramid * Four-sided pyramid. * \value Cone * Basic cone. * \value Cylinder * Basic cylinder. * \value BevelBar * Slightly beveled (rounded) rectangular bar. * \value BevelCube * Slightly beveled (rounded) cube. * \value Sphere * Sphere. * \value Minimal * The minimal 3D mesh: a triangular pyramid. Usable only with Q3DScatterWidgetItem. * \value Arrow * Arrow pointing upwards. * \value Point * 2D point. Usable only with Q3DScatterWidgetItem. * Shadows do not affect this style. Color style QGraphsTheme::ColorStyle::ObjectGradient * is not supported by this style. */ /*! * \enum QAbstract3DSeries::LightingMode * * Predefined lighting modes * * \value Shaded * Graphs respond to real time lighting * \value Unshaded * Graphs do not respond to real time lighting */ /*! * \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. * * \sa Bar3DSeries, Scatter3DSeries, Surface3DSeries. */ /*! * \qmlproperty bool Abstract3DSeries::visible * The visibility of the series. If \c false, the series is not rendered. */ /*! * \qmlproperty Abstract3DSeries.Mesh Abstract3DSeries::mesh * * The mesh of the items in the series, or the selection pointer in case of * Surface3DSeries. If the mesh is * \l{QAbstract3DSeries::Mesh::UserDefined}{Abstract3DSeries.Mesh.UserDefined}, * 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::Mesh::UserDefined}{Abstract3DSeries.Mesh.UserDefined}. * Defaults to \c{false}. */ /*! * \qmlproperty quaternion Abstract3DSeries::meshRotation * * 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 * * The filename for a user defined custom mesh for objects that is used * when \l mesh is * \l{QAbstract3DSeries::Mesh::UserDefined}{Abstract3DSeries.Mesh.UserDefined}. * \note The file needs to be in the QtQuick3D mesh format. Use the \c balsam * conversion tool to create a mesh from other 3D model formats. */ /*! * \qmlproperty GraphsTheme.ColorStyle Abstract3DSeries::colorStyle * * The color style for the series. * * \sa {QGraphsTheme::ColorStyle}{GraphsTheme.ColorStyle} */ /*! * \qmlproperty color Abstract3DSeries::baseColor * * The base color of the series. * * \sa colorStyle, {GraphsTheme::seriesColors}{GraphsTheme.seriesColors} */ /*! * \qmlproperty Gradient Abstract3DSeries::baseGradient * * The base gradient of the series. * * \sa colorStyle */ /*! * \qmlproperty color Abstract3DSeries::singleHighlightColor * * The single item highlight color of the series. * * \sa colorStyle, {GraphsTheme::singleHighlightColor}{GraphsTheme.singleHighlightColor} */ /*! * \qmlproperty Gradient Abstract3DSeries::singleHighlightGradient * * The single item highlight gradient of the series. * * \sa colorStyle, * {GraphsTheme::singleHighlightGradient}{GraphsTheme.singleHighlightGradient} */ /*! * \qmlproperty color Abstract3DSeries::multiHighlightColor * * The multiple item highlight color of the series. * * \sa colorStyle, {GraphsTheme::multiHighlightColor}{GraphsTheme.multiHighlightColor} */ /*! * \qmlproperty Gradient Abstract3DSeries::multiHighlightGradient * * The multiple item highlight gradient of the series. * * \sa colorStyle, * {GraphsTheme::multiHighlightGradient}{GraphsTheme.multiHighlightGradient} */ /*! * \qmlproperty Abstract3DSeries.LightingMode Abstract3DSeries::lightingMode * \since 6.10 * * The lighting mode of the items in the series. * The default value is \l{QAbstract3DSeries::LightingMode::Shaded} * * \sa QAbstract3DSeries::LightingMode */ /*! * \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 * * 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 * * 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 */ /*! \qmlsignal Abstract3DSeries::itemLabelFormatChanged(string format) This signal is emitted when itemLabelFormat changes to \a format. */ /*! \qmlsignal Abstract3DSeries::visibilityChanged(bool visible) This signal is emitted when the series visibility changes to \a visible. */ /*! \qmlsignal Abstract3DSeries::meshChanged(Abstract3DSeries.Mesh mesh) This signal is emitted when \l mesh changes to \a mesh. */ /*! \qmlsignal Abstract3DSeries::meshSmoothChanged(bool enabled) This signal is emitted when meshSmooth changes to \a enabled. */ /*! \qmlsignal Abstract3DSeries::meshRotationChanged(quaternion rotation) This signal is emitted when meshRotation changes to \a rotation. */ /*! \qmlsignal Abstract3DSeries::userDefinedMeshChanged(string fileName) This signal is emitted when userDefinedMesh changes to \a fileName. */ /*! \qmlsignal Abstract3DSeries::colorStyleChanged(GraphsTheme.ColorStyle style) This signal is emitted when colorStyle changes to \a style. */ /*! \qmlsignal Abstract3DSeries::baseColorChanged(color color) This signal is emitted when baseColor changes to \a color. */ /*! \qmlsignal Abstract3DSeries::baseGradientChanged(Gradient gradient) This signal is emitted when baseGradient changes to \a gradient. */ /*! \qmlsignal Abstract3DSeries::singleHighlightColorChanged(color color) This signal is emitted when singleHighlightColor changes to \a color. */ /*! \qmlsignal Abstract3DSeries::singleHighlightGradientChanged(Gradient gradient) This signal is emitted when singleHighlightGradient changes to \a gradient. */ /*! \qmlsignal Abstract3DSeries::multiHighlightColorChanged(color color) This signal is emitted when multiHighlightColor changes to \a color. */ /*! \qmlsignal Abstract3DSeries::multiHighlightGradientChanged(Gradient gradient) This signal is emitted when multiHighlightGradient changes to \a gradient. */ /*! \qmlsignal Abstract3DSeries::lightingModeChanged(Abstract3DSeries.LightingMode lightingMode) This signal is emitted when \l lightingMode changes to \a lightingMode. \since 6.10 */ /*! \qmlsignal Abstract3DSeries::nameChanged(string name) This signal is emitted when \l name changes to \a name. */ /*! \qmlsignal Abstract3DSeries::itemLabelChanged(string label) This signal is emitted when itemLabel changes to \a label. */ /*! \qmlsignal Abstract3DSeries::itemLabelVisibilityChanged(bool visible) This signal is emitted when itemLabelVisibility changes to \a visible. */ /*! * \internal */ QAbstract3DSeries::QAbstract3DSeries(QAbstract3DSeriesPrivate &d, QObject *parent) : QObject(d, parent) {} /*! * Deletes the abstract 3D series. */ QAbstract3DSeries::~QAbstract3DSeries() {} /*! * \property QAbstract3DSeries::type * * \brief The type of the series. */ QAbstract3DSeries::SeriesType QAbstract3DSeries::type() const { Q_D(const QAbstract3DSeries); return d->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. * * \sa QBar3DSeries, QScatter3DSeries, QSurface3DSeries. */ void QAbstract3DSeries::setItemLabelFormat(const QString &format) { Q_D(QAbstract3DSeries); if (d->m_itemLabelFormat == format) { qCDebug(lcProperties3D, "%s value: %s is same than it already was.", qUtf8Printable(QLatin1String(__FUNCTION__)), qUtf8Printable(format)); return; } d->setItemLabelFormat(format); emit itemLabelFormatChanged(format); } QString QAbstract3DSeries::itemLabelFormat() const { Q_D(const QAbstract3DSeries); return d->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) { Q_D(QAbstract3DSeries); if (d->m_visible == visible) { qCDebug(lcProperties3D) << __FUNCTION__ << "value is already set to:" << visible; return; } d->setVisible(visible); emit visibleChanged(visible); } bool QAbstract3DSeries::isVisible() const { Q_D(const QAbstract3DSeries); return d->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) { Q_D(QAbstract3DSeries); if ((mesh == QAbstract3DSeries::Mesh::Point || mesh == QAbstract3DSeries::Mesh::Minimal || mesh == QAbstract3DSeries::Mesh::Arrow) && type() != QAbstract3DSeries::SeriesType::Scatter) { qCWarning(lcProperties3D, "%s specified style is only supported for QScatter3DSeries.", qUtf8Printable(QLatin1String(__FUNCTION__))); return; } else if (d->m_mesh == mesh) { qCDebug(lcProperties3D) << __FUNCTION__ << "value is already set to:" << mesh; return; } d->setMesh(mesh); emit meshChanged(mesh); } QAbstract3DSeries::Mesh QAbstract3DSeries::mesh() const { Q_D(const QAbstract3DSeries); return d->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) { Q_D(QAbstract3DSeries); if (d->m_meshSmooth == enable) { qCDebug(lcProperties3D) << __FUNCTION__ << "value is already set to:" << enable; return; } d->setMeshSmooth(enable); emit meshSmoothChanged(enable); } bool QAbstract3DSeries::isMeshSmooth() const { Q_D(const QAbstract3DSeries); return d->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) { Q_D(QAbstract3DSeries); if (d->m_meshRotation == rotation) { qCDebug(lcProperties3D) << __FUNCTION__ << "value is already set to:" << rotation; return; } d->setMeshRotation(rotation); emit meshRotationChanged(rotation); } QQuaternion QAbstract3DSeries::meshRotation() const { Q_D(const QAbstract3DSeries); return d->m_meshRotation; } /*! * A convenience function to construct a mesh rotation quaternion from * \a axis and \a angle. * * \sa meshRotation */ void QAbstract3DSeries::setMeshAxisAndAngle(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 QtQuick3D mesh format. Use the \c balsam * conversion tool to create a mesh from other 3D model formats. */ void QAbstract3DSeries::setUserDefinedMesh(const QString &fileName) { Q_D(QAbstract3DSeries); if (d->m_userDefinedMesh == fileName) { qCDebug(lcProperties3D, "%s value %s is same than what is already being used.", qUtf8Printable(QLatin1String(__FUNCTION__)), qUtf8Printable(fileName)); return; } d->setUserDefinedMesh(fileName); emit userDefinedMeshChanged(fileName); } QString QAbstract3DSeries::userDefinedMesh() const { Q_D(const QAbstract3DSeries); return d->m_userDefinedMesh; } /*! * \property QAbstract3DSeries::colorStyle * * \brief The color style for the series. * * \sa QGraphsTheme::ColorStyle */ void QAbstract3DSeries::setColorStyle(QGraphsTheme::ColorStyle style) { Q_D(QAbstract3DSeries); if (d->m_colorStyle == style) { qCDebug(lcProperties3D) << __FUNCTION__ << "value is already set to:" << style; d->m_themeTracker.colorStyleOverride = true; return; } d->setColorStyle(style); emit colorStyleChanged(style); d->m_themeTracker.colorStyleOverride = true; } QGraphsTheme::ColorStyle QAbstract3DSeries::colorStyle() const { Q_D(const QAbstract3DSeries); return d->m_colorStyle; } /*! * \property QAbstract3DSeries::baseColor * * \brief The base color of the series. * * \sa colorStyle, QGraphsTheme::seriesColors */ void QAbstract3DSeries::setBaseColor(QColor color) { Q_D(QAbstract3DSeries); if (d->m_baseColor == color) { qCDebug(lcProperties3D, "%s value is already set to: %s", qUtf8Printable(QLatin1String(__FUNCTION__)), qUtf8Printable(color.name())); d->m_themeTracker.baseColorOverride = true; return; } d->setBaseColor(color); emit baseColorChanged(color); d->m_themeTracker.baseColorOverride = true; } QColor QAbstract3DSeries::baseColor() const { Q_D(const QAbstract3DSeries); return d->m_baseColor; } /*! * \property QAbstract3DSeries::baseGradient * * \brief The base gradient of the series. * * \sa colorStyle, QGraphsTheme::seriesGradients */ void QAbstract3DSeries::setBaseGradient(const QLinearGradient &gradient) { Q_D(QAbstract3DSeries); if (d->m_baseGradient == gradient) { qCDebug(lcProperties3D) << __FUNCTION__ << "value is already set to:" << gradient; d->m_themeTracker.baseGradientOverride = true; return; } d->setBaseGradient(gradient); emit baseGradientChanged(gradient); d->m_themeTracker.baseGradientOverride = true; } QLinearGradient QAbstract3DSeries::baseGradient() const { Q_D(const QAbstract3DSeries); return d->m_baseGradient; } /*! * \property QAbstract3DSeries::singleHighlightColor * * \brief The single item highlight color of the series. * * \sa colorStyle, QGraphsTheme::singleHighlightColor */ void QAbstract3DSeries::setSingleHighlightColor(QColor color) { Q_D(QAbstract3DSeries); if (d->m_singleHighlightColor == color) { qCDebug(lcProperties3D, "%s value is already set to: %s", qUtf8Printable(QLatin1String(__FUNCTION__)), qUtf8Printable(color.name())); d->m_themeTracker.singleHighlightColorOverride = true; return; } d->setSingleHighlightColor(color); emit singleHighlightColorChanged(color); d->m_themeTracker.singleHighlightColorOverride = true; } QColor QAbstract3DSeries::singleHighlightColor() const { Q_D(const QAbstract3DSeries); return d->m_singleHighlightColor; } /*! * \property QAbstract3DSeries::singleHighlightGradient * * \brief The single item highlight gradient of the series. * * \sa colorStyle, QGraphsTheme::singleHighlightGradient */ void QAbstract3DSeries::setSingleHighlightGradient(const QLinearGradient &gradient) { Q_D(QAbstract3DSeries); if (d->m_singleHighlightGradient == gradient) { qCDebug(lcProperties3D) << __FUNCTION__ << "value is already set to:" << gradient; d->m_themeTracker.singleHighlightGradientOverride = true; return; } d->setSingleHighlightGradient(gradient); emit singleHighlightGradientChanged(gradient); d->m_themeTracker.singleHighlightGradientOverride = true; } QLinearGradient QAbstract3DSeries::singleHighlightGradient() const { Q_D(const QAbstract3DSeries); return d->m_singleHighlightGradient; } /*! * \property QAbstract3DSeries::multiHighlightColor * * \brief The multiple item highlight color of the series. * * \sa colorStyle, QGraphsTheme::multiHighlightColor */ void QAbstract3DSeries::setMultiHighlightColor(QColor color) { Q_D(QAbstract3DSeries); if (d->m_multiHighlightColor == color) { qCDebug(lcProperties3D, "%s value is already set to: %s", qUtf8Printable(QLatin1String(__FUNCTION__)), qUtf8Printable(color.name())); d->m_themeTracker.multiHighlightColorOverride = true; return; } d->setMultiHighlightColor(color); emit multiHighlightColorChanged(color); d->m_themeTracker.multiHighlightColorOverride = true; } QColor QAbstract3DSeries::multiHighlightColor() const { Q_D(const QAbstract3DSeries); return d->m_multiHighlightColor; } /*! * \property QAbstract3DSeries::multiHighlightGradient * * \brief The multiple item highlight gradient of the series. * * \sa colorStyle, QGraphsTheme::multiHighlightGradient */ void QAbstract3DSeries::setMultiHighlightGradient(const QLinearGradient &gradient) { Q_D(QAbstract3DSeries); if (d->m_multiHighlightGradient == gradient) { qCDebug(lcProperties3D) << __FUNCTION__ << "value is already set to:" << gradient; d->m_themeTracker.multiHighlightGradientOverride = true; return; } d->setMultiHighlightGradient(gradient); emit multiHighlightGradientChanged(gradient); d->m_themeTracker.multiHighlightGradientOverride = true; } QLinearGradient QAbstract3DSeries::multiHighlightGradient() const { Q_D(const QAbstract3DSeries); return d->m_multiHighlightGradient; } /*! * \property QAbstract3DSeries::lightingMode * * \brief The lighting mode of the series * \since 6.10 * \sa LightingMode */ void QAbstract3DSeries::setLightingMode(LightingMode lightingMode) { Q_D(QAbstract3DSeries); if (d->m_lightingMode != lightingMode) { d->setLightingMode(lightingMode); emit lightingModeChanged(lightingMode); } } QAbstract3DSeries::LightingMode QAbstract3DSeries::lightingMode() const { Q_D(const QAbstract3DSeries); return d->m_lightingMode; } /*! * \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) { Q_D(QAbstract3DSeries); if (d->m_name == name) { qCDebug(lcProperties3D, "%s value is already set to: %s", qUtf8Printable(QLatin1String(__FUNCTION__)), qUtf8Printable(name)); return; } d->setName(name); emit nameChanged(name); } QString QAbstract3DSeries::name() const { Q_D(const QAbstract3DSeries); return d->m_name; } /*! * \property QAbstract3DSeries::itemLabel * * \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() { Q_D(QAbstract3DSeries); return d->itemLabel(); } /*! * \property QAbstract3DSeries::itemLabelVisible * * \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) { Q_D(QAbstract3DSeries); if (d->m_itemLabelVisible == visible) { qCDebug(lcProperties3D) << __FUNCTION__ << "value is already set to:" << visible; return; } d->setItemLabelVisible(visible); emit itemLabelVisibleChanged(visible); } bool QAbstract3DSeries::isItemLabelVisible() const { Q_D(const QAbstract3DSeries); return d->m_itemLabelVisible; } // QAbstract3DSeriesPrivate QAbstract3DSeriesPrivate::QAbstract3DSeriesPrivate(QAbstract3DSeries::SeriesType type) : m_type(type) , m_dataProxy(0) , m_visible(true) , m_graph(0) , m_mesh(QAbstract3DSeries::Mesh::Cube) , m_meshSmooth(false) , m_colorStyle(QGraphsTheme::ColorStyle::Uniform) , m_baseColor(Qt::black) , m_singleHighlightColor(Qt::black) , m_multiHighlightColor(Qt::black) , m_itemLabelDirty(true) , m_itemLabelVisible(true) , m_lightingMode(QAbstract3DSeries::LightingMode::Shaded) {} QAbstract3DSeriesPrivate::~QAbstract3DSeriesPrivate() {} QAbstractDataProxy *QAbstract3DSeriesPrivate::dataProxy() const { return m_dataProxy; } void QAbstract3DSeriesPrivate::setDataProxy(QAbstractDataProxy *proxy) { Q_Q(QAbstract3DSeries); Q_ASSERT(proxy && proxy != m_dataProxy && !proxy->d_func()->series()); delete m_dataProxy; m_dataProxy = proxy; proxy->d_func()->setSeries(q); // also sets parent if (m_graph) { connectGraphAndProxy(m_graph); m_graph->markDataDirty(); } } void QAbstract3DSeriesPrivate::setGraph(QQuickGraphsItem *graph) { Q_Q(QAbstract3DSeries); m_graph = graph; q->setParent(graph); connectGraphAndProxy(graph); 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_graph) { m_graph->markSeriesVisualsDirty(); if (m_graph->optimizationHint() == QtGraphs3D::OptimizationHint::Default) m_graph->markDataDirty(); } } void QAbstract3DSeriesPrivate::setMeshSmooth(bool enable) { m_meshSmooth = enable; m_changeTracker.meshSmoothChanged = true; if (m_graph) { m_graph->markSeriesVisualsDirty(); if (m_graph->optimizationHint() == QtGraphs3D::OptimizationHint::Default) m_graph->markDataDirty(); } } void QAbstract3DSeriesPrivate::setMeshRotation(const QQuaternion &rotation) { m_meshRotation = rotation; m_changeTracker.meshRotationChanged = true; if (m_graph) { m_graph->markSeriesVisualsDirty(); if (m_graph->optimizationHint() == QtGraphs3D::OptimizationHint::Default) m_graph->markDataDirty(); } } void QAbstract3DSeriesPrivate::setUserDefinedMesh(const QString &meshFile) { m_userDefinedMesh = meshFile; m_changeTracker.userDefinedMeshChanged = true; if (m_graph) { m_graph->markSeriesVisualsDirty(); if (m_graph->optimizationHint() == QtGraphs3D::OptimizationHint::Default) m_graph->markDataDirty(); } } void QAbstract3DSeriesPrivate::setColorStyle(QGraphsTheme::ColorStyle style) { m_colorStyle = style; m_changeTracker.colorStyleChanged = true; if (m_graph) m_graph->markSeriesVisualsDirty(); } void QAbstract3DSeriesPrivate::setBaseColor(QColor color) { m_baseColor = color; m_changeTracker.baseColorChanged = true; if (m_graph) m_graph->markSeriesVisualsDirty(); } void QAbstract3DSeriesPrivate::setBaseGradient(const QLinearGradient &gradient) { m_baseGradient = gradient; Utils::verifyGradientCompleteness(m_baseGradient); m_changeTracker.baseGradientChanged = true; if (m_graph) m_graph->markSeriesVisualsDirty(); } void QAbstract3DSeriesPrivate::setSingleHighlightColor(QColor color) { m_singleHighlightColor = color; m_changeTracker.singleHighlightColorChanged = true; if (m_graph) m_graph->markSeriesVisualsDirty(); } void QAbstract3DSeriesPrivate::setSingleHighlightGradient(const QLinearGradient &gradient) { m_singleHighlightGradient = gradient; Utils::verifyGradientCompleteness(m_singleHighlightGradient); m_changeTracker.singleHighlightGradientChanged = true; if (m_graph) m_graph->markSeriesVisualsDirty(); } void QAbstract3DSeriesPrivate::setMultiHighlightColor(QColor color) { m_multiHighlightColor = color; m_changeTracker.multiHighlightColorChanged = true; if (m_graph) m_graph->markSeriesVisualsDirty(); } void QAbstract3DSeriesPrivate::setMultiHighlightGradient(const QLinearGradient &gradient) { m_multiHighlightGradient = gradient; Utils::verifyGradientCompleteness(m_multiHighlightGradient); m_changeTracker.multiHighlightGradientChanged = true; if (m_graph) m_graph->markSeriesVisualsDirty(); } void QAbstract3DSeriesPrivate::setLightingMode(QAbstract3DSeries::LightingMode lightingMode) { m_lightingMode = lightingMode; if (m_graph) m_graph->markSeriesVisualsDirty(); m_changeTracker.lightingModeChanged = true; } void QAbstract3DSeriesPrivate::setName(const QString &name) { m_name = name; markItemLabelDirty(); m_changeTracker.nameChanged = true; } void QAbstract3DSeriesPrivate::resetToTheme(const QGraphsTheme &theme, qsizetype seriesIndex, bool force) { Q_Q(QAbstract3DSeries); qsizetype themeIndex = seriesIndex; if (force || !m_themeTracker.colorStyleOverride) { q->setColorStyle(theme.colorStyle()); m_themeTracker.colorStyleOverride = false; } if (theme.seriesColors().size() && (force || !m_themeTracker.baseColorOverride)) { if (theme.seriesColors().size() <= seriesIndex) themeIndex = seriesIndex % theme.seriesColors().size(); q->setBaseColor(theme.seriesColors().at(themeIndex)); m_themeTracker.baseColorOverride = false; } if (theme.seriesGradients().size() && (force || !m_themeTracker.baseGradientOverride)) { if (theme.seriesGradients().size() <= seriesIndex) themeIndex = seriesIndex % theme.seriesGradients().size(); q->setBaseGradient(theme.seriesGradients().at(themeIndex)); m_themeTracker.baseGradientOverride = false; } if (force || !m_themeTracker.singleHighlightColorOverride) { q->setSingleHighlightColor(theme.singleHighlightColor()); m_themeTracker.singleHighlightColorOverride = false; } if (force || !m_themeTracker.singleHighlightGradientOverride) { q->setSingleHighlightGradient(theme.singleHighlightGradient()); m_themeTracker.singleHighlightGradientOverride = false; } if (force || !m_themeTracker.multiHighlightColorOverride) { q->setMultiHighlightColor(theme.multiHighlightColor()); m_themeTracker.multiHighlightColorOverride = false; } if (force || !m_themeTracker.multiHighlightGradientOverride) { q->setMultiHighlightGradient(theme.multiHighlightGradient()); m_themeTracker.multiHighlightGradientOverride = false; } } QString QAbstract3DSeriesPrivate::itemLabel() { Q_Q(QAbstract3DSeries); if (m_itemLabelDirty) { QString oldLabel = m_itemLabel; if (m_graph && m_visible) createItemLabel(); else m_itemLabel = QString(); m_itemLabelDirty = false; if (oldLabel != m_itemLabel) emit q->itemLabelChanged(m_itemLabel); } return m_itemLabel; } void QAbstract3DSeriesPrivate::markItemLabelDirty() { m_itemLabelDirty = true; m_changeTracker.itemLabelChanged = true; } void QAbstract3DSeriesPrivate::setItemLabelVisible(bool visible) { m_itemLabelVisible = visible; markItemLabelDirty(); m_changeTracker.itemLabelVisibilityChanged = true; } bool QAbstract3DSeriesPrivate::isUsingGradient() { return m_colorStyle != QGraphsTheme::ColorStyle::Uniform ? true : false; } QT_END_NAMESPACE