diff options
author | Tomaz Canabrava <tcanabrava@kde.org> | 2018-11-16 13:49:19 +0100 |
---|---|---|
committer | Dirk Hohndel <dirk@hohndel.org> | 2018-12-14 01:05:18 +0800 |
commit | 201f0c8f89d6d7df96fd220ea2c0d0977c9b7f20 (patch) | |
tree | f98180cdc25df89c5465c5ea7a097302d1a40279 /qt-models/filtermodels.cpp | |
parent | e0f473fcb49c8121a0a9c52bf0536049b0f342ed (diff) | |
download | subsurface-201f0c8f89d6d7df96fd220ea2c0d0977c9b7f20.tar.gz |
Filter the data
Wire up the needed code to filter the data in the myInvalidate
call. The data comes from the Struct FilterData and if any
of the test conditions on the filter function are false, the
filter will assume that the specific dive shouldn't be shown
Signed-off-by: Tomaz Canabrava <tcanabrava@kde.org>
Diffstat (limited to 'qt-models/filtermodels.cpp')
-rw-r--r-- | qt-models/filtermodels.cpp | 95 |
1 files changed, 89 insertions, 6 deletions
diff --git a/qt-models/filtermodels.cpp b/qt-models/filtermodels.cpp index 31c6fe0af..3cae58e80 100644 --- a/qt-models/filtermodels.cpp +++ b/qt-models/filtermodels.cpp @@ -15,6 +15,61 @@ #include <QDebug> #include <algorithm> +namespace { + bool hasTag(const QStringList tags, const struct dive *d) + { + if (!tags.isEmpty()) { + auto dive_tags = get_taglist_string(d->tag_list).split(","); + bool found_tag = false; + for (const auto& filter_tag : tags) + for (const auto& dive_tag : dive_tags) + if (dive_tag.trimmed().toUpper().contains(filter_tag.trimmed().toUpper())) + found_tag = true; + + return found_tag; + } + return true; + } + + bool hasPerson(const QStringList people, const struct dive *d) + { + if (!people.isEmpty()) { + QStringList dive_people = QString(d->buddy).split(",", QString::SkipEmptyParts) + + QString(d->divemaster).split(",", QString::SkipEmptyParts); + + bool found_person = false; + for(const auto& filter_person : people) + for(const auto& dive_person : dive_people) + if (dive_person.trimmed().toUpper().contains(filter_person.trimmed().toUpper())) + found_person = true; + + return found_person; + } + return true; + } + + bool hasLocation(const QStringList locations, const struct dive *d) + { + if (!locations.isEmpty()) { + QStringList diveLocations; + if (d->divetrip) + diveLocations.push_back(QString(d->divetrip->location)); + + if (d->dive_site) + diveLocations.push_back(QString(d->dive_site->name)); + + bool found_location = false; + for (const auto& filter_location : locations) + for (const auto& dive_location : diveLocations) + if (dive_location.trimmed().toUpper().contains(filter_location.trimmed().toUpper())) + found_location = true; + + return found_location; + } + return true; + } +} + MultiFilterSortModel *MultiFilterSortModel::instance() { static MultiFilterSortModel self; @@ -39,12 +94,40 @@ void MultiFilterSortModel::setLayout(DiveTripModel::Layout layout) bool MultiFilterSortModel::showDive(const struct dive *d) const { - if (curr_dive_site) { - dive_site *ds = d->dive_site; - if (!ds) - return false; - return ds == curr_dive_site || same_string(ds->name, curr_dive_site->name); - } + if (!filterData.validFilter) + return true; + + if (d->visibility < filterData.minVisibility || d->visibility > filterData.maxVisibility) + return false; + + if (d->rating < filterData.minRating || d->rating > filterData.maxRating) + return false; + + // TODO: get the preferences for the imperial vs metric data. + // ignore the check if it doesn't makes sense. + if (d->watertemp.mkelvin < C_to_mkelvin(filterData.minWaterTemp) || d->watertemp.mkelvin > C_to_mkelvin((filterData.maxWaterTemp))) + return false; + + if (d->airtemp.mkelvin < C_to_mkelvin(filterData.minAirTemp) || d->airtemp.mkelvin > C_to_mkelvin(filterData.maxAirTemp)) + return false; + + if (filterData.from.isValid() && d->when < filterData.from.toTime_t()) + return false; + + if (filterData.to.isValid() && d->when > filterData.to.toTime_t()) + return false; + + // tags. + if (!hasTag(filterData.tags, d)) + return false; + + // people + if (!hasPerson(filterData.people, d)) + return false; + + // Location + if (!hasLocation(filterData.location, d)) + return false; return true; } |