diff options
author | Berthold Stoeger <bstoeger@mail.tuwien.ac.at> | 2021-01-01 22:26:52 +0100 |
---|---|---|
committer | Dirk Hohndel <dirk@hohndel.org> | 2021-01-02 11:04:03 -0800 |
commit | ad7872424b77398840352f663583be60a97892f8 (patch) | |
tree | 97d2b7b75d41cdbb580672a5f7f22fcdf013ddff /stats/pieseries.h | |
parent | b0bdef469ee142f09b3994eddc8dba0d5c6f79c3 (diff) | |
download | subsurface-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.h | 66 |
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 ¢er, 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 |