summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorGravatar Berthold Stoeger <bstoeger@mail.tuwien.ac.at>2020-04-26 18:44:59 +0200
committerGravatar Dirk Hohndel <dirk@hohndel.org>2020-04-26 13:54:59 -0700
commit5d49da5d6b3a16a9f0d08328a5e3dc9b609a1b51 (patch)
treeecfd4fca82a461175b3fd7ea5107a6133d16e4d2
parentaaecc6e98ef0d4790a2cb0289d3f0634db21a803 (diff)
downloadsubsurface-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.cpp11
-rw-r--r--desktop-widgets/divelistview.h1
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 &current, const QModelIndex &previous) override;
QNetworkAccessManager manager;
+ bool programmaticalSelectionChange;
};
#endif // DIVELISTVIEW_H