From 201f0c8f89d6d7df96fd220ea2c0d0977c9b7f20 Mon Sep 17 00:00:00 2001 From: Tomaz Canabrava Date: Fri, 16 Nov 2018 13:49:19 +0100 Subject: 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 --- qt-models/filtermodels.cpp | 95 +++++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 89 insertions(+), 6 deletions(-) (limited to 'qt-models/filtermodels.cpp') 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 #include +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; } -- cgit v1.2.3-70-g09d2