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:
Tomaz Canabrava 2013-12-02 17:15:40 -02:00 committed by Dirk Hohndel
parent 768cab66cc
commit 7481746d91
3 changed files with 68 additions and 1 deletions

View file

@ -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();

View file

@ -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);

View file

@ -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()