File indexing completed on 2024-04-28 03:56:45

0001 /*
0002  * This file is part of KQuickCharts
0003  * SPDX-FileCopyrightText: 2019 Arjen Hiemstra <ahiemstra@heimr.nl>
0004  *
0005  * SPDX-License-Identifier: LGPL-2.1-only OR LGPL-3.0-only OR LicenseRef-KDE-Accepted-LGPL
0006  */
0007 
0008 #ifndef GRIDLINES_H
0009 #define GRIDLINES_H
0010 
0011 #include <memory>
0012 
0013 #include <QQuickItem>
0014 
0015 class GridLines;
0016 class LineGridNode;
0017 class XYChart;
0018 
0019 class LinePropertiesGroup : public QObject
0020 {
0021     Q_OBJECT
0022     QML_ELEMENT
0023     QML_UNCREATABLE("Grouped Property")
0024 
0025 public:
0026     explicit LinePropertiesGroup(GridLines *parent);
0027 
0028     Q_PROPERTY(bool visible READ visible WRITE setVisible NOTIFY propertiesChanged)
0029     bool visible() const;
0030     void setVisible(bool newVisible);
0031 
0032     Q_PROPERTY(QColor color READ color WRITE setColor NOTIFY propertiesChanged)
0033     QColor color() const;
0034     void setColor(const QColor &newColor);
0035 
0036     Q_PROPERTY(float lineWidth READ lineWidth WRITE setLineWidth NOTIFY propertiesChanged)
0037     float lineWidth() const;
0038     void setLineWidth(float newLineWidth);
0039 
0040     Q_PROPERTY(int frequency READ frequency WRITE setFrequency NOTIFY propertiesChanged)
0041     int frequency() const;
0042     void setFrequency(int newFrequency);
0043 
0044     Q_PROPERTY(int count READ count WRITE setCount NOTIFY propertiesChanged)
0045     int count() const;
0046     void setCount(int newCount);
0047 
0048     Q_SIGNAL void propertiesChanged();
0049 
0050 private:
0051     GridLines *m_parent = nullptr;
0052     bool m_visible = true;
0053     QColor m_color = Qt::black;
0054     float m_lineWidth = 1.0;
0055     int m_frequency = 2;
0056     int m_count = -1;
0057 };
0058 
0059 /**
0060  * An item that renders a set of lines to make a grid for a chart.
0061  */
0062 class GridLines : public QQuickItem
0063 {
0064     Q_OBJECT
0065     QML_ELEMENT
0066 
0067 public:
0068     enum class Direction { Horizontal, Vertical };
0069     Q_ENUM(Direction)
0070     /**
0071      * Default constructor
0072      */
0073     explicit GridLines(QQuickItem *parent = nullptr);
0074 
0075     Q_PROPERTY(GridLines::Direction direction READ direction WRITE setDirection NOTIFY directionChanged)
0076     Direction direction() const;
0077     void setDirection(GridLines::Direction newDirection);
0078     Q_SIGNAL void directionChanged();
0079 
0080     Q_PROPERTY(XYChart *chart READ chart WRITE setChart NOTIFY chartChanged)
0081     XYChart *chart() const;
0082     void setChart(XYChart *newChart);
0083     Q_SIGNAL void chartChanged();
0084 
0085     Q_PROPERTY(float spacing READ spacing WRITE setSpacing NOTIFY spacingChanged)
0086     float spacing() const;
0087     void setSpacing(float newSpacing);
0088     Q_SIGNAL void spacingChanged();
0089 
0090     Q_PROPERTY(LinePropertiesGroup *major READ majorGroup CONSTANT)
0091     LinePropertiesGroup *majorGroup() const;
0092 
0093     Q_PROPERTY(LinePropertiesGroup *minor READ minorGroup CONSTANT)
0094     LinePropertiesGroup *minorGroup() const;
0095 
0096 private:
0097     QSGNode *updatePaintNode(QSGNode *node, QQuickItem::UpdatePaintNodeData *) override;
0098     void updateLines(LineGridNode *node, LinePropertiesGroup *properties);
0099 
0100     GridLines::Direction m_direction = Direction::Horizontal;
0101     XYChart *m_chart = nullptr;
0102     float m_spacing = 10.0;
0103 
0104     std::unique_ptr<LinePropertiesGroup> m_major;
0105     std::unique_ptr<LinePropertiesGroup> m_minor;
0106 };
0107 
0108 #endif // GRIDLINES_H