summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorGravatar Berthold Stoeger <bstoeger@mail.tuwien.ac.at>2020-05-02 18:14:44 +0200
committerGravatar Dirk Hohndel <dirk@hohndel.org>2020-05-03 15:02:21 -0700
commit769915f3fe75bcef8029e82fdfed7ae206182390 (patch)
treeab38f02413b4d55d1feafffcd31267b527467cda
parent51471317011bef1b6e51a42951f61073bb8be905 (diff)
downloadsubsurface-769915f3fe75bcef8029e82fdfed7ae206182390.tar.gz
selection: create global single_selected_trip() function
The DiveListView had a singleSelectedTrip function that returns the selected trip if exactly one trip is selected. This could be very slow if numerous non-trip items were selected, because all the selection indices were back- translated by the proxy model. This could make selection changes very slow, because the MainTab used said function to determine whether it should show trip or dive data.. Indeed, with a 3500 dive test log, when selecting all dives in tree mode, the updating of the TabWidgets is sped up from 130 ms to 5 ms this commit. Signed-off-by: Berthold Stoeger <bstoeger@mail.tuwien.ac.at>
-rw-r--r--core/selection.cpp12
-rw-r--r--core/selection.h1
-rw-r--r--desktop-widgets/divelistview.cpp22
-rw-r--r--desktop-widgets/divelistview.h1
-rw-r--r--desktop-widgets/tab-widgets/maintab.cpp4
5 files changed, 17 insertions, 23 deletions
diff --git a/core/selection.cpp b/core/selection.cpp
index 48bb1a76f..d6267c78a 100644
--- a/core/selection.cpp
+++ b/core/selection.cpp
@@ -254,6 +254,18 @@ extern "C" void deselect_trip(struct dive_trip *trip)
}
}
+extern "C" struct dive_trip *single_selected_trip()
+{
+ if (amount_trips_selected != 1)
+ return NULL;
+ for (int i = 0; i < trip_table.nr; ++i) {
+ if (trip_table.trips[i]->selected)
+ return trip_table.trips[i];
+ }
+ fprintf(stderr, "warning: found no selected trip even though one should be selected\n");
+ return NULL; // shouldn't happen
+}
+
extern "C" void clear_selection(void)
{
current_dive = nullptr;
diff --git a/core/selection.h b/core/selection.h
index beab31eaf..713e1b229 100644
--- a/core/selection.h
+++ b/core/selection.h
@@ -23,6 +23,7 @@ extern void select_newest_visible_dive();
extern void select_single_dive(struct dive *d); // wrapper for setSelection() with a single dive. NULL clears the selection.
extern void select_trip(struct dive_trip *trip);
extern void deselect_trip(struct dive_trip *trip);
+extern struct dive_trip *single_selected_trip(); // returns trip if exactly one trip is selected, NULL otherwise.
extern void clear_selection(void);
#if DEBUG_SELECTION_TRACKING
diff --git a/desktop-widgets/divelistview.cpp b/desktop-widgets/divelistview.cpp
index 3e1ec6baa..403165759 100644
--- a/desktop-widgets/divelistview.cpp
+++ b/desktop-widgets/divelistview.cpp
@@ -263,9 +263,8 @@ void DiveListView::rowsInserted(const QModelIndex &parent, int start, int end)
// Shouldn't the core-layer call us?
void DiveListView::tripChanged(dive_trip *trip, TripField)
{
- // First check if the trip is already selected (and only
- // this trip, as only then is it displayed). Is so, then do nothing.
- if (singleSelectedTrip() == trip)
+ // First check if the trip is already selected (and only this trip, as only then is it displayed).
+ if (single_selected_trip() == trip)
return;
unselectDives();
@@ -297,23 +296,6 @@ void DiveListView::unselectDives()
selectionModel()->clearSelection();
}
-// This function returns a trip if there is one selected trip or NULL.
-// Returning all selected trips turned out to be too slow.
-dive_trip_t *DiveListView::singleSelectedTrip()
-{
- dive_trip_t *res = nullptr;
- for (const QModelIndex &index: selectionModel()->selectedRows()) {
- if (index.parent().isValid())
- continue;
- if (dive_trip_t *trip = index.data(DiveTripModelBase::TRIP_ROLE).value<dive_trip *>()) {
- if (res)
- return nullptr; // More than one
- res = trip;
- }
- }
- return res;
-}
-
bool DiveListView::eventFilter(QObject *, QEvent *event)
{
if (event->type() != QEvent::KeyPress)
diff --git a/desktop-widgets/divelistview.h b/desktop-widgets/divelistview.h
index 2e15b9064..f1a5eba8d 100644
--- a/desktop-widgets/divelistview.h
+++ b/desktop-widgets/divelistview.h
@@ -25,7 +25,6 @@ public:
~DiveListView();
void setSortOrder(int i, Qt::SortOrder order); // Call to set sort order
void reload(); // Call to reload model data
- dive_trip *singleSelectedTrip();
static QString lastUsedImageDir();
static void updateLastUsedImageDir(const QString &s);
void loadImages();
diff --git a/desktop-widgets/tab-widgets/maintab.cpp b/desktop-widgets/tab-widgets/maintab.cpp
index 00f9d6ad4..7204cd7b0 100644
--- a/desktop-widgets/tab-widgets/maintab.cpp
+++ b/desktop-widgets/tab-widgets/maintab.cpp
@@ -365,7 +365,8 @@ void MainTab::updateDiveInfo()
// 2) the filter is reset, potentially erasing the current trip under our feet.
// TODO: Don't hard code tab location!
bool onDiveSiteTab = ui.tabWidget->currentIndex() == 6;
- if ((currentTrip = MainWindow::instance()->diveList->singleSelectedTrip()) != nullptr) {
+ currentTrip = single_selected_trip();
+ if (currentTrip) {
// Remember the tab selected for last dive but only if we're not on the dive site tab
if (lastSelectedDive && !onDiveSiteTab)
lastTabSelectedDive = ui.tabWidget->currentIndex();
@@ -412,7 +413,6 @@ void MainTab::updateDiveInfo()
if (!lastSelectedDive && !onDiveSiteTab)
ui.tabWidget->setCurrentIndex(lastTabSelectedDive);
lastSelectedDive = true;
- currentTrip = NULL;
// make all the fields visible writeable
ui.diveTripLocation->hide();
ui.location->show();