Skip to content

File Colormap.hpp

File List > effects > Colormap.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/GradientColorTypes.hpp"

#include <QObject>
#include <QQmlListProperty>
#include <QQmlParserStatus>
#include <QtQml/qqmlregistration.h>

#include <vector>

namespace QAccelPlot {

class Colormap : public QObject, public QQmlParserStatus {
    Q_OBJECT
    Q_INTERFACES(QQmlParserStatus)
    QML_NAMED_ELEMENT(Colormap)


    Q_PROPERTY(Preset preset READ preset WRITE setPreset NOTIFY colormapChanged)
    Q_PROPERTY(QQmlListProperty<QObject> stops READ stops NOTIFY colormapChanged)
    Q_PROPERTY(bool reversed READ reversed WRITE setReversed NOTIFY colormapChanged)
    Q_PROPERTY(qreal min READ min WRITE setMin NOTIFY colormapChanged)
    Q_PROPERTY(qreal max READ max WRITE setMax NOTIFY colormapChanged)
    Q_PROPERTY(bool logScale READ logScale WRITE setLogScale NOTIFY colormapChanged)

public:
    enum class Preset {
        Viridis,   
        Plasma,    
        Inferno,   
        Magma,     
        Grayscale, 
        Rainbow    
    };
    Q_ENUM(Preset)


    explicit Colormap(QObject* parent = nullptr);

    Preset preset() const;
    void setPreset(Preset preset);

    QQmlListProperty<QObject> stops();

    bool reversed() const;
    void setReversed(bool reversed);

    qreal min() const;
    void setMin(qreal value);

    qreal max() const;
    void setMax(qreal value);

    Q_INVOKABLE void setRange(qreal min, qreal max);

    bool logScale() const;
    void setLogScale(bool on);

    const std::vector<GradientStopData>& resolvedStops() const;

signals:
    void colormapChanged();

protected:
    void classBegin() override;
    void componentComplete() override;

private:
    Q_SLOT void onStopChanged();
    void onStopDestroyed(QObject* stop);
    // Tracks the stop's lifetime and its position and color edits.
    void connectStop(QObject* stop);
    void disconnectStops();
    // Moves a GradientStop declared in this list under an internal Gradient, so its edits notify.
    void adoptStop(QObject* stop);
    QObject* stopTracker();
    void rebuildStops();
    std::vector<GradientStopData> customStops() const;

    static void appendStop(QQmlListProperty<QObject>* list, QObject* stop);
    static qsizetype stopCount(QQmlListProperty<QObject>* list);
    static QObject* stopAt(QQmlListProperty<QObject>* list, qsizetype index);
    static void clearStops(QQmlListProperty<QObject>* list);

    Preset preset_{Preset::Viridis};
    QList<QObject*> stopObjects_;
    bool reversed_{false};
    std::vector<GradientStopData> resolvedStops_;
    qreal min_;
    qreal max_;
    bool logScale_{false};
};

} // namespace QAccelPlot