diff options
-rw-r--r-- | qt-ui/divelistview.cpp | 64 | ||||
-rw-r--r-- | qt-ui/divelistview.h | 1 | ||||
-rw-r--r-- | qt-ui/globe.cpp | 4 |
3 files changed, 68 insertions, 1 deletions
diff --git a/qt-ui/divelistview.cpp b/qt-ui/divelistview.cpp index 378c8ba83..af2ff12b8 100644 --- a/qt-ui/divelistview.cpp +++ b/qt-ui/divelistview.cpp @@ -210,6 +210,70 @@ void DiveListView::selectDive(int i, bool scrollto, bool toggle) if (scrollto) scrollTo(idx, PositionAtCenter); } + +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))); + + setAnimated(false); + collapseAll(); + QSortFilterProxyModel *m = qobject_cast<QSortFilterProxyModel*>(model()); + QItemSelectionModel::SelectionFlags flags = QItemSelectionModel::Select | QItemSelectionModel::Rows; + + QItemSelection newDeselected = selectionModel()->selection(); + QModelIndexList diveList; + QModelIndexList tripList; + + 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; + } + } + } + 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()){ + if(tripList.contains(idx.parent())) + continue; + tripList.append(idx.parent()); + } + } + + Q_FOREACH(const QModelIndex& idx, tripList){ + if(!isExpanded(idx)){ + expand(idx); + } + } + 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); + const QModelIndex& idx = m->match(m->index(0,0), DiveTripModel::DIVE_IDX,selected_dive, 2, Qt::MatchRecursive).first(); + scrollTo(idx); +} + void DiveListView::showSearchEdit() { searchBox->show(); diff --git a/qt-ui/divelistview.h b/qt-ui/divelistview.h index aae89a40f..da7660e88 100644 --- a/qt-ui/divelistview.h +++ b/qt-ui/divelistview.h @@ -26,6 +26,7 @@ public: bool eventFilter(QObject* , QEvent* ); void unselectDives(); void selectDive(int dive_table_idx, bool scrollto = false, bool toggle = false); + void selectDives(const QList<int>& newDiveSelection); void rememberSelection(); void restoreSelection(); void contextMenuEvent(QContextMenuEvent *event); diff --git a/qt-ui/globe.cpp b/qt-ui/globe.cpp index c149bda74..c39723dc3 100644 --- a/qt-ui/globe.cpp +++ b/qt-ui/globe.cpp @@ -135,6 +135,7 @@ void GlobeGPS::mouseClicked(qreal lon, qreal lat, GeoDataCoordinates::Unit unit) bool clear = !(QApplication::keyboardModifiers() && Qt::ControlModifier); bool toggle = !clear; bool first = true; + QList<int> selectedDiveIds; for_each_dive(idx, dive) { long lat_diff, lon_diff; if (!dive_has_gps_location(dive)) @@ -152,9 +153,10 @@ void GlobeGPS::mouseClicked(qreal lon, qreal lat, GeoDataCoordinates::Unit unit) mainWindow()->dive_list()->unselectDives(); clear = false; } - mainWindow()->dive_list()->selectDive(idx, first, toggle); + selectedDiveIds.push_back(idx); first = false; } + mainWindow()->dive_list()->selectDives(selectedDiveIds); } void GlobeGPS::repopulateLabels() |