From b76f2071589d6a7f45ec2845afa8b49110da608b Mon Sep 17 00:00:00 2001 From: Berthold Stoeger Date: Sun, 17 Nov 2019 18:13:55 +0100 Subject: Filter: split out filter from model Split out the actual filtering from the MultiFilterSortModel. Create a DiveFilter class that does the actual filtering. Currently, mobile and desktop have their own version of this class, though ultimately we may want to merge them. The idea here is that the trip-model and undo-commands have direct access to the filter-function and thus can take care of keeping track of the number of shown dives, etc. Signed-off-by: Berthold Stoeger --- desktop-widgets/divelistview.cpp | 5 +++-- desktop-widgets/divelogexportdialog.cpp | 5 +++-- desktop-widgets/filterwidget2.cpp | 2 +- desktop-widgets/filterwidget2.h | 2 +- desktop-widgets/locationinformation.cpp | 6 +++--- desktop-widgets/mainwindow.h | 1 + desktop-widgets/tab-widgets/TabDiveSite.cpp | 8 ++++---- 7 files changed, 16 insertions(+), 13 deletions(-) (limited to 'desktop-widgets') diff --git a/desktop-widgets/divelistview.cpp b/desktop-widgets/divelistview.cpp index aa2195434..d6a4d507e 100644 --- a/desktop-widgets/divelistview.cpp +++ b/desktop-widgets/divelistview.cpp @@ -10,6 +10,7 @@ #include "desktop-widgets/mainwindow.h" #include "desktop-widgets/divepicturewidget.h" #include "core/display.h" +#include "core/divefilter.h" #include #include #include @@ -463,7 +464,7 @@ void DiveListView::selectDives(const QList &newDiveSelection) // But don't do this if we are in divesite mode, because then // the dive-site selection is controlled by the filter not // by the selected dives. - if (!MultiFilterSortModel::instance()->diveSiteMode()) { + if (!DiveFilter::instance()->diveSiteMode()) { QVector selectedSites; for (int idx: newDiveSelection) { dive *d = get_dive(idx); @@ -698,7 +699,7 @@ void DiveListView::selectionChanged(const QItemSelection &selected, const QItemS // But don't do this if we are in divesite mode, because then // the dive-site selection is controlled by the filter not // by the selected dives. - if (!MultiFilterSortModel::instance()->diveSiteMode()) { + if (!DiveFilter::instance()->diveSiteMode()) { QVector selectedSites; for (QModelIndex index: selectionModel()->selection().indexes()) { const QAbstractItemModel *model = index.model(); diff --git a/desktop-widgets/divelogexportdialog.cpp b/desktop-widgets/divelogexportdialog.cpp index cf859e2b9..99f6eb8a8 100644 --- a/desktop-widgets/divelogexportdialog.cpp +++ b/desktop-widgets/divelogexportdialog.cpp @@ -11,6 +11,7 @@ #include "core/save-html.h" #include "core/settings/qPrefDisplay.h" #include "core/save-profiledata.h" +#include "core/divefilter.h" #include "core/divesite.h" #include "core/errorhelper.h" #include "core/file.h" @@ -134,10 +135,10 @@ static std::vector getDiveSitesToExport(bool selectedOnly) { std::vector res; - if (selectedOnly && MultiFilterSortModel::instance()->diveSiteMode()) { + if (selectedOnly && DiveFilter::instance()->diveSiteMode()) { // Special case in dive site mode: export all selected dive sites, // not the dive sites of selected dives. - QVector sites = MultiFilterSortModel::instance()->filteredDiveSites(); + QVector sites = DiveFilter::instance()->filteredDiveSites(); res.reserve(sites.size()); for (const dive_site *ds: sites) res.push_back(ds); diff --git a/desktop-widgets/filterwidget2.cpp b/desktop-widgets/filterwidget2.cpp index 0ab6bb022..140016a03 100644 --- a/desktop-widgets/filterwidget2.cpp +++ b/desktop-widgets/filterwidget2.cpp @@ -237,7 +237,7 @@ void FilterWidget2::hideEvent(QHideEvent *event) void FilterWidget2::filterDataChanged(const FilterData &data) { - MultiFilterSortModel::instance()->filterDataChanged(data); + DiveFilter::instance()->setFilter(data); } QString FilterWidget2::shownText() diff --git a/desktop-widgets/filterwidget2.h b/desktop-widgets/filterwidget2.h index 212f6b5ae..b52386fe7 100644 --- a/desktop-widgets/filterwidget2.h +++ b/desktop-widgets/filterwidget2.h @@ -8,7 +8,7 @@ #include #include "ui_filterwidget2.h" -#include "qt-models/filtermodels.h" +#include "core/divefilter.h" namespace Ui { class FilterWidget2; diff --git a/desktop-widgets/locationinformation.cpp b/desktop-widgets/locationinformation.cpp index bbf43ec5a..331a8555e 100644 --- a/desktop-widgets/locationinformation.cpp +++ b/desktop-widgets/locationinformation.cpp @@ -5,7 +5,7 @@ #include "desktop-widgets/divelistview.h" #include "core/qthelper.h" #include "desktop-widgets/mapwidget.h" -#include "qt-models/filtermodels.h" +#include "core/divefilter.h" #include "core/divesitehelpers.h" #include "desktop-widgets/modeldelegates.h" #include "core/subsurface-qt/DiveListNotifier.h" @@ -194,7 +194,7 @@ void LocationInformationWidget::acceptChanges() MainWindow::instance()->diveList->setEnabled(true); MainWindow::instance()->setEnabledToolbar(true); MainWindow::instance()->setApplicationState(ApplicationState::Default); - MultiFilterSortModel::instance()->stopFilterDiveSites(); + DiveFilter::instance()->stopFilterDiveSites(); // Subtlety alert: diveSite must be cleared *after* exiting the dive-site mode. // Exiting dive-site mode removes the focus from the active widget and @@ -211,7 +211,7 @@ void LocationInformationWidget::initFields(dive_site *ds) filter_model.set(ds, ds->location); updateLabels(); enableLocationButtons(dive_site_has_gps_location(ds)); - MultiFilterSortModel::instance()->startFilterDiveSites(QVector{ ds }); + DiveFilter::instance()->startFilterDiveSites(QVector{ ds }); filter_model.invalidate(); } else { filter_model.set(0, location_t { degrees_t{ 0 }, degrees_t{ 0 } }); diff --git a/desktop-widgets/mainwindow.h b/desktop-widgets/mainwindow.h index 0eaa5e1fa..075999707 100644 --- a/desktop-widgets/mainwindow.h +++ b/desktop-widgets/mainwindow.h @@ -21,6 +21,7 @@ #include "desktop-widgets/filterwidget2.h" #include "core/applicationstate.h" #include "core/gpslocation.h" +#include "core/dive.h" #define NUM_RECENT_FILES 4 diff --git a/desktop-widgets/tab-widgets/TabDiveSite.cpp b/desktop-widgets/tab-widgets/TabDiveSite.cpp index d5591c152..3ff693e59 100644 --- a/desktop-widgets/tab-widgets/TabDiveSite.cpp +++ b/desktop-widgets/tab-widgets/TabDiveSite.cpp @@ -2,8 +2,8 @@ #include "TabDiveSite.h" #include "core/subsurface-qt/DiveListNotifier.h" #include "core/divesite.h" +#include "core/divefilter.h" #include "qt-models/divelocationmodel.h" -#include "qt-models/filtermodels.h" #include "commands/command.h" #include @@ -97,18 +97,18 @@ QVector TabDiveSite::selectedDiveSites() void TabDiveSite::selectionChanged(const QItemSelection &, const QItemSelection &) { - MultiFilterSortModel::instance()->setFilterDiveSite(selectedDiveSites()); + DiveFilter::instance()->setFilterDiveSite(selectedDiveSites()); } void TabDiveSite::showEvent(QShowEvent *) { // If the user switches to the dive site tab and there was already a selection, // filter on that selection. - MultiFilterSortModel::instance()->startFilterDiveSites(selectedDiveSites()); + DiveFilter::instance()->startFilterDiveSites(selectedDiveSites()); } void TabDiveSite::hideEvent(QHideEvent *) { // If the user switches to a different tab, stop the dive site filtering - MultiFilterSortModel::instance()->stopFilterDiveSites(); + DiveFilter::instance()->stopFilterDiveSites(); } -- cgit v1.2.3-70-g09d2