summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--desktop-widgets/filterwidget2.cpp16
-rw-r--r--desktop-widgets/filterwidget2.ui24
-rw-r--r--qt-models/filtermodels.cpp42
-rw-r--r--qt-models/filtermodels.h15
4 files changed, 66 insertions, 31 deletions
diff --git a/desktop-widgets/filterwidget2.cpp b/desktop-widgets/filterwidget2.cpp
index 85c977b4e..77cefa5a8 100644
--- a/desktop-widgets/filterwidget2.cpp
+++ b/desktop-widgets/filterwidget2.cpp
@@ -140,10 +140,10 @@ void FilterWidget2::clearFilter()
ui.fromTime->setTime(filterData.fromTime);
ui.toDate->setDate(filterData.toDate.date());
ui.toTime->setTime(filterData.toTime);
- ui.tagsMode->setCurrentIndex(filterData.tagsNegate ? 1 : 0);
- ui.peopleMode->setCurrentIndex(filterData.peopleNegate ? 1 : 0);
- ui.locationMode->setCurrentIndex(filterData.locationNegate ? 1 : 0);
- ui.equipmentMode->setCurrentIndex(filterData.equipmentNegate ? 1 : 0);
+ ui.tagsMode->setCurrentIndex((int)filterData.tagsMode);
+ ui.peopleMode->setCurrentIndex((int)filterData.peopleMode);
+ ui.locationMode->setCurrentIndex((int)filterData.locationMode);
+ ui.equipmentMode->setCurrentIndex((int)filterData.equipmentMode);
ignoreSignal = false;
@@ -186,10 +186,10 @@ void FilterWidget2::updateFilter()
filterData.people = ui.people->text().split(",", QString::SkipEmptyParts);
filterData.location = ui.location->text().split(",", QString::SkipEmptyParts);
filterData.equipment = ui.equipment->text().split(",", QString::SkipEmptyParts);
- filterData.tagsNegate = ui.tagsMode->currentIndex() == 1;
- filterData.peopleNegate = ui.peopleMode->currentIndex() == 1;
- filterData.locationNegate = ui.locationMode->currentIndex() == 1;
- filterData.equipmentNegate = ui.equipmentMode->currentIndex() == 1;
+ filterData.tagsMode = (FilterData::Mode)ui.tagsMode->currentIndex();
+ filterData.peopleMode = (FilterData::Mode)ui.peopleMode->currentIndex();
+ filterData.locationMode = (FilterData::Mode)ui.locationMode->currentIndex();
+ filterData.equipmentMode = (FilterData::Mode)ui.equipmentMode->currentIndex();
filterData.logged = ui.logged->isChecked();
filterData.planned = ui.planned->isChecked();
diff --git a/desktop-widgets/filterwidget2.ui b/desktop-widgets/filterwidget2.ui
index 0b95f7bae..92b61ba80 100644
--- a/desktop-widgets/filterwidget2.ui
+++ b/desktop-widgets/filterwidget2.ui
@@ -300,6 +300,11 @@
</item>
<item>
<property name="text">
+ <string>Any of</string>
+ </property>
+ </item>
+ <item>
+ <property name="text">
<string>None of</string>
</property>
</item>
@@ -314,6 +319,11 @@
</item>
<item>
<property name="text">
+ <string>Any of</string>
+ </property>
+ </item>
+ <item>
+ <property name="text">
<string>None of</string>
</property>
</item>
@@ -323,12 +333,17 @@
<widget class="QComboBox" name="locationMode">
<item>
<property name="text">
- <string>Matches</string>
+ <string>All of</string>
+ </property>
+ </item>
+ <item>
+ <property name="text">
+ <string>Any of</string>
</property>
</item>
<item>
<property name="text">
- <string>Doesn't match</string>
+ <string>None of</string>
</property>
</item>
</widget>
@@ -342,6 +357,11 @@
</item>
<item>
<property name="text">
+ <string>Any of</string>
+ </property>
+ </item>
+ <item>
+ <property name="text">
<string>None of</string>
</property>
</item>
diff --git a/qt-models/filtermodels.cpp b/qt-models/filtermodels.cpp
index 1a292741a..93bb59abf 100644
--- a/qt-models/filtermodels.cpp
+++ b/qt-models/filtermodels.cpp
@@ -24,28 +24,37 @@ namespace {
{ return s2.trimmed().contains(s.trimmed(), Qt::CaseInsensitive); } );
}
- bool hasTags(const QStringList &tags, const struct dive *d, bool negate)
+ // Check whether either all, any or none of the items of the first list is
+ // in the second list as a super string.
+ // The mode is controlled by the second argument
+ bool check(const QStringList &items, const QStringList &list, FilterData::Mode mode)
+ {
+ bool negate = mode == FilterData::Mode::NONE_OF;
+ bool any_of = mode == FilterData::Mode::ANY_OF;
+ auto fun = [&list, negate](const QString &item)
+ { return listContainsSuperstring(list, item) != negate; };
+ return any_of ? std::any_of(items.begin(), items.end(), fun)
+ : std::all_of(items.begin(), items.end(), fun);
+ }
+
+ bool hasTags(const QStringList &tags, const struct dive *d, FilterData::Mode mode)
{
if (tags.isEmpty())
return true;
QStringList dive_tags = get_taglist_string(d->tag_list).split(",");
-
- return std::all_of(tags.begin(), tags.end(), [&dive_tags, negate](const QString &tag)
- { return listContainsSuperstring(dive_tags, tag) != negate; } );
+ return check(tags, dive_tags, mode);
}
- bool hasPersons(const QStringList &people, const struct dive *d, bool negate)
+ bool hasPersons(const QStringList &people, const struct dive *d, FilterData::Mode mode)
{
if (people.isEmpty())
return true;
QStringList dive_people = QString(d->buddy).split(",", QString::SkipEmptyParts)
+ QString(d->divemaster).split(",", QString::SkipEmptyParts);
-
- return std::all_of(people.begin(), people.end(), [&dive_people, negate](const QString &person)
- { return listContainsSuperstring(dive_people, person) != negate; } );
+ return check(people, dive_people, mode);
}
- bool hasLocations(const QStringList &locations, const struct dive *d, bool negate)
+ bool hasLocations(const QStringList &locations, const struct dive *d, FilterData::Mode mode)
{
if (locations.isEmpty())
return true;
@@ -56,12 +65,11 @@ namespace {
if (d->dive_site)
diveLocations.push_back(QString(d->dive_site->name));
- return std::all_of(locations.begin(), locations.end(), [&diveLocations, negate](const QString &location)
- { return listContainsSuperstring(diveLocations, location) != negate; } );
+ return check(locations, diveLocations, mode);
}
- // TODO: Finish this iimplementation.
- bool hasEquipment(const QStringList &, const struct dive *, bool)
+ // TODO: Finish this implementation.
+ bool hasEquipment(const QStringList &, const struct dive *, FilterData::Mode)
{
return true;
}
@@ -129,18 +137,18 @@ bool MultiFilterSortModel::showDive(const struct dive *d) const
return false;
// tags.
- if (!hasTags(filterData.tags, d, filterData.tagsNegate))
+ if (!hasTags(filterData.tags, d, filterData.tagsMode))
return false;
// people
- if (!hasPersons(filterData.people, d, filterData.peopleNegate))
+ if (!hasPersons(filterData.people, d, filterData.peopleMode))
return false;
// Location
- if (!hasLocations(filterData.location, d, filterData.locationNegate))
+ if (!hasLocations(filterData.location, d, filterData.locationMode))
return false;
- if (!hasEquipment(filterData.equipment, d, filterData.equipmentNegate))
+ if (!hasEquipment(filterData.equipment, d, filterData.equipmentMode))
return false;
// Planned/Logged
diff --git a/qt-models/filtermodels.h b/qt-models/filtermodels.h
index 39f6f83e4..7370b8d5f 100644
--- a/qt-models/filtermodels.h
+++ b/qt-models/filtermodels.h
@@ -15,6 +15,13 @@ struct dive;
struct dive_trip;
struct FilterData {
+ // The mode ids are chosen such that they can be directly converted from / to combobox indices.
+ enum class Mode {
+ ALL_OF = 0,
+ ANY_OF = 1,
+ NONE_OF = 2
+ };
+
bool validFilter = false;
int minVisibility = 0;
int maxVisibility = 5;
@@ -35,10 +42,10 @@ struct FilterData {
QStringList people;
QStringList location;
QStringList equipment;
- bool tagsNegate = false;
- bool peopleNegate = false;
- bool locationNegate = false;
- bool equipmentNegate = false;
+ Mode tagsMode = Mode::ALL_OF;
+ Mode peopleMode = Mode::ALL_OF;
+ Mode locationMode = Mode::ALL_OF;
+ Mode equipmentMode = Mode::ALL_OF;
bool logged = true;
bool planned = true;
};