summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorGravatar Berthold Stoeger <bstoeger@mail.tuwien.ac.at>2020-04-22 00:05:52 +0200
committerGravatar Dirk Hohndel <dirk@hohndel.org>2020-04-24 10:05:27 -0700
commit89784a176efb52558b3fa103401fd7d8d2be0fe5 (patch)
tree5c5e124c30f4ee76103748b02fda2ceac7b3dac8
parent9b8eed7821c7e55c5e2eccd252184a6d2123e3cd (diff)
downloadsubsurface-89784a176efb52558b3fa103401fd7d8d2be0fe5.tar.gz
filter: implement filtering for divemode
This only checks the first divecomputer as the semantics for multiple dive computers with different dive modes are not clear. Should we check them all? The implementation is a bit hackish: the indexes [0...n] of the combobox are mapped onto [-1...n-1], where -1 means don't filter and n-1 is the last valid dive mode. Implements #2329 Signed-off-by: Berthold Stoeger <bstoeger@mail.tuwien.ac.at>
-rw-r--r--core/divefilter.cpp4
-rw-r--r--core/divefilter.h1
-rw-r--r--desktop-widgets/filterwidget2.cpp12
-rw-r--r--desktop-widgets/filterwidget2.ui22
4 files changed, 34 insertions, 5 deletions
diff --git a/core/divefilter.cpp b/core/divefilter.cpp
index ed8e30f5f..89fbd731d 100644
--- a/core/divefilter.cpp
+++ b/core/divefilter.cpp
@@ -349,6 +349,10 @@ bool DiveFilter::showDive(const struct dive *d) const
if (!filterData.planned && !has_planned(d, false))
return false;
+ // Dive mode
+ if (filterData.diveMode >= 0 && d->dc.divemode != (divemode_t)filterData.diveMode)
+ return false;
+
return true;
}
diff --git a/core/divefilter.h b/core/divefilter.h
index ae5ba9869..37024be47 100644
--- a/core/divefilter.h
+++ b/core/divefilter.h
@@ -101,6 +101,7 @@ struct FilterData {
StringFilterMode equipmentStringMode = StringFilterMode::SUBSTRING;
bool logged = true;
bool planned = true;
+ int diveMode = -1; // -1: don't filter, >= 0: corresponds to divemode_t
};
class DiveFilter {
diff --git a/desktop-widgets/filterwidget2.cpp b/desktop-widgets/filterwidget2.cpp
index 2dee9979b..6d90ae0b3 100644
--- a/desktop-widgets/filterwidget2.cpp
+++ b/desktop-widgets/filterwidget2.cpp
@@ -21,6 +21,13 @@ FilterWidget2::FilterWidget2(QWidget* parent) :
ui.minWaterTemp->setRange(data.minWaterTemp, data.maxWaterTemp);
ui.maxWaterTemp->setRange(data.minWaterTemp, data.maxWaterTemp);
+ // This needs to be the same order as enum dive_comp_type in dive.h!
+ QStringList types;
+ types.append(""); // Empty means don't filter on dive mode
+ for (int i = 0; i < NUM_DIVEMODE; i++)
+ types.append(gettextFromC::tr(divemode_text_ui[i]));
+ ui.diveMode->insertItems(0, types);
+
// TODO: unhide this when we discover how to search for equipment.
ui.equipment->hide();
ui.equipmentMode->hide();
@@ -135,6 +142,9 @@ FilterWidget2::FilterWidget2(QWidget* parent) :
connect(ui.planned, &QCheckBox::stateChanged,
this, &FilterWidget2::updatePlanned);
+ connect(ui.diveMode, QOverload<int>::of(&QComboBox::currentIndexChanged),
+ this, &FilterWidget2::updateFilter);
+
// Update temperature fields if user changes temperature-units in preferences.
connect(qPrefUnits::instance(), &qPrefUnits::temperatureChanged,
this, &FilterWidget2::temperatureChanged);
@@ -183,6 +193,7 @@ void FilterWidget2::clearFilter()
ui.suitStringMode->setCurrentIndex((int)filterData.suitStringMode);
ui.dnotesStringMode->setCurrentIndex((int)filterData.dnotesStringMode);
ui.equipmentStringMode->setCurrentIndex((int)filterData.equipmentStringMode);
+ ui.diveMode->setCurrentIndex(filterData.diveMode + 1); // -1 means don't filter, transform that into index 0
ignoreSignal = false;
@@ -243,6 +254,7 @@ void FilterWidget2::updateFilter()
filterData.equipmentStringMode = (StringFilterMode)ui.equipmentStringMode->currentIndex();
filterData.logged = ui.logged->isChecked();
filterData.planned = ui.planned->isChecked();
+ filterData.diveMode = ui.diveMode->currentIndex() - 1; // The first entry means don't filter, transform that to -1.
filterDataChanged(filterData);
}
diff --git a/desktop-widgets/filterwidget2.ui b/desktop-widgets/filterwidget2.ui
index 74f1e5da7..395083204 100644
--- a/desktop-widgets/filterwidget2.ui
+++ b/desktop-widgets/filterwidget2.ui
@@ -115,7 +115,7 @@
</property>
</widget>
</item>
- <item row="15" column="0">
+ <item row="16" column="0">
<widget class="QLabel" name="labelEquipment">
<property name="text">
<string>Equipment</string>
@@ -188,7 +188,7 @@
</property>
</widget>
</item>
- <item row="15" column="1">
+ <item row="16" column="1">
<widget class="QComboBox" name="equipmentMode">
<item>
<property name="text">
@@ -234,7 +234,7 @@
</property>
</widget>
</item>
- <item row="15" column="0">
+ <item row="16" column="0">
<spacer name="verticalSpacer">
<property name="orientation">
<enum>Qt::Vertical</enum>
@@ -247,7 +247,7 @@
</property>
</spacer>
</item>
- <item row="13" column="4" colspan="2">
+ <item row="16" column="4" colspan="2">
<widget class="QLineEdit" name="equipment"/>
</item>
<item row="8" column="4">
@@ -452,7 +452,7 @@
</property>
</widget>
</item>
- <item row="15" column="2">
+ <item row="16" column="2">
<widget class="QComboBox" name="equipmentStringMode">
<item>
<property name="text">
@@ -602,6 +602,17 @@
<item row="1" column="2" colspan="4">
<widget class="QLineEdit" name="fullText"/>
</item>
+ <item row="15" column="0">
+ <widget class="QLabel" name="label_21">
+ <property name="text">
+ <string>Dive mode</string>
+ </property>
+ </widget>
+ </item>
+ <item row="15" column="1">
+ <widget class="QComboBox" name="diveMode">
+ </widget>
+ </item>
</layout>
</widget>
</widget>
@@ -648,6 +659,7 @@
<tabstop>dnotesMode</tabstop>
<tabstop>dnotesStringMode</tabstop>
<tabstop>dnotes</tabstop>
+ <tabstop>diveMode</tabstop>
<tabstop>equipmentMode</tabstop>
<tabstop>equipmentStringMode</tabstop>
<tabstop>equipment</tabstop>