コード例 #1
0
ファイル: editlyrics.cpp プロジェクト: trig-ger/MuseScore
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());
                  }
            }
      }
コード例 #2
0
ファイル: editlyrics.cpp プロジェクト: barichd/MuseScore
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);
                  }
            }
      }
コード例 #3
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);
                  }
            }
      }