New algorithm for sorting staves after parts are moved.

This algorithm is uses SortStaves() and takes care of the track mapping to excerpts.
This commit is contained in:
Niek van den Berg 2021-05-15 09:07:35 +02:00
parent 2bcd84dfbf
commit 78abc4ec52

View file

@ -1242,6 +1242,7 @@ void NotationParts::removeMissingParts(const PartInstrumentList& parts)
void NotationParts::appendNewParts(const PartInstrumentList& parts) void NotationParts::appendNewParts(const PartInstrumentList& parts)
{ {
int staffCount = 0;
for (const PartInstrument& pi: parts) { for (const PartInstrument& pi: parts) {
if (pi.isExistingPart) { if (pi.isExistingPart) {
continue; continue;
@ -1253,8 +1254,9 @@ void NotationParts::appendNewParts(const PartInstrumentList& parts)
part->setSoloist(pi.isSoloist); part->setSoloist(pi.isSoloist);
part->setInstrument(InstrumentsConverter::convertInstrument(pi.instrument)); part->setInstrument(InstrumentsConverter::convertInstrument(pi.instrument));
score()->undo(new Ms::InsertPart(part, lastStaffIndex())); score()->undo(new Ms::InsertPart(part, staffCount));
appendStaves(part, pi.instrument); appendStaves(part, pi.instrument);
staffCount += part->nstaves();
} }
} }
@ -1271,22 +1273,29 @@ void NotationParts::sortParts(const PartInstrumentList& parts)
{ {
Q_ASSERT(score()->parts().size() == static_cast<int>(parts.size())); Q_ASSERT(score()->parts().size() == static_cast<int>(parts.size()));
for (int i = 0; i < parts.size(); ++i) { QList<int> staffMapping;
const Part* currentPart = score()->parts().at(i); QList<int> trackMapping;
int runningStaffIndex = 0;
bool sortingNeeded = false;
if (currentPart->id() == parts.at(i).partId) { int partIndex = 0;
continue; for (const PartInstrument& pi: parts) {
} Ms::Part* currentPart = pi.isExistingPart ? part(pi.partId) : masterScore()->parts()[partIndex];
for (Ms::Staff* staff: *currentPart->staves()) {
for (int j = i; j < score()->parts().size(); ++j) { int actualStaffIndex = masterScore()->staves().indexOf(staff);
const Part* part = score()->parts().at(j);
trackMapping.append(pi.isExistingPart ? actualStaffIndex : runningStaffIndex);
if (part->id() == parts.at(i).partId) { staffMapping.append(actualStaffIndex);
doMovePart(part->id(), currentPart->id()); sortingNeeded |= actualStaffIndex == runningStaffIndex;
break; ++runningStaffIndex;
}
} }
++partIndex;
} }
if (sortingNeeded) {
masterScore()->undo(new Ms::SortStaves(masterScore(), staffMapping));
}
masterScore()->undo(new Ms::MapExcerptTracks(masterScore(), trackMapping));
} }
IDList NotationParts::allInstrumentsIds() const IDList NotationParts::allInstrumentsIds() const