diff options
-rw-r--r-- | divelist.c | 10 | ||||
-rw-r--r-- | divelist.h | 1 | ||||
-rw-r--r-- | qt-ui/divelistview.cpp | 5 | ||||
-rw-r--r-- | qt-ui/models.cpp | 14 |
4 files changed, 22 insertions, 8 deletions
diff --git a/divelist.c b/divelist.c index ad0c2e716..8802aaea1 100644 --- a/divelist.c +++ b/divelist.c @@ -873,6 +873,16 @@ void select_dives_in_trip(struct dive_trip *trip) select_dive(get_divenr(dive)); } +void filter_dive(struct dive *d, bool shown) +{ + if (!d) + return; + d->hidden_by_filter = !shown; + if (!shown && d->selected) + deselect_dive(get_divenr(d)); +} + + /* This only gets called with non-NULL trips. * It does not combine notes or location, just picks the first one * (or the second one if the first one is empty */ diff --git a/divelist.h b/divelist.h index a24deea17..79e1f6cbc 100644 --- a/divelist.h +++ b/divelist.h @@ -32,6 +32,7 @@ extern void select_dive(int idx); extern void deselect_dive(int idx); extern void select_dives_in_trip(struct dive_trip *trip); extern void deselect_dives_in_trip(struct dive_trip *trip); +extern void filter_dive(struct dive *d, bool shown); extern void combine_trips(struct dive_trip *trip_a, struct dive_trip *trip_b); extern void find_new_trip_start_time(dive_trip_t *trip); extern struct dive *first_selected_dive(); diff --git a/qt-ui/divelistview.cpp b/qt-ui/divelistview.cpp index 0d7c4fa6d..f250e901a 100644 --- a/qt-ui/divelistview.cpp +++ b/qt-ui/divelistview.cpp @@ -314,6 +314,8 @@ void DiveListView::selectDive(int i, bool scrollto, bool toggle) void DiveListView::selectDives(const QList<int> &newDiveSelection) { int firstInList, newSelection; + struct dive *d; + if (!newDiveSelection.count()) return; @@ -335,7 +337,8 @@ void DiveListView::selectDives(const QList<int> &newDiveSelection) newSelection = dive_table.nr - 1; if (newSelection == firstInList) break; - selectDive(newSelection); + if ((d = get_dive(newSelection)) != NULL && !d->hidden_by_filter) + selectDive(newSelection); } QSortFilterProxyModel *m = qobject_cast<QSortFilterProxyModel *>(model()); QModelIndexList idxList = m->match(m->index(0, 0), DiveTripModel::DIVE_IDX, selected_dive, 2, Qt::MatchRecursive); diff --git a/qt-ui/models.cpp b/qt-ui/models.cpp index 5ad1c79c7..c7886d2b9 100644 --- a/qt-ui/models.cpp +++ b/qt-ui/models.cpp @@ -2366,7 +2366,9 @@ bool TagFilterModel::filterRow(int source_row, const QModelIndex &source_parent, QVariant diveVariant = sourceModel->data(index0, DiveTripModel::DIVE_ROLE); struct dive *d = (struct dive *)diveVariant.value<void *>(); - return doFilter(d, index0, sourceModel); + bool show = doFilter(d, index0, sourceModel); + filter_dive(d, show); + return show; } BuddyFilterModel::BuddyFilterModel(QObject *parent) : QStringListModel(parent) @@ -2628,11 +2630,7 @@ bool MultiFilterSortModel::filterAcceptsRow(int source_row, const QModelIndex &s shouldShow = false; } // if it's a dive, mark it accordingly - if (d) { - if (d->selected) - d->selected = shouldShow; - d->hidden_by_filter = !shouldShow; - } + filter_dive(d, shouldShow); return shouldShow; } @@ -2656,10 +2654,12 @@ void MultiFilterSortModel::myInvalidate() } else { // otherwise find the dives that should still be selected (the filter above unselected any // dive that's no longer visible) and select them again + QList<int>curSelectedDives; for_each_dive (i, d) { if(d->selected) - dlv->selectDive(get_idx_by_uniq_id(d->id)); + curSelectedDives.append(get_divenr(d)); } + dlv->selectDives(curSelectedDives); } } |