mirror of
https://github.com/subsurface/subsurface.git
synced 2024-12-01 06:30:26 +00:00
6095a5f04f
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>
132 lines
3.3 KiB
C++
132 lines
3.3 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 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();
|
|
QString filterString;
|
|
void updateFilterState();
|
|
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:
|
|
DiveListSortModel();
|
|
};
|
|
|
|
QString formatSac(const dive *d);
|
|
QString formatNotes(const dive *d);
|
|
QString format_gps_decimal(const dive *d);
|
|
QStringList formatGetCylinder(const dive *d);
|
|
QStringList getStartPressure(const dive *d);
|
|
QStringList getEndPressure(const dive *d);
|
|
QStringList getFirstGas(const dive *d);
|
|
QStringList getFullCylinderList();
|
|
|
|
class DiveListModel : public QAbstractListModel
|
|
{
|
|
Q_OBJECT
|
|
public:
|
|
enum DiveListRoles {
|
|
DiveDateRole = Qt::UserRole + 1,
|
|
TripIdRole,
|
|
TripNrDivesRole,
|
|
DateTimeRole,
|
|
IdRole,
|
|
NumberRole,
|
|
LocationRole,
|
|
DepthRole,
|
|
DurationRole,
|
|
DepthDurationRole,
|
|
RatingRole,
|
|
VizRole,
|
|
SuitRole,
|
|
AirTempRole,
|
|
WaterTempRole,
|
|
SacRole,
|
|
SumWeightRole,
|
|
DiveMasterRole,
|
|
BuddyRole,
|
|
NotesRole,
|
|
GpsDecimalRole,
|
|
GpsRole,
|
|
NoDiveRole,
|
|
DiveSiteRole,
|
|
CylinderRole,
|
|
GetCylinderRole,
|
|
CylinderListRole,
|
|
SingleWeightRole,
|
|
StartPressureRole,
|
|
EndPressureRole,
|
|
FirstGasRole,
|
|
CollapsedRole,
|
|
SelectedRole,
|
|
};
|
|
|
|
static DiveListModel *instance();
|
|
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:
|
|
DiveListModel();
|
|
};
|
|
|
|
#endif // DIVELISTMODEL_H
|