summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorGravatar Berthold Stoeger <bstoeger@mail.tuwien.ac.at>2018-10-29 14:56:48 +0100
committerGravatar Dirk Hohndel <dirk@hohndel.org>2018-11-01 07:28:15 -0700
commit803111ef02f84119f762ce495710edb2e7f40bdb (patch)
treec1b5e4813bd6d0592a94885a3c7522ad18c2a661
parent4636fcc83469309362c3925ef80ade589ea409a0 (diff)
downloadsubsurface-803111ef02f84119f762ce495710edb2e7f40bdb.tar.gz
Dive list: make filter model aware of its source
The data-flow from C-core to list-view is as follows: C-core --> DiveTripModel --> MultiSortFilterModel --> DiveListView The control-flow, on the other hand, differs as DiveListView accesses both MultiSortFilterModel and DiveTripModel, whereas MultiSortFilterModel is mostly unaware of its source model. This is in principle legitimate, as the MultiSortFilterModel might be used for different sources. In our particular case, this is not so. MultiSortFilterModel is written for a particular use case. Therefore, model control-flow follow after data-flow: Let MultiSortFilterModel set its own source model and DiveListView access the MultiSortFilterModel, which then manages its source model. This is not bike-shedding, but will enable a more flexible and higher-performance sorting. Signed-off-by: Berthold Stoeger <bstoeger@mail.tuwien.ac.at>
-rw-r--r--desktop-widgets/divelistview.cpp10
-rw-r--r--qt-models/divetripmodel.cpp3
-rw-r--r--qt-models/divetripmodel.h2
-rw-r--r--qt-models/filtermodels.cpp12
-rw-r--r--qt-models/filtermodels.h3
5 files changed, 18 insertions, 12 deletions
diff --git a/desktop-widgets/divelistview.cpp b/desktop-widgets/divelistview.cpp
index c01a6189a..30364a8eb 100644
--- a/desktop-widgets/divelistview.cpp
+++ b/desktop-widgets/divelistview.cpp
@@ -33,12 +33,7 @@ DiveListView::DiveListView(QWidget *parent) : QTreeView(parent), mouseClickSelec
setItemDelegate(new DiveListDelegate(this));
setUniformRowHeights(true);
setItemDelegateForColumn(DiveTripModel::RATING, new StarWidgetsDelegate(this));
- MultiFilterSortModel *model = MultiFilterSortModel::instance();
- model->setSortRole(DiveTripModel::SORT_ROLE);
- model->setFilterKeyColumn(-1); // filter all columns
- model->setFilterCaseSensitivity(Qt::CaseInsensitive);
- model->setSourceModel(DiveTripModel::instance());
- setModel(model);
+ setModel(MultiFilterSortModel::instance());
setSortingEnabled(false);
setContextMenuPolicy(Qt::DefaultContextMenu);
@@ -503,8 +498,7 @@ void DiveListView::reload(DiveTripModel::Layout layout, bool forceSort)
header()->setSectionsClickable(true);
connect(header(), SIGNAL(sectionPressed(int)), this, SLOT(headerClicked(int)), Qt::UniqueConnection);
- DiveTripModel *tripModel = DiveTripModel::instance();
- tripModel->setLayout(layout); // Note: setLayout() resets the whole model
+ MultiFilterSortModel::instance()->setLayout(layout);
if (!forceSort)
return;
diff --git a/qt-models/divetripmodel.cpp b/qt-models/divetripmodel.cpp
index 14bc744f6..0194a312f 100644
--- a/qt-models/divetripmodel.cpp
+++ b/qt-models/divetripmodel.cpp
@@ -320,9 +320,6 @@ DiveTripModel::DiveTripModel(QObject *parent) :
connect(&diveListNotifier, &DiveListNotifier::divesSelected, this, &DiveTripModel::divesSelected);
connect(&diveListNotifier, &DiveListNotifier::divesDeselected, this, &DiveTripModel::divesDeselected);
connect(&diveListNotifier, &DiveListNotifier::currentDiveChanged, this, &DiveTripModel::currentDiveChanged);
-
- // Update trip headers if filter finished
- connect(MultiFilterSortModel::instance(), &MultiFilterSortModel::filterFinished, this, &DiveTripModel::filterFinished);
}
int DiveTripModel::columnCount(const QModelIndex&) const
diff --git a/qt-models/divetripmodel.h b/qt-models/divetripmodel.h
index fb826eec1..b372a981f 100644
--- a/qt-models/divetripmodel.h
+++ b/qt-models/divetripmodel.h
@@ -55,6 +55,7 @@ public:
int rowCount(const QModelIndex &parent) const;
QModelIndex index(int row, int column, const QModelIndex &parent) const;
QModelIndex parent(const QModelIndex &index) const;
+ void filterFinished();
signals:
// The propagation of selection changes is complex.
// The control flow of dive-selection goes:
@@ -74,7 +75,6 @@ private slots:
void divesSelected(dive_trip *trip, const QVector<dive *> &dives);
void divesDeselected(dive_trip *trip, const QVector<dive *> &dives);
void currentDiveChanged();
- void filterFinished();
private:
// The model has up to two levels. At the top level, we have either trips or dives
// that do not belong to trips. Such a top-level item is represented by the "Item"
diff --git a/qt-models/filtermodels.cpp b/qt-models/filtermodels.cpp
index ce0c2528c..857c5d698 100644
--- a/qt-models/filtermodels.cpp
+++ b/qt-models/filtermodels.cpp
@@ -562,6 +562,16 @@ MultiFilterSortModel::MultiFilterSortModel(QObject *parent) : QSortFilterProxyMo
divesDisplayed(0),
curr_dive_site(NULL)
{
+ setSortRole(DiveTripModel::SORT_ROLE);
+ setFilterKeyColumn(-1); // filter all columns
+ setFilterCaseSensitivity(Qt::CaseInsensitive);
+ setSourceModel(DiveTripModel::instance());
+}
+
+void MultiFilterSortModel::setLayout(DiveTripModel::Layout layout)
+{
+ DiveTripModel *tripModel = DiveTripModel::instance();
+ tripModel->setLayout(layout); // Note: setLayout() resets the whole model
}
void MultiFilterSortModel::divesAdded(const QVector<dive *> &dives)
@@ -656,6 +666,8 @@ void MultiFilterSortModel::myInvalidate()
invalidateFilter();
+ // Tell the dive trip model to update the displayed-counts
+ DiveTripModel::instance()->filterFinished();
emit filterFinished();
#if !defined(SUBSURFACE_MOBILE)
diff --git a/qt-models/filtermodels.h b/qt-models/filtermodels.h
index f962386a1..f579df1a9 100644
--- a/qt-models/filtermodels.h
+++ b/qt-models/filtermodels.h
@@ -2,6 +2,8 @@
#ifndef FILTERMODELS_H
#define FILTERMODELS_H
+#include "divetripmodel.h" // For DiveTripModel::Layout. TODO: remove in due course
+
#include <QStringListModel>
#include <QSortFilterProxyModel>
#include <stdint.h>
@@ -132,6 +134,7 @@ slots:
void startFilterDiveSite(struct dive_site *ds);
void stopFilterDiveSite();
void filterChanged(const QModelIndex &from, const QModelIndex &to, const QVector<int> &roles);
+ void setLayout(DiveTripModel::Layout layout);
signals:
void filterFinished();