QML's ListView uses the "section" property to test if items belong to the same section. Apparently, this must be a string and therefore we can't pass e.g. a dive-trip object. Therefore a specially formatted string was passed in, which was guaranteed to be unique (contained the dive-trip pointer value) and the fully formatted trip-title and short-date. The disadvantage of that approach is that the formatting is performed for every dive and not every trip. Perhaps not a problem now, but it makes it for example necessary to cache the number of filtered dives. To be more flexible, pass in only the pointer value formatted as hexadecimal string and provide a function to convert that string back to a trip-pointer (in the form of a QVariant, so that it can be passed to QML). Moreover provide two functions for formatting the title and the short-date. The three new functions are members of DiveListSortModel. This might not be the perfect place, but it is easy to reach from the DiveListView. Signed-off-by: Berthold Stoeger <bstoeger@mail.tuwien.ac.at>
71 lines
1.9 KiB
C++
71 lines
1.9 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 addAllDives();
|
|
Q_INVOKABLE void clear();
|
|
Q_INVOKABLE QVariant tripIdToObject(const QString &s);
|
|
Q_INVOKABLE QString tripTitle(const QVariant &trip);
|
|
Q_INVOKABLE QString tripShortDate(const QVariant &trip);
|
|
public slots:
|
|
int getDiveId(int idx);
|
|
int getIdxForId(int id);
|
|
void setFilter(QString f);
|
|
void resetFilter();
|
|
int shown();
|
|
void updateDivesShownInTrips();
|
|
protected:
|
|
bool filterAcceptsRow(int source_row, const QModelIndex &source_parent) const;
|
|
private:
|
|
std::vector<unsigned char> filteredRows; // using unsigned char because using 'bool' turns this into a bitfield
|
|
QString filterString;
|
|
void updateFilterState();
|
|
};
|
|
|
|
class DiveListModel : public QAbstractListModel
|
|
{
|
|
Q_OBJECT
|
|
public:
|
|
|
|
enum DiveListRoles {
|
|
DiveRole = Qt::UserRole + 1,
|
|
DiveDateRole,
|
|
FullTextRole,
|
|
FullTextNoNotesRole
|
|
};
|
|
|
|
static DiveListModel *instance();
|
|
DiveListModel(QObject *parent = 0);
|
|
void addDive(QList<dive *> listOfDives);
|
|
void addAllDives();
|
|
void insertDive(int i, DiveObjectHelper *newDive);
|
|
void removeDive(int i);
|
|
void removeDiveById(int id);
|
|
void updateDive(int i, dive *d);
|
|
void clear();
|
|
int rowCount(const QModelIndex &parent = QModelIndex()) const;
|
|
int getDiveId(int idx) const;
|
|
int getDiveIdx(int id) const;
|
|
QVariant data(const QModelIndex &index, int role = Qt::DisplayRole) const;
|
|
QHash<int, QByteArray> roleNames() const;
|
|
QString startAddDive();
|
|
void resetInternalData();
|
|
Q_INVOKABLE DiveObjectHelper* at(int i);
|
|
private:
|
|
QList<DiveObjectHelper*> m_dives;
|
|
static DiveListModel *m_instance;
|
|
};
|
|
|
|
#endif // DIVELISTMODEL_H
|