Skip to content

Commit

Permalink
New instrument numbering, renumbers instruments and soloists independ…
Browse files Browse the repository at this point in the history
…ently.
  • Loading branch information
njvdberg committed Dec 9, 2020
1 parent a9b2c44 commit a5778bd
Showing 1 changed file with 37 additions and 25 deletions.
62 changes: 37 additions & 25 deletions mscore/instrwidget.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1299,36 +1299,48 @@ void InstrumentsWidget::createInstruments(Score* cs)

void InstrumentsWidget::numberInstrumentNames(Score* cs)
{
std::vector<QString> names;
std::vector<QString> firsts;

for (auto i = cs->parts().begin(); i != cs->parts().end(); ++i) {
auto p = *i;

QString name = p->partName();

names.push_back(name);
int n = 1;

for (auto j = i + 1; j != cs->parts().end(); ++j) {
auto part = *j;
// number 2nd and subsequent instances of instrument
if (std::find(names.begin(), names.end(), part->partName()) != names.end()) {
firsts.push_back(name);
n++;
part->setPartName((part->partName() + QStringLiteral(" %1").arg(n)));
part->setLongName((part->longName() + QStringLiteral(" %1").arg(n)));
part->setShortName((part->shortName() + QStringLiteral(" %1").arg(n)));
class PartNamer {
Part* part;
bool soloist;
int number;

void setNamesN(Part *p) {
++number;
QString tmpl = soloist ? QString(qApp->translate("InstrumentsDialog", "%1 solo %2")) : QString("%1 %2");
p->setLongName(tmpl.arg(p->longName()).arg(number));
p->setPartName(tmpl.arg(p->partName()).arg(number));
p->setShortName(tmpl.arg(p->shortName()).arg(number));
}
public:
PartNamer(Part* p=nullptr) : part(p), soloist(p && p->soloist()), number(0) {}
~PartNamer() {
if (part && !number) {
QString tmpl = soloist ? QString(qApp->translate("InstrumentsDialog", "%1 solo")) : QString("%1");
part->setLongName(tmpl.arg(part->longName()));
part->setPartName(tmpl.arg(part->partName()));
part->setShortName(tmpl.arg(part->shortName()));
}
}

// now finish by adding first instances
if (std::find(firsts.begin(), firsts.end(), p->partName()) != firsts.end()) {
p->setPartName(p->partName() + " 1");
p->setLongName(p->longName() + " 1");
p->setShortName(p->shortName() + " 1");
void update(Part* p) {
if (!number)
setNamesN(part);
setNamesN(p);
}

};

QMap<QString, PartNamer*> namers;
for (Part* p : cs->parts()) {
const QString key = QString("%1/%2").arg(p->partName()).arg(p->soloist());
if (namers.contains(key))
namers[key]->update(p);
else
namers.insert(key, new PartNamer(p));
}

for (auto namer : namers.values())
delete namer;
}

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

0 comments on commit a5778bd

Please sign in to comment.