summaryrefslogtreecommitdiffstats
path: root/qt-ui
diff options
context:
space:
mode:
Diffstat (limited to 'qt-ui')
-rw-r--r--qt-ui/divelistview.cpp23
-rw-r--r--qt-ui/divelistview.h1
-rw-r--r--qt-ui/models.cpp20
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)