Merge pull request #2607 from hpfmn/fix-111606

Fix #111606
This commit is contained in:
Nicolas Froment 2016-05-20 17:38:26 +02:00
commit 931ea7b92b
6 changed files with 87 additions and 59 deletions

View file

@ -1217,7 +1217,9 @@ void Score::addElement(Element* element)
case Element::Type::TEMPO_TEXT:
{
TempoText* tt = static_cast<TempoText*>(element);
TempoText* tt = toTempoText(element);
if (tt->isRelative())
tt->updateRelative();
setTempo(tt->segment(), tt->tempo());
}
break;

View file

@ -97,31 +97,25 @@ struct TempoPattern {
// note: findTempoDuration requires the longer patterns to be before the shorter patterns in tp
static const TempoPattern tp[] = {
TempoPattern("<sym>metNoteWhole</sym><sym>space</sym><sym>metAugmentationDot</sym>", 1.5/15.0, TDuration::DurationType::V_WHOLE, 1), // dotted whole
TempoPattern("<sym>metNoteWhole</sym>\\s*<sym>metAugmentationDot</sym>", 1.5/15.0, TDuration::DurationType::V_WHOLE, 1), // dotted whole
TempoPattern("<sym>metNoteHalfUp</sym><sym>space</sym><sym>metAugmentationDot</sym><sym>space</sym><sym>metAugmentationDot</sym>", 1.75/30.0, TDuration::DurationType::V_HALF, 2), // double dotted 1/2
TempoPattern("<sym>metNoteHalfUp</sym>\\s*<sym>metAugmentationDot</sym>\\s*<sym>metAugmentationDot</sym>", 1.75/30.0, TDuration::DurationType::V_HALF, 2), // double dotted 1/2
TempoPattern("<sym>metNoteHalfUp</sym><sym>space</sym><sym>metAugmentationDot</sym>", 1.5/30.0, TDuration::DurationType::V_HALF, 1), // dotted 1/2
TempoPattern("<sym>metNoteHalfUp</sym>\\s*<sym>metAugmentationDot</sym>", 1.5/30.0, TDuration::DurationType::V_HALF, 1), // dotted 1/2
TempoPattern("<sym>metNoteQuarterUp</sym><sym>space</sym><sym>metAugmentationDot</sym><sym>space</sym><sym>metAugmentationDot</sym>", 1.75/60.0, TDuration::DurationType::V_QUARTER, 2), // double dotted 1/4
TempoPattern("<sym>metNoteQuarterUp</sym>\\s*<sym>metAugmentationDot</sym>\\s*<sym>metAugmentationDot</sym>", 1.75/60.0, TDuration::DurationType::V_QUARTER, 2), // double dotted 1/4
TempoPattern("<sym>metNoteQuarterUp</sym><sym>space</sym><sym>metAugmentationDot</sym>", 1.5/60.0, TDuration::DurationType::V_QUARTER, 1), // dotted 1/4
TempoPattern("<sym>metNoteQuarterUp</sym>\\s*<sym>metAugmentationDot</sym>", 1.5/60.0, TDuration::DurationType::V_QUARTER, 1), // dotted 1/4
TempoPattern("<sym>metNote8thUp</sym><sym>metAugmentationDot</sym><sym>space</sym><sym>metAugmentationDot</sym>", 1.75/120.0, TDuration::DurationType::V_EIGHTH, 2), // double dotted 1/8
TempoPattern("<sym>metNote8thUp</sym>\\s*<sym>metAugmentationDot</sym>\\s*<sym>metAugmentationDot</sym>", 1.75/120.0, TDuration::DurationType::V_EIGHTH, 2), // double dotted 1/8
TempoPattern("<sym>metNote8thUp</sym><sym>space</sym><sym>metAugmentationDot</sym>", 1.5/120.0, TDuration::DurationType::V_EIGHTH, 1), // dotted 1/8
TempoPattern("<sym>metNote8thUp</sym>\\s*<sym>metAugmentationDot</sym>", 1.5/120.0, TDuration::DurationType::V_EIGHTH, 1), // dotted 1/8
TempoPattern("<sym>metNote16thUp</sym><sym>space</sym><sym>metAugmentationDot</sym>", 1.5/240.0, TDuration::DurationType::V_16TH, 1), // dotted 1/16
TempoPattern("<sym>metNote16thUp</sym>\\s*<sym>metAugmentationDot</sym>", 1.5/240.0, TDuration::DurationType::V_16TH, 1), // dotted 1/16
TempoPattern("<sym>metNote32ndUp</sym><sym>space</sym><sym>metAugmentationDot</sym>", 1.5/480.0, TDuration::DurationType::V_32ND, 1), // dotted 1/32
TempoPattern("<sym>metNote32ndUp</sym>\\s*<sym>metAugmentationDot</sym>", 1.5/480.0, TDuration::DurationType::V_32ND, 1), // dotted 1/32
TempoPattern("<sym>metNoteWhole</sym>", 1.0/15.0, TDuration::DurationType::V_WHOLE), // whole
TempoPattern("<sym>metNoteHalfUp</sym>", 1.0/30.0, TDuration::DurationType::V_HALF), // 1/2
TempoPattern("<sym>metNoteQuarterUp</sym>", 1.0/60.0, TDuration::DurationType::V_QUARTER), // 1/4
TempoPattern("<sym>metNoteHalfUp</sym>\\s*<sym>metAugmentationDot</sym>\\s*<sym>metAugmentationDot</sym>", 1.75/30.0, TDuration::DurationType::V_HALF, 2), // double dotted 1/2
TempoPattern("<sym>metNoteHalfUp</sym>\\s*<sym>metAugmentationDot</sym>", 1.5/30.0, TDuration::DurationType::V_HALF, 1), // dotted 1/2
TempoPattern("<sym>metNoteHalfUp</sym>", 1.0/30.0, TDuration::DurationType::V_HALF), // 1/2
TempoPattern("<sym>metNote8thUp</sym>\\s*<sym>metAugmentationDot</sym>\\s*<sym>metAugmentationDot</sym>", 1.75/120.0, TDuration::DurationType::V_EIGHTH, 2), // double dotted 1/8
TempoPattern("<sym>metNote8thUp</sym>\\s*<sym>metAugmentationDot</sym>", 1.5/120.0, TDuration::DurationType::V_EIGHTH, 1), // dotted 1/8
TempoPattern("<sym>metNote8thUp</sym>", 1.0/120.0, TDuration::DurationType::V_EIGHTH), // 1/8
TempoPattern("<sym>metNoteWhole</sym>\\s*<sym>metAugmentationDot</sym>", 1.5/15.0, TDuration::DurationType::V_WHOLE, 1), // dotted whole
TempoPattern("<sym>metNoteWhole</sym>", 1.0/15.0, TDuration::DurationType::V_WHOLE), // whole
TempoPattern("<sym>metNote16thUp</sym>\\s*<sym>metAugmentationDot</sym>", 1.5/240.0, TDuration::DurationType::V_16TH, 1), // dotted 1/16
TempoPattern("<sym>metNote16thUp</sym>", 1.0/240.0, TDuration::DurationType::V_16TH), // 1/16
TempoPattern("<sym>metNote32ndUp</sym>\\s*<sym>metAugmentationDot</sym>", 1.5/480.0, TDuration::DurationType::V_32ND, 1), // dotted 1/32
TempoPattern("<sym>metNote32ndUp</sym>", 1.0/480.0, TDuration::DurationType::V_32ND), // 1/32
TempoPattern("<sym>metNoteDoubleWholeSquare</sym>", 1.0/7.5, TDuration::DurationType::V_BREVE), // longa
TempoPattern("<sym>metNoteDoubleWhole</sym>", 1.0/7.5, TDuration::DurationType::V_BREVE), // double whole
TempoPattern("<sym>metNote64thUp</sym>", 1.0/960.0, TDuration::DurationType::V_64TH), // 1/64
TempoPattern("<sym>metNote128thUp</sym>", 1.0/1920.0,TDuration::DurationType::V_128TH), // 1/128
};
//---------------------------------------------------------
@ -196,6 +190,7 @@ void TempoText::textChanged()
return;
QString s = plainText();
s.replace(",", ".");
s.replace("<sym>space</sym>"," ");
for (const TempoPattern& pa : tp) {
QRegExp re(QString(pa.pattern)+"\\s*=\\s*(\\d+[.]{0,1}\\d*)\\s*");
if (re.indexIn(s) != -1) {
@ -338,33 +333,51 @@ void TempoText::layout()
adjustReadPos();
}
QString TempoText::duration2userName(const TDuration t)
{
QString dots;
switch (t.dots()) {
case 1: dots = tr("Dotted %1").arg(t.durationTypeUserName());
break;
case 2: dots = tr("Double dotted %1").arg(t.durationTypeUserName());
break;
case 3: dots = tr("Triple dotted %1").arg(t.durationTypeUserName());
break;
default:
dots = t.durationTypeUserName();
break;
}
return dots;
}
//---------------------------------------------------------
// accessibleInfo
//---------------------------------------------------------
QString TempoText::accessibleInfo() const
{
TDuration t;
int len;
int x = findTempoDuration(plainText(), len, t);
if (x != -1) {
QString dots;
TDuration t1;
TDuration t2;
int len1;
int len2;
QString text = plainText();
QString firstPart = text.split(" = ").first();
QString secondPart = text.split(" = ").back();
int x1 = findTempoDuration(firstPart, len1, t1);
int x2 = -1;
if (_relative)
x2 = findTempoDuration(secondPart, len2, t2);
switch (t.dots()) {
case 1: dots = tr("Dotted %1").arg(t.durationTypeUserName());
break;
case 2: dots = tr("Double dotted %1").arg(t.durationTypeUserName());
break;
case 3: dots = tr("Triple dotted %1").arg(t.durationTypeUserName());
break;
default:
dots = t.durationTypeUserName();
break;
if (x1 != -1) {
QString dots1;
QString dots2;
dots1 = duration2userName(t1);
if (x2 != -1) {
dots2 = duration2userName(t2);
return QString("%1: %2 %3 = %4 %5").arg(Element::accessibleInfo()).arg(dots1).arg(tr("note")).arg(dots2).arg(tr("note"));
}
QString bpm = plainText().split(" = ").back();
return QString("%1: %2 %3").arg(Element::accessibleInfo()).arg(dots).arg(tr("note = %1").arg(bpm));
else
return QString("%1: %2 %3 = %4").arg(Element::accessibleInfo()).arg(dots1).arg(tr("note")).arg(secondPart);
}
else
return Text::accessibleInfo();

View file

@ -50,6 +50,7 @@ class TempoText : public Text {
void setTempo(qreal v);
void undoSetTempo(qreal v);
bool isRelative() { return _isRelative; }
void setRelative(qreal v) { _isRelative = true; _relative = v; }
bool followText() const { return _followText; }
void setFollowText(bool v) { _followText = v; }
@ -61,6 +62,7 @@ class TempoText : public Text {
static int findTempoDuration(const QString& s, int& len, TDuration& dur);
static QString duration2tempoTextString(const TDuration dur);
static QString duration2userName(const TDuration t);
QVariant getProperty(P_ID propertyId) const override;
bool setProperty(P_ID propertyId, const QVariant&) override;

View file

@ -174,7 +174,7 @@ MasterPalette::MasterPalette(QWidget* parent)
addPalette(MuseScore::newNoteHeadsPalette());
addPalette(MuseScore::newTremoloPalette());
addPalette(MuseScore::newRepeatsPalette());
addPalette(MuseScore::newTempoPalette());
addPalette(MuseScore::newTempoPalette(false));
addPalette(MuseScore::newTextPalette());
addPalette(MuseScore::newBreaksPalette());
addPalette(MuseScore::newBagpipeEmbellishmentPalette());

View file

@ -992,15 +992,16 @@ void MuseScore::showPalette(bool visible)
struct TempoPattern {
QString pattern;
double f;
bool relative;
TempoPattern(const QString& s, double v) : pattern(s), f(v) {}
TempoPattern(const QString& s, double v, bool relative) : pattern(s), f(v), relative(relative) {}
};
//---------------------------------------------------------
// newTempoPalette
//---------------------------------------------------------
Palette* MuseScore::newTempoPalette()
Palette* MuseScore::newTempoPalette(bool basic)
{
Palette* sp = new Palette;
sp->setName(QT_TRANSLATE_NOOP("Palette", "Tempo"));
@ -1008,24 +1009,34 @@ Palette* MuseScore::newTempoPalette()
sp->setGrid(60, 30);
sp->setDrawGrid(true);
static const TempoPattern tp[] = {
TempoPattern("<sym>metNoteHalfUp</sym> = 80", 80.0/30.0), // 1/2
TempoPattern("<sym>metNoteQuarterUp</sym> = 80", 80.0/60.0), // 1/4
TempoPattern("<sym>metNote8thUp</sym> = 80", 80.0/120.0), // 1/8
TempoPattern("<sym>metNoteHalfUp</sym><sym>space</sym><sym>metAugmentationDot</sym> = 80", 120/30.0), // dotted 1/2
TempoPattern("<sym>metNoteQuarterUp</sym><sym>space</sym><sym>metAugmentationDot</sym> = 80", 120/60.0), // dotted 1/4
TempoPattern("<sym>metNote8thUp</sym><sym>space</sym><sym>metAugmentationDot</sym> = 80", 120/120.0), // dotted 1/8
static const TempoPattern tps[] = {
TempoPattern("<sym>metNoteHalfUp</sym> = 80", 80.0/30.0, false), // 1/2
TempoPattern("<sym>metNoteQuarterUp</sym> = 80", 80.0/60.0, false), // 1/4
TempoPattern("<sym>metNote8thUp</sym> = 80", 80.0/120.0, false), // 1/8
TempoPattern("<sym>metNoteHalfUp</sym><sym>space</sym><sym>metAugmentationDot</sym> = 80", 120/30.0, false), // dotted 1/2
TempoPattern("<sym>metNoteQuarterUp</sym><sym>space</sym><sym>metAugmentationDot</sym> = 80", 120/60.0, false), // dotted 1/4
TempoPattern("<sym>metNote8thUp</sym><sym>space</sym><sym>metAugmentationDot</sym> = 80", 120/120.0, false), // dotted 1/8
TempoPattern("<sym>metNoteQuarterUp</sym> = <sym>metNoteQuarterUp</sym><sym>space</sym><sym>metAugmentationDot</sym>", 3.0/2.0, true),
TempoPattern("<sym>metNoteQuarterUp</sym><sym>space</sym><sym>metAugmentationDot</sym> = <sym>metNoteQuarterUp</sym>", 2.0/3.0, true),
TempoPattern("<sym>metNoteHalfUp</sym> = <sym>metNoteQuarterUp</sym>", 1.0/2.0, true),
TempoPattern("<sym>metNoteQuarterUp</sym> = <sym>metNoteHalfUp</sym>", 2.0/1.0, true),
TempoPattern("<sym>metNote8thUp</sym> = <sym>metNote8thUp</sym>", 1.0/1.0, true),
TempoPattern("<sym>metNoteQuarterUp</sym> = <sym>metNoteQuarterUp</sym>", 1.0/1.0, true),
};
for (unsigned i = 0; i < sizeof(tp)/sizeof(*tp); ++i) {
for (TempoPattern tp : tps) {
if (tp.relative && basic)
continue;
TempoText* tt = new TempoText(gscore);
tt->setFollowText(true);
// leave track at default (-1) to make it possible
// for drop() to tell that this came from palette
// (it will then be set to 0 there)
//tt->setTrack(0);
tt->setTempo(tp[i].f);
tt->setXmlText(tp[i].pattern);
sp->append(tt, tr("Tempo text"), QString(), 1.5);
tt->setXmlText(tp.pattern);
if (tp.relative) {
tt->setRelative(tp.f);
sp->append(tt, tr("Metric modulation"), QString(), 1.5);
}
else {
tt->setTempo(tp.f);
sp->append(tt, tr("Tempo text"), QString(), 1.5);
}
}
return sp;
}
@ -1135,7 +1146,7 @@ void MuseScore::setAdvancedPalette()
paletteBox->addPalette(newNoteHeadsPalette());
paletteBox->addPalette(newTremoloPalette());
paletteBox->addPalette(newRepeatsPalette());
paletteBox->addPalette(newTempoPalette());
paletteBox->addPalette(newTempoPalette(false));
paletteBox->addPalette(newTextPalette());
paletteBox->addPalette(newBreaksPalette());
paletteBox->addPalette(newBagpipeEmbellishmentPalette());
@ -1258,7 +1269,7 @@ void MuseScore::setBasicPalette()
// paletteBox->addPalette(newNoteHeadsPalette());
// paletteBox->addPalette(newTremoloPalette());
paletteBox->addPalette(newRepeatsPalette());
paletteBox->addPalette(newTempoPalette());
paletteBox->addPalette(newTempoPalette(true));
paletteBox->addPalette(newTextPalette());
paletteBox->addPalette(newBreaksPalette());
paletteBox->addPalette(newBeamPalette(true));

View file

@ -648,7 +648,7 @@ class MuseScore : public QMainWindow, public MuseScoreCore {
void allowShowMidiPanel(const QString &file);
void setMidiReopenInProgress(const QString &file);
static Palette* newTempoPalette();
static Palette* newTempoPalette(bool basic);
static Palette* newTextPalette();
static Palette* newTimePalette();
static Palette* newRepeatsPalette();