fixed updating loop markers when notation is changed

This commit is contained in:
RomanPudashkin 2021-02-15 13:17:38 +02:00 committed by Igor Korsukov
parent bc4160c452
commit 18f26dd3a5
4 changed files with 41 additions and 11 deletions

View file

@ -83,7 +83,7 @@ Notation::Notation(Ms::Score* score)
m_undoStack = std::make_shared<NotationUndoStack>(this, m_notationChanged); m_undoStack = std::make_shared<NotationUndoStack>(this, m_notationChanged);
m_interaction = std::make_shared<NotationInteraction>(this, m_undoStack); m_interaction = std::make_shared<NotationInteraction>(this, m_undoStack);
m_playback = std::make_shared<NotationPlayback>(this); m_playback = std::make_shared<NotationPlayback>(this, m_notationChanged);
m_midiInput = std::make_shared<NotationMidiInput>(this, m_undoStack); m_midiInput = std::make_shared<NotationMidiInput>(this, m_undoStack);
m_accessibility = std::make_shared<NotationAccessibility>(this, m_interaction->selectionChanged()); m_accessibility = std::make_shared<NotationAccessibility>(this, m_interaction->selectionChanged());
m_parts = std::make_shared<NotationParts>(this, m_interaction, m_undoStack); m_parts = std::make_shared<NotationParts>(this, m_interaction, m_undoStack);

View file

@ -48,12 +48,16 @@ using namespace mu::midi;
static constexpr int MIN_CHUNK_SIZE(10); // measure static constexpr int MIN_CHUNK_SIZE(10); // measure
NotationPlayback::NotationPlayback(IGetScore* getScore) NotationPlayback::NotationPlayback(IGetScore* getScore, async::Notification notationChanged)
: m_getScore(getScore) : m_getScore(getScore)
{ {
m_midiStream = std::make_shared<MidiStream>(); m_midiStream = std::make_shared<MidiStream>();
m_midiStream->isStreamingAllowed = true; m_midiStream->isStreamingAllowed = true;
m_midiStream->request.onReceive(this, [this](tick_t tick) { onChunkRequest(tick); }); m_midiStream->request.onReceive(this, [this](tick_t tick) { onChunkRequest(tick); });
notationChanged.onNotify(this, [this]() {
updateLoopBoundaries();
});
} }
Ms::Score* NotationPlayback::score() const Ms::Score* NotationPlayback::score() const
@ -79,14 +83,22 @@ void NotationPlayback::init()
if (Ms::POS::CURRENT == pos) { if (Ms::POS::CURRENT == pos) {
m_playPositionTickChanged.send(tick); m_playPositionTickChanged.send(tick);
} else { } else {
updateLoopBoundaries();
}
});
}
void NotationPlayback::updateLoopBoundaries()
{
LoopBoundaries boundaries; LoopBoundaries boundaries;
boundaries.loopInTick = score()->loopInTick().ticks(); boundaries.loopInTick = score()->loopInTick().ticks();
boundaries.loopOutTick = score()->loopOutTick().ticks(); boundaries.loopOutTick = score()->loopOutTick().ticks();
boundaries.loopInRect = loopBoundaryRectByTick(LoopBoundaryType::LoopIn, boundaries.loopInTick); boundaries.loopInRect = loopBoundaryRectByTick(LoopBoundaryType::LoopIn, boundaries.loopInTick);
boundaries.loopOutRect = loopBoundaryRectByTick(LoopBoundaryType::LoopOut, boundaries.loopOutTick); boundaries.loopOutRect = loopBoundaryRectByTick(LoopBoundaryType::LoopOut, boundaries.loopOutTick);
m_loopBoundariesChanged.send(boundaries);
if (m_loopBoundaries.val != boundaries) {
m_loopBoundaries.set(boundaries);
} }
});
} }
std::shared_ptr<MidiStream> NotationPlayback::midiStream() const std::shared_ptr<MidiStream> NotationPlayback::midiStream() const
@ -705,7 +717,7 @@ QRect NotationPlayback::loopBoundaryRectByTick(LoopBoundaryType boundaryType, in
mu::async::Channel<LoopBoundaries> NotationPlayback::loopBoundariesChanged() const mu::async::Channel<LoopBoundaries> NotationPlayback::loopBoundariesChanged() const
{ {
return m_loopBoundariesChanged; return m_loopBoundaries.ch;
} }
Tempo NotationPlayback::tempo(int tick) const Tempo NotationPlayback::tempo(int tick) const

View file

@ -40,7 +40,7 @@ class NotationPlayback : public INotationPlayback, public async::Asyncable
INJECT(notation, INotationConfiguration, configuration) INJECT(notation, INotationConfiguration, configuration)
public: public:
NotationPlayback(IGetScore* getScore); NotationPlayback(IGetScore* getScore, async::Notification notationChanged);
void init(); void init();
@ -91,6 +91,7 @@ private:
void addLoopIn(int tick); void addLoopIn(int tick);
void addLoopOut(int tick); void addLoopOut(int tick);
QRect loopBoundaryRectByTick(LoopBoundaryType boundaryType, int tick) const; QRect loopBoundaryRectByTick(LoopBoundaryType boundaryType, int tick) const;
void updateLoopBoundaries();
const Ms::TempoText* tempoText(int tick) const; const Ms::TempoText* tempoText(int tick) const;
@ -98,7 +99,7 @@ private:
std::shared_ptr<midi::MidiStream> m_midiStream; std::shared_ptr<midi::MidiStream> m_midiStream;
std::unique_ptr<Ms::MidiRenderer> m_midiRenderer; std::unique_ptr<Ms::MidiRenderer> m_midiRenderer;
async::Channel<int> m_playPositionTickChanged; async::Channel<int> m_playPositionTickChanged;
async::Channel<LoopBoundaries> m_loopBoundariesChanged; ValCh<LoopBoundaries> m_loopBoundaries;
}; };
} }

View file

@ -343,6 +343,23 @@ struct LoopBoundaries
{ {
return loopInTick == 0 && loopOutTick == 0; return loopInTick == 0 && loopOutTick == 0;
} }
bool operator==(const LoopBoundaries& boundaries) const
{
bool equals = true;
equals &= loopInTick == boundaries.loopInTick;
equals &= loopOutTick == boundaries.loopOutTick;
equals &= loopInRect == boundaries.loopInRect;
equals &= loopOutRect == boundaries.loopOutRect;
return equals;
}
bool operator!=(const LoopBoundaries& boundaries) const
{
return !(*this == boundaries);
}
}; };
inline QString staffTypeToString(StaffType type) inline QString staffTypeToString(StaffType type)