diff --git a/src/libs/core/score/tscoreobject.cpp b/src/libs/core/score/tscoreobject.cpp index bd199c208d9d36cece041a103f83dd43a438486a..dfaabb666b3d3b864240144d495b497d80b1cbea 100644 --- a/src/libs/core/score/tscoreobject.cpp +++ b/src/libs/core/score/tscoreobject.cpp @@ -216,7 +216,7 @@ void solveList(const Tnote& n, int dur, QList<Tnote>& outList) { } } -void TscoreObject::addNote(const Tnote& newNote) { +void TscoreObject::addNote(const Tnote& newNote, bool fromQML) { CHECKTIME ( auto lastMeasure = m_measures.last(); @@ -274,6 +274,11 @@ CHECKTIME ( lastMeasure->appendNewNotes(lastNoteId, 1); } emitLastNote(); + if (fromQML) { + if (!m_recordMode) + setSelectedItem(lastNote()); + emit noteWasAdded(); + } ) } @@ -365,6 +370,8 @@ void TscoreObject::setNote(TnoteObject* no, const Tnote& n) { m_segments[2]->item()->setVisible(false); } } + if (m_recordMode) + setSelectedItem(no); } @@ -557,6 +564,13 @@ void TscoreObject::setSingleNote(bool singleN) { } +void TscoreObject::setRecordMode(bool r) { + if (r != m_recordMode) { + m_recordMode = r; + emit recordModeChanged(); + } +} + qreal TscoreObject::stavesHeight() { if (m_staves.isEmpty()) @@ -712,6 +726,7 @@ void TscoreObject::deleteLastNote() { emitLastNote(); if (tempActiveBar != m_activeBarNr) emitActiveBarChanged(); + setSelectedItem(nullptr); } } @@ -731,6 +746,8 @@ void TscoreObject::clearScore() { m_activeNote = nullptr; adjustScoreWidth(); emitLastNote(); + setSelectedItem(nullptr); + emit scoreWasCleared(); } } diff --git a/src/libs/core/score/tscoreobject.h b/src/libs/core/score/tscoreobject.h index b835050558841b79858dd48ac4e60b9f3b57d543..fcc69e4a6a7e4ae2412f982c38b19de9e0dd0d55 100644 --- a/src/libs/core/score/tscoreobject.h +++ b/src/libs/core/score/tscoreobject.h @@ -76,6 +76,7 @@ class NOOTKACORE_EXPORT TscoreObject : public QObject Q_PROPERTY(bool readOnly READ readOnly WRITE setReadOnly) Q_PROPERTY(bool singleNote READ singleNote WRITE setSingleNote NOTIFY singleNoteChanged) Q_PROPERTY(bool enharmNotesEnabled READ enharmNotesEnabled WRITE setEnharmNotesEnabled) + Q_PROPERTY(bool recordMode READ recordMode WRITE setRecordMode NOTIFY recordModeChanged) /* Helper variables */ Q_PROPERTY(qreal stavesHeight READ stavesHeight NOTIFY stavesHeightChanged) Q_PROPERTY(qreal width READ width WRITE setWidth) @@ -119,7 +120,13 @@ public: int keySignature() const { return static_cast<int>(m_keySignature); } void setKeySignature(int k); - Q_INVOKABLE void addNote(const Tnote& newNote); + /** + * Adds note @p newNote to score. + * in some situations QML part has to take additional actions (scrolls score to make added note visible). + * @p fromQML has to be set to @p TRUE then - signal @p noteWaAdded() is emitted + * and QML performs required routines + */ + Q_INVOKABLE void addNote(const Tnote& newNote, bool fromQML = false); Q_INVOKABLE void setNote(TnoteObject* no, const Tnote& n); /** @@ -180,6 +187,9 @@ public: bool enharmNotesEnabled() const { return m_enharmNotesEnabled; } void setEnharmNotesEnabled(bool enEn) { m_enharmNotesEnabled = enEn; } + bool recordMode() const { return m_recordMode; } + void setRecordMode(bool r); + /* ------------------ Lists with score content (staves, measures notes) ------------------ */ int notesCount() const { return m_notes.count(); } @@ -351,12 +361,15 @@ signals: * QML score depends on it */ void lastNoteChanged(); + void noteWasAdded(); + void scoreWasCleared(); void workRtmTextChanged(); void selectedItemChanged(); void selectedNoteChanged(); void singleNoteChanged(); + void recordModeChanged(); protected: /** @@ -476,6 +489,7 @@ private: bool m_readOnly = false; bool m_singleNote = false; bool m_enharmNotesEnabled = false; + bool m_recordMode = false; /* Lists with notes, measures, staves, meter groups */ QList<TnotePair*> m_segments; QList<TnotePair*> m_spareSegments; diff --git a/src/libs/core/tnootkaqml.cpp b/src/libs/core/tnootkaqml.cpp index 29bf3da35ba15308643b302995b0233684c6a6aa..7819bbfde54571c171bb66767573f4703febf87c 100755 --- a/src/libs/core/tnootkaqml.cpp +++ b/src/libs/core/tnootkaqml.cpp @@ -374,6 +374,11 @@ QString TnootkaQML::pix(const QString& imageFileName) { } +QString TnootkaQML::TR(const QString& context, const QString& text, const QString& disambiguation, int n) { + return qTR(qPrintable(context), qPrintable(text), qPrintable(disambiguation), n); +} + + QColor TnootkaQML::alpha(const QColor& c, int a) { return Tcolor::alpha(c, a); } @@ -503,16 +508,14 @@ void TnootkaQML::instrumentChangesNoteSlot() { rawNote = rawNote.showWithFlat(); if (m_scoreObject->singleNote()) { - QMetaObject::invokeMethod(m_mainScore, "setNote", Q_ARG(QVariant, QVariant::fromValue(m_scoreObject->note(0))), - Q_ARG(QVariant, QVariant::fromValue(rawNote))); + m_scoreObject->setNote(m_scoreObject->note(0), rawNote); } else { if (m_scoreObject->selectedItem()) { rawNote.setRhythm(m_scoreObject->selectedItem()->note()->rtm); - QMetaObject::invokeMethod(m_mainScore, "setNote", Q_ARG(QVariant, QVariant::fromValue(m_scoreObject->selectedItem())), - Q_ARG(QVariant, QVariant::fromValue(rawNote))); + m_scoreObject->setNote(m_scoreObject->selectedItem(), rawNote); } else { rawNote.setRhythm(m_scoreObject->workRhythm()); - QMetaObject::invokeMethod(m_mainScore, "addNote", Q_ARG(QVariant, QVariant::fromValue(rawNote))); + m_scoreObject->addNote(rawNote, true); } } } @@ -544,11 +547,6 @@ void TnootkaQML::scoreChangedNote() { } -QString TnootkaQML::TR(const QString& context, const QString& text, const QString& disambiguation, int n) { - return qTR(qPrintable(context), qPrintable(text), qPrintable(disambiguation), n); -} - - int TnootkaQML::selectedNoteId() const { return m_scoreObject->selectedItem() ? m_scoreObject->selectedItem()->index() : -1; } diff --git a/src/main/texamexecutor.cpp b/src/main/texamexecutor.cpp index 1ec93858eeacc4cc2b61efa10bf176799f1e58ba..a4f1f424ecf4f978957154874790c57a5cf74a72 100755 --- a/src/main/texamexecutor.cpp +++ b/src/main/texamexecutor.cpp @@ -1170,7 +1170,7 @@ void TexamExecutor::disableWidgets() { void TexamExecutor::clearWidgets() { - QMetaObject::invokeMethod(SCORE_ITEM, "clearScore"); + SCORE->clearScore(); if (NOTENAME) NOTENAME->setNote(Tnote()); // INSTRUMENT->clearFingerBoard(); diff --git a/src/qml/score/Score.qml b/src/qml/score/Score.qml index 879a481786d78c5f7d50feae8cfa5a9b0cdc5b2d..629d318bb93a89328bd1eb2c9fbf78a5c0b65513 100644 --- a/src/qml/score/Score.qml +++ b/src/qml/score/Score.qml @@ -27,7 +27,7 @@ Flickable { property alias note: scoreObj.selectedNote property alias readOnly: scoreObj.readOnly property alias singleNote: scoreObj.singleNote - property bool recordMode: false + property alias recordMode: scoreObj.recordMode // private property var staves: [ staff0 ] @@ -73,6 +73,14 @@ Flickable { workRhythm = Noo.rhythm(Trhythm.NoRhythm, false, false, false) } function removeStaff(nr) { staves.splice(nr, 1); lastStaff = staves[staves.length - 1] } + onNoteWasAdded: { + if (staves.length > 1) + ensureVisible(lastNote.staffItem.y, lastNote.staffItem.height * scale) + } + onScoreWasCleared: { + accidControl.show = false + rtmControl.show = false + } } onCurrentNoteChanged: { @@ -176,30 +184,11 @@ Flickable { contentY = yy + hh - height } - function addNote(n) { - scoreObj.addNote(n) - var lastNote = scoreObj.lastNote - if (staves.length > 1) - ensureVisible(lastNote.staffItem.y, lastNote.staffItem.height * scale) - if (!recordMode) - currentNote = lastNote - } + function addNote(n) { scoreObj.addNote(n ,true) } - function setNote(noteItem, note) { - scoreObj.setNote(noteItem, note) - if (recordMode) - currentNote = scoreObj.getNext(currentNote) - } + function setNote(noteItem, note) { scoreObj.setNote(noteItem, note) } - function clearScore() { - scoreObj.clearScore() - currentNote = null - accidControl.show = false - rtmControl.show = false - } + function clearScore() { scoreObj.clearScore() } - function deleteLast() { - scoreObj.deleteLastNote() - currentNote = null - } + function deleteLast() { scoreObj.deleteLastNote() } }