From a3d300ca919d338345edfb6d76eb17a88875293a Mon Sep 17 00:00:00 2001 From: Dirk Hohndel Date: Sat, 24 May 2014 20:55:28 -0700 Subject: Correctly implement multi dive selection The old code had several issues. It broke the synchronization between dive->select and Qt selected status and worse, it would partially unselect previously selected dives when called. This patch, however, causes the selection via the map to be glacially slow because it forces a redraw of every single selected profile. Signed-off-by: Dirk Hohndel --- qt-ui/divelistview.cpp | 50 ++++++++------------------------------------------ 1 file changed, 8 insertions(+), 42 deletions(-) (limited to 'qt-ui') diff --git a/qt-ui/divelistview.cpp b/qt-ui/divelistview.cpp index 77a51343b..e505cfd0d 100644 --- a/qt-ui/divelistview.cpp +++ b/qt-ui/divelistview.cpp @@ -241,54 +241,20 @@ void DiveListView::selectDives(const QList &newDiveSelection) if (!newDiveSelection.count()) return; - disconnect(selectionModel(), SIGNAL(selectionChanged(QItemSelection, QItemSelection)), - this, SLOT(selectionChanged(QItemSelection, QItemSelection))); - disconnect(selectionModel(), SIGNAL(currentChanged(QModelIndex, QModelIndex)), - this, SLOT(currentChanged(QModelIndex, QModelIndex))); + // select the dives, highest index first - this way the oldest of the dives + // becomes the selected_dive that we scroll to + QList sortedSelection = newDiveSelection; + qSort(sortedSelection.begin(), sortedSelection.end()); + while (!sortedSelection.isEmpty()) + selectDive(sortedSelection.takeLast()); - setAnimated(false); - collapseAll(); QSortFilterProxyModel *m = qobject_cast(model()); - QItemSelectionModel::SelectionFlags flags = QItemSelectionModel::Select | QItemSelectionModel::Rows; - - QItemSelection newDeselected = selectionModel()->selection(); - QModelIndexList diveList; - - //TODO: This should be called find_first_selected_dive and be ported to C code. - int firstSelectedDive = -1; - /* context for temp. variables. */ { - int i = 0; - struct dive *dive; - for_each_dive (i, dive) { - dive->selected = newDiveSelection.contains(i) == true; - if (firstSelectedDive == -1 && dive->selected) { - firstSelectedDive = i; - break; - } - } - } - select_dive(firstSelectedDive); - Q_FOREACH (int i, newDiveSelection) { - diveList.append(m->match(m->index(0, 0), DiveTripModel::DIVE_IDX, - i, 2, Qt::MatchRecursive).first()); - } - Q_FOREACH (const QModelIndex &idx, diveList) { - selectionModel()->select(idx, flags); - if (idx.parent().isValid() && !isExpanded(idx.parent())) { - expand(idx.parent()); - } - } - setAnimated(true); - QTreeView::selectionChanged(selectionModel()->selection(), newDeselected); - connect(selectionModel(), SIGNAL(selectionChanged(QItemSelection, QItemSelection)), - this, SLOT(selectionChanged(QItemSelection, QItemSelection))); - connect(selectionModel(), SIGNAL(currentChanged(QModelIndex, QModelIndex)), - this, SLOT(currentChanged(QModelIndex, QModelIndex))); - Q_EMIT currentDiveChanged(selected_dive); QModelIndex idx = m->match(m->index(0, 0), DiveTripModel::DIVE_IDX, selected_dive, 2, Qt::MatchRecursive).first(); if (idx.parent().isValid()) scrollTo(idx.parent()); scrollTo(idx); + + return; } void DiveListView::showSearchEdit() -- cgit v1.2.3-70-g09d2