1 /*
2  * This file is part of KQuickCharts
3  * SPDX-FileCopyrightText: 2019 Arjen Hiemstra <ahiemstra@heimr.nl>
4  *
5  * SPDX-License-Identifier: LGPL-2.1-only OR LGPL-3.0-only OR LicenseRef-KDE-Accepted-LGPL
6  */
7 
8 #ifndef GRIDLINES_H
9 #define GRIDLINES_H
10 
11 #include <memory>
12 
13 #include <QQuickItem>
14 
15 class GridLines;
16 class LineGridNode;
17 class XYChart;
18 
19 class LinePropertiesGroup : public QObject
20 {
21     Q_OBJECT
22     Q_PROPERTY(bool visible READ visible WRITE setVisible NOTIFY propertiesChanged)
23     Q_PROPERTY(QColor color READ color WRITE setColor NOTIFY propertiesChanged)
24     Q_PROPERTY(float lineWidth READ lineWidth WRITE setLineWidth NOTIFY propertiesChanged)
25     Q_PROPERTY(int frequency READ frequency WRITE setFrequency NOTIFY propertiesChanged)
26     Q_PROPERTY(int count READ count WRITE setCount NOTIFY propertiesChanged)
27 
28 public:
29     explicit LinePropertiesGroup(GridLines *parent);
30 
31     bool visible() const;
32     void setVisible(bool newVisible);
33 
34     QColor color() const;
35     void setColor(const QColor &newColor);
36 
37     float lineWidth() const;
38     void setLineWidth(float newLineWidth);
39 
40     int frequency() const;
41     void setFrequency(int newFrequency);
42 
43     int count() const;
44     void setCount(int newCount);
45 
46     Q_SIGNAL void propertiesChanged();
47 
48 private:
49     GridLines *m_parent = nullptr;
50     bool m_visible = true;
51     QColor m_color = Qt::black;
52     float m_lineWidth = 1.0;
53     int m_frequency = 2;
54     int m_count = -1;
55 };
56 
57 /**
58  * An item that renders a set of lines to make a grid for a chart.
59  */
60 class GridLines : public QQuickItem
61 {
62     Q_OBJECT
63 
64     Q_PROPERTY(GridLines::Direction direction READ direction WRITE setDirection NOTIFY directionChanged)
65     Q_PROPERTY(XYChart *chart READ chart WRITE setChart NOTIFY chartChanged)
66     Q_PROPERTY(float spacing READ spacing WRITE setSpacing NOTIFY spacingChanged)
67     Q_PROPERTY(LinePropertiesGroup *major READ majorGroup CONSTANT)
68     Q_PROPERTY(LinePropertiesGroup *minor READ minorGroup CONSTANT)
69 
70 public:
71     enum class Direction { Horizontal, Vertical };
72     Q_ENUM(Direction)
73     /**
74      * Default constructor
75      */
76     explicit GridLines(QQuickItem *parent = nullptr);
77 
78     Direction direction() const;
79     void setDirection(GridLines::Direction newDirection);
80     Q_SIGNAL void directionChanged();
81 
82     XYChart *chart() const;
83     void setChart(XYChart *newChart);
84     Q_SIGNAL void chartChanged();
85 
86     float spacing() const;
87     void setSpacing(float newSpacing);
88     Q_SIGNAL void spacingChanged();
89 
90     LinePropertiesGroup *majorGroup() const;
91     LinePropertiesGroup *minorGroup() const;
92 
93 private:
94     QSGNode *updatePaintNode(QSGNode *node, QQuickItem::UpdatePaintNodeData *) override;
95     void updateLines(LineGridNode *node, LinePropertiesGroup *properties);
96 
97     GridLines::Direction m_direction = Direction::Horizontal;
98     XYChart *m_chart = nullptr;
99     float m_spacing = 10.0;
100 
101     std::unique_ptr<LinePropertiesGroup> m_major;
102     std::unique_ptr<LinePropertiesGroup> m_minor;
103 };
104 
105 #endif // GRIDLINES_H
106