From 5d49da5d6b3a16a9f0d08328a5e3dc9b609a1b51 Mon Sep 17 00:00:00 2001 From: Berthold Stoeger Date: Sun, 26 Apr 2020 18:44:59 +0200 Subject: selection: move test for programmatical selection changes to widget The DiveListView widget has to differentiate between programmatical und user-initiated selection changes. It did so by using the DiveListNotifier::inCommand() flag. However, 1) There is only one point of entry for such selection changes, viz. the MultiFilterSortModel::selectionChanged() signal 2) This signal is not only emitted in command-context. Another source is for example dive-map selection changes. Therefore, move the programmatical-selection-change status down to the widget and set/reset it in the diveSelectionChanged() slot. This makes "select all visible dive sites" somewhat faster. Sadly, not as much as expected. Signed-off-by: Berthold Stoeger --- desktop-widgets/divelistview.cpp | 11 +++++++++-- desktop-widgets/divelistview.h | 1 + 2 files changed, 10 insertions(+), 2 deletions(-) diff --git a/desktop-widgets/divelistview.cpp b/desktop-widgets/divelistview.cpp index 311fc5e6e..746af88f2 100644 --- a/desktop-widgets/divelistview.cpp +++ b/desktop-widgets/divelistview.cpp @@ -32,7 +32,8 @@ DiveListView::DiveListView(QWidget *parent) : QTreeView(parent), currentLayout(DiveTripModelBase::TREE), - initialColumnWidths(DiveTripModelBase::COLUMNS, 50) // Set up with default length 50 + initialColumnWidths(DiveTripModelBase::COLUMNS, 50), // Set up with default length 50 + programmaticalSelectionChange(false) { setItemDelegate(new DiveListDelegate(this)); setUniformRowHeights(true); @@ -201,6 +202,11 @@ void DiveListView::reset() // If items were selected, inform the selection model void DiveListView::diveSelectionChanged(const QVector &indices) { + // This is the entry point for programmatical selection changes. + // Set a flag so that selection changes are not further processed, + // since the core structures were already set. + programmaticalSelectionChange = true; + clearSelection(); QItemSelectionModel *s = selectionModel(); for (const QModelIndex &index: indices) { @@ -215,6 +221,7 @@ void DiveListView::diveSelectionChanged(const QVector &indices) } selectionChangeDone(); + programmaticalSelectionChange = false; } void DiveListView::currentDiveChanged(QModelIndex index) @@ -522,7 +529,7 @@ void DiveListView::selectionChangeDone() void DiveListView::selectionChanged(const QItemSelection &selected, const QItemSelection &deselected) { - if (diveListNotifier.inCommand()) { + if (programmaticalSelectionChange) { // This is a programmatical change of the selection. // Call the QTreeView base function to reflect the selection in the display, // but don't process it any further. diff --git a/desktop-widgets/divelistview.h b/desktop-widgets/divelistview.h index e490f1398..9b5d2d7d8 100644 --- a/desktop-widgets/divelistview.h +++ b/desktop-widgets/divelistview.h @@ -86,6 +86,7 @@ private: void contextMenuEvent(QContextMenuEvent *event) override; void currentChanged(const QModelIndex ¤t, const QModelIndex &previous) override; QNetworkAccessManager manager; + bool programmaticalSelectionChange; }; #endif // DIVELISTVIEW_H -- cgit v1.2.3-70-g09d2