Skip to content

File GradientFill.hpp

File List > effects > GradientFill.hpp

Go to the documentation of this file

//
// SPDX-FileCopyrightText: 2026 Michal Grabarczyk
// SPDX-License-Identifier: GPL-3.0-only WITH Universal-FOSS-exception-1.0
//
// This file is also available under a separate commercial license.
// See COMMERCIAL-LICENSING.md for contact information.
//
#pragma once

#include "QAccelPlot/effects/Colormap.hpp"
#include "QAccelPlot/effects/GradientColorTypes.hpp"
#include "QAccelPlot/effects/LineCurveEffect.hpp"

#include <QMetaObject>
#include <QObject>
#include <QVector>
#include <QtQml/qqmlregistration.h>

namespace QAccelPlot {

class GradientFill : public LineCurveEffect {
    Q_OBJECT
    QML_NAMED_ELEMENT(GradientFill)


    Q_PROPERTY(Qt::Orientation direction READ direction WRITE setDirection NOTIFY directionChanged)
    Q_PROPERTY(QObject* gradient READ gradient WRITE setGradient NOTIFY gradientChanged)
    Q_PROPERTY(Colormap* colormap READ colormap WRITE setColormap NOTIFY colormapChanged)
    Q_PROPERTY(GradientValueSource valueMinSource READ valueMinSource WRITE setValueMinSource NOTIFY valueMinSourceChanged)
    Q_PROPERTY(qreal valueMin READ valueMin WRITE setValueMin NOTIFY valueMinChanged)
    Q_PROPERTY(GradientValueSource valueMaxSource READ valueMaxSource WRITE setValueMaxSource NOTIFY valueMaxSourceChanged)
    Q_PROPERTY(qreal valueMax READ valueMax WRITE setValueMax NOTIFY valueMaxChanged)
    Q_PROPERTY(GradientFillBaseline baseline READ baseline WRITE setBaseline NOTIFY baselineChanged)
    Q_PROPERTY(qreal baselineValue READ baselineValue WRITE setBaselineValue NOTIFY baselineValueChanged)
    Q_PROPERTY(qreal opacity READ opacity WRITE setOpacity NOTIFY opacityChanged)

public:
    explicit GradientFill(QObject* parent = nullptr);

    Qt::Orientation direction() const;
    void setDirection(Qt::Orientation direction);

    QObject* gradient() const;
    void setGradient(QObject* gradient);

    Colormap* colormap() const;
    void setColormap(Colormap* colormap);

    GradientValueSource valueMinSource() const;
    void setValueMinSource(GradientValueSource source);

    qreal valueMin() const;
    void setValueMin(qreal value);

    GradientValueSource valueMaxSource() const;
    void setValueMaxSource(GradientValueSource source);

    qreal valueMax() const;
    void setValueMax(qreal value);

    GradientFillBaseline baseline() const;
    void setBaseline(GradientFillBaseline baseline);

    qreal baselineValue() const;
    void setBaselineValue(qreal value);

    qreal opacity() const;
    void setOpacity(qreal value);

    const GradientFillPayload& payload() const;

    void refresh() override;

signals:
    void directionChanged();
    void gradientChanged();
    void colormapChanged();
    void valueMinSourceChanged();
    void valueMinChanged();
    void valueMaxSourceChanged();
    void valueMaxChanged();
    void baselineChanged();
    void baselineValueChanged();
    void opacityChanged();

private:
    GradientFillPayload readPayload() const;
    void updatePayload();
    void reconnectGradientSignals();
    void disconnectGradientSignals();
    Q_SLOT void onGradientObjectChanged();
    void reconnectColormapSignals();
    void disconnectColormapSignals();

    Qt::Orientation direction_{Qt::Horizontal};
    QObject* gradient_{nullptr};
    QVector<QMetaObject::Connection> gradientConnections_;
    Colormap* colormap_{nullptr};
    QVector<QMetaObject::Connection> colormapConnections_;
    GradientValueSource valueMinSource_{GradientValueSource::DataRange};
    qreal valueMin_{0.0};
    GradientValueSource valueMaxSource_{GradientValueSource::DataRange};
    qreal valueMax_{0.0};
    GradientFillBaseline baseline_{GradientFillBaseline::AxisMinimum};
    qreal baselineValue_{0.0};
    qreal opacity_{0.35};
    GradientFillPayload payload_;
};

} // namespace QAccelPlot