summaryrefslogtreecommitdiffstats
path: root/qt-models/divelistmodel.h
diff options
context:
space:
mode:
authorGravatar Dirk Hohndel <dirk@hohndel.org>2019-11-06 06:54:03 +0100
committerGravatar Dirk Hohndel <dirk@hohndel.org>2019-11-08 20:50:05 +0100
commit6095a5f04f204e786136eb203630f728a3df2983 (patch)
tree326f8aeb8a20aece1db3f7c4e050579881ecccb7 /qt-models/divelistmodel.h
parentb01e9fb0a833e5cc2da16ae7d1bb1f2a6e92b465 (diff)
downloadsubsurface-6095a5f04f204e786136eb203630f728a3df2983.tar.gz
Mobile: add second filter proxy model for dive list
This one significantly reduces the number of dives that are handed to the ListView in QML. For every trip that isn't expanded (only zero or one trips are expanded at any time, so almost all the others are collapsed), send only first dive to the View to allow creation of the section. Hide the rest so we don't have all these invisible, zero height entries for the vertical dive list. A big part of this commit is moving a few functions from the DiveListSortModel to the CollapsedDiveListSortModel. Those are the ones that are needed for the trip header. Signed-off-by: Dirk Hohndel <dirk@hohndel.org>
Diffstat (limited to 'qt-models/divelistmodel.h')
-rw-r--r--qt-models/divelistmodel.h39
1 files changed, 35 insertions, 4 deletions
diff --git a/qt-models/divelistmodel.h b/qt-models/divelistmodel.h
index d9e0928dc..92e7a9291 100644
--- a/qt-models/divelistmodel.h
+++ b/qt-models/divelistmodel.h
@@ -7,15 +7,46 @@
#include "core/subsurface-qt/DiveObjectHelper.h"
+class CollapsedDiveListSortModel : public QSortFilterProxyModel
+{
+ Q_OBJECT
+public:
+ static CollapsedDiveListSortModel *instance();
+ void setSourceModel(QAbstractItemModel *sourceModel);
+ Q_INVOKABLE QString tripTitle(const QString &trip);
+ Q_INVOKABLE QString tripShortDate(const QString &trip);
+ Q_INVOKABLE void setActiveTrip(const QString &trip);
+ Q_INVOKABLE QString activeTrip() const;
+ // super subtle optimization alert - in order to reduce the number of model accesses from QML,
+ // the two states where we show the dive in question have odd numbers
+ enum CollapsedState {
+ DontShow = 0,
+ ShowDive = 1,
+ ShowTrip = 2,
+ ShowDiveAndTrip = 3
+ };
+ void updateFilterState();
+ void updateSelectionState();
+
+protected:
+ bool filterAcceptsRow(int source_row, const QModelIndex &source_parent) const;
+
+private:
+ CollapsedDiveListSortModel();
+ bool isExpanded(struct dive_trip *dt) const;
+ QString m_activeTrip;
+};
+
class DiveListSortModel : public QSortFilterProxyModel
{
Q_OBJECT
public:
static DiveListSortModel *instance();
void setSourceModel(QAbstractItemModel *sourceModel);
+ QString getFilterString() const;
Q_INVOKABLE void reload();
- Q_INVOKABLE QString tripTitle(const QString &trip);
- Q_INVOKABLE QString tripShortDate(const QString &trip);
+ QString filterString;
+ void updateFilterState();
public slots:
int getIdxForId(int id);
void setFilter(QString f);
@@ -25,8 +56,6 @@ protected:
bool filterAcceptsRow(int source_row, const QModelIndex &source_parent) const;
private:
DiveListSortModel();
- QString filterString;
- void updateFilterState();
};
QString formatSac(const dive *d);
@@ -74,6 +103,8 @@ public:
StartPressureRole,
EndPressureRole,
FirstGasRole,
+ CollapsedRole,
+ SelectedRole,
};
static DiveListModel *instance();