Filter: prevent selection-change notifications in filter invalidation

Invalidating the filter can cause numerous selection-change notifications.
These cause a full UI reload. Therefore, go into "command" mode that was
implemented for the undo commands. Then, all selection-changes are
considered as "programmatical" and ignored.

At the end of filter invalidation, a filter-finished signal causes a
proper reload anyway.

Signed-off-by: Berthold Stoeger <bstoeger@mail.tuwien.ac.at>
This commit is contained in:
Berthold Stoeger 2019-05-06 22:52:52 +02:00 committed by Dirk Hohndel
parent 4e81edcf1e
commit 29c6aea797

View file

@ -227,21 +227,33 @@ void MultiFilterSortModel::myInvalidate()
int i;
struct dive *d;
divesDisplayed = 0;
{
// This marker prevents the UI from getting notifications on selection changes.
// It is active until the end of the scope.
// This is actually meant for the undo-commands, so that they can do their work
// without having the UI updated.
// Here, it is used because invalidating the filter can generate numerous
// selection changes, which do full ui reloads. Instead, do that all at once
// as a consequence of the filterFinished signal right after the local scope.
auto marker = diveListNotifier.enterCommand();
// Apply filter for each dive
for_each_dive (i, d) {
bool show = showDive(d);
filter_dive(d, show);
if (show)
divesDisplayed++;
divesDisplayed = 0;
// Apply filter for each dive
for_each_dive (i, d) {
bool show = showDive(d);
filter_dive(d, show);
if (show)
divesDisplayed++;
}
invalidateFilter();
// Tell the dive trip model to update the displayed-counts
DiveTripModelBase::instance()->filterFinished();
countsChanged();
}
invalidateFilter();
// Tell the dive trip model to update the displayed-counts
DiveTripModelBase::instance()->filterFinished();
countsChanged();
emit filterFinished();
#if !defined(SUBSURFACE_MOBILE)