Skip to content

Commit

Permalink
Merge pull request #265 from softins/chord-navigation
Browse files Browse the repository at this point in the history
Restore 1.3 behaviour of Space for harmony
  • Loading branch information
lasconic committed Mar 16, 2013
2 parents 82bd308 + 2b5bf2b commit a60cbb9
Show file tree
Hide file tree
Showing 3 changed files with 53 additions and 85 deletions.
10 changes: 5 additions & 5 deletions mscore/keyb.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -157,18 +157,18 @@ void ScoreView::editKey(QKeyEvent* ev)
}
}
else if (editObject->type() == Element::HARMONY) {
if (key == Qt::Key_Space && !(modifiers & CONTROL_MODIFIER)) {
harmonyTab(false, modifiers & Qt::ShiftModifier);
if (key == Qt::Key_Tab || key == Qt::Key_Backtab) {
harmonyTab(key == Qt::Key_Backtab ? true : (modifiers & Qt::ShiftModifier));
ev->accept();
return;
}
if (key == Qt::Key_Tab || key == Qt::Key_Backtab) {
harmonyTab(true, key == Qt::Key_Backtab ? true : (modifiers & Qt::ShiftModifier));
if (key == Qt::Key_Space && !(modifiers & CONTROL_MODIFIER)) {
harmonyBeatsTab(true, modifiers & Qt::ShiftModifier);
ev->accept();
return;
}
if (key == Qt::Key_Semicolon || key == Qt::Key_Colon) {
harmonyBeatsTab(key == Qt::Key_Colon);
harmonyBeatsTab(false, key == Qt::Key_Colon);
ev->accept();
return;
}
Expand Down
124 changes: 46 additions & 78 deletions mscore/scoreview.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -4222,7 +4222,7 @@ void ScoreView::modifyElement(Element* el)
// harmonyTab
//---------------------------------------------------------

void ScoreView::harmonyTab(bool meas, bool back)
void ScoreView::harmonyTab(bool back)
{
Harmony* harmony = static_cast<Harmony*>(editObject);
if (!harmony->parent() || harmony->parent()->type() != Element::SEGMENT){
Expand All @@ -4236,59 +4236,24 @@ void ScoreView::harmonyTab(bool meas, bool back)
return;
}

// moving to next/prev measure

// if moving to next/prev measure

if (meas) {
Measure* measure = segment->measure();
if (measure) {
if (back)
measure = measure->prevMeasure();
else
measure = measure->nextMeasure();
}
if (!measure) {
qDebug("harmonyTab: no prev/next measure");
return;
}

segment = measure->findSegment(Segment::SegChordRest, measure->tick());
if (!segment) {
qDebug("harmonyTab: no ChordRest segment as measure");
return;
}
}

// if moving to next/prev chord segment

else {
// search next chord segment in same staff
Measure* measure = segment->measure();
if (measure) {
if (back)
segment = segment->prev1(Segment::SegChordRest);
measure = measure->prevMeasure();
else
segment = segment->next1(Segment::SegChordRest);

int minTrack = (track / VOICES ) * VOICES;
int maxTrack = minTrack + (VOICES-1);
int curTrack;
measure = measure->nextMeasure();
}
if (!measure) {
qDebug("harmonyTab: no prev/next measure");
return;
}

while (segment) { // look for a ChordRest in the compatible track range
foreach (const Element* e, segment->annotations())
if (e->type() == Element::HARMONY && e->track() >= minTrack && e->track() <= maxTrack)
goto Found;
for (curTrack = minTrack; curTrack <= maxTrack; curTrack++)
if (segment->element(curTrack))
goto Found;
if (back)
segment = segment->prev1(Segment::SegChordRest);
else
segment = segment->next1(Segment::SegChordRest);
}
Found:
if (!segment) {
qDebug("harmonyTab: no prev/next segment");
return;
}
segment = measure->findSegment(Segment::SegChordRest, measure->tick());
if (!segment) {
qDebug("harmonyTab: no ChordRest segment as measure");
return;
}

endEdit();
Expand Down Expand Up @@ -4327,9 +4292,10 @@ void ScoreView::harmonyTab(bool meas, bool back)
//---------------------------------------------------------
// harmonyBeatsTab
// manages [;:], moving forward or back to the next beat
// and Space/Shift-Space, to stop at next note, rest, harmony or beat.
//---------------------------------------------------------

void ScoreView::harmonyBeatsTab(bool back)
void ScoreView::harmonyBeatsTab(bool noterest, bool back)
{
Harmony* harmony = static_cast<Harmony*>(editObject);
int track = harmony->track();
Expand All @@ -4353,46 +4319,48 @@ void ScoreView::harmonyBeatsTab(bool back)
Fraction f = measure->len();
int ticksPerBeat = f.ticks() / ((f.numerator()>3 && (f.numerator()%3)==0 && f.denominator()>4) ? f.numerator()/3 : f.numerator());
int tickInBar = tick - measure->tick();
int newTick = measure->tick() + ((tickInBar+(back?-1:ticksPerBeat))/ticksPerBeat)*ticksPerBeat;

// move to the previous or next beat boundary
if (back) {
int newTick = measure->tick() + ((tickInBar-1)/ticksPerBeat)*ticksPerBeat;
// look for next/prev beat, note, rest or chord
for (;;) {
segment = back ? segment->prev1(Segment::SegChordRest) : segment->next1(Segment::SegChordRest);

while (segment && segment->tick() > newTick)
segment = segment->prev1(Segment::SegChordRest);
if (!segment || segment->tick() < newTick) {
if (!segment || (back ? (segment->tick() < newTick) : (segment->tick() > newTick))) {
// no segment or moved past the beat - create new segment
if (!back && newTick >= measure->tick() + f.ticks()) {
// next bar, if any
measure = measure->nextMeasure();
if (!measure) {
qDebug("harmonyBeatsTab: no next measure");
return;
}
}
segment = new Segment(measure, Segment::SegChordRest, newTick);
if (!segment) {
qDebug("harmonyBeatsTab: no prev segment");
return;
}
_score->undoAddElement(segment);
break;
}
}
else {
int newTick = measure->tick() + ((tickInBar+ticksPerBeat)/ticksPerBeat)*ticksPerBeat;

if (newTick >= measure->tick() + f.ticks()) {
// next bar, if any
measure = measure->nextMeasure();
if (!measure) {
qDebug("harmonyBeatsTab: no next measure");
return;
}
}
if (segment->tick() == newTick)
break;

while (segment && segment->tick() < newTick)
segment = segment->next1(Segment::SegChordRest);
if (!segment || segment->tick() > newTick) {
segment = new Segment(measure, Segment::SegChordRest, newTick);
if (!segment) {
qDebug("harmonyBeatsTab: no next segment");
return;
}
_score->undoAddElement(segment);
if (noterest) {
int minTrack = (track / VOICES ) * VOICES;
int maxTrack = minTrack + (VOICES-1);
int curTrack;

foreach (const Element* e, segment->annotations())
if (e->type() == Element::HARMONY && e->track() >= minTrack && e->track() <= maxTrack)
goto Found;
for (curTrack = minTrack; curTrack <= maxTrack; curTrack++)
if (segment->element(curTrack))
goto Found;
}
}

Found:
endEdit();

_score->startCmd();
Expand Down
4 changes: 2 additions & 2 deletions mscore/scoreview.h
Original file line number Diff line number Diff line change
Expand Up @@ -231,8 +231,8 @@ class ScoreView : public QWidget, public MuseScoreView {
void lyricsMinus();
void lyricsUnderscore();
void harmonyEndEdit();
void harmonyTab(bool meas, bool back);
void harmonyBeatsTab(bool back);
void harmonyTab(bool back);
void harmonyBeatsTab(bool noterest, bool back);
void harmonyTicksTab(int ticks);
void figuredBassTab(bool meas, bool back);
void figuredBassTicksTab(int ticks);
Expand Down

0 comments on commit a60cbb9

Please sign in to comment.