Skip to content

Commit d9de077

Browse files
committed
Move tempo changes if rehearsal mark on the same segment
1 parent 9ceddf8 commit d9de077

File tree

4 files changed

+44
-0
lines changed

4 files changed

+44
-0
lines changed

src/engraving/dom/gradualtempochange.cpp

Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,8 @@
2222

2323
#include "gradualtempochange.h"
2424

25+
#include "dom/rehearsalmark.h"
26+
#include "dom/text.h"
2527
#include "measure.h"
2628
#include "score.h"
2729
#include "segment.h"
@@ -147,6 +149,8 @@ PropertyValue GradualTempoChange::getProperty(Pid id) const
147149
return tempoChangeFactor();
148150
case Pid::SNAP_AFTER:
149151
return snapToItemAfter();
152+
case Pid::TEMPO_ALIGN_RIGHT_OF_REHEARSAL_MARK:
153+
return m_alignRightOfRehearsalMark;
150154
default:
151155
return TextLineBase::getProperty(id);
152156
}
@@ -167,6 +171,9 @@ bool GradualTempoChange::setProperty(Pid id, const PropertyValue& val)
167171
case Pid::SNAP_AFTER:
168172
setSnapToItemAfter(val.toBool());
169173
break;
174+
case Pid::TEMPO_ALIGN_RIGHT_OF_REHEARSAL_MARK:
175+
m_alignRightOfRehearsalMark = val.toBool();
176+
break;
170177
default:
171178
if (!TextLineBase::setProperty(id, val)) {
172179
return false;
@@ -221,6 +228,9 @@ PropertyValue GradualTempoChange::propertyDefault(Pid propertyId) const
221228
case Pid::SNAP_AFTER:
222229
return true;
223230

231+
case Pid::TEMPO_ALIGN_RIGHT_OF_REHEARSAL_MARK:
232+
return true;
233+
224234
default:
225235
return TextLineBase::propertyDefault(propertyId);
226236
}
@@ -261,6 +271,36 @@ Sid GradualTempoChange::getPropertyStyle(Pid id) const
261271
return TextLineBase::getPropertyStyle(id);
262272
}
263273

274+
PointF GradualTempoChange::linePos(Grip grip, System** system) const
275+
{
276+
bool start = grip == Grip::START;
277+
Segment* segment = start ? startSegment() : endSegment();
278+
if (!m_alignRightOfRehearsalMark || !segment) {
279+
return TextLineBase::linePos(grip, system);
280+
}
281+
282+
RehearsalMark* rehearsalMark = toRehearsalMark(segment->findAnnotation(ElementType::REHEARSAL_MARK, track(), track()));
283+
284+
RectF thisBbox = ldata()->bbox().translated(pos());
285+
RectF rehearsalMarkBbox = rehearsalMark ? rehearsalMark->ldata()->bbox().translated(rehearsalMark->pos()) : RectF();
286+
287+
if (muse::RealIsEqualOrLess(rehearsalMarkBbox.bottom(), thisBbox.top())) {
288+
return TextLineBase::linePos(grip, system);
289+
}
290+
291+
PointF rehearsalMarkPos = segment->pos() + segment->measure()->pos();
292+
rehearsalMarkBbox.translate(rehearsalMarkPos);
293+
294+
Text* text = start ? toGradualTempoChangeSegment(frontSegment())->text() : toGradualTempoChangeSegment(backSegment())->endText();
295+
296+
double padding = text ? 0.5 * text->fontMetrics().xHeight() : spatium();
297+
padding *= start ? 1.0 : -1.0;
298+
double x = (start ? rehearsalMarkBbox.right() : rehearsalMarkBbox.left()) + padding;
299+
300+
*system = segment->measure()->system();
301+
return PointF(x, 0.0);
302+
}
303+
264304
void GradualTempoChange::added()
265305
{
266306
requestToRebuildTempo();

src/engraving/dom/gradualtempochange.h

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -56,6 +56,8 @@ class GradualTempoChange : public TextLineBase
5656
bool snapToItemAfter() const { return m_snapToItemAfter; }
5757
void setSnapToItemAfter(bool v) { m_snapToItemAfter = v; }
5858

59+
PointF linePos(Grip grip, System** system) const override;
60+
5961
protected:
6062
void added() override;
6163
void removed() override;
@@ -69,6 +71,8 @@ class GradualTempoChange : public TextLineBase
6971

7072
bool m_snapToItemAfter = true;
7173

74+
bool m_alignRightOfRehearsalMark = true;
75+
7276
friend class GradualTempoChangeSegment;
7377
};
7478

20.5 KB
Binary file not shown.

vtest/scores/tie-26.mscz

26.4 KB
Binary file not shown.

0 commit comments

Comments
 (0)