diff options
| author | 2019-05-06 22:52:52 +0200 | |
|---|---|---|
| committer | 2019-05-11 12:06:19 -0700 | |
| commit | 29c6aea797f96e59eae621df3b35b4fd0f260e3f (patch) | |
| tree | 24f8b4421c69f9c29dda05ab54d3300bffa240cb | |
| parent | 4e81edcf1e73b118fea1cb72b8a287a2ed738ef5 (diff) | |
| download | subsurface-29c6aea797f96e59eae621df3b35b4fd0f260e3f.tar.gz | |
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>
| -rw-r--r-- | qt-models/filtermodels.cpp | 36 |
1 files changed, 24 insertions, 12 deletions
diff --git a/qt-models/filtermodels.cpp b/qt-models/filtermodels.cpp index 331439bb4..5b1169de8 100644 --- a/qt-models/filtermodels.cpp +++ b/qt-models/filtermodels.cpp @@ -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; - invalidateFilter(); + // 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(); + } - // Tell the dive trip model to update the displayed-counts - DiveTripModelBase::instance()->filterFinished(); - countsChanged(); emit filterFinished(); #if !defined(SUBSURFACE_MOBILE) |