1 | /* |
2 | * SPDX-FileCopyrightText: 2019 Arjen Hiemstra <ahiemstra@heimr.nl> |
3 | * |
4 | * SPDX-License-Identifier: LGPL-2.1-only OR LGPL-3.0-only OR LicenseRef-KDE-Accepted-LGPL |
5 | */ |
6 | |
7 | #ifndef BARCHART_H |
8 | #define BARCHART_H |
9 | |
10 | #include <qqmlregistration.h> |
11 | |
12 | #include "XYChart.h" |
13 | |
14 | struct Bar; |
15 | |
16 | /** |
17 | * An item to render a bar chart. |
18 | * |
19 | * This chart renders |
20 | * |
21 | * ## Usage example |
22 | * |
23 | * \snippet snippets/barchart.qml example |
24 | * |
25 | * \image html barchart.png "The resulting bar chart." |
26 | */ |
27 | class QUICKCHARTS_EXPORT BarChart : public XYChart |
28 | { |
29 | Q_OBJECT |
30 | QML_ELEMENT |
31 | |
32 | public: |
33 | /** |
34 | * Helper enum to provide an easy way to set barWidth to auto. |
35 | */ |
36 | enum WidthMode { AutoWidth = -2 }; |
37 | Q_ENUM(WidthMode) |
38 | |
39 | enum Orientation { |
40 | HorizontalOrientation = Qt::Horizontal, ///< Bars are oriented horizontally, with low values left and high values right. |
41 | VerticalOrientation = Qt::Vertical ///< Bars are oriented vertically, with low values at the bottom and high values at the top. |
42 | }; |
43 | Q_ENUM(Orientation) |
44 | |
45 | explicit BarChart(QQuickItem *parent = nullptr); |
46 | |
47 | /** |
48 | * The spacing between bars for each value source. |
49 | * |
50 | * Note that spacing between each X axis value is determined automatically |
51 | * based on barWidth, spacing and total chart width. The default is 0. |
52 | */ |
53 | Q_PROPERTY(qreal spacing READ spacing WRITE setSpacing NOTIFY spacingChanged) |
54 | qreal spacing() const; |
55 | void setSpacing(qreal newSpacing); |
56 | Q_SIGNAL void spacingChanged(); |
57 | |
58 | /** |
59 | * The width of individual bars in the chart. |
60 | * |
61 | * If set to WidthMode::AutoWidth (also the default), the width will be |
62 | * calculated automatically based on total chart width and item count. |
63 | */ |
64 | Q_PROPERTY(qreal barWidth READ barWidth WRITE setBarWidth NOTIFY barWidthChanged) |
65 | qreal barWidth() const; |
66 | void setBarWidth(qreal newBarWidth); |
67 | Q_SIGNAL void barWidthChanged(); |
68 | |
69 | /** |
70 | * The radius of the ends of bars in the chart in pixels. |
71 | * |
72 | * By default this is 0, which means no rounding will be done. |
73 | */ |
74 | Q_PROPERTY(qreal radius READ radius WRITE setRadius NOTIFY radiusChanged) |
75 | qreal radius() const; |
76 | void setRadius(qreal newRadius); |
77 | Q_SIGNAL void radiusChanged(); |
78 | |
79 | /** |
80 | * The orientation of bars in the chart. |
81 | * |
82 | * By default this is Vertical. |
83 | */ |
84 | Q_PROPERTY(Orientation orientation READ orientation WRITE setOrientation NOTIFY orientationChanged) |
85 | Orientation orientation() const; |
86 | void setOrientation(Orientation newOrientation); |
87 | Q_SIGNAL void orientationChanged(); |
88 | |
89 | /** |
90 | * The background color of bars in the chart. |
91 | * |
92 | * By default this is Qt::transparent. If set to something non-transparent, |
93 | * the chart will render backgrounds for the bars. These backgrounds will |
94 | * have the same width as the bars but stretch the full height. |
95 | */ |
96 | Q_PROPERTY(QColor backgroundColor READ backgroundColor WRITE setBackgroundColor NOTIFY backgroundColorChanged) |
97 | QColor backgroundColor() const; |
98 | void setBackgroundColor(const QColor &newBackgroundColor); |
99 | Q_SIGNAL void backgroundColorChanged(); |
100 | |
101 | protected: |
102 | /** |
103 | * Reimplemented from QQuickItem. |
104 | */ |
105 | QSGNode *updatePaintNode(QSGNode *node, QQuickItem::UpdatePaintNodeData *) override; |
106 | /** |
107 | * Reimplemented from Chart. |
108 | */ |
109 | void onDataChanged() override; |
110 | |
111 | private: |
112 | QList<Bar> calculateBars(); |
113 | |
114 | qreal m_spacing = 0.0; |
115 | qreal m_barWidth = AutoWidth; |
116 | qreal m_radius = 0.0; |
117 | Orientation m_orientation = VerticalOrientation; |
118 | bool m_orientationChanged = false; |
119 | struct BarData { |
120 | qreal value = 0; |
121 | QColor color; |
122 | }; |
123 | QList<QList<BarData>> m_barDataItems; |
124 | QColor m_backgroundColor = Qt::transparent; |
125 | }; |
126 | |
127 | #endif // BARCHART_H |
128 | |