// SPDX-License-Identifier: GPL-2.0 #ifndef STATS_VIEW_H #define STATS_VIEW_H #include "statsstate.h" #include "statsselection.h" #include "qt-quick/chartview.h" #include #include #include struct dive; struct StatsBinner; struct StatsBin; struct StatsState; struct StatsVariable; class StatsSeries; class CategoryAxis; class ChartRectLineItem; class ChartTextItem; class CountAxis; class HistogramAxis; class HistogramMarker; class QuartileMarker; class RegressionItem; class StatsAxis; class StatsGrid; class StatsTheme; class Legend; enum class ChartSubType : int; enum class StatsOperation : int; enum class ChartSortMode : int; class StatsView : public ChartView { Q_OBJECT public: StatsView(); StatsView(QQuickItem *parent); ~StatsView(); void plot(const StatsState &state); void updateFeatures(const StatsState &state); // Updates the visibility of chart features, such as legend, regression, etc. void restrictToSelection(); void unrestrict(); int restrictionCount() const; // <0: no restriction void setTheme(bool dark); // Chart must be replot for theme to become effective. const StatsTheme &getCurrentTheme() const; void replotIfVisible(); void divesSelected(const QVector &dives); private: void plotAreaChanged(const QSizeF &size) override; void reset(); // clears all series and axes void resetPointers() override; void setAxes(StatsAxis *x, StatsAxis *y); void plotBarChart(const std::vector &dives, ChartSubType subType, ChartSortMode sortMode, const StatsVariable *categoryVariable, const StatsBinner *categoryBinner, const StatsVariable *valueVariable, const StatsBinner *valueBinner); void plotValueChart(const std::vector &dives, ChartSubType subType, ChartSortMode sortMode, const StatsVariable *categoryVariable, const StatsBinner *categoryBinner, const StatsVariable *valueVariable, StatsOperation valueAxisOperation); void plotDiscreteCountChart(const std::vector &dives, ChartSubType subType, ChartSortMode sortMode, const StatsVariable *categoryVariable, const StatsBinner *categoryBinner); void plotPieChart(const std::vector &dives, ChartSortMode sortMode, const StatsVariable *categoryVariable, const StatsBinner *categoryBinner); void plotDiscreteBoxChart(const std::vector &dives, const StatsVariable *categoryVariable, const StatsBinner *categoryBinner, const StatsVariable *valueVariable); void plotDiscreteScatter(const std::vector &dives, const StatsVariable *categoryVariable, const StatsBinner *categoryBinner, const StatsVariable *valueVariable); void plotHistogramCountChart(const std::vector &dives, ChartSubType subType, const StatsVariable *categoryVariable, const StatsBinner *categoryBinner); void plotHistogramValueChart(const std::vector &dives, ChartSubType subType, const StatsVariable *categoryVariable, const StatsBinner *categoryBinner, const StatsVariable *valueVariable, StatsOperation valueAxisOperation); void plotHistogramStackedChart(const std::vector &dives, ChartSubType subType, const StatsVariable *categoryVariable, const StatsBinner *categoryBinner, const StatsVariable *valueVariable, const StatsBinner *valueBinner); void plotHistogramBoxChart(const std::vector &dives, const StatsVariable *categoryVariable, const StatsBinner *categoryBinner, const StatsVariable *valueVariable); void plotScatter(const std::vector &dives, const StatsVariable *categoryVariable, const StatsVariable *valueVariable); void setTitle(const QString &); void updateTitlePos(); // After resizing, set title to correct position void plotChart(); void updateFeatures(); // Updates the visibility of chart features, such as legend, regression, etc. template T *createSeries(Args&&... args); template T *createAxis(const QString &title, Args&&... args); template CategoryAxis *createCategoryAxis(const QString &title, const StatsBinner &binner, const std::vector &bins, bool isHorizontal); template HistogramAxis *createHistogramAxis(const QString &title, const StatsBinner &binner, const std::vector &bins, bool isHorizontal); CountAxis *createCountAxis(int maxVal, bool isHorizontal); // Helper functions to add feature to the chart void addLineMarker(double pos, double low, double high, const QPen &pen, bool isHorizontal); StatsState state; const StatsTheme *currentTheme; std::vector> series; std::unique_ptr grid; std::vector> quartileMarkers; ChartItemPtr medianMarker, meanMarker; StatsSeries *highlightedSeries; StatsAxis *xAxis, *yAxis; ChartItemPtr title; ChartItemPtr legend; ChartItemPtr regressionItem; ChartItemPtr selectionRect; QPointF selectionStartMouse; SelectionModifier selectionModifier; std::vector oldSelection; bool restrictDives; std::vector restrictedDives; // sorted by pointer for quick lookup. void hoverEnterEvent(QHoverEvent *event) override; void hoverMoveEvent(QHoverEvent *event) override; void mousePressEvent(QMouseEvent *event) override; void mouseReleaseEvent(QMouseEvent *event) override; void mouseMoveEvent(QMouseEvent *event) override; }; #endif