summaryrefslogtreecommitdiffstats
path: root/qt-models
diff options
context:
space:
mode:
authorGravatar Berthold Stoeger <bstoeger@mail.tuwien.ac.at>2019-12-11 10:55:45 +0100
committerGravatar Dirk Hohndel <dirk@hohndel.org>2020-03-10 09:25:57 -0700
commit71b378aa82296c76c504c8f6b7f765601c7ae821 (patch)
tree642d0207caaff6d00768368e54c7e44fc08f5cd5 /qt-models
parent7e1ac2167bb531b54974c182f131af8b14c401b1 (diff)
downloadsubsurface-71b378aa82296c76c504c8f6b7f765601c7ae821.tar.gz
mobile/divelist: derive MobileListModel from a base model
In analogy to the DiveTripModel split, derive MobileListModel from a base model that exports the roles, etc. This will allow us to create a second model, which nevertheless possesses the same roles and all that without too much code duplication. Signed-off-by: Berthold Stoeger <bstoeger@mail.tuwien.ac.at>
Diffstat (limited to 'qt-models')
-rw-r--r--qt-models/mobilelistmodel.cpp71
-rw-r--r--qt-models/mobilelistmodel.h31
2 files changed, 62 insertions, 40 deletions
diff --git a/qt-models/mobilelistmodel.cpp b/qt-models/mobilelistmodel.cpp
index e679c72c6..3312a2d97 100644
--- a/qt-models/mobilelistmodel.cpp
+++ b/qt-models/mobilelistmodel.cpp
@@ -2,23 +2,11 @@
#include "mobilelistmodel.h"
#include "core/divelist.h" // for shown_dives
-MobileListModel::MobileListModel(DiveTripModelBase *sourceIn) :
- source(sourceIn),
- expandedRow(-1)
+MobileListModelBase::MobileListModelBase(DiveTripModelBase *sourceIn) : source(sourceIn)
{
- connect(source, &DiveTripModelBase::modelAboutToBeReset, this, &MobileListModel::beginResetModel);
- connect(source, &DiveTripModelBase::modelReset, this, &MobileListModel::endResetModel);
- connect(source, &DiveTripModelBase::rowsAboutToBeRemoved, this, &MobileListModel::prepareRemove);
- connect(source, &DiveTripModelBase::rowsRemoved, this, &MobileListModel::doneRemove);
- connect(source, &DiveTripModelBase::rowsAboutToBeInserted, this, &MobileListModel::prepareInsert);
- connect(source, &DiveTripModelBase::rowsInserted, this, &MobileListModel::doneInsert);
- connect(source, &DiveTripModelBase::rowsAboutToBeMoved, this, &MobileListModel::prepareMove);
- connect(source, &DiveTripModelBase::rowsMoved, this, &MobileListModel::doneMove);
- connect(source, &DiveTripModelBase::dataChanged, this, &MobileListModel::changed);
- connect(&diveListNotifier, &DiveListNotifier::numShownChanged, this, &MobileListModel::shownChanged);
}
-QHash<int, QByteArray> MobileListModel::roleNames() const
+QHash<int, QByteArray> MobileListModelBase::roleNames() const
{
QHash<int, QByteArray> roles;
roles[DiveTripModelBase::IS_TRIP_ROLE] = "isTrip";
@@ -66,6 +54,40 @@ int MobileListModel::shown() const
return shown_dives;
}
+int MobileListModelBase::columnCount(const QModelIndex &parent) const
+{
+ return source->columnCount(parent);
+}
+
+QModelIndex MobileListModelBase::index(int row, int column, const QModelIndex &parent) const
+{
+ if (!hasIndex(row, column, parent))
+ return QModelIndex();
+
+ return createIndex(row, column);
+}
+
+QModelIndex MobileListModelBase::parent(const QModelIndex &index) const
+{
+ // These are flat models - there is no parent
+ return QModelIndex();
+}
+
+MobileListModel::MobileListModel(DiveTripModelBase *source) : MobileListModelBase(source),
+ expandedRow(-1)
+{
+ connect(source, &DiveTripModelBase::modelAboutToBeReset, this, &MobileListModel::beginResetModel);
+ connect(source, &DiveTripModelBase::modelReset, this, &MobileListModel::endResetModel);
+ connect(source, &DiveTripModelBase::rowsAboutToBeRemoved, this, &MobileListModel::prepareRemove);
+ connect(source, &DiveTripModelBase::rowsRemoved, this, &MobileListModel::doneRemove);
+ connect(source, &DiveTripModelBase::rowsAboutToBeInserted, this, &MobileListModel::prepareInsert);
+ connect(source, &DiveTripModelBase::rowsInserted, this, &MobileListModel::doneInsert);
+ connect(source, &DiveTripModelBase::rowsAboutToBeMoved, this, &MobileListModel::prepareMove);
+ connect(source, &DiveTripModelBase::rowsMoved, this, &MobileListModel::doneMove);
+ connect(source, &DiveTripModelBase::dataChanged, this, &MobileListModel::changed);
+ connect(&diveListNotifier, &DiveListNotifier::numShownChanged, this, &MobileListModel::shownChanged);
+}
+
// We want to show the newest dives first. Therefore, we have to invert
// the indexes with respect to the source model. To avoid mental gymnastics
// in the rest of the code, we do this right before sending to the
@@ -201,20 +223,6 @@ QModelIndex MobileListModel::mapToSource(const QModelIndex &idx) const
return sourceIndex(row - expandedRow - 1, col, expandedRow);
}
-QModelIndex MobileListModel::index(int row, int column, const QModelIndex &parent) const
-{
- if (!hasIndex(row, column, parent))
- return QModelIndex();
-
- return createIndex(row, column);
-}
-
-QModelIndex MobileListModel::parent(const QModelIndex &index) const
-{
- // This is a flat model - there is no parent
- return QModelIndex();
-}
-
int MobileListModel::rowCount(const QModelIndex &parent) const
{
if (parent.isValid())
@@ -222,11 +230,6 @@ int MobileListModel::rowCount(const QModelIndex &parent) const
return source->rowCount() + numSubItems();
}
-int MobileListModel::columnCount(const QModelIndex &parent) const
-{
- return source->columnCount(parent);
-}
-
QVariant MobileListModel::data(const QModelIndex &index, int role) const
{
if (role == IsTopLevelRole)
@@ -270,7 +273,6 @@ void MobileListModel::prepareRemove(const QModelIndex &parent, int first, int la
beginRemoveRows(QModelIndex(), range.first, range.last);
}
-
void MobileListModel::updateRowAfterRemove(const IndexRange &range, int &row)
{
if (row < 0)
@@ -534,6 +536,7 @@ MobileModels *MobileModels::instance()
MobileModels::MobileModels() :
lm(&source)
{
+ reset();
}
MobileListModel *MobileModels::listModel()
diff --git a/qt-models/mobilelistmodel.h b/qt-models/mobilelistmodel.h
index f5242a3c9..f5214d9bd 100644
--- a/qt-models/mobilelistmodel.h
+++ b/qt-models/mobilelistmodel.h
@@ -1,10 +1,21 @@
// SPDX-License-Identifier: GPL-2.0
+// This header files declares two linear models used by the mobile UI.
+//
+// MobileListModel presents a list of trips and optionally the dives of
+// one expanded trip. It is used for quick navigation through trips.
+//
+// MobileDiveListModel gives a linearized view of all dives, sorted by
+// trip. Even if there is temporal overlap of trips, all dives of
+// a trip are listed in a contiguous block. This model is used for
+// swiping through dives.
#ifndef MOBILELISTMODEL_H
#define MOBILELISTMODEL_H
#include "divetripmodel.h"
-class MobileListModel : public QAbstractItemModel {
+// This is the base class of the mobile-list model. All it does
+// is exporting the various dive fields as roles.
+class MobileListModelBase : public QAbstractItemModel {
Q_OBJECT
public:
enum Roles {
@@ -44,6 +55,19 @@ public:
FirstGasRole,
SelectedRole,
};
+ QHash<int, QByteArray> roleNames() const override;
+protected:
+ DiveTripModelBase *source;
+ MobileListModelBase(DiveTripModelBase *source);
+private:
+ int columnCount(const QModelIndex &parent) const override;
+ QModelIndex index(int row, int column, const QModelIndex &parent) const override;
+ QModelIndex parent(const QModelIndex &index) const override;
+};
+
+class MobileListModel : public MobileListModelBase {
+ Q_OBJECT
+public:
MobileListModel(DiveTripModelBase *source);
void expand(int row);
void unexpand();
@@ -71,14 +95,9 @@ private:
static void updateRowAfterRemove(const IndexRange &range, int &row);
static void updateRowAfterMove(const IndexRange &range, const IndexRange &dest, int &row);
QVariant data(const QModelIndex &index, int role) const override;
- QModelIndex index(int row, int column, const QModelIndex &parent) const override;
- QModelIndex parent(const QModelIndex &index) const override;
int rowCount(const QModelIndex &parent) const override;
- int columnCount(const QModelIndex &parent) const override;
- QHash<int, QByteArray> roleNames() const override;
int shown() const;
- DiveTripModelBase *source;
int expandedRow;
private slots:
void prepareRemove(const QModelIndex &parent, int first, int last);