void ScoreView::lyricsEndEdit() { Lyrics* lyrics = toLyrics(editObject); // if no text, just remove this lyrics if (lyrics->empty()) lyrics->parent()->remove(lyrics); // if not empty, make sure this new lyrics does not fall in the middle // of an existing melisma from a previous lyrics; in case, shorten it else { int verse = lyrics->no(); Element::Placement placement = lyrics->placement(); int track = lyrics->track(); // search previous lyric Lyrics* prevLyrics = 0; Segment* prevSegment = lyrics->segment()->prev1(Segment::Type::ChordRest); Segment* segment = prevSegment; while (segment) { ChordRest* cr = toChordRest(segment->element(track)); if (cr) { prevLyrics = cr->lyrics(verse, placement); if (prevLyrics) break; } segment = segment->prev1(Segment::Type::ChordRest); } if (prevLyrics && prevLyrics->syllabic() == Lyrics::Syllabic::END) { int endTick = prevSegment->tick(); // a prev. melisma should not go beyond this segment if (prevLyrics->endTick() >= endTick) prevLyrics->undoChangeProperty(P_ID::LYRIC_TICKS, endTick - prevLyrics->segment()->tick()); } } }
void ScoreView::lyricsEndEdit() { Lyrics* lyrics = static_cast<Lyrics*>(editObject); int endTick = lyrics->segment()->tick(); // search previous lyric: int verse = lyrics->no(); int track = lyrics->track(); // search previous lyric Lyrics* oldLyrics = 0; Segment* segment = lyrics->segment(); while (segment) { const QList<Lyrics*>* nll = segment->lyricsList(track); if (nll) { oldLyrics = nll->value(verse); if (oldLyrics) break; } segment = segment->prev1(Segment::Type::ChordRest); } if (lyrics->isEmpty()) lyrics->parent()->remove(lyrics); else { if (oldLyrics && oldLyrics->syllabic() == Lyrics::Syllabic::END) { if (oldLyrics->endTick() >= endTick) oldLyrics->undoChangeProperty(P_ID::LYRIC_TICKS, 0); } } }
void ScoreView::lyricsEndEdit() { Lyrics* lyrics = (Lyrics*)editObject; int endTick = lyrics->segment()->tick(); // search previous lyric: int verse = lyrics->no(); int staffIdx = lyrics->staffIdx(); // search previous lyric Lyrics* oldLyrics = 0; Segment* segment = lyrics->segment(); while (segment) { const QList<Lyrics*>* nll = segment->lyricsList(staffIdx); if (nll) { oldLyrics = nll->value(verse); if (oldLyrics) break; } segment = segment->prev1(Segment::SegChordRest | Segment::SegGrace); } // if (lyrics->isEmpty() && origL->isEmpty()) if (lyrics->isEmpty()) lyrics->parent()->remove(lyrics); else { if (oldLyrics && oldLyrics->syllabic() == Lyrics::END) { if (oldLyrics->endTick() >= endTick) oldLyrics->setTicks(0); } } }