Skip to content

Commit

Permalink
fix #12138: deletion of measures with parts causes corruption. Do not…
Browse files Browse the repository at this point in the history
… insert frames in parts/score
  • Loading branch information
lasconic committed Jun 12, 2013
1 parent 61a22b0 commit a5d1ac2
Showing 1 changed file with 43 additions and 32 deletions.
75 changes: 43 additions & 32 deletions libmscore/edit.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1113,6 +1113,8 @@ void Score::cmdAddBSymbol(BSymbol* s, const QPointF& pos, const QPointF& off)

void Score::deleteItem(Element* el)
{
if(!el)
return;
switch(el->type()) {
case Element::INSTRUMENT_NAME: {
Part* part = el->staff()->part();
Expand Down Expand Up @@ -1314,9 +1316,12 @@ void Score::cmdDeleteSelectedMeasures()
}

QList<Score*> scores = scoreList();
int startTick = measure(startIdx)->tick();
int endTick = measure(endIdx)->tick();
foreach(Score* score, scores) {
MeasureBase* is = score->measure(startIdx);
MeasureBase* ie = score->measure(endIdx);
MeasureBase* is = score->tick2measure(startTick);
MeasureBase* ie = score->tick2measure(endTick);
mBeforeSel = is->prevMeasure();
for (;;) {
deleteItem(ie);
if (ie == is)
Expand All @@ -1325,42 +1330,42 @@ void Score::cmdDeleteSelectedMeasures()
if (ie == 0)
break;
}
}

if (createEndBar) {
MeasureBase* mb = _measures.last();
while (mb && mb->type() != Element::MEASURE)
mb = mb->prev();
if (mb) {
Measure* lastMeasure = static_cast<Measure*>(mb);
if (lastMeasure->endBarLineType() == NORMAL_BAR) {
undoChangeEndBarLineType(lastMeasure, END_BAR);
if (createEndBar) {
MeasureBase* mb = score->measures()->last();
while (mb && mb->type() != Element::MEASURE)
mb = mb->prev();
if (mb) {
Measure* lastMeasure = static_cast<Measure*>(mb);
if (lastMeasure->endBarLineType() == NORMAL_BAR) {
undoChangeEndBarLineType(lastMeasure, END_BAR);
}
}
}
}

// insert correct timesig after deletion
Measure* mAfterSel = mBeforeSel ? mBeforeSel->nextMeasure() : firstMeasure();
if (mAfterSel && lastDeletedSig) {
bool changed = true;
if (mBeforeSel) {
if (mBeforeSel->timesig() == mAfterSel->timesig()) {
changed = false;
// insert correct timesig after deletion
Measure* mAfterSel = mBeforeSel ? mBeforeSel->nextMeasure() : firstMeasure();
if (mAfterSel && lastDeletedSig) {
bool changed = true;
if (mBeforeSel) {
if (mBeforeSel->timesig() == mAfterSel->timesig()) {
changed = false;
}
}
}
Segment* s = mAfterSel->findSegment(Segment::SegTimeSig, mAfterSel->tick());
if (!s && changed) {
Segment* ns = mAfterSel->undoGetSegment(Segment::SegTimeSig, mAfterSel->tick());
for (int staffIdx = 0; staffIdx < nstaves(); staffIdx++) {
TimeSig* nts = new TimeSig(this);
nts->setTrack(staffIdx * VOICES);
nts->setParent(ns);
nts->setSig(lastDeletedSig->sig(), lastDeletedSig->timeSigType());
undoAddElement(nts);
Segment* s = mAfterSel->findSegment(Segment::SegTimeSig, mAfterSel->tick());
if (!s && changed) {
Segment* ns = mAfterSel->undoGetSegment(Segment::SegTimeSig, mAfterSel->tick());
for (int staffIdx = 0; staffIdx < score->nstaves(); staffIdx++) {
TimeSig* nts = new TimeSig(score);
nts->setTrack(staffIdx * VOICES);
nts->setParent(ns);
nts->setSig(lastDeletedSig->sig(), lastDeletedSig->timeSigType());
score->undoAddElement(nts);
}
}
}
}



select(0, SELECT_SINGLE, 0);
_is.setSegment(0); // invalidate position
}
Expand Down Expand Up @@ -1753,7 +1758,13 @@ MeasureBase* Score::insertMeasure(Element::ElementType type, MeasureBase* measur
}

MeasureBase* omb = 0;
foreach(Score* score, scoreList()) {
QList<Score*> scorelist;
if (type == Element::MEASURE)
scorelist = scoreList();
else
scorelist = {this};

foreach(Score* score, scorelist) {
MeasureBase* mb = static_cast<MeasureBase*>(Element::create(type, score));
MeasureBase* im = idx != -1 ? score->measure(idx) : 0;
// insert before im, append if im = 0
Expand Down

0 comments on commit a5d1ac2

Please sign in to comment.