// SPDX-License-Identifier: GPL-2.0 // Describes the current state of the statistics widget // (selected variables, chart type, etc.) and is the // interface between UI and plotting code. #ifndef STATS_STATE_H #define STATS_STATE_H #include #include enum class ChartType { DiscreteBar, DiscreteValue, DiscreteCount, DiscreteBox, DiscreteScatter, Pie, HistogramCount, HistogramValue, HistogramBox, HistogramStacked, ScatterPlot, Invalid }; enum class ChartSubType { Vertical = 0, VerticalGrouped, VerticalStacked, Horizontal, HorizontalGrouped, HorizontalStacked, Dots, Box, Pie, Count }; enum class ChartSortMode { Bin = 0, // Sort according to the binner (i.e. don't change sorting) Count, // Sort by number of dives in the bin Value // Sort by the displayed value of the bin }; struct ChartTypeDesc; // Internal implementation detail struct StatsVariable; struct StatsBinner; enum class StatsOperation : int; struct StatsState { public: StatsState(); int setFirstAxis(); int setSecondAxis(); struct Variable { QString name; int id; }; struct VariableList { std::vector variables; int selected; }; struct Chart { QString name; QString subtypeName; ChartSubType subtype; int id; bool warning; // Not recommended for that combination }; struct ChartList { std::vector charts; int selected; }; struct BinnerList { std::vector binners; int selected; }; struct Feature { QString name; int id; bool selected; }; struct UIState { VariableList var1; VariableList var2; QString var1Name; QString var2Name; ChartList charts; std::vector features; BinnerList binners1; BinnerList binners2; // Currently, only alternative sorting on the first variable. // Sort mode reuses the variable list - not very nice. VariableList sortMode1; // Currently, operations are only supported on the second variable // This reuses the variable list - not very nice. VariableList operations2; }; UIState getUIState() const; // State changers void var1Changed(int id); void var2Changed(int id); void chartChanged(int id); void binner1Changed(int id); void binner2Changed(int id); void var2OperationChanged(int id); void sortMode1Changed(int id); void featureChanged(int id, bool state); const StatsVariable *var1; // Independent variable const StatsVariable *var2; // Dependent variable (nullptr: count) ChartType type; ChartSubType subtype; bool labels; bool legend; bool median; bool mean; bool quartiles; bool regression; bool confidence; const StatsBinner *var1Binner; // nullptr: undefined const StatsBinner *var2Binner; // nullptr: undefined StatsOperation var2Operation; ChartSortMode sortMode1; private: void validate(bool varChanged); int chartFeatures; }; #endif