subsurface/core/subsurface-qt
Berthold Stoeger 23db0ba68d Dive list view: replace signal-magic by flag
In DiveListView, we have a very fundamental problem: When
On the one hand, we get informed of user-selection in the
DiveListView::selectionChanged() slot. This has to set the
correct flags in the C-backend.

On the other hand, sometimes we have to set the selection
programatically, e.g. when selecting a trip. This is done
by calling QItemSelectionModel::select().

But: this will *also* call into the above slot, in which
we can't tell whether it was a user interaction or an
internal call. This can lead to either infinite loops or
very inefficient behavior, because the current dive
is set numerous times.

The current code is aware of that and disconnects the
corresponding signal. This is scary, as these signals are
set internally by the model and view. Replace this
by a global "command executing" flag in DiveListNotifier.
The flag is set using a "marker" class, which resets the flag
once it goes out of scope (cf. RAII pattern).

In DiveListView, only process a selection if the flag is not
set. Otherwise simply call the QTreeView base class, to reflect
the new selection in the UI.

To have a common point for notifications of selection changes,
add such a signal to DiveListNotifier. This signal will be
used by the DiveListView as well as the Command-objects.

Signed-off-by: Berthold Stoeger <bstoeger@mail.tuwien.ac.at>
2018-10-11 16:22:27 -07:00
..
CylinderObjectHelper.cpp Cleanup: fold core/helpers.h into core/qthelper.h 2018-06-04 08:50:10 -07:00
CylinderObjectHelper.h Add SPDX header to remaining core files 2017-04-29 13:32:55 -07:00
DiveListNotifier.cpp Dive list: implement proper Qt-model semantics for DiveTripModel 2018-10-11 16:22:27 -07:00
DiveListNotifier.h Dive list view: replace signal-magic by flag 2018-10-11 16:22:27 -07:00
DiveObjectHelper.cpp Cleanup: pass gasmix by value 2018-08-23 05:16:38 -07:00
DiveObjectHelper.h Mobile: return pressures for all used cylinders 2018-08-11 11:19:07 -07:00