// SPDX-License-Identifier: GPL-2.0 // A pie chart series, which displays percentual information. #ifndef PIE_SERIES_H #define PIE_SERIES_H #include "statshelper.h" #include "statsseries.h" #include #include #include struct dive; struct InformationBox; struct ChartPieItem; struct ChartTextItem; class QRectF; 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(StatsView &view, StatsAxis *xAxis, StatsAxis *yAxis, const QString &categoryName, std::vector>> data, bool keepOrder); ~PieSeries(); void updatePositions() override; bool hover(QPointF pos) override; void unhighlight() override; bool selectItemsUnderMouse(const QPointF &point, SelectionModifier modifier) override; std::vector binNames(); private: // Get item under mouse pointer, or -1 if none int getItemUnderMouse(const QPointF &f) const; ChartItemPtr item; QString categoryName; std::vector makeInfo(int idx) const; struct Item { ChartItemPtr innerLabel, outerLabel; QString name; double angleFrom, angleTo; // In fraction of total std::vector dives; QPointF innerLabelPos, outerLabelPos; // With respect to a (-1, -1)-(1, 1) rectangle. bool selected; Item(StatsView &view, const QString &name, int from, std::vector dives, int totalCount, int bin_nr, int numBins); void updatePositions(const QPointF ¢er, double radius); void highlight(ChartPieItem &item, int bin_nr, bool highlight, int numBins); }; std::vector items; int totalCount; // Entries in the "other" group. If empty, there is no "other" group. struct OtherItem { QString name; int count; }; std::vector other; ChartItemPtr information; QPointF center; // center of drawing area double radius; // radius of pie int highlighted; // -1: no item highlighted int lastClicked; // -1: no item clicked void divesSelected(const QVector &) override; }; #endif