diff options
Diffstat (limited to 'desktop-widgets/tab-widgets/TabDiveInformation.cpp')
-rw-r--r-- | desktop-widgets/tab-widgets/TabDiveInformation.cpp | 79 |
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 + } +} + + |