Skip to content

Commit

Permalink
Merge pull request #5327 from MarcSabatella/294126-navigate-measure-e…
Browse files Browse the repository at this point in the history
…lements

fix #294126: cannot navigate to measure elements
  • Loading branch information
anatoly-os committed Oct 2, 2019
1 parent b3574ad commit c559c11
Show file tree
Hide file tree
Showing 4 changed files with 53 additions and 8 deletions.
29 changes: 29 additions & 0 deletions libmscore/measure.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -3193,6 +3193,19 @@ Element* Measure::nextElementStaff(int staff)
Element* e = score()->selection().element();
if (!e && !score()->selection().elements().isEmpty())
e = score()->selection().elements().first();

// handle measure elements
if (e->parent() == this) {
auto i = std::find(el().begin(), el().end(), e);
if (i != el().end()) {
if (++i != el().end()) {
Element* e = *i;
if (e)
return e;
}
}
}

for (; e && e->type() != ElementType::SEGMENT; e = e->parent()) {
;
}
Expand All @@ -3211,6 +3224,22 @@ Element* Measure::nextElementStaff(int staff)

Element* Measure::prevElementStaff(int staff)
{
Element* e = score()->selection().element();
if (!e && !score()->selection().elements().isEmpty())
e = score()->selection().elements().first();

// handle measure elements
if (e->parent() == this) {
auto i = std::find(el().rbegin(), el().rend(), e);
if (i != el().rend()) {
if (++i != el().rend()) {
Element* e = *i;
if (e)
return e;
}
}
}

Measure* prevM = prevMeasureMM();
if (prevM) {
Segment* seg = prevM->last();
Expand Down
26 changes: 18 additions & 8 deletions libmscore/segment.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1588,11 +1588,16 @@ Element* Segment::nextElement(int activeStaff)
return mb && mb->isBox() ? mb : score()->lastElement();
}

// check for frame
MeasureBase* nmb = measure()->next();
Measure* nsm = nextSegment->measure();
if (nsm != measure() && nsm != nmb)
return nmb;
if (nsm != measure()) {
// check for frame, measure elements
MeasureBase* nmb = measure()->next();
Element* nme = nsm->el().empty() ? nullptr : nsm->el().front();
if (nsm != nmb)
return nmb;
else if (nme && nme->isTextBase() && nme->staffIdx() == e->staffIdx())
return nme;
}

while (nextSegment) {
nextEl = nextSegment->firstElementOfSegment(nextSegment, activeStaff);
Expand Down Expand Up @@ -1728,11 +1733,16 @@ Element* Segment::prevElement(int activeStaff)
return mb && mb->isBox() ? mb : score()->firstElement();
}

// check for frame
MeasureBase* pmb = measure()->prev();
Measure* psm = prevSeg->measure();
if (psm != measure() && psm != pmb)
return pmb;
if (psm != measure()) {
// check for frame, measure elements
MeasureBase* pmb = measure()->prev();
Element* me = measure()->el().empty() ? nullptr : measure()->el().back();
if (me && me->isTextBase() && me->staffIdx() == e->staffIdx())
return me;
else if (psm != pmb)
return pmb;
}

prev = lastElementOfSegment(prevSeg, activeStaff);
while (!prev && prevSeg) {
Expand Down
1 change: 1 addition & 0 deletions mtest/testscript/scripts/accessible1.script
Original file line number Diff line number Diff line change
Expand Up @@ -37,6 +37,7 @@ cmd next-element
cmd toggle-visible
cmd next-element
cmd next-element
cmd delete
cmd next-element
cmd next-element
cmd next-element
Expand Down
5 changes: 5 additions & 0 deletions mtest/testscript/scripts/init/twoStavesWithNotesAndMore.mscx
Original file line number Diff line number Diff line change
Expand Up @@ -230,6 +230,11 @@
</voice>
</Measure>
<Measure>
<Marker>
<style>Repeat Text Right</style>
<text>Fine</text>
<label>fine</label>
</Marker>
<voice>
<Chord>
<durationType>half</durationType>
Expand Down

0 comments on commit c559c11

Please sign in to comment.