Skip to content

Commit bbfbabe

Browse files
committed
Fix undo error
1 parent a66a6a0 commit bbfbabe

3 files changed

Lines changed: 56 additions & 2 deletions

File tree

src/engraving/editing/editmeasures.cpp

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -408,3 +408,21 @@ void ChangeMeasureRepeatCount::flip(EditData*)
408408
m->setMeasureRepeatCount(count, staffIdx);
409409
count = oldCount;
410410
}
411+
412+
void ChangeMMRestNext::flip(EditData*)
413+
{
414+
assert(m_mmrest->isMMRest());
415+
MeasureBase* oldNext = m_mmrest->next();
416+
417+
m_mmrest->setNext(m_next);
418+
m_next = oldNext;
419+
}
420+
421+
void ChangeMMRestPrev::flip(EditData*)
422+
{
423+
assert(m_mmrest->isMMRest());
424+
MeasureBase* oldPrev = m_mmrest->prev();
425+
426+
m_mmrest->setPrev(m_prev);
427+
m_prev = oldPrev;
428+
}

src/engraving/editing/editmeasures.h

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -110,6 +110,41 @@ class ChangeMMRest : public UndoableCommand
110110
UNDO_CHANGED_OBJECTS({ m, mmrest })
111111
};
112112

113+
// ChangeMMRestNext & ChangeMMRestPrev SHOULD ONLY BE USED FOR MMRests
114+
// Setting m_next & m_prev involves the score's MeasureList for regular measures
115+
// This is handled through undo commands above
116+
class ChangeMMRestNext : public UndoableCommand
117+
{
118+
OBJECT_ALLOCATOR(engraving, ChangeMMRestNext)
119+
120+
Measure* m_mmrest = nullptr;
121+
MeasureBase* m_next = nullptr;
122+
123+
void flip(EditData*) override;
124+
public:
125+
ChangeMMRestNext(Measure* mmrest, MeasureBase* next)
126+
: m_mmrest(mmrest), m_next(next) {}
127+
128+
UNDO_NAME("ChangeMMRestNext")
129+
UNDO_CHANGED_OBJECTS({ m_mmrest })
130+
};
131+
132+
class ChangeMMRestPrev : public UndoableCommand
133+
{
134+
OBJECT_ALLOCATOR(engraving, ChangeMMRestPrev)
135+
136+
Measure* m_mmrest = nullptr;
137+
MeasureBase* m_prev = nullptr;
138+
139+
void flip(EditData*) override;
140+
public:
141+
ChangeMMRestPrev(Measure* mmrest, MeasureBase* prev)
142+
: m_mmrest(mmrest), m_prev(prev) {}
143+
144+
UNDO_NAME("ChangeMMRestPrev")
145+
UNDO_CHANGED_OBJECTS({ m_mmrest })
146+
};
147+
113148
class ChangeMeasureRepeatCount : public UndoableCommand
114149
{
115150
OBJECT_ALLOCATOR(engraving, ChangeMeasureRepeatCount)

src/engraving/rendering/score/mmrestlayout.cpp

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -214,8 +214,8 @@ void MMRestLayout::createMMRest(LayoutContext& ctx, Measure* firstMeasure, Measu
214214
changeMeasureElParents(firstMeasure, lastMeasure, mmrMeasure, ctx);
215215

216216
MeasureBase* nm = ctx.conf().isShowVBox() ? lastMeasure->next() : lastMeasure->nextMeasure();
217-
mmrMeasure->setNext(nm);
218-
mmrMeasure->setPrev(firstMeasure->prev());
217+
ctx.mutDom().undo(new ChangeMMRestNext(mmrMeasure, nm));
218+
ctx.mutDom().undo(new ChangeMMRestPrev(mmrMeasure, firstMeasure->prev()));
219219
}
220220

221221
void MMRestLayout::changeMeasureElParents(Measure* firstMeasure, Measure* lastMeasure, Measure* mmrMeasure, LayoutContext& ctx)
@@ -724,6 +724,7 @@ void MMRestLayout::createMultiMeasureRestsIfNeed(Measure* firstMeasure, LayoutCo
724724
Fraction len;
725725

726726
while (validMMRestMeasure(ctx, measureToBeChecked)) {
727+
LOGI() << "check: " << measureToBeChecked;
727728
if (n && breakMultiMeasureRest(ctx, measureToBeChecked)) {
728729
break;
729730
}

0 commit comments

Comments
 (0)