summaryrefslogtreecommitdiffstats
path: root/qt-models/yearlystatisticsmodel.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'qt-models/yearlystatisticsmodel.cpp')
-rw-r--r--qt-models/yearlystatisticsmodel.cpp205
1 files changed, 205 insertions, 0 deletions
diff --git a/qt-models/yearlystatisticsmodel.cpp b/qt-models/yearlystatisticsmodel.cpp
new file mode 100644
index 000000000..47d9891f2
--- /dev/null
+++ b/qt-models/yearlystatisticsmodel.cpp
@@ -0,0 +1,205 @@
+#include "yearlystatisticsmodel.h"
+#include "dive.h"
+#include "helpers.h"
+#include "metrics.h"
+#include "statistics.h"
+
+class YearStatisticsItem : public TreeItem {
+public:
+ enum {
+ YEAR,
+ DIVES,
+ TOTAL_TIME,
+ AVERAGE_TIME,
+ SHORTEST_TIME,
+ LONGEST_TIME,
+ AVG_DEPTH,
+ MIN_DEPTH,
+ MAX_DEPTH,
+ AVG_SAC,
+ MIN_SAC,
+ MAX_SAC,
+ AVG_TEMP,
+ MIN_TEMP,
+ MAX_TEMP,
+ COLUMNS
+ };
+
+ QVariant data(int column, int role) const;
+ YearStatisticsItem(stats_t interval);
+
+private:
+ stats_t stats_interval;
+};
+
+YearStatisticsItem::YearStatisticsItem(stats_t interval) : stats_interval(interval)
+{
+}
+
+QVariant YearStatisticsItem::data(int column, int role) const
+{
+ double value;
+ QVariant ret;
+
+ if (role == Qt::FontRole) {
+ QFont font = defaultModelFont();
+ font.setBold(stats_interval.is_year);
+ return font;
+ } else if (role != Qt::DisplayRole) {
+ return ret;
+ }
+ switch (column) {
+ case YEAR:
+ if (stats_interval.is_trip) {
+ ret = stats_interval.location;
+ } else {
+ ret = stats_interval.period;
+ }
+ break;
+ case DIVES:
+ ret = stats_interval.selection_size;
+ break;
+ case TOTAL_TIME:
+ ret = get_time_string(stats_interval.total_time.seconds, 0);
+ break;
+ case AVERAGE_TIME:
+ ret = get_minutes(stats_interval.total_time.seconds / stats_interval.selection_size);
+ break;
+ case SHORTEST_TIME:
+ ret = get_minutes(stats_interval.shortest_time.seconds);
+ break;
+ case LONGEST_TIME:
+ ret = get_minutes(stats_interval.longest_time.seconds);
+ break;
+ case AVG_DEPTH:
+ ret = get_depth_string(stats_interval.avg_depth);
+ break;
+ case MIN_DEPTH:
+ ret = get_depth_string(stats_interval.min_depth);
+ break;
+ case MAX_DEPTH:
+ ret = get_depth_string(stats_interval.max_depth);
+ break;
+ case AVG_SAC:
+ ret = get_volume_string(stats_interval.avg_sac);
+ break;
+ case MIN_SAC:
+ ret = get_volume_string(stats_interval.min_sac);
+ break;
+ case MAX_SAC:
+ ret = get_volume_string(stats_interval.max_sac);
+ break;
+ case AVG_TEMP:
+ if (stats_interval.combined_temp && stats_interval.combined_count) {
+ ret = QString::number(stats_interval.combined_temp / stats_interval.combined_count, 'f', 1);
+ }
+ break;
+ case MIN_TEMP:
+ value = get_temp_units(stats_interval.min_temp, NULL);
+ if (value > -100.0)
+ ret = QString::number(value, 'f', 1);
+ break;
+ case MAX_TEMP:
+ value = get_temp_units(stats_interval.max_temp, NULL);
+ if (value > -100.0)
+ ret = QString::number(value, 'f', 1);
+ break;
+ }
+ return ret;
+}
+
+YearlyStatisticsModel::YearlyStatisticsModel(QObject *parent)
+{
+ columns = COLUMNS;
+ update_yearly_stats();
+}
+
+QVariant YearlyStatisticsModel::headerData(int section, Qt::Orientation orientation, int role) const
+{
+ QVariant val;
+ if (role == Qt::FontRole)
+ val = defaultModelFont();
+
+ if (role == Qt::DisplayRole && orientation == Qt::Horizontal) {
+ switch (section) {
+ case YEAR:
+ val = tr("Year \n > Month / Trip");
+ break;
+ case DIVES:
+ val = tr("#");
+ break;
+ case TOTAL_TIME:
+ val = tr("Duration \n Total");
+ break;
+ case AVERAGE_TIME:
+ val = tr("\nAverage");
+ break;
+ case SHORTEST_TIME:
+ val = tr("\nShortest");
+ break;
+ case LONGEST_TIME:
+ val = tr("\nLongest");
+ break;
+ case AVG_DEPTH:
+ val = QString(tr("Depth (%1)\n Average")).arg(get_depth_unit());
+ break;
+ case MIN_DEPTH:
+ val = tr("\nMinimum");
+ break;
+ case MAX_DEPTH:
+ val = tr("\nMaximum");
+ break;
+ case AVG_SAC:
+ val = QString(tr("SAC (%1)\n Average")).arg(get_volume_unit());
+ break;
+ case MIN_SAC:
+ val = tr("\nMinimum");
+ break;
+ case MAX_SAC:
+ val = tr("\nMaximum");
+ break;
+ case AVG_TEMP:
+ val = QString(tr("Temp. (%1)\n Average").arg(get_temp_unit()));
+ break;
+ case MIN_TEMP:
+ val = tr("\nMinimum");
+ break;
+ case MAX_TEMP:
+ val = tr("\nMaximum");
+ break;
+ }
+ }
+ return val;
+}
+
+void YearlyStatisticsModel::update_yearly_stats()
+{
+ int i, month = 0;
+ unsigned int j, combined_months;
+
+ for (i = 0; stats_yearly != NULL && stats_yearly[i].period; ++i) {
+ YearStatisticsItem *item = new YearStatisticsItem(stats_yearly[i]);
+ combined_months = 0;
+ for (j = 0; combined_months < stats_yearly[i].selection_size; ++j) {
+ combined_months += stats_monthly[month].selection_size;
+ YearStatisticsItem *iChild = new YearStatisticsItem(stats_monthly[month]);
+ item->children.append(iChild);
+ iChild->parent = item;
+ month++;
+ }
+ rootItem->children.append(item);
+ item->parent = rootItem;
+ }
+
+
+ if (stats_by_trip != NULL && stats_by_trip[0].is_trip == true) {
+ YearStatisticsItem *item = new YearStatisticsItem(stats_by_trip[0]);
+ for (i = 1; stats_by_trip != NULL && stats_by_trip[i].is_trip; ++i) {
+ YearStatisticsItem *iChild = new YearStatisticsItem(stats_by_trip[i]);
+ item->children.append(iChild);
+ iChild->parent = item;
+ }
+ rootItem->children.append(item);
+ item->parent = rootItem;
+ }
+}