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