Skip to content

Commit

Permalink
Fix GH#17600: Select tuplet when calling next-element prev-element ac…
Browse files Browse the repository at this point in the history
…tions

Backport of musescore#23082
  • Loading branch information
efu98 authored and Jojo-Schmitz committed Aug 29, 2024
1 parent 0e43867 commit 7cd91bd
Show file tree
Hide file tree
Showing 7 changed files with 58 additions and 5 deletions.
14 changes: 14 additions & 0 deletions libmscore/chord.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -3793,4 +3793,18 @@ void Chord::setNoteEventLists(QList<NoteEventList>& ell)

}

//---------------------------------
// firstGraceOrNote
//---------------------------------
Note* Chord::firstGraceOrNote()
{
QVector<Chord*> graceNotesBefore = this->graceNotesBefore();
if (!graceNotesBefore.empty()) {
if (Chord* graceNotesBeforeFirstChord = graceNotesBefore.front())
return graceNotesBeforeFirstChord->notes().front();
}

return this->notes().back();
}

}
2 changes: 2 additions & 0 deletions libmscore/chord.h
Original file line number Diff line number Diff line change
Expand Up @@ -229,6 +229,8 @@ class Chord final : public ChordRest {
Element* prevSegmentElement() override;
QString accessibleExtraInfo() const override;

Note* firstGraceOrNote();

Shape shape() const override;
};

Expand Down
5 changes: 5 additions & 0 deletions libmscore/chordrest.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1141,6 +1141,11 @@ Element* ChordRest::prevElement()
break;
}
}

Tuplet* tuplet = this->tuplet();
if (tuplet && this == tuplet->elements().front())
return tuplet;

int staffId = e->staffIdx();
return segment()->prevElement(staffId);
}
Expand Down
6 changes: 4 additions & 2 deletions libmscore/navigate.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -536,7 +536,8 @@ Element* Score::nextElement()
switch (e->type()) {
case ElementType::NOTE:
case ElementType::REST:
case ElementType::CHORD: {
case ElementType::CHORD:
case ElementType::TUPLET: {
Element* next = e->nextElement();
if (next)
return next;
Expand Down Expand Up @@ -664,7 +665,8 @@ Element* Score::prevElement()
switch (e->type()) {
case ElementType::NOTE:
case ElementType::REST:
case ElementType::CHORD: {
case ElementType::CHORD:
case ElementType::TUPLET: {
Element* prev = e->prevElement();
if (prev)
return prev;
Expand Down
15 changes: 12 additions & 3 deletions libmscore/segment.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1395,8 +1395,16 @@ Element* Segment::firstElementOfSegment(Segment* s, int activeStaff)
{
for (auto i: s->elist()) {
if (i && i->staffIdx() == activeStaff) {
if (i->type() == ElementType::CHORD)
return toChord(i)->notes().back();
if (i->isDurationElement()) {
DurationElement* de = toDurationElement(i);
Tuplet* tuplet = de->tuplet();
if (tuplet && de == tuplet->elements().front())
return tuplet;
}
if (i->type() == ElementType::CHORD) {
Chord* chord = toChord(i);
return chord->firstGraceOrNote();
}
else
return i;
}
Expand Down Expand Up @@ -1659,7 +1667,8 @@ Element* Segment::nextElement(int activeStaff)
case ElementType::FIGURED_BASS:
case ElementType::STAFF_STATE:
case ElementType::INSTRUMENT_CHANGE:
case ElementType::STICKING: {
case ElementType::STICKING:
case ElementType::TUPLET:{
Element* next = nullptr;
if (e->parent() == this)
next = nextAnnotation(e);
Expand Down
18 changes: 18 additions & 0 deletions libmscore/tuplet.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1381,5 +1381,23 @@ void Tuplet::addMissingElements()
if (!missingElementsDuration.isZero())
qDebug("Tuplet::addMissingElements(): still missing duration of %d/%d", missingElementsDuration.numerator(), missingElementsDuration.denominator());
}

Element* Tuplet::nextElement()
{
ChordRest* firstElement = toChordRest(elements().front());
if (firstElement->type() == ElementType::CHORD) {
Chord* chord = toChord(firstElement);
return chord->firstGraceOrNote();
}
return firstElement;
}

Element* Tuplet::prevElement()
{
ChordRest* firstElement = toChordRest(elements().front());
int staffId = firstElement->staffIdx();
Element* prevItem = firstElement->segment()->prevElement(staffId);
return prevItem;
}
} // namespace Ms

3 changes: 3 additions & 0 deletions libmscore/tuplet.h
Original file line number Diff line number Diff line change
Expand Up @@ -145,6 +145,9 @@ class Tuplet final : public DurationElement {

void sanitizeTuplet();
void addMissingElements();

Element* nextElement() override;
Element* prevElement() override;
};


Expand Down

0 comments on commit 7cd91bd

Please sign in to comment.