// SPDX-License-Identifier: GPL-2.0 // A small custom box plot series, which displays quartiles. // The QtCharts bar series were too inflexible with respect // to placement of the bars. #ifndef BOX_SERIES_H #define BOX_SERIES_H #include "chartitem.h" #include "statsseries.h" #include "statsvariables.h" // for StatsQuartiles #include #include struct InformationBox; class BoxSeries : public StatsSeries { public: BoxSeries(StatsView &view, StatsAxis *xAxis, StatsAxis *yAxis, const QString &variable, const QString &unit, int decimals); ~BoxSeries(); void updatePositions() override; bool hover(QPointF pos) override; void unhighlight() override; bool selectItemsUnderMouse(const QPointF &point, SelectionModifier modifier) override; // Note: this expects that all items are added with increasing pos // and that no bar is inside another bar, i.e. lowerBound and upperBound // are ordered identically. void append(double lowerBound, double upperBound, const StatsQuartiles &q, const QString &binName); private: // Get item under mouse pointer, or -1 if none int getItemUnderMouse(const QPointF &f); struct Item { ChartItemPtr item; double lowerBound, upperBound; StatsQuartiles q; QString binName; bool selected; Item(StatsView &view, BoxSeries *series, double lowerBound, double upperBound, const StatsQuartiles &q, const QString &binName); ~Item(); void updatePosition(BoxSeries *series); void highlight(bool highlight); }; QString variable, unit; int decimals; std::vector formatInformation(const Item &item) const; ChartItemPtr information; std::vector> items; int highlighted; // -1: no item highlighted int lastClicked; // -1: no item clicked void divesSelected(const QVector &) override; }; #endif