diff options
Diffstat (limited to 'qt-ui/divelistview.cpp')
-rw-r--r-- | qt-ui/divelistview.cpp | 64 |
1 files changed, 64 insertions, 0 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(); |