This adds dive type based division to the "yearly statistics" window.
Thus people can see the stats from individually from OC, CCR, PSCR and
freedive.

See #949

Signed-off-by: Miika Turkia <[email protected]>
---
 qt-models/yearlystatisticsmodel.cpp | 14 ++++++++++++++
 subsurface-core/statistics.c        | 26 +++++++++++++++++++++++++-
 subsurface-core/statistics.h        |  1 +
 3 files changed, 40 insertions(+), 1 deletion(-)

diff --git a/qt-models/yearlystatisticsmodel.cpp 
b/qt-models/yearlystatisticsmodel.cpp
index 47d9891..1cc5a90 100644
--- a/qt-models/yearlystatisticsmodel.cpp
+++ b/qt-models/yearlystatisticsmodel.cpp
@@ -202,4 +202,18 @@ void YearlyStatisticsModel::update_yearly_stats()
                rootItem->children.append(item);
                item->parent = rootItem;
        }
+
+       /* Show the statistic sorted by dive type */
+       if (stats_by_type != NULL && stats_by_type[0].selection_size) {
+               YearStatisticsItem *item = new 
YearStatisticsItem(stats_by_type[0]);
+               for (i = 1; i <= sizeof(dive_comp_type) + 1; ++i) {
+                       if (stats_by_type[i].selection_size == 0)
+                               continue;
+                       YearStatisticsItem *iChild = new 
YearStatisticsItem(stats_by_type[i]);
+                       item->children.append(iChild);
+                       iChild->parent = item;
+               }
+               rootItem->children.append(item);
+               item->parent = rootItem;
+       }
 }
diff --git a/subsurface-core/statistics.c b/subsurface-core/statistics.c
index 19fd350..ab0aaac 100644
--- a/subsurface-core/statistics.c
+++ b/subsurface-core/statistics.c
@@ -20,6 +20,7 @@ stats_t stats_selection;
 stats_t *stats_monthly = NULL;
 stats_t *stats_yearly = NULL;
 stats_t *stats_by_trip = NULL;
+stats_t *stats_by_type = NULL;
 
 static void process_temperatures(struct dive *dp, stats_t *stats)
 {
@@ -117,18 +118,34 @@ void process_all_dives(struct dive *dive, struct dive 
**prev_dive)
        free(stats_yearly);
        free(stats_monthly);
        free(stats_by_trip);
+       free(stats_by_type);
 
        size = sizeof(stats_t) * (dive_table.nr + 1);
        stats_yearly = malloc(size);
        stats_monthly = malloc(size);
        stats_by_trip = malloc(size);
-       if (!stats_yearly || !stats_monthly || !stats_by_trip)
+       stats_by_type = malloc(size);
+       if (!stats_yearly || !stats_monthly || !stats_by_trip || !stats_by_type)
                return;
        memset(stats_yearly, 0, size);
        memset(stats_monthly, 0, size);
        memset(stats_by_trip, 0, size);
+       memset(stats_by_type, 0, size);
        stats_yearly[0].is_year = true;
 
+       /* Setting the is_trip to true to show the location as first
+        * field in the statistics window */
+       stats_by_type[0].location = strdup("All (by type stats)");
+       stats_by_type[0].is_trip = true;
+       stats_by_type[1].location = strdup("OC");
+       stats_by_type[1].is_trip = true;
+       stats_by_type[2].location = strdup("CCR");
+       stats_by_type[2].is_trip = true;
+       stats_by_type[3].location = strdup("pSCR");
+       stats_by_type[3].is_trip = true;
+       stats_by_type[4].location = strdup("Freedive");
+       stats_by_type[4].is_trip = true;
+
        /* this relies on the fact that the dives in the dive_table
         * are in chronological order */
        for_each_dive (idx, dp) {
@@ -154,6 +171,13 @@ void process_all_dives(struct dive *dive, struct dive 
**prev_dive)
                stats_yearly[year_iter].selection_size++;
                stats_yearly[year_iter].period = current_year;
 
+               /* stats_by_type[0] is all the dives combined */
+               stats_by_type[0].selection_size++;
+               process_dive(dp, &(stats_by_type[0]));
+
+               process_dive(dp, &(stats_by_type[dp->dc.divemode + 1]));
+               stats_by_type[dp->dc.divemode + 1].selection_size++;
+
                if (dp->divetrip != NULL) {
                        if (trip_ptr != dp->divetrip) {
                                trip_ptr = dp->divetrip;
diff --git a/subsurface-core/statistics.h b/subsurface-core/statistics.h
index dbab257..890e6e5 100644
--- a/subsurface-core/statistics.h
+++ b/subsurface-core/statistics.h
@@ -39,6 +39,7 @@ extern stats_t stats_selection;
 extern stats_t *stats_yearly;
 extern stats_t *stats_monthly;
 extern stats_t *stats_by_trip;
+extern stats_t *stats_by_type;
 
 extern char *get_time_string_s(int seconds, int maxdays, bool freediving);
 extern char *get_minutes(int seconds);
-- 
2.5.0

_______________________________________________
subsurface mailing list
[email protected]
http://lists.subsurface-divelog.org/cgi-bin/mailman/listinfo/subsurface

Reply via email to