Skip to content

Commit 334fd34

Browse files
authored
Merge pull request #31790 from miiizen/31393-lyricLineInvalidRepeatSections
Allow normal lyric lines in invalid repeat sections
2 parents c44ab66 + 51af042 commit 334fd34

File tree

5 files changed

+25
-12
lines changed

5 files changed

+25
-12
lines changed

src/engraving/dom/navigate.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -196,7 +196,7 @@ ChordRest* nextChordRest(const ChordRest* cr, const ChordRestNavigateOptions& op
196196
SegmentType st = SegmentType::ChordRest;
197197
Segment* curSeg = cr->segment();
198198
for (Segment* seg = curSeg->next1MM(st); seg; seg = seg->next1MM(st)) {
199-
if (options.disableOverRepeats && !segmentsAreAdjacentInRepeatStructure(curSeg, seg)) {
199+
if (options.disableOverRepeats && !segmentsAreAdjacent(curSeg, seg)) {
200200
return nullptr;
201201
}
202202
ChordRest* e = toChordRest(seg->element(track));
@@ -277,7 +277,7 @@ ChordRest* prevChordRest(const ChordRest* cr, const ChordRestNavigateOptions& op
277277
SegmentType st = SegmentType::ChordRest;
278278
Segment* curSeg = cr->segment();
279279
for (Segment* seg = cr->segment()->prev1MM(st); seg; seg = seg->prev1MM(st)) {
280-
if (options.disableOverRepeats && !segmentsAreAdjacentInRepeatStructure(curSeg, seg)) {
280+
if (options.disableOverRepeats && !segmentsAreAdjacent(curSeg, seg)) {
281281
return nullptr;
282282
}
283283

src/engraving/dom/tie.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -266,7 +266,7 @@ void Tie::updatePossibleJumpPoints()
266266
const Segment* endNoteSegment = endChord ? endChord->segment() : nullptr;
267267
const ChordRest* finalCROfMeasure = measure->lastChordRest(track());
268268
const bool finalCRHasFollowingJump = finalCROfMeasure ? finalCROfMeasure->hasFollowingJumpItem() : false;
269-
const bool segsAreAdjacent = segmentsAreAdjacentInRepeatStructure(segment, endNoteSegment);
269+
const bool segsAreAdjacent = segmentsAreAdjacent(segment, endNoteSegment);
270270
const bool segsAreInDifferentRepeatSegments = segmentsAreInDifferentRepeatSegments(segment, endNoteSegment);
271271

272272
if (!(finalCRHasFollowingJump && segsAreAdjacent) || !segsAreInDifferentRepeatSegments) {

src/engraving/dom/utils.cpp

Lines changed: 17 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -594,7 +594,7 @@ Note* searchTieNote(const Note* note, const Segment* nextSegment, const bool dis
594594
return nullptr;
595595
}
596596

597-
if (disableOverRepeats && !segmentsAreAdjacentInRepeatStructure(seg, nextSegment)) {
597+
if (disableOverRepeats && !segmentsAreAdjacent(seg, nextSegment)) {
598598
return nullptr;
599599
}
600600

@@ -1596,7 +1596,7 @@ bool repeatHasPartialLyricLine(const Measure* endRepeatMeasure)
15961596
return false;
15971597
}
15981598

1599-
bool segmentsAreAdjacentInRepeatStructure(const Segment* firstSeg, const Segment* secondSeg)
1599+
bool segmentsAreAdjacent(const Segment* firstSeg, const Segment* secondSeg)
16001600
{
16011601
if (!firstSeg || !secondSeg) {
16021602
return false;
@@ -1619,12 +1619,20 @@ bool segmentsAreAdjacentInRepeatStructure(const Segment* firstSeg, const Segment
16191619

16201620
std::vector<const Measure*> measures;
16211621

1622+
bool firstMeasureSegmentFound = false;
1623+
bool secondMeasureSegmentFound = false;
1624+
16221625
for (auto it = repeatList.begin(); it != repeatList.end(); it++) {
16231626
const RepeatSegment* rs = *it;
16241627
const auto nextSegIt = std::next(it);
16251628

16261629
// Check if measures are in the same repeat segment
1627-
if (rs->containsMeasure(firstMasterMeasure) && rs->containsMeasure(secondMasterMeasure)) {
1630+
bool containsFirstMeasure = rs->containsMeasure(firstMasterMeasure);
1631+
bool containsSecondMeasure = rs->containsMeasure(secondMasterMeasure);
1632+
firstMeasureSegmentFound |= containsFirstMeasure;
1633+
secondMeasureSegmentFound |= containsSecondMeasure;
1634+
1635+
if (containsFirstMeasure && containsSecondMeasure) {
16281636
return true;
16291637
}
16301638

@@ -1650,6 +1658,11 @@ bool segmentsAreAdjacentInRepeatStructure(const Segment* firstSeg, const Segment
16501658
}
16511659
}
16521660

1661+
if (!firstMeasureSegmentFound && !secondMeasureSegmentFound) {
1662+
// The measures are outside of the (invalid) repeat structure
1663+
return firstMasterMeasure->nextMeasure() == secondMasterMeasure;
1664+
}
1665+
16531666
return false;
16541667
}
16551668

@@ -1881,7 +1894,7 @@ Lyrics* searchNextLyrics(Segment* s, staff_idx_t staffIdx, int verse, PlacementV
18811894
Lyrics* l = nullptr;
18821895
const Segment* originalSeg = s;
18831896
while ((s = s->next1(SegmentType::ChordRest))) {
1884-
if (!segmentsAreAdjacentInRepeatStructure(originalSeg, s)) {
1897+
if (!segmentsAreAdjacent(originalSeg, s)) {
18851898
return nullptr;
18861899
}
18871900

src/engraving/dom/utils.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -120,7 +120,7 @@ extern InstrumentTrackId makeInstrumentTrackId(const EngravingItem* item);
120120
extern std::vector<Measure*> findFollowingRepeatMeasures(const Measure* measure);
121121
extern std::vector<Measure*> findPreviousRepeatMeasures(const Measure* measure);
122122
extern bool repeatHasPartialLyricLine(const Measure* endRepeatMeasure);
123-
extern bool segmentsAreAdjacentInRepeatStructure(const Segment* firstSeg, const Segment* secondSeg);
123+
extern bool segmentsAreAdjacent(const Segment* firstSeg, const Segment* secondSeg);
124124
extern bool segmentsAreInDifferentRepeatSegments(const Segment* firstSeg, const Segment* secondSeg);
125125
extern bool isValidBarLineForRepeatSection(const Segment* firstSeg, const Segment* secondSeg);
126126

src/notation/internal/notationinteraction.cpp

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -6863,7 +6863,7 @@ void NotationInteraction::navigateToNextSyllable()
68636863
}
68646864
}
68656865

6866-
if (!segmentsAreAdjacentInRepeatStructure(segment, nextSegment)) {
6866+
if (!segmentsAreAdjacent(segment, nextSegment)) {
68676867
nextSegment = nullptr;
68686868
}
68696869

@@ -6877,7 +6877,7 @@ void NotationInteraction::navigateToNextSyllable()
68776877
// we are extending with several dashes
68786878
Lyrics* fromLyrics = nullptr;
68796879
Segment* curSeg = segment;
6880-
while (segment && segmentsAreAdjacentInRepeatStructure(segment, curSeg)) {
6880+
while (segment && segmentsAreAdjacent(segment, curSeg)) {
68816881
ChordRest* cr = toChordRest(segment->element(track));
68826882
if (!cr) {
68836883
segment = segment->prev1(SegmentType::ChordRest);
@@ -7721,7 +7721,7 @@ void NotationInteraction::addMelisma()
77217721
}
77227722
}
77237723

7724-
if (!segmentsAreAdjacentInRepeatStructure(segment, nextSegment)) {
7724+
if (!segmentsAreAdjacent(segment, nextSegment)) {
77257725
nextSegment = nullptr;
77267726
}
77277727

@@ -7730,7 +7730,7 @@ void NotationInteraction::addMelisma()
77307730
Segment* curSeg = segment;
77317731
Lyrics* fromLyrics = nullptr;
77327732
PartialLyricsLine* prevPartialLyricsLine = nullptr;
7733-
while (segment && segmentsAreAdjacentInRepeatStructure(segment, curSeg)) {
7733+
while (segment && segmentsAreAdjacent(segment, curSeg)) {
77347734
ChordRest* cr = toChordRest(segment->element(track));
77357735
if (cr) {
77367736
fromLyrics = cr->lyrics(verse, placement);

0 commit comments

Comments
 (0)