summaryrefslogtreecommitdiffstats
path: root/stats/pieseries.h
diff options
context:
space:
mode:
authorGravatar Berthold Stoeger <bstoeger@mail.tuwien.ac.at>2021-01-01 22:26:52 +0100
committerGravatar Dirk Hohndel <dirk@hohndel.org>2021-01-02 11:04:03 -0800
commitad7872424b77398840352f663583be60a97892f8 (patch)
tree97d2b7b75d41cdbb580672a5f7f22fcdf013ddff /stats/pieseries.h
parentb0bdef469ee142f09b3994eddc8dba0d5c6f79c3 (diff)
downloadsubsurface-ad7872424b77398840352f663583be60a97892f8.tar.gz
statistics: implement pie series
Implement a simple count-based pie chart. Percentage labels are shown in the pie slices, the names outside the pie slices. On hovering over a slice, the actual counts are shown. Signed-off-by: Berthold Stoeger <bstoeger@mail.tuwien.ac.at>
Diffstat (limited to 'stats/pieseries.h')
-rw-r--r--stats/pieseries.h66
1 files changed, 66 insertions, 0 deletions
diff --git a/stats/pieseries.h b/stats/pieseries.h
new file mode 100644
index 000000000..242cfa781
--- /dev/null
+++ b/stats/pieseries.h
@@ -0,0 +1,66 @@
+// SPDX-License-Identifier: GPL-2.0
+// A pie chart series, which displays percentual information.
+#ifndef PIE_SERIES_H
+#define PIE_SERIES_H
+
+#include "statsseries.h"
+
+#include <memory>
+#include <vector>
+#include <QString>
+
+class InformationBox;
+class QGraphicsEllipseItem;
+class QGraphicsSimpleTextItem;
+
+class PieSeries : public StatsSeries {
+public:
+ // The pie series is initialized with (name, count) pairs.
+ // If keepOrder is false, bins will be sorted by size, otherwise the sorting
+ // of the shown bins will be retained. Small bins are omitted for clarity.
+ PieSeries(QtCharts::QChart *chart, StatsAxis *xAxis, StatsAxis *yAxis, const QString &categoryName,
+ const std::vector<std::pair<QString, int>> &data, bool keepOrder, bool labels);
+ ~PieSeries();
+
+ void updatePositions() override;
+ bool hover(QPointF pos) override;
+ void unhighlight() override;
+
+ std::vector<QString> binNames();
+
+private:
+ // Get item under mouse pointer, or -1 if none
+ int getItemUnderMouse(const QPointF &f) const;
+
+ QString categoryName;
+ std::vector<QString> makeInfo(int idx) const;
+
+ struct Item {
+ std::unique_ptr<QGraphicsEllipseItem> item;
+ std::unique_ptr<QGraphicsSimpleTextItem> innerLabel, outerLabel;
+ QString name;
+ double angleTo; // In fraction of total
+ int count;
+ QPointF innerLabelPos, outerLabelPos; // With respect to a (-1, -1)-(1, 1) rectangle.
+ Item(QtCharts::QChart *chart, const QString &name, int from, int count, int totalCount,
+ int bin_nr, int numBins, bool labels);
+ void updatePositions(const QRectF &rect, const QPointF &center, double radius);
+ void highlight(int bin_nr, bool highlight, int numBins);
+ };
+ std::vector<Item> items;
+ int totalCount;
+
+ // Entries in the "other" group. If empty, there is no "other" group.
+ struct OtherItem {
+ QString name;
+ int count;
+ };
+ std::vector<OtherItem> other;
+
+ std::unique_ptr<InformationBox> information;
+ QPointF center; // center of drawing area
+ double radius; // radius of pie
+ int highlighted;
+};
+
+#endif