Skip to content

Commit

Permalink
fix #45601 changing note value can lead to missing accidentals; simpl…
Browse files Browse the repository at this point in the history
…ify layout()
  • Loading branch information
wschweer committed Feb 17, 2015
1 parent 11b49de commit ec8913a
Show file tree
Hide file tree
Showing 36 changed files with 84 additions and 384 deletions.
4 changes: 2 additions & 2 deletions libmscore/barline.cpp
Expand Up @@ -1363,7 +1363,7 @@ QString BarLine::accessibleExtraInfo()

if (m) {
//jumps
foreach (Element* e, *m->el()) {
foreach (Element* e, m->el()) {
if (!score()->selectionFilter().canSelect(e)) continue;
if (e->type() == Element::Type::JUMP)
rez= QString("%1 %2").arg(rez).arg(e->screenReaderInfo());
Expand All @@ -1377,7 +1377,7 @@ QString BarLine::accessibleExtraInfo()
//markers
Measure* nextM = m->nextMeasureMM();
if (nextM) {
foreach (Element* e, *nextM->el()) {
foreach (Element* e, nextM->el()) {
if (!score()->selectionFilter().canSelect(e)) continue;
if (e->type() == Element::Type::MARKER)
if (static_cast<Marker*>(e)->markerType() == Marker::Type::FINE)
Expand Down
48 changes: 1 addition & 47 deletions libmscore/chord.cpp
Expand Up @@ -507,13 +507,8 @@ void Chord::remove(Element* e)
Note* note = static_cast<Note*>(e);
if (_notes.removeOne(note)) {
if (note->tieFor()) {
if (note->tieFor()->endNote()) {
if (note->tieFor()->endNote())
note->tieFor()->endNote()->setTieBack(0);
// update accidentals for endNote
Chord* chord = note->tieFor()->endNote()->chord();
Measure* m = chord->segment()->measure();
m->cmdUpdateNotes(chord->staffIdx());
}
}
}
else
Expand Down Expand Up @@ -1590,47 +1585,6 @@ void Chord::layout2()

}

//---------------------------------------------------------
// updateNotes
//---------------------------------------------------------

void Chord::updateNotes(AccidentalState* as)
{

QList<Chord*> graceNotesBefore;
int gnb = getGraceNotesBefore(&graceNotesBefore);
if (gnb) {
for (Chord* c : graceNotesBefore)
c->updateNotes(as);
}

const Drumset* drumset = 0;
if (staff()->part()->instr()->useDrumset())
drumset = staff()->part()->instr()->drumset();

QList<Note*> nl(notes());
if (drumset) {
for (Note* note : nl) {
int pitch = note->pitch();
if (drumset->isValid(pitch) && !note->fixed()) {
note->setHeadGroup(drumset->noteHead(pitch));
note->setLine(drumset->line(pitch));
}
}
}
else {
for (Note* note : nl)
note->layout10(as);
}
QList<Chord*> graceNotesAfter;
int gna = getGraceNotesAfter(&graceNotesAfter);
if (gna) {
for (Chord* c : graceNotesAfter)
c->updateNotes(as);
}
sortNotes();
}

//---------------------------------------------------------
// cmdUpdateNotes
//---------------------------------------------------------
Expand Down
1 change: 0 additions & 1 deletion libmscore/chord.h
Expand Up @@ -172,7 +172,6 @@ class Chord : public ChordRest {
Note* selectedNote() const;
virtual void layout();
void layout2();
void updateNotes(AccidentalState*);
void cmdUpdateNotes(AccidentalState*);

NoteType noteType() const { return _noteType; }
Expand Down
20 changes: 1 addition & 19 deletions libmscore/cmd.cpp
Expand Up @@ -431,8 +431,6 @@ void Score::cmdAddInterval(int val, const QList<Note*>& nl)

select(note, SelectType::SINGLE, 0);
}
Chord* c = nl.front()->chord();
c->measure()->cmdUpdateNotes(c->staffIdx());
setLayoutAll(true);
_is.moveToNextInputPos();
endCmd();
Expand Down Expand Up @@ -948,8 +946,6 @@ void Score::changeCRlen(ChordRest* cr, const TDuration& d)
if (srcF == dstF)
return;

qDebug("changeCRlen: %d/%d -> %d/%d", srcF.numerator(), srcF.denominator(), dstF.numerator(), dstF.denominator());

//keep selected element if any
Element* selElement = selection().isSingle() ? getSelectedElement() : 0;

Expand Down Expand Up @@ -977,7 +973,6 @@ qDebug("changeCRlen: %d/%d -> %d/%d", srcF.numerator(), srcF.denominator(), dstF
}
}
undoChangeChordRestLen(cr, TDuration(dstF));
qDebug(" setRest at %d+%d, %d/%d", cr->tick(), cr->actualTicks(), (srcF-dstF).numerator(), (srcF-dstF).denominator());
setRest(cr->tick() + cr->actualTicks(), track, srcF - dstF, false, tuplet);

if (selElement)
Expand All @@ -994,22 +989,18 @@ qDebug(" setRest at %d+%d, %d/%d", cr->tick(), cr->actualTicks(), (srcF-dstF).n
return;

deselectAll();
qDebug("ChangeCRLen::List:");
foreach (Fraction f, flist)
qDebug(" %d/%d", f.numerator(), f.denominator());

int tick = cr->tick();
Fraction f = dstF;
ChordRest* cr1 = cr;
Chord* oc = 0;

bool first = true;
foreach (Fraction f2, flist) {
for (Fraction f2 : flist) {
f -= f2;
makeGap(cr1->segment(), cr1->track(), f2, tuplet, first);

if (cr->type() == Element::Type::REST) {
qDebug(" +ChangeCRLen::setRest %d/%d", f2.numerator(), f2.denominator());
Fraction timeStretch = cr1->staff()->timeStretch(cr1->tick());
Rest* r = static_cast<Rest*>(cr);
if (first) {
Expand All @@ -1029,15 +1020,12 @@ qDebug(" +ChangeCRLen::setRest %d/%d", f2.numerator(), f2.denominator());
select(r, SelectType::SINGLE, 0);
first = false;
}
qDebug(" ChangeCRLen:: %d += %d(actual=%d)", tick, f2.ticks(), f2.ticks() * timeStretch.numerator() / timeStretch.denominator());
tick += f2.ticks() * timeStretch.numerator() / timeStretch.denominator();
}
else {
QList<TDuration> dList = toDurationList(f2, true);
Measure* measure = tick2measure(tick);
int etick = measure->tick();
// if (measure->tick() != tick)
// etick += measure->ticks();
if (((tick - etick) % dList[0].ticks()) == 0) {
foreach(TDuration du, dList) {
bool genTie;
Expand Down Expand Up @@ -1097,7 +1085,6 @@ qDebug(" ChangeCRLen:: %d += %d(actual=%d)", tick, f2.ticks(), f2.ticks() * tim
expandVoice(s, track);
cr1 = static_cast<ChordRest*>(s->element(track));
}
// checkSpanner(cr->tick(), cr->tick() + d.ticks());
connectTies();
}

Expand Down Expand Up @@ -1419,11 +1406,6 @@ static void changeAccidental2(Note* n, int pitch, int tpc)
}
}
}
//
// recalculate needed accidentals for
// whole measure
//
chord->measure()->cmdUpdateNotes(staffIdx);
}

//---------------------------------------------------------
Expand Down
4 changes: 1 addition & 3 deletions libmscore/edit.cpp
Expand Up @@ -228,7 +228,6 @@ Chord* Score::addChord(int tick, TDuration d, Chord* oc, bool genTie, Tuplet* tu
}
}

measure->cmdUpdateNotes(chord->staffIdx());
return chord;
}

Expand Down Expand Up @@ -1463,7 +1462,6 @@ void Score::deleteItem(Element* el)

case Element::Type::KEYSIG:
undoRemoveElement(el);
cmdUpdateNotes();
break;

case Element::Type::NOTE:
Expand Down Expand Up @@ -1633,7 +1631,7 @@ void Score::deleteItem(Element* el)
if (m->isMMRest()) {
// propagate to original measure
m = m->mmRestLast();
foreach(Element* e, *m->el()) {
foreach(Element* e, m->el()) {
if (e->type() == Element::Type::LAYOUT_BREAK) {
undoRemoveElement(e);
break;
Expand Down
3 changes: 1 addition & 2 deletions libmscore/excerpt.cpp
Expand Up @@ -199,7 +199,6 @@ void createExcerpt(Excerpt* excerpt)
}
}
}
score->updateNotes();
}

//
Expand Down Expand Up @@ -479,7 +478,7 @@ void cloneStaves(Score* oscore, Score* score, const QList<int>& map)
}

nmb->linkTo(mb);
foreach (Element* e, *mb->el()) {
foreach (Element* e, mb->el()) {
if (e->type() == Element::Type::LAYOUT_BREAK) {
LayoutBreak::Type st = static_cast<LayoutBreak*>(e)->layoutBreakType();
if (st == LayoutBreak::Type::PAGE || st == LayoutBreak::Type::LINE)
Expand Down
99 changes: 55 additions & 44 deletions libmscore/layout.cpp
Expand Up @@ -1368,9 +1368,8 @@ void Score::layoutStage3()
for (int staffIdx = 0; staffIdx < nstaves(); ++staffIdx) {
if (!staff(staffIdx)->show())
continue;
for (Segment* segment = firstSegment(st); segment; segment = segment->next1(st)) {
for (Segment* segment = firstSegment(st); segment; segment = segment->next1(st))
layoutChords1(segment, staffIdx);
}
}
}

Expand All @@ -1391,6 +1390,20 @@ void Score::doLayout()
// abort();
// return;
}
if (_staves.isEmpty() || first() == 0) {
// score is empty
// qDeleteAll(_pages);
_pages.clear();

Page* page = addPage();
page->layout();
page->setNo(0);
page->setPos(0.0, 0.0);
page->rebuildBspTree();
qDebug("layout: empty score");
_layoutAll = false;
return;
}

_scoreFont = ScoreFont::fontFactory(_style.value(StyleIdx::MusicalSymbolFont).toString());
_noteHeadWidth = _scoreFont->width(SymId::noteheadBlack, spatium() / (MScore::DPI * SPATIUM20));
Expand All @@ -1401,45 +1414,46 @@ void Score::doLayout()
updateVelo();
if (layoutFlags & LayoutFlag::PLAY_EVENTS)
createPlayEvents();

int measureNo = 0;
for (Measure* m = firstMeasure(); m; m = m->nextMeasure()) {
Measure* measure = static_cast<Measure*>(m);
measureNo += measure->noOffset();
measure->setNo(measureNo);
if (measure->sectionBreak() && measure->sectionBreak()->startWithMeasureOne())
measureNo = 0;
else if (measure->irregular()) // dont count measure
;
else
++measureNo;
measure->setBreakMMRest(false);
}

for (MeasureBase* m = first(); m; m = m->next()) // set layout break
m->layout0();

layoutFlags = 0;

int measureNo = 0;
int nstaves = _staves.size();
for (MeasureBase* m = first(); m; m = m->next()) { // set layout break
m->setPageBreak(false);
m->setLineBreak(false);
m->setSectionBreak(0);

if (_staves.isEmpty() || first() == 0) {
// score is empty
// qDeleteAll(_pages);
_pages.clear();

Page* page = addPage();
page->layout();
page->setNo(0);
page->setPos(0.0, 0.0);
page->rebuildBspTree();
qDebug("layout: empty score");
_layoutAll = false;
return;
for (Element* e : m->el()) {
if (!tagIsValid(e->tag()) || (e->type() != Element::Type::LAYOUT_BREAK))
continue;
LayoutBreak* lb = static_cast<LayoutBreak*>(e);
switch (lb->layoutBreakType()) {
case LayoutBreak::Type::PAGE:
m->setPageBreak(true);
break;
case LayoutBreak::Type::LINE:
m->setLineBreak(true);
break;
case LayoutBreak::Type::SECTION:
m->setSectionBreak(lb);
break;
}
}
if (m->type() == Element::Type::MEASURE) {
Measure* measure = static_cast<Measure*>(m);
measureNo += measure->noOffset();
measure->setNo(measureNo);
if (measure->sectionBreak() && measure->sectionBreak()->startWithMeasureOne())
measureNo = 0;
else if (!measure->irregular()) // dont count measure
++measureNo;
measure->setBreakMMRest(false);
measure->layoutStage1();
for (int staffIdx = 0; staffIdx < nstaves; ++staffIdx)
measure->cmdUpdateNotes(staffIdx);
}
}

for (Measure* m = firstMeasure(); m; m = m->nextMeasure())
m->layoutStage1();
if (styleB(StyleIdx::createMultiMeasureRests))
createMMRests();

Expand Down Expand Up @@ -1786,7 +1800,7 @@ static bool breakMultiMeasureRest(Measure* m)
}

// break for marker in this measure
for (Element* e : *m->el()) {
for (Element* e : m->el()) {
if (e->type() == Element::Type::MARKER) {
Marker* mark = static_cast<Marker*>(e);
if (!(mark->textStyle().align() & AlignmentFlags::RIGHT))
Expand All @@ -1797,7 +1811,7 @@ static bool breakMultiMeasureRest(Measure* m)
// break for marker & jump in previous measure
Measure* pm = m->prevMeasure();
if (pm) {
for (Element* e : *pm->el()) {
for (Element* e : pm->el()) {
if (e->type() == Element::Type::JUMP) {
return true;
}
Expand Down Expand Up @@ -1902,15 +1916,15 @@ void Score::createMMRests()

mmr->setRepeatFlags(m->repeatFlags() | lm->repeatFlags());

qDeleteAll(*mmr->el());
mmr->el()->clear();
qDeleteAll(mmr->el());
mmr->el().clear();

for (Element* e : *m->el()) {
for (Element* e : m->el()) {
if (e->type() == Element::Type::MARKER)
mmr->add(e->clone());
}

for (Element* e : *lm->el())
for (Element* e : lm->el())
mmr->add(e->clone());

Segment* s = mmr->undoGetSegment(Segment::Type::ChordRest, m->tick());
Expand Down Expand Up @@ -2058,9 +2072,6 @@ void Score::createMMRests()
m->setMMRestCount(0);
}
}
/* Update Notes After creating mmRest Because on load, mmRest->next() was not set
on first pass in updateNotes() and break occur */
updateNotes();
}

//---------------------------------------------------------
Expand Down

0 comments on commit ec8913a

Please sign in to comment.