summaryrefslogtreecommitdiffstats
path: root/desktop-widgets/tab-widgets/TabDiveInformation.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'desktop-widgets/tab-widgets/TabDiveInformation.cpp')
-rw-r--r--desktop-widgets/tab-widgets/TabDiveInformation.cpp79
1 files changed, 73 insertions, 6 deletions
diff --git a/desktop-widgets/tab-widgets/TabDiveInformation.cpp b/desktop-widgets/tab-widgets/TabDiveInformation.cpp
index 5fe6ea714..4511f9b61 100644
--- a/desktop-widgets/tab-widgets/TabDiveInformation.cpp
+++ b/desktop-widgets/tab-widgets/TabDiveInformation.cpp
@@ -2,15 +2,24 @@
#include "TabDiveInformation.h"
#include "ui_TabDiveInformation.h"
#include "../tagwidget.h"
+#include "core/units.h"
+#include "core/dive.h"
+#include "desktop-widgets/command.h"
#include <core/qthelper.h>
#include <core/statistics.h>
#include <core/display.h>
+#define COMBO_CHANGED 0
+#define TEXT_EDITED 1
+
TabDiveInformation::TabDiveInformation(QWidget *parent) : TabBase(parent), ui(new Ui::TabDiveInformation())
{
ui->setupUi(this);
connect(&diveListNotifier, &DiveListNotifier::divesChanged, this, &TabDiveInformation::divesChanged);
+ QStringList atmPressTypes { "mbar", get_depth_unit() ,"use dc"};
+ ui->atmPressType->insertItems(0, atmPressTypes);
+ pressTypeIndex = 0;
}
TabDiveInformation::~TabDiveInformation()
@@ -32,7 +41,7 @@ void TabDiveInformation::clear()
ui->averageDepthText->clear();
ui->waterTemperatureText->clear();
ui->airTemperatureText->clear();
- ui->airPressureText->clear();
+ ui->atmPressVal->clear();
ui->salinityText->clear();
}
@@ -74,6 +83,17 @@ void TabDiveInformation::updateProfile()
" ", current_dive->dc.divemode == FREEDIVE));
ui->sacText->setText( mean[0] ? SACs : QString());
+
+ if (current_dive->surface_pressure.mbar == 0) {
+ ui->atmPressVal->clear(); // If no atm pressure for dive then clear text box
+ }
+ else {
+
+ ui->atmPressVal->setEnabled(true);
+ QString pressStr;
+ pressStr.sprintf("%d",current_dive->surface_pressure.mbar);
+ ui->atmPressVal->setText(pressStr); // else display atm pressure
+ }
}
// Update fields that depend on start of dive
@@ -99,15 +119,15 @@ void TabDiveInformation::updateData()
ui->waterTemperatureText->setText(get_temperature_string(current_dive->watertemp, true));
ui->airTemperatureText->setText(get_temperature_string(current_dive->airtemp, true));
- if (current_dive->surface_pressure.mbar) /* this is ALWAYS displayed in mbar */
- ui->airPressureText->setText(QString("%1mbar").arg(current_dive->surface_pressure.mbar));
- else
- ui->airPressureText->clear();
-
if (current_dive->salinity)
ui->salinityText->setText(QString("%1g/ℓ").arg(current_dive->salinity / 10.0));
else
ui->salinityText->clear();
+
+ ui->atmPressType->setEditable(true);
+ ui->atmPressType->setItemText(1, get_depth_unit()); // Check for changes in depth unit (imperial/metric)
+ ui->atmPressType->setEditable(false);
+ ui->atmPressType->setCurrentIndex(0); // Set the atmospheric pressure combo box to mbar
}
// This function gets called if a field gets updated by an undo command.
@@ -130,6 +150,9 @@ void TabDiveInformation::divesChanged(dive_trip *trip, const QVector<dive *> &di
case DiveField::WATER_TEMP:
ui->waterTemperatureText->setText(get_temperature_string(current_dive->watertemp, true));
break;
+ case DiveField::ATM_PRESS:
+ ui->atmPressVal->setText(ui->atmPressVal->text().sprintf("%d",current_dive->surface_pressure.mbar));
+ break;
case DiveField::DATETIME:
updateWhen();
break;
@@ -137,3 +160,47 @@ void TabDiveInformation::divesChanged(dive_trip *trip, const QVector<dive *> &di
break;
}
}
+
+void TabDiveInformation::on_atmPressType_currentIndexChanged(int index) { updateTextBox(COMBO_CHANGED); }
+
+void TabDiveInformation::on_atmPressVal_editingFinished() { updateTextBox(TEXT_EDITED); }
+
+void TabDiveInformation::updateTextBox(int event) // Either the text box has been edited or the pressure type has changed.
+{ // Either way this gets a numeric value and puts it on the text box atmPressVal,
+ pressure_t atmpress = { 0 }; // then stores it in dive->surface_pressure.The undo stack for the text box content is
+ double altitudeVal; // maintained even though two independent events trigger saving the text box contents.
+ if (current_dive) {
+ switch (ui->atmPressType->currentIndex()) {
+ case 0: // If an atm pressure has been specified in mbar:
+ if (event == TEXT_EDITED) // this is only triggered by on_atmPressVal_editingFinished()
+ atmpress.mbar = ui->atmPressVal->text().toInt(); // use the specified mbar pressure
+ break;
+ case 1: // If an altitude has been specified:
+ if (event == TEXT_EDITED) { // this is only triggered by on_atmPressVal_editingFinished()
+ altitudeVal = (ui->atmPressVal->text().toFloat()); // get altitude from text box
+ if (prefs.units.length == units::FEET) // if altitude in feet
+ altitudeVal = feet_to_mm(altitudeVal); // imperial: convert altitude from feet to mm
+ else
+ altitudeVal = altitudeVal * 1000; // metric: convert altitude from meters to mm
+ atmpress.mbar = altitude_to_pressure((int32_t) altitudeVal); // convert altitude (mm) to pressure (mbar)
+ ui->atmPressVal->setText(ui->atmPressVal->text().sprintf("%d",atmpress.mbar));
+ ui->atmPressType->setCurrentIndex(0); // reset combobox to mbar
+ } else { // i.e. event == COMBO_CHANGED, that is, "m" or "ft" was selected from combobox
+ ui->atmPressVal->clear(); // Clear the text box so that altitude can be typed
+ }
+ break;
+ case 2: // i.e. event = COMBO_CHANGED, that is, the option "Use dc" was selected from combobox
+ atmpress = calculate_surface_pressure(current_dive); // re-calculate air pressure from dc data
+ ui->atmPressVal->setText(QString::number(atmpress.mbar)); // display it in text box
+ ui->atmPressType->setCurrentIndex(0); // reset combobox to mbar
+ break;
+ default:
+ atmpress.mbar = 1013; // This line should never execute
+ break;
+ }
+ if (atmpress.mbar)
+ Command::editAtmPress(atmpress.mbar, false); // and save the pressure for undo
+ }
+}
+
+