Skip to content

Commit

Permalink
Rehearsal mark vs tempo positioning
Browse files Browse the repository at this point in the history
Backport of musescore#26436
  • Loading branch information
mike-spa authored and Jojo-Schmitz committed Feb 11, 2025
1 parent f0be61c commit 304bc3f
Show file tree
Hide file tree
Showing 7 changed files with 336 additions and 20 deletions.
33 changes: 20 additions & 13 deletions libmscore/layout.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -41,6 +41,7 @@
#include "note.h"
#include "page.h"
#include "part.h"
#include "rehearsalmark.h"
#include "repeat.h"
#include "score.h"
#include "segment.h"
Expand Down Expand Up @@ -3868,7 +3869,7 @@ void alignHarmonies(const System* system, const std::vector<Segment*>& sl, bool
qreal shift = be->rypos();
be->rypos() = reference - be->ryoffset();
shift -= be->rypos();
for (Element* e : qAsConst(elements[s])) {
for (Element*& e : elements[s]) {
if ((above && e->placeBelow()) || (!above && e->placeAbove()))
continue;
modified.append(e);
Expand All @@ -3886,7 +3887,7 @@ void alignHarmonies(const System* system, const std::vector<Segment*>& sl, bool

void addToSkyline(const System* system)
{
for (Element* e : qAsConst(modified)) {
for (Element*& e : modified) {
const Segment* s = toSegment(e->parent());
const MeasureBase* m = toMeasureBase(s->parent());
system->staff(e->staffIdx())->skyline().add(e->shape().translated(e->pos() + s->pos() + m->pos()));
Expand Down Expand Up @@ -4854,6 +4855,20 @@ void Score::layoutSystemElements(System* system, LayoutContext& lc)
}
}

//-------------------------------------------------------------
// RehearsalMark
//-------------------------------------------------------------
// Layout before tempo text but autoplace after
std::vector<RehearsalMark*> rehearsMarks;
for (const Segment* s : sl) {
for (Element* e : s->annotations()) {
if (e->isRehearsalMark()) {
e->layout();
rehearsMarks.push_back(toRehearsalMark(e));
}
}
}

//-------------------------------------------------------------
// TempoText
//-------------------------------------------------------------
Expand All @@ -4865,6 +4880,9 @@ void Score::layoutSystemElements(System* system, LayoutContext& lc)
}
}

for (RehearsalMark* rehearsMark : rehearsMarks)
rehearsMark->autoplaceSegmentElement();

//-------------------------------------------------------------
// Jump, Marker
//-------------------------------------------------------------
Expand All @@ -4879,17 +4897,6 @@ void Score::layoutSystemElements(System* system, LayoutContext& lc)
}
}

//-------------------------------------------------------------
// RehearsalMark
//-------------------------------------------------------------

for (const Segment* s : sl) {
for (Element* e : s->annotations()) {
if (e->isRehearsalMark())
e->layout();
}
}

//-------------------------------------------------------------
// Image
//-------------------------------------------------------------
Expand Down
7 changes: 6 additions & 1 deletion libmscore/style.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1001,7 +1001,7 @@ static const StyleType styleTypes[] {
{ Sid::rehearsalMarkFrameFgColor, "rehearsalMarkFrameFgColor", QColor(0, 0, 0, 255) },
{ Sid::rehearsalMarkFrameBgColor, "rehearsalMarkFrameBgColor", QColor(255, 255, 255, 0) },
{ Sid::rehearsalMarkPlacement, "rehearsalMarkPlacement", int(Placement::ABOVE) },
{ Sid::rehearsalMarkPosAbove, "rehearsalMarkPosAbove", QPointF(.0, -3.0) },
{ Sid::rehearsalMarkPosAbove, "rehearsalMarkPosAbove", QPointF(.0, -2.0) },
{ Sid::rehearsalMarkPosBelow, "rehearsalMarkPosBelow", QPointF(.0, 4.0) },
{ Sid::rehearsalMarkMinDistance, "rehearsalMarkMinDistance", Spatium(0.5) },

Expand Down Expand Up @@ -3787,6 +3787,11 @@ bool MStyle::readProperties450(XmlReader& e, int mscVersion)
else if (tag == "minLaissezVibLength" // Mu4.5+ only, let's skip
|| tag =="laissezVibUseSmuflSym") // Mu4.5+ only, let's skip
e.skipCurrentElement();
else if (tag == "rehearsalMarkPosAbove") { // y: -3.0 -> -2.0
QPointF rehearsalMarkPosAbove = e.readPoint();
if (!qFuzzyCompare(rehearsalMarkPosAbove.y(), 2.0)) // Changed from 4.5+ default
set(Sid::rehearsalMarkPosAbove, rehearsalMarkPosAbove);
}
else if (tag.startsWith("noteLine")) // Mu4.5+ only, let's skip
e.skipCurrentElement();
else if (tag == "glissandoType" // Mu4.5+ only, let's skip
Expand Down
19 changes: 16 additions & 3 deletions libmscore/tempotext.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@

#include "measure.h"
#include "musescoreCore.h"
#include "rehearsalmark.h"
#include "score.h"
#include "staff.h"
#include "system.h"
Expand Down Expand Up @@ -435,13 +436,25 @@ void TempoText::layout()
{
TextBase::layout();

if (!autoplace())
return;

// tempo text on first chordrest of measure should align over time sig if present, unless time sig is above staff
Segment* s = segment();
if (!s) // for use in palette
return;

// tempo text on first chordrest of measure should align over time sig if present
//
if (autoplace() && s->rtick().isZero()) {
RehearsalMark* rehearsalMark = toRehearsalMark(s->findAnnotation(ElementType::REHEARSAL_MARK, track(), track()));
QRectF rehearsMarkBbox = rehearsalMark ? rehearsalMark->bbox().translated(rehearsalMark->pos()) : QRectF();
QRectF thisBbox = bbox().translated(pos());

if (rehearsalMark && rehearsMarkBbox.bottom() > thisBbox.top()) {
qreal rightEdge = rehearsMarkBbox.right();
const qreal padding = 0.5 * fontMetrics().xHeight();
qreal curX = pos().x();
rxpos() = std::max(curX, rightEdge + padding);
}
else if (s->rtick().isZero()) {
Segment* p = segment()->prev(SegmentType::TimeSig);
if (p) {
rxpos() -= s->x() - p->x();
Expand Down
3 changes: 2 additions & 1 deletion vtest/gen
Original file line number Diff line number Diff line change
Expand Up @@ -82,7 +82,8 @@ else
layout-sequence-9 layout-sequence-10 layout-sequence-11 layout-sequence-12\
layout-sequence-13 layout-sequence-14 layout-sequence-15 layout-sequence-16\
measure-number-1 measure-number-2 measure-number-3 measure-number-4 measure-number-5 measure-number-6\
custom-keysig-1 custom-keysig-2 custom-keysig-3 custom-keysig-4"
custom-keysig-1 custom-keysig-2 custom-keysig-3 custom-keysig-4\
tempoText-1"
fi

#####DEBUG: failed tests
Expand Down
5 changes: 3 additions & 2 deletions vtest/gen.bat
Original file line number Diff line number Diff line change
Expand Up @@ -57,8 +57,9 @@ set SRC=bravura-mmrest,gonville-mmrest, ^
layout-sequence-5,layout-sequence-6,layout-sequence-7,layout-sequence-8, ^
layout-sequence-9,layout-sequence-10,layout-sequence-11,layout-sequence-12, ^
layout-sequence-13, layout-sequence-14, layout-sequence-15,layout-sequence-16, ^
measure-number-1,measure-number-2,measure-number-3,measure-number-4,measure-number-5 measure-number-6 ^
custom-keysig-1,custom-keysig-2,custom-keysig-2,custom-keysig-3,custom-keysig-4
measure-number-1,measure-number-2,measure-number-3,measure-number-4,measure-number-5 measure-number-6, ^
custom-keysig-1,custom-keysig-2,custom-keysig-2,custom-keysig-3,custom-keysig-4, ^
tempoText-1

IF NOT "%1"=="" (
SET INSTALL_PATH=%1
Expand Down
Binary file added vtest/tempoText-1-ref.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading

0 comments on commit 304bc3f

Please sign in to comment.