summaryrefslogtreecommitdiffstats
path: root/core
diff options
context:
space:
mode:
Diffstat (limited to 'core')
-rw-r--r--core/divefilter.cpp39
-rw-r--r--core/divefilter.h20
2 files changed, 52 insertions, 7 deletions
diff --git a/core/divefilter.cpp b/core/divefilter.cpp
index 5bb05b947..7f47e45ac 100644
--- a/core/divefilter.cpp
+++ b/core/divefilter.cpp
@@ -8,10 +8,12 @@ DiveFilter::DiveFilter()
{
}
-bool DiveFilter::showDive(const struct dive *d) const
+ShownChange DiveFilter::update(const QVector<dive *> &) const
+{
+}
+
+ShownChange DiveFilter::updateAll() const
{
- // TODO: Do something useful
- return true;
}
#else // SUBSURFACE_MOBILE
@@ -24,6 +26,37 @@ bool DiveFilter::showDive(const struct dive *d) const
#include "core/divesite.h"
#include "qt-models/filtermodels.h"
+void DiveFilter::updateDiveStatus(dive *d, ShownChange &change) const
+{
+ bool newStatus = showDive(d);
+ if (filter_dive(d, newStatus)) {
+ if (newStatus)
+ change.newShown.push_back(d);
+ else
+ change.newHidden.push_back(d);
+ }
+}
+
+ShownChange DiveFilter::update(const QVector<dive *> &dives) const
+{
+ dive *old_current = current_dive;
+ ShownChange res;
+ for (dive *d: dives)
+ updateDiveStatus(d, res);
+ res.currentChanged = old_current != current_dive;
+ return res;
+}
+
+ShownChange DiveFilter::updateAll() const
+{
+ dive *old_current = current_dive;
+ ShownChange res;
+ for (int i = 0; i < dive_table.nr; ++i)
+ updateDiveStatus(get_dive(i), res);
+ res.currentChanged = old_current != current_dive;
+ return res;
+}
+
namespace {
// Pointer to function that takes two strings and returns whether
// the first matches the second according to a criterion (substring, starts-with, exact).
diff --git a/core/divefilter.h b/core/divefilter.h
index 2ad3c4b9b..aa166d022 100644
--- a/core/divefilter.h
+++ b/core/divefilter.h
@@ -3,6 +3,16 @@
#ifndef DIVE_FILTER_H
#define DIVE_FILTER_H
+#include <QVector>
+struct dive;
+
+// Structure describing changes of shown status upon applying the filter
+struct ShownChange {
+ QVector<dive *> newShown;
+ QVector<dive *> newHidden;
+ bool currentChanged;
+};
+
// The dive filter for mobile is currently much simpler than for desktop.
// Therefore, for now we have two completely separate implementations.
// This should be unified in the future.
@@ -12,7 +22,8 @@ class DiveFilter {
public:
static DiveFilter *instance();
- bool showDive(const struct dive *d) const;
+ ShownChange update(const QVector<dive *> &dives) const; // Update filter status of given dives and return dives whose status changed
+ ShownChange updateAll() const; // Update filter status of all dives and return dives whose status changed
private:
DiveFilter();
};
@@ -21,9 +32,7 @@ private:
#include <QDateTime>
#include <QStringList>
-#include <QVector>
-struct dive;
struct dive_trip;
struct dive_site;
@@ -82,15 +91,18 @@ class DiveFilter {
public:
static DiveFilter *instance();
- bool showDive(const struct dive *d) const;
bool diveSiteMode() const; // returns true if we're filtering on dive site
const QVector<dive_site *> &filteredDiveSites() const;
void startFilterDiveSites(QVector<dive_site *> ds);
void setFilterDiveSite(QVector<dive_site *> ds);
void stopFilterDiveSites();
void setFilter(const FilterData &data);
+ ShownChange update(const QVector<dive *> &dives) const; // Update filter status of given dives and return dives whose status changed
+ ShownChange updateAll() const; // Update filter status of all dives and return dives whose status changed
private:
DiveFilter();
+ void updateDiveStatus(dive *d, ShownChange &change) const;
+ bool showDive(const struct dive *d) const; // Should that dive be shown?
QVector<dive_site *> dive_sites;
FilterData filterData;