diff --git a/src/engraving/api/v1/score.cpp b/src/engraving/api/v1/score.cpp index 506e365f4ef57..7a15c843836ca 100644 --- a/src/engraving/api/v1/score.cpp +++ b/src/engraving/api/v1/score.cpp @@ -28,6 +28,8 @@ #include "dom/measure.h" #include "dom/score.h" #include "dom/segment.h" +#include "dom/spanner.h" +#include "dom/spannermap.h" #include "dom/text.h" #include "editing/editsystemlocks.h" #include "types/typesconv.h" @@ -39,6 +41,51 @@ using namespace mu::engraving::apiv1; +qsizetype Score::spannerListCount(QQmlListProperty* list) +{ + auto* scoreWrapper = static_cast(list->data); + if (!scoreWrapper) { + return 0; + } + + mu::engraving::Score* nativeScore = scoreWrapper->score(); + if (!nativeScore) { + return 0; + } + + return static_cast(nativeScore->spannerMap().map().size()); +} + +Spanner* Score::spannerListAt(QQmlListProperty* list, qsizetype index) +{ + auto* scoreWrapper = static_cast(list->data); + if (!scoreWrapper || index < 0) { + return nullptr; + } + + mu::engraving::Score* nativeScore = scoreWrapper->score(); + if (!nativeScore) { + return nullptr; + } + + const auto& spanMap = nativeScore->spannerMap().map(); + qsizetype current = 0; + for (const auto& [tick, spanner] : spanMap) { + UNUSED(tick); + if (!spanner) { + continue; + } + + if (current == index) { + return qobject_cast(wrap(spanner, Ownership::SCORE)); + } + + ++current; + } + + return nullptr; +} + Cursor* Score::newCursor() { return new Cursor(score()); @@ -262,6 +309,15 @@ QQmlListProperty Score::systems() return wrapContainerProperty(this, score()->systems()); } +//--------------------------------------------------------- +// Score::spanners +//--------------------------------------------------------- + +QQmlListProperty Score::spanners() +{ + return QQmlListProperty(this, this, &Score::spannerListCount, &Score::spannerListAt); +} + //--------------------------------------------------------- // Score::startCmd //--------------------------------------------------------- diff --git a/src/engraving/api/v1/score.h b/src/engraving/api/v1/score.h index 486d686e0925b..524304550f4f0 100644 --- a/src/engraving/api/v1/score.h +++ b/src/engraving/api/v1/score.h @@ -41,6 +41,7 @@ Q_MOC_INCLUDE("engraving/api/v1/selection.h") namespace mu::engraving { class InstrumentTemplate; class Selection; +class Spanner; } namespace mu::engraving::apiv1 { @@ -53,6 +54,7 @@ class System; class Selection; class Score; class Staff; +class Spanner; extern Selection* selectionWrap(mu::engraving::Selection* select); @@ -165,6 +167,9 @@ class Score : public apiv1::ScoreElement, public muse::Injectable /// List of systems in this score. /// \since MuseScore 4.6 Q_PROPERTY(QQmlListProperty systems READ systems) + /// List of score-level spanners. + /// \since MuseScore 4.7 + Q_PROPERTY(QQmlListProperty spanners READ spanners) muse::Inject context = { this }; @@ -345,6 +350,7 @@ class Score : public apiv1::ScoreElement, public muse::Injectable QQmlListProperty staves(); QQmlListProperty pages(); QQmlListProperty systems(); + QQmlListProperty spanners(); static const mu::engraving::InstrumentTemplate* instrTemplateFromName(const QString& name); // used by PluginAPI::newScore() /// \endcond @@ -352,5 +358,8 @@ class Score : public apiv1::ScoreElement, public muse::Injectable private: mu::notation::INotationPtr notation() const; mu::notation::INotationUndoStackPtr undoStack() const; + + static qsizetype spannerListCount(QQmlListProperty* list); + static Spanner* spannerListAt(QQmlListProperty* list, qsizetype index); }; } diff --git a/src/engraving/dom/note.h b/src/engraving/dom/note.h index d1be5d714a433..676a9d5f77308 100644 --- a/src/engraving/dom/note.h +++ b/src/engraving/dom/note.h @@ -380,7 +380,7 @@ class Note final : public EngravingItem EngravingItem* prevInEl(EngravingItem* e); EngravingItem* nextElement() override; EngravingItem* prevElement() override; - virtual EngravingItem* lastElementBeforeSegment(); + EngravingItem* lastElementBeforeSegment(); EngravingItem* nextSegmentElement() override; EngravingItem* prevSegmentElement() override;