mirror of
https://github.com/subsurface/subsurface.git
synced 2025-02-01 04:33:24 +00:00
eecca6aab0
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>
71 lines
1.8 KiB
C++
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
|