mirror of
https://github.com/subsurface/subsurface.git
synced 2025-02-19 22:16:15 +00:00
dive list: don't access selected dives via indices
When determining the selected dive sites to highlight them on the map, the DiveListView code used the local indices of the selected dives. However, that was unreasonably slow. Even though a layering violation, let's access the core data structures directly. In my tests this improved from 700 ms to 0 ms! Signed-off-by: Berthold Stoeger <bstoeger@mail.tuwien.ac.at>
This commit is contained in:
parent
f43b3f56b2
commit
4f438d1e32
1 changed files with 9 additions and 5 deletions
|
@ -515,12 +515,16 @@ void DiveListView::selectionChangeDone()
|
|||
// the dive-site selection is controlled by the filter not
|
||||
// by the selected dives.
|
||||
if (!DiveFilter::instance()->diveSiteMode()) {
|
||||
// This is truly sad, but taking the list of selected indices and turning them
|
||||
// into dive sites turned out to be unreasonably slow. Therefore, let's access
|
||||
// the core list directly. In my tests, this went down from 700 to 0 ms!
|
||||
QVector<dive_site *> selectedSites;
|
||||
for (QModelIndex index: selectionModel()->selectedRows()) {
|
||||
const QAbstractItemModel *model = index.model();
|
||||
struct dive *dive = model->data(index, DiveTripModelBase::DIVE_ROLE).value<struct dive *>();
|
||||
if (dive && dive->dive_site && !selectedSites.contains(dive->dive_site))
|
||||
selectedSites.push_back(dive->dive_site);
|
||||
selectedSites.reserve(amount_selected);
|
||||
int i;
|
||||
dive *d;
|
||||
for_each_dive(i, d) {
|
||||
if (d->selected && !d->hidden_by_filter && d->dive_site && !selectedSites.contains(d->dive_site))
|
||||
selectedSites.push_back(d->dive_site);
|
||||
}
|
||||
MapWidget::instance()->setSelected(selectedSites);
|
||||
}
|
||||
|
|
Loading…
Add table
Reference in a new issue