summaryrefslogtreecommitdiffstats
path: root/desktop-widgets/tab-widgets/TabDiveStatistics.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'desktop-widgets/tab-widgets/TabDiveStatistics.cpp')
-rw-r--r--desktop-widgets/tab-widgets/TabDiveStatistics.cpp125
1 files changed, 125 insertions, 0 deletions
diff --git a/desktop-widgets/tab-widgets/TabDiveStatistics.cpp b/desktop-widgets/tab-widgets/TabDiveStatistics.cpp
new file mode 100644
index 000000000..6f8c207b1
--- /dev/null
+++ b/desktop-widgets/tab-widgets/TabDiveStatistics.cpp
@@ -0,0 +1,125 @@
+#include "TabDiveStatistics.h"
+#include "ui_TabDiveStatistics.h"
+
+#include <core/helpers.h>
+#include <core/display.h>
+#include <core/statistics.h>
+
+TabDiveStatistics::TabDiveStatistics(QWidget *parent) : TabBase(parent), ui(new Ui::TabDiveStatistics())
+{
+ ui->setupUi(this);
+ ui->sacLimits->overrideMaxToolTipText(tr("Highest total SAC of a dive"));
+ ui->sacLimits->overrideMinToolTipText(tr("Lowest total SAC of a dive"));
+ ui->sacLimits->overrideAvgToolTipText(tr("Average total SAC of all selected dives"));
+ ui->tempLimits->overrideMaxToolTipText(tr("Highest temperature"));
+ ui->tempLimits->overrideMinToolTipText(tr("Lowest temperature"));
+ ui->tempLimits->overrideAvgToolTipText(tr("Average temperature of all selected dives"));
+ ui->depthLimits->overrideMaxToolTipText(tr("Deepest dive"));
+ ui->depthLimits->overrideMinToolTipText(tr("Shallowest dive"));
+ ui->timeLimits->overrideMaxToolTipText(tr("Longest dive"));
+ ui->timeLimits->overrideMinToolTipText(tr("Shortest dive"));
+ ui->timeLimits->overrideAvgToolTipText(tr("Average length of all selected dives"));
+
+ Q_FOREACH (QObject *obj, children()) {
+ if (QLabel *label = qobject_cast<QLabel *>(obj))
+ label->setAlignment(Qt::AlignHCenter);
+ }
+}
+
+TabDiveStatistics::~TabDiveStatistics()
+{
+ delete ui;
+}
+
+void TabDiveStatistics::clear()
+{
+ ui->depthLimits->clear();
+ ui->sacLimits->clear();
+ ui->divesAllText->clear();
+ ui->tempLimits->clear();
+ ui->totalTimeAllText->clear();
+ ui->timeLimits->clear();
+}
+
+void TabDiveStatistics::updateData()
+{
+ clear();
+ ui->depthLimits->setMaximum(get_depth_string(stats_selection.max_depth, true));
+ ui->depthLimits->setMinimum(get_depth_string(stats_selection.min_depth, true));
+ // the overall average depth is really confusing when listed between the
+ // deepest and shallowest dive - let's just not set it
+ // ui->depthLimits->setAverage(get_depth_string(stats_selection.avg_depth, true));
+
+
+ if (amount_selected > 1 && stats_selection.max_sac.mliter)
+ ui->sacLimits->setMaximum(get_volume_string(stats_selection.max_sac, true).append(tr("/min")));
+ else
+ ui->sacLimits->setMaximum("");
+ if (amount_selected > 1 && stats_selection.min_sac.mliter)
+ ui->sacLimits->setMinimum(get_volume_string(stats_selection.min_sac, true).append(tr("/min")));
+ else
+ ui->sacLimits->setMinimum("");
+ if (stats_selection.avg_sac.mliter)
+ ui->sacLimits->setAverage(get_volume_string(stats_selection.avg_sac, true).append(tr("/min")));
+ else
+ ui->sacLimits->setAverage("");
+
+ temperature_t temp;
+ temp.mkelvin = stats_selection.max_temp;
+ ui->tempLimits->setMaximum(get_temperature_string(temp, true));
+ temp.mkelvin = stats_selection.min_temp;
+ ui->tempLimits->setMinimum(get_temperature_string(temp, true));
+ if (stats_selection.combined_temp && stats_selection.combined_count) {
+ const char *unit;
+ get_temp_units(0, &unit);
+ ui->tempLimits->setAverage(QString("%1%2").arg(stats_selection.combined_temp / stats_selection.combined_count, 0, 'f', 1).arg(unit));
+ }
+
+
+ ui->divesAllText->setText(QString::number(stats_selection.selection_size));
+ ui->totalTimeAllText->setText(get_time_string_s(stats_selection.total_time.seconds, 0, (displayed_dive.dc.divemode == FREEDIVE)));
+ int seconds = stats_selection.total_time.seconds;
+ if (stats_selection.selection_size)
+ seconds /= stats_selection.selection_size;
+ ui->timeLimits->setAverage(get_time_string_s(seconds, 0,(displayed_dive.dc.divemode == FREEDIVE)));
+ if (amount_selected > 1) {
+ ui->timeLimits->setMaximum(get_time_string_s(stats_selection.longest_time.seconds, 0, (displayed_dive.dc.divemode == FREEDIVE)));
+ ui->timeLimits->setMinimum(get_time_string_s(stats_selection.shortest_time.seconds, 0, (displayed_dive.dc.divemode == FREEDIVE)));
+ } else {
+ ui->timeLimits->setMaximum("");
+ ui->timeLimits->setMinimum("");
+ }
+
+ QVector<QPair<QString, int> > gasUsed;
+ QString gasUsedString;
+ volume_t vol;
+ selectedDivesGasUsed(gasUsed);
+ for (int j = 0; j < 20; j++) {
+ if (gasUsed.isEmpty())
+ break;
+ QPair<QString, int> gasPair = gasUsed.last();
+ gasUsed.pop_back();
+ vol.mliter = gasPair.second;
+ gasUsedString.append(gasPair.first).append(": ").append(get_volume_string(vol, true)).append("\n");
+ }
+ if (!gasUsed.isEmpty())
+ gasUsedString.append("...");
+ volume_t o2_tot = {}, he_tot = {};
+ selected_dives_gas_parts(&o2_tot, &he_tot);
+
+ /* No need to show the gas mixing information if diving
+ * with pure air, and only display the he / O2 part when
+ * it is used.
+ */
+ if (he_tot.mliter || o2_tot.mliter) {
+ gasUsedString.append(tr("These gases could be\nmixed from Air and using:\n"));
+ if (he_tot.mliter)
+ gasUsedString.append(QString("He: %1").arg(get_volume_string(he_tot, true)));
+ if (he_tot.mliter && o2_tot.mliter)
+ gasUsedString.append(tr(" and "));
+ if (o2_tot.mliter)
+ gasUsedString.append(QString("O2: %2\n").arg(get_volume_string(o2_tot, true)));
+ }
+ ui->gasConsumption->setText(gasUsedString);
+}
+