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+
264304void GradualTempoChange::added ()
265305{
266306 requestToRebuildTempo ();
0 commit comments