Skip to content

Commit 5765fdb

Browse files
committed
Correction to vertical placement and autoplace behavior
1 parent 358f157 commit 5765fdb

File tree

3 files changed

+43
-29
lines changed

3 files changed

+43
-29
lines changed

src/engraving/dom/lyrics.cpp

Lines changed: 10 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -489,6 +489,16 @@ void Lyrics::triggerLayout() const
489489
}
490490
}
491491

492+
double Lyrics::yRelativeToStaff() const
493+
{
494+
return pos().y() + chordRest()->pos().y();
495+
}
496+
497+
void Lyrics::setYRelativeToStaff(double y)
498+
{
499+
mutldata()->setPosY(y - chordRest()->pos().y());
500+
}
501+
492502
//---------------------------------------------------------
493503
// forAllLyrics
494504
//---------------------------------------------------------
@@ -525,21 +535,6 @@ void Lyrics::undoChangeProperty(Pid id, const PropertyValue& v, PropertyFlags ps
525535
}
526536
TextBase::undoChangeProperty(id, v, ps);
527537
return;
528-
} else if (id == Pid::AUTOPLACE && v.toBool() != autoplace()) {
529-
if (v.toBool()) {
530-
// setting autoplace
531-
// reset offset
532-
undoResetProperty(Pid::OFFSET);
533-
} else {
534-
// unsetting autoplace
535-
// rebase offset
536-
PointF off = offset();
537-
double y = pos().y() - propertyDefault(Pid::OFFSET).value<PointF>().y();
538-
off.ry() = placeAbove() ? y : y - staff()->staffHeight();
539-
undoChangeProperty(Pid::OFFSET, off, PropertyFlags::UNSTYLED);
540-
}
541-
TextBase::undoChangeProperty(id, v, ps);
542-
return;
543538
}
544539

545540
TextBase::undoChangeProperty(id, v, ps);

src/engraving/dom/lyrics.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -103,6 +103,9 @@ class Lyrics final : public TextBase
103103
PropertyValue propertyDefault(Pid id) const override;
104104
void triggerLayout() const override;
105105

106+
double yRelativeToStaff() const;
107+
void setYRelativeToStaff(double y);
108+
106109
protected:
107110
int m_no = 0; // row index
108111
bool m_even = false;

src/engraving/rendering/dev/lyricslayout.cpp

Lines changed: 30 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -195,6 +195,7 @@ void LyricsLayout::layout(Lyrics* item, LayoutContext& ctx)
195195
}
196196

197197
ldata->setPosX(x);
198+
item->setYRelativeToStaff(0.0);
198199

199200
if (item->ticks().isNotZero()) {
200201
// set melisma end
@@ -612,7 +613,7 @@ void LyricsLayout::setDefaultPositions(staff_idx_t staffIdx, LyricsVersesMap& ly
612613
LyricsVerse& lyricsVerse = pair.second;
613614
for (Lyrics* lyrics : lyricsVerse.lyrics()) {
614615
double y = -(totVersesAbove - verse) * lyrics->lineHeight() * lyricsLineHeightFactor;
615-
lyrics->mutldata()->setPosY(y);
616+
lyrics->setYRelativeToStaff(y);
616617
}
617618
for (LyricsLineSegment* lyricsLineSegment : lyricsVerse.lines()) {
618619
Lyrics* lyrics = lyricsLineSegment->lyricsLine()->lyrics();
@@ -626,7 +627,7 @@ void LyricsLayout::setDefaultPositions(staff_idx_t staffIdx, LyricsVersesMap& ly
626627
LyricsVerse& lyricsVerse = pair.second;
627628
for (Lyrics* lyrics : lyricsVerse.lyrics()) {
628629
double y = staffHeight + verse * lyrics->lineHeight() * lyricsLineHeightFactor;
629-
lyrics->mutldata()->setPosY(y);
630+
lyrics->setYRelativeToStaff(y);
630631
}
631632
for (LyricsLineSegment* lyricsLineSegment : lyricsVerse.lines()) {
632633
Lyrics* lyrics = lyricsLineSegment->lyricsLine()->lyrics();
@@ -678,11 +679,15 @@ SkylineLine LyricsLayout::createSkylineForVerse(int verse, bool north, LyricsVer
678679
if (lyricsVerses.count(verse) > 0) {
679680
LyricsVerse& lyricsVerse = lyricsVerses[verse];
680681
for (Lyrics* lyrics : lyricsVerse.lyrics()) {
681-
Shape lyricsShape = lyrics->highResShape().translated(PointF(lyrics->pageX() - systemX, lyrics->pos().y()));
682-
lyricsSkyline.add(lyricsShape);
682+
if (lyrics->addToSkyline()) {
683+
Shape lyricsShape = lyrics->highResShape().translated(PointF(lyrics->pageX() - systemX, lyrics->yRelativeToStaff()));
684+
lyricsSkyline.add(lyricsShape);
685+
}
683686
}
684687
for (LyricsLineSegment* lyricsLineSeg : lyricsVerse.lines()) {
685-
lyricsSkyline.add(lyricsLineSeg->shape().translate(lyricsLineSeg->pos()));
688+
if (lyricsLineSeg->lyricsLine()->lyrics()->addToSkyline()) {
689+
lyricsSkyline.add(lyricsLineSeg->shape().translate(lyricsLineSeg->pos()));
690+
}
686691
}
687692
}
688693

@@ -718,28 +723,39 @@ void LyricsLayout::addToSkyline(System* system, staff_idx_t staffIdx, LayoutCont
718723
LyricsVersesMap& lyricsVersesBelow)
719724
{
720725
double systemX = system->pageX();
721-
double lyricsVerticalPadding = ctx.conf().styleMM(Sid::lyricsMinBottomDistance);
726+
// HACK: subtract minVerticalDistance here because it's added later during staff distance calculations. Needs a better solution.
727+
double lyricsVerticalPadding = ctx.conf().styleMM(Sid::lyricsMinBottomDistance) - ctx.conf().styleMM(Sid::minVerticalDistance);
722728
Skyline& skyline = system->staff(staffIdx)->skyline();
723729
for (auto& pair : lyricsVersesAbove) {
724730
LyricsVerse& lyricsVerse = pair.second;
725731
for (Lyrics* lyrics : lyricsVerse.lyrics()) {
726-
Shape lyricsShape = lyrics->highResShape().translated(PointF(lyrics->pageX() - systemX, lyrics->pos().y()));
727-
skyline.north().add(lyricsShape.adjust(0.0, -lyricsVerticalPadding, 0.0, 0.0));
732+
if (lyrics->addToSkyline()) {
733+
Shape lyricsShape
734+
= lyrics->highResShape().translated(PointF(lyrics->pageX() - systemX, lyrics->yRelativeToStaff()));
735+
skyline.north().add(lyricsShape.adjust(0.0, -lyricsVerticalPadding, 0.0, 0.0));
736+
}
728737
}
729738
for (LyricsLineSegment* lyricsLineSeg : lyricsVerse.lines()) {
730-
Shape lineShape = lyricsLineSeg->shape().translate(lyricsLineSeg->pos());
731-
skyline.north().add(lineShape.adjust(0.0, -lyricsVerticalPadding, 0.0, 0.0));
739+
if (lyricsLineSeg->lyricsLine()->lyrics()->addToSkyline()) {
740+
Shape lineShape = lyricsLineSeg->shape().translate(lyricsLineSeg->pos());
741+
skyline.north().add(lineShape.adjust(0.0, -lyricsVerticalPadding, 0.0, 0.0));
742+
}
732743
}
733744
}
734745
for (auto& pair : lyricsVersesBelow) {
735746
LyricsVerse& lyricsVerse = pair.second;
736747
for (Lyrics* lyrics : lyricsVerse.lyrics()) {
737-
Shape lyricsShape = lyrics->highResShape().translated(PointF(lyrics->pageX() - systemX, lyrics->pos().y()));
738-
skyline.south().add(lyricsShape.adjust(0.0, 0.0, 0.0, lyricsVerticalPadding));
748+
if (lyrics->addToSkyline()) {
749+
Shape lyricsShape
750+
= lyrics->highResShape().translated(PointF(lyrics->pageX() - systemX, lyrics->yRelativeToStaff()));
751+
skyline.south().add(lyricsShape.adjust(0.0, 0.0, 0.0, lyricsVerticalPadding));
752+
}
739753
}
740754
for (LyricsLineSegment* lyricsLineSeg : lyricsVerse.lines()) {
741-
Shape lineShape = lyricsLineSeg->shape().translate(lyricsLineSeg->pos());
742-
skyline.south().add(lineShape.adjust(0.0, 0.0, 0.0, lyricsVerticalPadding));
755+
if (lyricsLineSeg->lyricsLine()->lyrics()->addToSkyline()) {
756+
Shape lineShape = lyricsLineSeg->shape().translate(lyricsLineSeg->pos());
757+
skyline.south().add(lineShape.adjust(0.0, 0.0, 0.0, lyricsVerticalPadding));
758+
}
743759
}
744760
}
745761
}

0 commit comments

Comments
 (0)