diff --git a/libmscore/element.cpp b/libmscore/element.cpp index d42d445e9c618..5230a5c999be8 100644 --- a/libmscore/element.cpp +++ b/libmscore/element.cpp @@ -2595,4 +2595,53 @@ void Element::autoplaceMeasureElement(bool above, bool add) setOffsetChanged(false); } +//--------------------------------------------------------- +// barbeat +//--------------------------------------------------------- + +std::pair Element::barbeat() const + { + int bar = 0; + int beat = 0; + int ticks = 0; + TimeSigMap* tsm = this->score()->sigmap(); + const Element* p = this; + int ticksB = ticks_beat(tsm->timesig(0).timesig().denominator()); + while(p && p->type() != ElementType::SEGMENT && p->type() != ElementType::MEASURE) + p = p->parent(); + + if (!p) { + return std::pair(0, 0.0F); + } + else if (p->type() == ElementType::SEGMENT) { + const Segment* seg = static_cast(p); + tsm->tickValues(seg->tick().ticks(), &bar, &beat, &ticks); + ticksB = ticks_beat(tsm->timesig(seg->tick().ticks()).timesig().denominator()); + } + else if (p->type() == ElementType::MEASURE) { + const Measure* m = static_cast(p); + bar = m->no(); + beat = -1; + ticks = 0; + } + return std::pair(bar + 1, beat + 1 + ticks / static_cast(ticksB)); + } + +//--------------------------------------------------------- +// accessibleBarbeat +//--------------------------------------------------------- + +QString Element::accessibleBarbeat() const + { + QString barsAndBeats = ""; + std::pairbar_beat = barbeat(); + if (bar_beat.first) { + barsAndBeats += "; " + QObject::tr("Measure: %1").arg(QString::number(bar_beat.first)); + if (bar_beat.second) + barsAndBeats += "; " + QObject::tr("Beat: %1").arg(QString::number(bar_beat.second)); + } + if (staffIdx() + 1) + barsAndBeats += "; " + QObject::tr("Staff: %1").arg(QString::number(staffIdx() + 1)); + return barsAndBeats; + } } diff --git a/libmscore/element.h b/libmscore/element.h index eb0edfa54741d..0da91a92a12f9 100644 --- a/libmscore/element.h +++ b/libmscore/element.h @@ -210,6 +210,8 @@ class Element : public ScoreElement { virtual bool isElement() const override { return true; } qreal spatium() const; + std::pairbarbeat() const; + QString accessibleBarbeat() const; inline void setFlag(ElementFlag f, bool v) { if (v) _flags |= f; else _flags &= ~ElementFlags(f); } inline void setFlag(ElementFlag f, bool v) const { if (v) _flags |= f; else _flags &= ~ElementFlags(f); } diff --git a/mscore/scoreaccessibility.cpp b/mscore/scoreaccessibility.cpp index 09aa1b77b6a13..3ddfc73186285 100644 --- a/mscore/scoreaccessibility.cpp +++ b/mscore/scoreaccessibility.cpp @@ -244,8 +244,8 @@ void ScoreAccessibility::currentInfoChanged() QString optimizedBarsAndBeats = ""; if (el->isSpanner()) { Spanner* s = static_cast(el); - std::pair bar_beat = barbeat(s->startSegment()); - barsAndBeats += tr("Start Measure: %1; Start Beat: %2").arg(QString::number(bar_beat.first)).arg(QString::number(bar_beat.second)); + std::pair bar_beat = s->startSegment()->barbeat(); + barsAndBeats += " " + tr("Start Measure: %1; Start Beat: %2").arg(QString::number(bar_beat.first)).arg(QString::number(bar_beat.second)); Segment* seg = s->endSegment(); if(!seg) seg = score->lastSegment()->prev1MM(SegmentType::ChordRest); @@ -255,12 +255,12 @@ void ScoreAccessibility::currentInfoChanged() s->type() != ElementType::TIE ) seg = seg->prev1MM(SegmentType::ChordRest); - bar_beat = barbeat(seg); + bar_beat = seg->barbeat(); barsAndBeats += "; " + tr("End Measure: %1; End Beat: %2").arg(QString::number(bar_beat.first)).arg(QString::number(bar_beat.second)); optimizedBarsAndBeats = barsAndBeats; } else { - std::pairbar_beat = barbeat(el); + std::pairbar_beat = el->barbeat(); if (bar_beat.first) { _oldBar = bar_beat.first; barsAndBeats += " " + tr("Measure: %1").arg(QString::number(bar_beat.first)); @@ -331,7 +331,7 @@ void ScoreAccessibility::currentInfoChanged() QString barsAndBeats = ""; std::pair bar_beat; - bar_beat = barbeat(score->selection().startSegment()); + bar_beat = score->selection().startSegment()->barbeat(); barsAndBeats += " " + tr("Start Measure: %1; Start Beat: %2").arg(QString::number(bar_beat.first)).arg(QString::number(bar_beat.second)); Segment* endSegment = score->selection().endSegment(); @@ -340,7 +340,7 @@ void ScoreAccessibility::currentInfoChanged() else endSegment = endSegment->prev1MM(); - bar_beat = barbeat(endSegment); + bar_beat = endSegment->barbeat(); barsAndBeats += " " + tr("End Measure: %1; End Beat: %2").arg(QString::number(bar_beat.first)).arg(QString::number(bar_beat.second)); statusBarLabel->setText(tr("Range Selection") + barsAndBeats); score->setAccessibleInfo(tr("Range Selection") + barsAndBeats); @@ -419,38 +419,6 @@ void ScoreAccessibility::updateAccessibility() //QAccessible::updateAccessibility(&ev2); } -std::pair ScoreAccessibility::barbeat(Element *e) - { - if (!e) { - return std::pair(0, 0.0F); - } - - int bar = 0; - int beat = 0; - int ticks = 0; - TimeSigMap* tsm = e->score()->sigmap(); - Element* p = e; - int ticksB = ticks_beat(tsm->timesig(0).timesig().denominator()); - while(p && p->type() != ElementType::SEGMENT && p->type() != ElementType::MEASURE) - p = p->parent(); - - if (!p) { - return std::pair(0, 0.0F); - } - else if (p->type() == ElementType::SEGMENT) { - Segment* seg = static_cast(p); - tsm->tickValues(seg->tick().ticks(), &bar, &beat, &ticks); - ticksB = ticks_beat(tsm->timesig(seg->tick().ticks()).timesig().denominator()); - } - else if (p->type() == ElementType::MEASURE) { - Measure* m = static_cast(p); - bar = m->no(); - beat = -1; - ticks = 0; - } - return std::pair(bar + 1, beat + 1 + ticks / static_cast(ticksB)); - } - void ScoreAccessibility::makeReadable(QString& s) { static std::vector> unicodeReplacements { diff --git a/mscore/scoreaccessibility.h b/mscore/scoreaccessibility.h index 9d113ff90f359..8765f4d0125b6 100644 --- a/mscore/scoreaccessibility.h +++ b/mscore/scoreaccessibility.h @@ -75,7 +75,6 @@ class ScoreAccessibility : public QObject { QMainWindow* mainWindow; QLabel* statusBarLabel; ScoreAccessibility(QMainWindow* statusBar); - std::pairbarbeat(Element* e); int _oldStaff = -1; int _oldBar = -1;