aboutsummaryrefslogtreecommitdiffstats
path: root/qt-ui
diff options
context:
space:
mode:
authorGravatar Dirk Hohndel <dirk@hohndel.org>2014-05-24 20:55:28 -0700
committerGravatar Dirk Hohndel <dirk@hohndel.org>2014-05-24 21:03:53 -0700
commita3d300ca919d338345edfb6d76eb17a88875293a (patch)
tree2e7cc86d8603ae5578d8db2a706c1b3c7c418b5a /qt-ui
parent6009d770b2baa242a989cba38b32f40070717782 (diff)
downloadsubsurface-a3d300ca919d338345edfb6d76eb17a88875293a.tar.gz
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 <dirk@hohndel.org>
Diffstat (limited to 'qt-ui')
-rw-r--r--qt-ui/divelistview.cpp50
1 files changed, 8 insertions, 42 deletions
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<int> &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<int> sortedSelection = newDiveSelection;
+ qSort(sortedSelection.begin(), sortedSelection.end());
+ while (!sortedSelection.isEmpty())
+ selectDive(sortedSelection.takeLast());
- setAnimated(false);
- collapseAll();
QSortFilterProxyModel *m = qobject_cast<QSortFilterProxyModel *>(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()