diff options
author | Berthold Stoeger <bstoeger@mail.tuwien.ac.at> | 2020-04-26 18:44:59 +0200 |
---|---|---|
committer | Dirk Hohndel <dirk@hohndel.org> | 2020-04-26 13:54:59 -0700 |
commit | 5d49da5d6b3a16a9f0d08328a5e3dc9b609a1b51 (patch) | |
tree | ecfd4fca82a461175b3fd7ea5107a6133d16e4d2 | |
parent | aaecc6e98ef0d4790a2cb0289d3f0634db21a803 (diff) | |
download | subsurface-5d49da5d6b3a16a9f0d08328a5e3dc9b609a1b51.tar.gz |
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 <bstoeger@mail.tuwien.ac.at>
-rw-r--r-- | desktop-widgets/divelistview.cpp | 11 | ||||
-rw-r--r-- | 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<QModelIndex> &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<QModelIndex> &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 |