From d43ada52e33c442ccf9d5c94be65958fed10c715 Mon Sep 17 00:00:00 2001 From: Roman Pudashkin Date: Mon, 18 Dec 2023 11:59:37 +0200 Subject: [PATCH] fix #20530: explicitly reload PlaybackModel when adding repeats (it was reloading implicitly before PR #20141) --- src/engraving/playback/playbackmodel.cpp | 21 +++++++++++++++++---- src/engraving/playback/playbackmodel.h | 2 +- 2 files changed, 18 insertions(+), 5 deletions(-) diff --git a/src/engraving/playback/playbackmodel.cpp b/src/engraving/playback/playbackmodel.cpp index 793dcca08bfc1..f9d557af265d8 100644 --- a/src/engraving/playback/playbackmodel.cpp +++ b/src/engraving/playback/playbackmodel.cpp @@ -541,7 +541,7 @@ bool PlaybackModel::hasToReloadTracks(const ScoreChangesRange& changesRange) con return false; } -bool PlaybackModel::hasToReloadScore(const std::unordered_set& changedTypes) const +bool PlaybackModel::hasToReloadScore(const ScoreChangesRange& changesRange) const { static const std::unordered_set REQUIRED_TYPES = { ElementType::SCORE, @@ -558,13 +558,26 @@ bool PlaybackModel::hasToReloadScore(const std::unordered_set& chan }; for (const ElementType type : REQUIRED_TYPES) { - if (changedTypes.find(type) == changedTypes.cend()) { + if (changesRange.changedTypes.find(type) == changesRange.changedTypes.cend()) { continue; } return true; } + static const std::unordered_set REQUIRED_PROPERTIES { + mu::engraving::Pid::REPEAT_START, + mu::engraving::Pid::REPEAT_END, + mu::engraving::Pid::REPEAT_JUMP, + mu::engraving::Pid::REPEAT_COUNT, + }; + + for (const Pid pid: changesRange.changedPropertyIdSet) { + if (mu::contains(REQUIRED_PROPERTIES, pid)) { + return true; + } + } + return false; } @@ -747,7 +760,7 @@ PlaybackModel::TrackBoundaries PlaybackModel::trackBoundaries(const ScoreChanges result.trackFrom = staff2track(changesRange.staffIdxFrom, 0); result.trackTo = staff2track(changesRange.staffIdxTo, VOICES); - if (hasToReloadScore(changesRange.changedTypes) || !changesRange.isValidBoundary()) { + if (hasToReloadScore(changesRange) || !changesRange.isValidBoundary()) { result.trackFrom = 0; result.trackTo = m_score->ntracks(); } @@ -763,7 +776,7 @@ PlaybackModel::TickBoundaries PlaybackModel::tickBoundaries(const ScoreChangesRa result.tickTo = changesRange.tickTo; if (hasToReloadTracks(changesRange) - || hasToReloadScore(changesRange.changedTypes) + || hasToReloadScore(changesRange) || !changesRange.isValidBoundary()) { const Measure* lastMeasure = m_score->lastMeasure(); result.tickFrom = 0; diff --git a/src/engraving/playback/playbackmodel.h b/src/engraving/playback/playbackmodel.h index 48fa2d0e9ef37..14739ad77b666 100644 --- a/src/engraving/playback/playbackmodel.h +++ b/src/engraving/playback/playbackmodel.h @@ -114,7 +114,7 @@ class PlaybackModel : public async::Asyncable const staff_idx_t staffIdx, ChangedTrackIdSet* trackChanges); bool hasToReloadTracks(const ScoreChangesRange& changesRange) const; - bool hasToReloadScore(const std::unordered_set& changedTypes) const; + bool hasToReloadScore(const ScoreChangesRange& changesRange) const; bool containsTrack(const InstrumentTrackId& trackId) const; void clearExpiredTracks();