From 093adf1ea88dbcab465051b28f8a60a3a29f7a87 Mon Sep 17 00:00:00 2001 From: Berthold Stoeger Date: Sat, 31 Aug 2019 09:09:14 +0200 Subject: Map: highlight correct dive sites in dive site mode Since changing the highlighting to use the selected dive, dive sites with no dive were never highlighted in dive site mode. Obviously, because there was no dive to be selected. Therefore special-case all dive-site selection code to recognize when we are in dive site mode. Signed-off-by: Berthold Stoeger --- desktop-widgets/divelistview.cpp | 42 +++++++++++++++++++++++++--------------- qt-models/filtermodels.cpp | 19 ++++++++++++++---- 2 files changed, 41 insertions(+), 20 deletions(-) diff --git a/desktop-widgets/divelistview.cpp b/desktop-widgets/divelistview.cpp index fffb1186f..4983b41f4 100644 --- a/desktop-widgets/divelistview.cpp +++ b/desktop-widgets/divelistview.cpp @@ -461,16 +461,21 @@ void DiveListView::selectDives(const QList &newDiveSelection) // the actual reloading of the dive sites will be perfomed // by the main-window in response to the divesSelected signal // emitted below. - QVector selectedSites; - for (int idx: newDiveSelection) { - dive *d = get_dive(idx); - if (!d) - continue; - dive_site *ds = d->dive_site; - if (ds && !selectedSites.contains(ds)) - selectedSites.append(ds); + // 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()) { + QVector selectedSites; + for (int idx: newDiveSelection) { + dive *d = get_dive(idx); + if (!d) + continue; + dive_site *ds = d->dive_site; + if (ds && !selectedSites.contains(ds)) + selectedSites.append(ds); + } + MapWidget::instance()->setSelected(selectedSites); } - MapWidget::instance()->setSelected(selectedSites); // now that everything is up to date, update the widgets emit divesSelected(); @@ -691,14 +696,19 @@ void DiveListView::selectionChanged(const QItemSelection &selected, const QItemS // When receiving the divesSelected signal the main window will // instruct the map to update the flags. Thus, make sure that // the selected maps are registered correctly. - QVector selectedSites; - for (QModelIndex index: selectionModel()->selection().indexes()) { - const QAbstractItemModel *model = index.model(); - struct dive *dive = model->data(index, DiveTripModelBase::DIVE_ROLE).value(); - if (dive && dive->dive_site) - selectedSites.push_back(dive->dive_site); + // 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()) { + QVector selectedSites; + for (QModelIndex index: selectionModel()->selection().indexes()) { + const QAbstractItemModel *model = index.model(); + struct dive *dive = model->data(index, DiveTripModelBase::DIVE_ROLE).value(); + if (dive && dive->dive_site) + selectedSites.push_back(dive->dive_site); + } + MapWidget::instance()->setSelected(selectedSites); } - MapWidget::instance()->setSelected(selectedSites); emit divesSelected(); } diff --git a/qt-models/filtermodels.cpp b/qt-models/filtermodels.cpp index 7beb11d49..e9fbb9866 100644 --- a/qt-models/filtermodels.cpp +++ b/qt-models/filtermodels.cpp @@ -127,8 +127,7 @@ void MultiFilterSortModel::resetModel(DiveTripModelBase::Layout layout) bool MultiFilterSortModel::showDive(const struct dive *d) const { - // If dive_sites is not empty, we are in a special dive-site filtering mode. - if (!dive_sites.isEmpty()) + if (diveSiteMode()) return dive_sites.contains(d->dive_site); if (!filterData.validFilter) @@ -267,13 +266,16 @@ void MultiFilterSortModel::myInvalidate() #if !defined(SUBSURFACE_MOBILE) // The shown maps may have changed -> reload the map widget. - MapWidget::instance()->reload(); + // But don't do this in dive site mode, because then we show all + // dive sites and only change the selected flag. + if (!diveSiteMode()) + MapWidget::instance()->reload(); #endif emit filterFinished(); #if !defined(SUBSURFACE_MOBILE) - if (!dive_sites.isEmpty()) + if (diveSiteMode()) MainWindow::instance()->diveList->expandAll(); #endif } @@ -303,6 +305,11 @@ void MultiFilterSortModel::startFilterDiveSites(QVector ds) } else { std::sort(ds.begin(), ds.end()); dive_sites = ds; +#if !defined(SUBSURFACE_MOBILE) + // When switching into dive site mode, reload the dive sites. + // We won't do this in myInvalidate() once we are in dive site mode. + MapWidget::instance()->reload(); +#endif myInvalidate(); } } @@ -323,6 +330,10 @@ void MultiFilterSortModel::setFilterDiveSite(QVector ds) if (ds == dive_sites) return; dive_sites = ds; + +#if !defined(SUBSURFACE_MOBILE) + MapWidget::instance()->setSelected(dive_sites); +#endif myInvalidate(); } -- cgit v1.2.3-70-g09d2