Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Rehearsal mark vs tempo positioning #798

Draft
wants to merge 1 commit into
base: 3.x
Choose a base branch
from
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
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