From 8422a7d4106d7eede4923c1ff8293204d490ddd7 Mon Sep 17 00:00:00 2001 From: alexandr Date: Wed, 5 Sep 2018 15:17:49 +0200 Subject: [PATCH] fix #271616: Fermata tempo is not applied when importing 2.X->3.0 score --- libmscore/layout.cpp | 4 ++++ libmscore/measure.cpp | 54 +++++++++++++++++++++++++------------------ libmscore/measure.h | 1 + libmscore/read206.cpp | 3 +++ 4 files changed, 39 insertions(+), 23 deletions(-) diff --git a/libmscore/layout.cpp b/libmscore/layout.cpp index dd0192f19e..81e90b490d 100644 --- a/libmscore/layout.cpp +++ b/libmscore/layout.cpp @@ -2454,6 +2454,7 @@ void Score::getNextMeasure(LayoutContext& lc) } } + measure->computeTicks(); for (Segment& segment : measure->segments()) { if (segment.isBreathType()) { qreal length = 0.0; @@ -3857,6 +3858,9 @@ void Score::doLayoutRange(int stick, int etick) lc.prevMeasure = 0; + // we need to reset tempo because fermata is setted + //inside getNextMeasure and it lead to twice timeStretch + fixTicks(); getNextMeasure(lc); lc.curSystem = collectSystem(lc); diff --git a/libmscore/measure.cpp b/libmscore/measure.cpp index 877cbf66e9..e62ffc02d9 100644 --- a/libmscore/measure.cpp +++ b/libmscore/measure.cpp @@ -3518,29 +3518,7 @@ void Measure::stretchMeasure(qreal targetWidth) { bbox().setWidth(targetWidth); - //--------------------------------------------------- - // compute minTick and set ticks for all segments - //--------------------------------------------------- - - int minTick = ticks(); - if (minTick <= 0) { - qDebug("=====minTick %d measure %p", minTick, this); - } - Q_ASSERT(minTick > 0); - - Segment* ns = first(); - while (ns && !ns->enabled()) - ns = ns->next(); - while (ns) { - Segment* s = ns; - ns = s->nextEnabled(); - int nticks = (ns ? ns->rtick() : ticks()) - s->rtick(); - if (nticks) { - if (nticks < minTick) - minTick = nticks; - } - s->setTicks(nticks); - } + int minTick = computeTicks(); //--------------------------------------------------- // compute stretch @@ -3674,6 +3652,36 @@ void Measure::stretchMeasure(qreal targetWidth) } } +//--------------------------------------------------- +// computeTicks +// set ticks for all segments +// return minTick +//--------------------------------------------------- + +int Measure::computeTicks() { + int minTick = ticks(); + if (minTick <= 0) { + qDebug("=====minTick %d measure %p", minTick, this); + } + Q_ASSERT(minTick > 0); + + Segment* ns = first(); + while (ns && !ns->enabled()) + ns = ns->next(); + while (ns) { + Segment* s = ns; + ns = s->nextEnabled(); + int nticks = (ns ? ns->rtick() : ticks()) - s->rtick(); + if (nticks) { + if (nticks < minTick) + minTick = nticks; + } + s->setTicks(nticks); + } + + return minTick; +} + //--------------------------------------------------------- // endBarLine // return the first one diff --git a/libmscore/measure.h b/libmscore/measure.h index b196895211..57f0a5bf2a 100644 --- a/libmscore/measure.h +++ b/libmscore/measure.h @@ -159,6 +159,7 @@ class Measure final : public MeasureBase { void setUserStretch(qreal v) { _userStretch = v; } void stretchMeasure(qreal stretch); + int computeTicks(); void layout2(); Chord* findChord(int tick, int track); diff --git a/libmscore/read206.cpp b/libmscore/read206.cpp index c8f92446a5..cfacd839d4 100644 --- a/libmscore/read206.cpp +++ b/libmscore/read206.cpp @@ -1665,6 +1665,9 @@ Element* readArticulation(ChordRest* cr, XmlReader& e) el->readProperties300(e); } } + else if (tag == "timeStretch") + if (el && el->isFermata()) + el->setProperty(Pid::TIME_STRETCH ,e.readDouble()); else { if (!el) { qDebug("not handled <%s>", qPrintable(tag.toString()));