diff options
-rw-r--r-- | qt-ui/divelistview.cpp | 23 | ||||
-rw-r--r-- | qt-ui/divelistview.h | 1 | ||||
-rw-r--r-- | qt-ui/models.cpp | 20 |
3 files changed, 39 insertions, 5 deletions
diff --git a/qt-ui/divelistview.cpp b/qt-ui/divelistview.cpp index 98681197c..502cebcbd 100644 --- a/qt-ui/divelistview.cpp +++ b/qt-ui/divelistview.cpp @@ -234,6 +234,29 @@ void DiveListView::selectTrip(dive_trip_t *trip) expand(idx); } +// this is an odd one - when filtering the dive list the selection status of the trips +// is kept - but all other selections are lost. That's gets us into rather inconsistent state +// we call this function which clears the selection state of the trips as well, but does so +// without updating our internal "->selected" state. So once we called this function we can +// go back and select those dives that are still visible under the filter and everything +// works as expected +void DiveListView::clearTripSelection() +{ + // we want to make sure no trips are selected + disconnect(selectionModel(), SIGNAL(selectionChanged(QItemSelection, QItemSelection)), this, SLOT(selectionChanged(QItemSelection, QItemSelection))); + disconnect(selectionModel(), SIGNAL(currentChanged(QModelIndex, QModelIndex)), this, SLOT(currentChanged(QModelIndex, QModelIndex))); + + Q_FOREACH (const QModelIndex &index, selectionModel()->selectedRows()) { + dive_trip_t *trip = static_cast<dive_trip_t *>(index.data(DiveTripModel::TRIP_ROLE).value<void *>()); + if (!trip) + continue; + selectionModel()->select(index, QItemSelectionModel::Deselect); + } + + connect(selectionModel(), SIGNAL(selectionChanged(QItemSelection, QItemSelection)), this, SLOT(selectionChanged(QItemSelection, QItemSelection))); + connect(selectionModel(), SIGNAL(currentChanged(QModelIndex, QModelIndex)), this, SLOT(currentChanged(QModelIndex, QModelIndex))); +} + void DiveListView::unselectDives() { // make sure we don't try to redraw the dives during the selection change diff --git a/qt-ui/divelistview.h b/qt-ui/divelistview.h index a2e33a09d..a6522fa9a 100644 --- a/qt-ui/divelistview.h +++ b/qt-ui/divelistview.h @@ -25,6 +25,7 @@ public: void reload(DiveTripModel::Layout layout, bool forceSort = true); bool eventFilter(QObject *, QEvent *); void unselectDives(); + void clearTripSelection(); void selectDive(int dive_table_idx, bool scrollto = false, bool toggle = false); void selectDives(const QList<int> &newDiveSelection); void rememberSelection(); diff --git a/qt-ui/models.cpp b/qt-ui/models.cpp index c5b602c83..796397f77 100644 --- a/qt-ui/models.cpp +++ b/qt-ui/models.cpp @@ -2617,18 +2617,28 @@ void MultiFilterSortModel::myInvalidate() { int i; struct dive *d; + DiveListView *dlv = MainWindow::instance()->dive_list(); invalidate(); - for_each_dive (i, d) { - if(d->selected) - MainWindow::instance()->dive_list()->selectDive(get_idx_by_uniq_id(d->id)); - } + // first make sure the trips are no longer shown as selected + // (but without updating the selection state of the dives... this just cleans + // up an oddity in the filter handling) + dlv->clearTripSelection(); + // if we have no more selected dives, clean up the display - this later triggers us // to pick one of the dives that are shown in the list as selected dive which is the // natural behavior - if (amount_selected == 0) + if (amount_selected == 0) { MainWindow::instance()->cleanUpEmpty(); + } 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 + for_each_dive (i, d) { + if(d->selected) + dlv->selectDive(get_idx_by_uniq_id(d->id)); + } + } } void MultiFilterSortModel::addFilterModel(MultiFilterInterface *model) |