aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--desktop-widgets/filterwidget2.cpp20
-rw-r--r--desktop-widgets/filterwidget2.ui59
-rw-r--r--qt-models/filtermodels.cpp30
-rw-r--r--qt-models/filtermodels.h5
4 files changed, 81 insertions, 33 deletions
diff --git a/desktop-widgets/filterwidget2.cpp b/desktop-widgets/filterwidget2.cpp
index c27d22062..71e7de83d 100644
--- a/desktop-widgets/filterwidget2.cpp
+++ b/desktop-widgets/filterwidget2.cpp
@@ -20,8 +20,8 @@ FilterWidget2::FilterWidget2(QWidget* parent) : QWidget(parent), ignoreSignal(fa
// TODO: unhide this when we discover how to search for equipment.
ui.equipment->hide();
+ ui.equipmentNegate->hide();
ui.labelEquipment->hide();
- ui.invertFilter->hide();
ui.fromDate->setDisplayFormat(prefs.date_format);
ui.fromTime->setDisplayFormat(prefs.time_format);
@@ -77,12 +77,21 @@ FilterWidget2::FilterWidget2(QWidget* parent) : QWidget(parent), ignoreSignal(fa
connect(ui.tags, &QLineEdit::textChanged,
this, &FilterWidget2::updateFilter);
+ connect(ui.tagsNegate, &QToolButton::toggled,
+ this, &FilterWidget2::updateFilter);
+
connect(ui.people, &QLineEdit::textChanged,
this, &FilterWidget2::updateFilter);
+ connect(ui.peopleNegate, &QToolButton::toggled,
+ this, &FilterWidget2::updateFilter);
+
connect(ui.location, &QLineEdit::textChanged,
this, &FilterWidget2::updateFilter);
+ connect(ui.locationNegate, &QToolButton::toggled,
+ this, &FilterWidget2::updateFilter);
+
connect(ui.logged, SIGNAL(stateChanged(int)), this, SLOT(updateLogged(int)));
connect(ui.planned, SIGNAL(stateChanged(int)), this, SLOT(updatePlanned(int)));
@@ -121,6 +130,10 @@ void FilterWidget2::clearFilter()
ui.fromTime->setTime(filterData.fromTime);
ui.toDate->setDate(filterData.toDate.date());
ui.toTime->setTime(filterData.toTime);
+ ui.tagsNegate->setChecked(filterData.tagsNegate);
+ ui.peopleNegate->setChecked(filterData.peopleNegate);
+ ui.locationNegate->setChecked(filterData.locationNegate);
+ ui.equipmentNegate->setChecked(filterData.equipmentNegate);
ignoreSignal = false;
filterDataChanged(filterData);
@@ -162,7 +175,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.invertFilter = ui.invertFilter->isChecked();
+ filterData.tagsNegate = ui.tagsNegate->isChecked();
+ filterData.peopleNegate = ui.peopleNegate->isChecked();
+ filterData.locationNegate = ui.locationNegate->isChecked();
+ filterData.equipmentNegate = ui.equipmentNegate->isChecked();
filterData.logged = ui.logged->isChecked();
filterData.planned = ui.planned->isChecked();
diff --git a/desktop-widgets/filterwidget2.ui b/desktop-widgets/filterwidget2.ui
index 0822a582f..84c543640 100644
--- a/desktop-widgets/filterwidget2.ui
+++ b/desktop-widgets/filterwidget2.ui
@@ -21,7 +21,7 @@
</property>
</widget>
</item>
- <item row="8" column="2" colspan="7">
+ <item row="8" column="2" colspan="6">
<widget class="QLineEdit" name="tags"/>
</item>
<item row="1" column="2">
@@ -62,16 +62,6 @@
<item row="3" column="6">
<widget class="QDoubleSpinBox" name="minWaterTemp"/>
</item>
- <item row="12" column="2" colspan="7">
- <widget class="QCheckBox" name="invertFilter">
- <property name="toolTip">
- <string>Display dives that will not match the search, only applies to tags, people, location and equipment</string>
- </property>
- <property name="text">
- <string>Invert filter</string>
- </property>
- </widget>
- </item>
<item row="2" column="7">
<widget class="QLabel" name="label_16">
<property name="text">
@@ -131,7 +121,7 @@
</property>
</widget>
</item>
- <item row="10" column="2" colspan="7">
+ <item row="10" column="2" colspan="6">
<widget class="QLineEdit" name="location"/>
</item>
<item row="11" column="0">
@@ -147,7 +137,7 @@
<item row="4" column="8">
<widget class="QDoubleSpinBox" name="maxAirTemp"/>
</item>
- <item row="11" column="2" colspan="7">
+ <item row="11" column="2" colspan="6">
<widget class="QLineEdit" name="equipment"/>
</item>
<item row="3" column="0">
@@ -157,7 +147,7 @@
</property>
</widget>
</item>
- <item row="9" column="2" colspan="7">
+ <item row="9" column="2" colspan="6">
<widget class="QLineEdit" name="people"/>
</item>
<item row="4" column="7">
@@ -301,6 +291,46 @@
</property>
</widget>
</item>
+ <item row="8" column="8">
+ <widget class="QToolButton" name="tagsNegate">
+ <property name="text">
+ <string>¬</string>
+ </property>
+ <property name="checkable">
+ <bool>true</bool>
+ </property>
+ </widget>
+ </item>
+ <item row="9" column="8">
+ <widget class="QToolButton" name="peopleNegate">
+ <property name="text">
+ <string>¬</string>
+ </property>
+ <property name="checkable">
+ <bool>true</bool>
+ </property>
+ </widget>
+ </item>
+ <item row="10" column="8">
+ <widget class="QToolButton" name="locationNegate">
+ <property name="text">
+ <string>¬</string>
+ </property>
+ <property name="checkable">
+ <bool>true</bool>
+ </property>
+ </widget>
+ </item>
+ <item row="11" column="8">
+ <widget class="QToolButton" name="equipmentNegate">
+ <property name="text">
+ <string>¬</string>
+ </property>
+ <property name="checkable">
+ <bool>true</bool>
+ </property>
+ </widget>
+ </item>
</layout>
</widget>
<customwidgets>
@@ -326,7 +356,6 @@
<tabstop>people</tabstop>
<tabstop>location</tabstop>
<tabstop>equipment</tabstop>
- <tabstop>invertFilter</tabstop>
</tabstops>
<resources/>
<connections/>
diff --git a/qt-models/filtermodels.cpp b/qt-models/filtermodels.cpp
index 5168e32d8..1a292741a 100644
--- a/qt-models/filtermodels.cpp
+++ b/qt-models/filtermodels.cpp
@@ -21,31 +21,31 @@ namespace {
bool listContainsSuperstring(const QStringList &list, const QString &s)
{
return std::any_of(list.begin(), list.end(), [&s](const QString &s2)
- { return s2.trimmed().contains(s.trimmed(), Qt::CaseInsensitive); });
+ { return s2.trimmed().contains(s.trimmed(), Qt::CaseInsensitive); } );
}
- bool hasTags(const QStringList &tags, const struct dive *d)
+ bool hasTags(const QStringList &tags, const struct dive *d, bool negate)
{
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](const QString &tag)
- { return listContainsSuperstring(dive_tags, tag); });
+ return std::all_of(tags.begin(), tags.end(), [&dive_tags, negate](const QString &tag)
+ { return listContainsSuperstring(dive_tags, tag) != negate; } );
}
- bool hasPersons(const QStringList &people, const struct dive *d)
+ bool hasPersons(const QStringList &people, const struct dive *d, bool negate)
{
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](const QString &person)
- { return listContainsSuperstring(dive_people, person); });
+ return std::all_of(people.begin(), people.end(), [&dive_people, negate](const QString &person)
+ { return listContainsSuperstring(dive_people, person) != negate; } );
}
- bool hasLocations(const QStringList &locations, const struct dive *d)
+ bool hasLocations(const QStringList &locations, const struct dive *d, bool negate)
{
if (locations.isEmpty())
return true;
@@ -56,12 +56,12 @@ namespace {
if (d->dive_site)
diveLocations.push_back(QString(d->dive_site->name));
- return std::all_of(locations.begin(), locations.end(), [&diveLocations](const QString &location)
- { return listContainsSuperstring(diveLocations, location); });
+ return std::all_of(locations.begin(), locations.end(), [&diveLocations, negate](const QString &location)
+ { return listContainsSuperstring(diveLocations, location) != negate; } );
}
// TODO: Finish this iimplementation.
- bool hasEquipment(const QStringList& equipment, const struct dive *d)
+ bool hasEquipment(const QStringList &, const struct dive *, bool)
{
return true;
}
@@ -129,18 +129,18 @@ bool MultiFilterSortModel::showDive(const struct dive *d) const
return false;
// tags.
- if (!hasTags(filterData.tags, d))
+ if (!hasTags(filterData.tags, d, filterData.tagsNegate))
return false;
// people
- if (!hasPersons(filterData.people, d))
+ if (!hasPersons(filterData.people, d, filterData.peopleNegate))
return false;
// Location
- if (!hasLocations(filterData.location, d))
+ if (!hasLocations(filterData.location, d, filterData.locationNegate))
return false;
- if (!hasEquipment(filterData.equipment, d))
+ if (!hasEquipment(filterData.equipment, d, filterData.equipmentNegate))
return false;
// Planned/Logged
diff --git a/qt-models/filtermodels.h b/qt-models/filtermodels.h
index 7ef50df92..39f6f83e4 100644
--- a/qt-models/filtermodels.h
+++ b/qt-models/filtermodels.h
@@ -35,9 +35,12 @@ struct FilterData {
QStringList people;
QStringList location;
QStringList equipment;
+ bool tagsNegate = false;
+ bool peopleNegate = false;
+ bool locationNegate = false;
+ bool equipmentNegate = false;
bool logged = true;
bool planned = true;
- bool invertFilter;
};
class MultiFilterSortModel : public QSortFilterProxyModel {