@@ -3012,25 +3012,63 @@ void TLayout::layoutGraceNotesGroup2(const GraceNotesGroup* item, GraceNotesGrou
3012
3012
ldata->setShape (shape);
3013
3013
}
3014
3014
3015
- void TLayout::layoutGradualTempoChangeSegment (GradualTempoChangeSegment* item, LayoutContext& ctx)
3015
+ void TLayout::manageTempoChangeSnapping (GradualTempoChangeSegment* item, LayoutContext& ctx)
3016
3016
{
3017
- LAYOUT_CALL_ITEM (item);
3018
-
3019
3017
GradualTempoChangeSegment::LayoutData* ldata = item->mutldata ();
3020
3018
3021
3019
ldata->disconnectSnappedItems ();
3022
-
3023
- layoutTextLineBaseSegment (item, ctx);
3024
-
3025
3020
GradualTempoChangeSegment* tempoChangeSegmentSnappedBefore = item->findElementToSnapBefore ();
3026
3021
if (tempoChangeSegmentSnappedBefore) {
3027
3022
ldata->connectItemSnappedBefore (tempoChangeSegmentSnappedBefore);
3023
+ doLayoutGradualTempoChangeSegment (tempoChangeSegmentSnappedBefore, ctx);
3028
3024
}
3029
3025
3030
3026
TempoText* tempoTextSnappedAfter = item->findElementToSnapAfter ();
3031
3027
if (tempoTextSnappedAfter) {
3032
3028
ldata->connectItemSnappedAfter (tempoTextSnappedAfter);
3033
3029
}
3030
+ }
3031
+
3032
+ void TLayout::doLayoutGradualTempoChangeSegment (GradualTempoChangeSegment* item, LayoutContext& ctx)
3033
+ {
3034
+ GradualTempoChangeSegment::LayoutData* ldata = item->mutldata ();
3035
+
3036
+ auto extendLineToSnappedItemAfter = [item](EngravingItem* itemAfter) {
3037
+ assert (itemAfter->isGradualTempoChangeSegment () || itemAfter->isTempoText ());
3038
+ if (item->tempoChange ()->adjustForRehearsalMark (false )
3039
+ || itemAfter->findAncestor (ElementType::SYSTEM) != item->system ()) {
3040
+ return ;
3041
+ }
3042
+
3043
+ double xItemPos = itemAfter->pageX () - item->system ()->pageX ();
3044
+ double itemLeftEdge = xItemPos + itemAfter->ldata ()->bbox ().left ();
3045
+
3046
+ double padding = item->spatium ();
3047
+ if (itemAfter->isTempoText ()) {
3048
+ const double fontSizeScaleFactor = toTempoText (itemAfter)->size () / 10.0 ;
3049
+ padding = 0.5 * item->spatium () * fontSizeScaleFactor;
3050
+ } else if (itemAfter->isGradualTempoChangeSegment ()) {
3051
+ Text* startText = toGradualTempoChangeSegment (itemAfter)->text ();
3052
+ if (startText) {
3053
+ const double fontSizeScaleFactor = startText->size () / 10.0 ;
3054
+ padding = 0.5 * item->spatium () * fontSizeScaleFactor;
3055
+ }
3056
+ }
3057
+
3058
+ double maxTempoLineEnd = itemLeftEdge - padding;
3059
+ double xEndDiff = maxTempoLineEnd - (item->pos ().x () + item->pos2 ().x ());
3060
+ item->rxpos2 () += xEndDiff;
3061
+ };
3062
+
3063
+ if (ldata->itemSnappedAfter () && ldata->itemSnappedAfter ()->isTempoText ()) {
3064
+ TempoText* tempoTextSnappedAfter = toTempoText (ldata->itemSnappedAfter ());
3065
+ extendLineToSnappedItemAfter (tempoTextSnappedAfter);
3066
+ } else if (ldata->itemSnappedAfter () && ldata->itemSnappedAfter ()->isGradualTempoChangeSegment ()) {
3067
+ GradualTempoChangeSegment* tempoChangeSegmentSnappedAfter = toGradualTempoChangeSegment (ldata->itemSnappedAfter ());
3068
+ extendLineToSnappedItemAfter (tempoChangeSegmentSnappedAfter);
3069
+ }
3070
+
3071
+ mu::engraving::rendering::score::TLayout::layoutTextLineBaseSegment (item, ctx);
3034
3072
3035
3073
if (item->isStyled (Pid::OFFSET)) {
3036
3074
item->roffset () = item->tempoChange ()->propertyDefault (Pid::OFFSET).value <PointF>();
@@ -3042,6 +3080,15 @@ void TLayout::layoutGradualTempoChangeSegment(GradualTempoChangeSegment* item, L
3042
3080
Autoplace::autoplaceSpannerSegment (item, ldata, ctx.conf ().spatium ());
3043
3081
}
3044
3082
3083
+ void TLayout::layoutGradualTempoChangeSegment (GradualTempoChangeSegment* item, LayoutContext& ctx)
3084
+ {
3085
+ LAYOUT_CALL_ITEM (item);
3086
+
3087
+ manageTempoChangeSnapping (item, ctx);
3088
+
3089
+ doLayoutGradualTempoChangeSegment (item, ctx);
3090
+ }
3091
+
3045
3092
void TLayout::layoutGradualTempoChange (GradualTempoChange* item, LayoutContext& ctx)
3046
3093
{
3047
3094
LAYOUT_CALL_ITEM (item);
@@ -5876,16 +5923,10 @@ void TLayout::layoutTempoText(const TempoText* item, TempoText::LayoutData* ldat
5876
5923
Segment* s = item->segment ();
5877
5924
5878
5925
RehearsalMark* rehearsalMark = toRehearsalMark (s->findAnnotation (ElementType::REHEARSAL_MARK, item->track (), item->track ()));
5879
- RectF rehearsMarkBbox = rehearsalMark ? rehearsalMark->ldata ()->bbox ().translated (rehearsalMark->pos ()) : RectF ();
5926
+ RectF rehearsalMarkBbox = rehearsalMark ? rehearsalMark->ldata ()->bbox ().translated (rehearsalMark->pos ()) : RectF ();
5880
5927
RectF thisBbox = ldata->bbox ().translated (item->pos ());
5881
5928
5882
- if (rehearsalMark && rehearsMarkBbox.bottom () > thisBbox.top ()
5883
- && item->getProperty (Pid::TEMPO_ALIGN_RIGHT_OF_REHEARSAL_MARK).toBool ()) {
5884
- double rightEdge = rehearsMarkBbox.right ();
5885
- const double padding = 0.5 * item->fontMetrics ().xHeight ();
5886
- double curX = ldata->pos ().x ();
5887
- ldata->setPosX (std::max (curX, rightEdge + padding));
5888
- } else if (s->rtick ().isZero ()) {
5929
+ if (s->rtick ().isZero ()) {
5889
5930
Segment* p = item->segment ()->prev (SegmentType::TimeSig);
5890
5931
if (p && !p->allElementsInvisible ()) {
5891
5932
ldata->moveX (-(s->x () - p->x ()));
@@ -5895,6 +5936,21 @@ void TLayout::layoutTempoText(const TempoText* item, TempoText::LayoutData* ldat
5895
5936
}
5896
5937
}
5897
5938
}
5939
+
5940
+ if (rehearsalMark) {
5941
+ const bool sameSide = item->placeAbove () == rehearsalMark->placeAbove ();
5942
+ const bool collision
5943
+ = item->placeAbove () ? muse::RealIsEqualOrMore (rehearsalMarkBbox.bottom (), thisBbox.top ()) : muse::RealIsEqualOrLess (
5944
+ rehearsalMarkBbox.top (), thisBbox.bottom ());
5945
+
5946
+ if (sameSide && collision && item->getProperty (Pid::TEMPO_ALIGN_RIGHT_OF_REHEARSAL_MARK).toBool ()) {
5947
+ double rightEdge = rehearsalMarkBbox.right ();
5948
+ const double fontSizeScaleFactor = item->size () / 10.0 ;
5949
+ const double padding = 0.5 * item->spatium () * fontSizeScaleFactor;
5950
+ double curX = ldata->pos ().x ();
5951
+ ldata->setPosX (std::max (curX, rightEdge + padding));
5952
+ }
5953
+ }
5898
5954
Autoplace::autoplaceSegmentElement (item, ldata);
5899
5955
}
5900
5956
0 commit comments