subsurface/qt-models/divelistmodel.h
Berthold Stoeger eecca6aab0 Mobile: replace model-reset by row-addition in DiveListModel::reload()
Owing to apparent QML breakage, a model-reset leads to the DiveDetail
page being reloaded for every dive in the list(!). Therefore, add
rows instead.

This leads to extremely subtle code, as it is now imperative that
the model has been properly cleared beforehand. Nevertheless, for
now we have to do this to fix a severe performance regression.

Fixes #2295

Signed-off-by: Berthold Stoeger <bstoeger@mail.tuwien.ac.at>
2019-09-27 16:33:37 -07:00

71 lines
1.8 KiB
C++

// SPDX-License-Identifier: GPL-2.0
#ifndef DIVELISTMODEL_H
#define DIVELISTMODEL_H
#include <QAbstractListModel>
#include <QSortFilterProxyModel>
#include "core/subsurface-qt/DiveObjectHelper.h"
class DiveListSortModel : public QSortFilterProxyModel
{
Q_OBJECT
public:
DiveListSortModel(QObject *parent = 0);
void setSourceModel(QAbstractItemModel *sourceModel);
Q_INVOKABLE void reload();
Q_INVOKABLE QString tripTitle(const QString &trip);
Q_INVOKABLE QString tripShortDate(const QString &trip);
public slots:
int getIdxForId(int id);
void setFilter(QString f);
void resetFilter();
int shown();
protected:
bool filterAcceptsRow(int source_row, const QModelIndex &source_parent) const;
private:
QString filterString;
void updateFilterState();
};
class DiveListModel : public QAbstractListModel
{
Q_OBJECT
public:
enum DiveListRoles {
DiveRole = Qt::UserRole + 1,
DiveDateRole,
TripIdRole,
TripNrDivesRole,
DateTimeRole,
IdRole,
NumberRole,
LocationRole,
DepthDurationRole,
};
static DiveListModel *instance();
DiveListModel(QObject *parent = 0);
void addDive(const QList<dive *> &listOfDives);
void addAllDives();
void insertDive(int i);
void removeDive(int i);
void removeDiveById(int id);
void updateDive(int i, dive *d);
void reload(); // Only call after clearing the model!
struct dive *getDive(int i);
int rowCount(const QModelIndex &parent = QModelIndex()) const;
int getDiveIdx(int id) const;
QModelIndex getDiveQIdx(int id);
QVariant data(const QModelIndex &index, int role = Qt::DisplayRole) const;
QHash<int, QByteArray> roleNames() const;
QString startAddDive();
void resetInternalData();
void clear(); // Clear all dives in core
Q_INVOKABLE DiveObjectHelper at(int i);
private:
static DiveListModel *m_instance;
};
#endif // DIVELISTMODEL_H