From 61f8b8c00282519db18614c1a85036be769ee15c Mon Sep 17 00:00:00 2001 From: Berthold Stoeger Date: Sat, 3 Oct 2020 15:13:24 +0200 Subject: planner: limit depth and time of segments to sane values Using non-sensical depth and times for segments in the planner may lead to an unresponsive UI. Therefore limit depth to 1000 m/3300 ft and time to 100 h. Limiting of depth is done in settingsChanged() since it has to adapt to the user changig their preferred units. Fixes #2762. Signed-off-by: Berthold Stoeger --- desktop-widgets/diveplanner.cpp | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/desktop-widgets/diveplanner.cpp b/desktop-widgets/diveplanner.cpp index cd0ae2c2d..00aaffdac 100644 --- a/desktop-widgets/diveplanner.cpp +++ b/desktop-widgets/diveplanner.cpp @@ -169,9 +169,10 @@ DivePlannerWidget::DivePlannerWidget(QWidget *parent, Qt::WindowFlags f) : QWidg connect(closeKey, &QShortcut::activated, plannerModel, &DivePlannerPointsModel::cancelPlan); // This makes shure the spinbox gets a setMinimum(0) on it so we can't have negative time or depth. - ui.tableWidget->view()->setItemDelegateForColumn(DivePlannerPointsModel::DEPTH, new SpinBoxDelegate(0, INT_MAX, 1, this)); + // Limit segments to a depth of 1000 m/3300 ft and a duration of 100 h. Setting the limit for + // the depth will be done in settingChanged() since this depends on the chosen units. ui.tableWidget->view()->setItemDelegateForColumn(DivePlannerPointsModel::RUNTIME, new SpinBoxDelegate(0, INT_MAX, 1, this)); - ui.tableWidget->view()->setItemDelegateForColumn(DivePlannerPointsModel::DURATION, new SpinBoxDelegate(0, INT_MAX, 1, this)); + ui.tableWidget->view()->setItemDelegateForColumn(DivePlannerPointsModel::DURATION, new SpinBoxDelegate(0, 6000, 1, this)); ui.tableWidget->view()->setItemDelegateForColumn(DivePlannerPointsModel::CCSETPOINT, new DoubleSpinBoxDelegate(0, 2, 0.1, this)); /* set defaults. */ @@ -227,15 +228,19 @@ void DivePlannerWidget::setSalinity(int salinity) void DivePlannerWidget::settingsChanged() { // Adopt units + int maxDepth; if (get_units()->length == units::FEET) { ui.atmHeight->setSuffix("ft"); ui.atmHeight->setMinimum(-300); ui.atmHeight->setMaximum(10000); + maxDepth = 3300; } else { ui.atmHeight->setSuffix(("m")); ui.atmHeight->setMinimum(-100); ui.atmHeight->setMaximum(3000); + maxDepth = 1000; } + ui.tableWidget->view()->setItemDelegateForColumn(DivePlannerPointsModel::DEPTH, new SpinBoxDelegate(0, maxDepth, 1, this)); ui.atmHeight->blockSignals(true); ui.atmHeight->setValue((int) get_depth_units((int) pressure_to_altitude(DivePlannerPointsModel::instance()->getSurfacePressure()), NULL,NULL)); ui.atmHeight->blockSignals(false); @@ -553,7 +558,7 @@ void PlannerSettingsWidget::settingsChanged() ui.asc6toSurf->setText(tr("6m to surface")); ui.bestmixEND->setSuffix(tr("m")); } - if(get_units()->volume == units::CUFT) { + if (get_units()->volume == units::CUFT) { ui.bottomSAC->setSuffix(tr("cuft/min")); ui.decoStopSAC->setSuffix(tr("cuft/min")); ui.bottomSAC->setDecimals(2); @@ -572,7 +577,7 @@ void PlannerSettingsWidget::settingsChanged() ui.bottomSAC->setValue(PlannerShared::bottomsac()); ui.decoStopSAC->setValue(PlannerShared::decosac()); } - if(get_units()->pressure == units::BAR) { + if (get_units()->pressure == units::BAR) { ui.reserve_gas->setSuffix(tr("bar")); ui.reserve_gas->setSingleStep(1); ui.reserve_gas->setValue(prefs.reserve_gas / 1000); -- cgit v1.2.3-70-g09d2