mirror of
https://github.com/subsurface/subsurface.git
synced 2025-02-19 22:16:15 +00:00
Huge speedup when selecting Dives from the Globe View.
The old code ( slow++ ) ignored that each new dive-selection we recreated all information on the profile window, so this version ( a lot more verbose, I know. ) will ignore all dives that are being selected and will only send the 'dive was selected' information in the last line of the algorithm, instead of calling it for each dive on the list of 'to be selected' dives. Signed-off-by: Tomaz Canabrava <tcanabrava@kde.org> Signed-off-by: Dirk Hohndel <dirk@hohndel.org>
This commit is contained in:
parent
768cab66cc
commit
7481746d91
3 changed files with 68 additions and 1 deletions
|
@ -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();
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue