diff --git a/src/libs/core/music/tkeysignature.h b/src/libs/core/music/tkeysignature.h index f699cdad85781bb74e1992bf3a13a094155f5ac5..2f6f01a877a3d56ceae6487dbfde06da596a5ecb 100644 --- a/src/libs/core/music/tkeysignature.h +++ b/src/libs/core/music/tkeysignature.h @@ -105,7 +105,7 @@ public: bool isMinor() { return m_isMinor; } void setMinor(bool isMinor) { m_isMinor = isMinor; } - char value() { return m_key; } + char value() const { return m_key; } /** * Returns base (tonic) note of this key signature, i.e. for a-minor key it is note 'a'. diff --git a/src/libs/core/score/tscoreobject.cpp b/src/libs/core/score/tscoreobject.cpp index 59a64a838326cac9dee62147631047d3a420c445..c9e63cf7c99136e0a91e87a727ce988ea22dde3e 100644 --- a/src/libs/core/score/tscoreobject.cpp +++ b/src/libs/core/score/tscoreobject.cpp @@ -417,26 +417,8 @@ void TscoreObject::noteClicked(qreal yPos) { void TscoreObject::openMusicXml(const QString& musicFile) { if (!musicFile.isEmpty()) { auto melody = new Tmelody(); - if (melody->grabFromMusicXml(musicFile)) { - clearScorePrivate(); - m_notes.clear(); - setMeter(melody->meter()->meter()); - if (melody->clef() != m_clefType) { - setClefType(melody->clef()); - emit clefTypeChanged(); - } - int newKey = static_cast<int>(melody->key().value()); - if (newKey != keySignature()) { - if (!m_keySignEnabled && qAbs(newKey) != 0) - setKeySignatureEnabled(true); - setKeySignature(newKey); - } - for (int n = 0; n < melody->length(); ++n) { - addNote(melody->note(n)->p()); - } - adjustScoreWidth(); - emitLastNote(); - } + if (melody->grabFromMusicXml(musicFile)) + setMelody(melody); delete melody; } } @@ -452,14 +434,34 @@ void TscoreObject::saveMusicXml(const QString& musicFile) { melody->setMeter(m_meter->meter()); if (m_keySignEnabled) melody->setKey(TkeySignature(static_cast<char>(m_keySignature))); - for (int n = 0; n < notesCount(); ++n) { + for (int n = 0; n < notesCount(); ++n) melody->addNote(Tchunk(m_notes[n])); - } melody->saveToMusicXml(fileName); delete melody; } } + +void TscoreObject::setMelody(Tmelody* melody) { +CHECKTIME ( + clearScorePrivate(); + m_notes.clear(); + setMeter(melody->meter()->meter()); + setClefType(melody->clef()); + int newKey = static_cast<int>(melody->key().value()); + if (newKey != keySignature()) { + if (!m_keySignEnabled && qAbs(newKey) != 0) + setKeySignatureEnabled(true); + setKeySignature(newKey); + } + for (int n = 0; n < melody->length(); ++n) + addNote(melody->note(n)->p()); + adjustScoreWidth(); + emitLastNote(); +) +} + + //################################################################################################# //################### Score switches ############################################ //################################################################################################# @@ -827,6 +829,14 @@ void TscoreObject::setSelectedItem(TnoteObject* item) { } +void TscoreObject::setBgColor(const QColor& bg) { + if (bg != m_bgColor) { + m_bgColor = bg; + emit bgColorChanged(); + } +} + + //################################################################################################# //################### PROTECTED ############################################ //################################################################################################# diff --git a/src/libs/core/score/tscoreobject.h b/src/libs/core/score/tscoreobject.h index cb3839a414a47afc6a15b8e8639a1be2d2f15e0c..ccf9cadd0f7dd0cdebdaa2eabcf346a6f123c382 100644 --- a/src/libs/core/score/tscoreobject.h +++ b/src/libs/core/score/tscoreobject.h @@ -51,6 +51,7 @@ class TstaffObject; class TmeasureObject; class TnoteObject; class Tmeter; +class Tmelody; /** @@ -83,6 +84,7 @@ class NOOTKACORE_EXPORT TscoreObject : public QObject Q_PROPERTY(qreal width READ width WRITE setWidth) Q_PROPERTY(TnoteObject* selectedItem READ selectedItem WRITE setSelectedItem NOTIFY selectedItemChanged) Q_PROPERTY(Tnote selectedNote READ selectedNote NOTIFY selectedNoteChanged) + Q_PROPERTY(QColor bgColor READ bgColor WRITE setBgColor NOTIFY bgColorChanged) /* Note cursor */ Q_PROPERTY(TnoteObject* activeNote READ activeNote NOTIFY activeNoteChanged) Q_PROPERTY(TnoteObject* lastNote READ lastNote NOTIFY lastNoteChanged) @@ -152,6 +154,8 @@ public: Q_INVOKABLE void openMusicXml(const QString& musicFile); Q_INVOKABLE void saveMusicXml(const QString& musicFile); + void setMelody(Tmelody* melody); + /* ------------------ Score switches ------------------ */ bool keySignatureEnabled() const { return m_keySignEnabled; } @@ -269,6 +273,9 @@ public: Tnote selectedNote() const { return noteOfItem(m_selectedItem); } + QColor bgColor() const { return m_bgColor; } + void setBgColor(const QColor& bg); + /* ------------------ Note cursor ------------------ */ TnoteObject* activeNote() { return m_activeNote; } qreal xFirstInActivBar(); @@ -375,6 +382,7 @@ signals: void singleNoteChanged(); void recordModeChanged(); void scaleFactorChanged(); + void bgColorChanged(); protected: /** @@ -515,6 +523,7 @@ private: QColor m_nameColor; int m_nameStyle; TnoteObject *m_selectedItem = nullptr; + QColor m_bgColor; /* Note cursor */ TnoteObject *m_activeNote = nullptr; qreal m_activeYpos = 0.0; diff --git a/src/main/texamexecutor.cpp b/src/main/texamexecutor.cpp index a4f1f424ecf4f978957154874790c57a5cf74a72..86c3e963198d6984025fa13a8aad2c6642e3c958 100755 --- a/src/main/texamexecutor.cpp +++ b/src/main/texamexecutor.cpp @@ -43,8 +43,9 @@ #include <taction.h> #include <tnootkaqml.h> #include <instruments/tcommoninstrument.h> -#include <score/tscoreobject.h> +// #include <score/tscoreobject.h> #include "tnameitem.h" +#include "tmainscoreobject.h" #include <QtCore/qdatetime.h> #include <QtCore/qtimer.h> @@ -66,8 +67,6 @@ #endif #define SOUND_DURATION (1500) //[ms] -#define SCORE NOO->scoreObj() -#define SCORE_ITEM NOO->mainScore() #define INSTRUMENT NOO->instrument() @@ -86,7 +85,7 @@ void debugStyle(TQAunit &qa) { QString getExamFileName(Texam* e) { QString fName = QDir::toNativeSeparators(GLOB->E->examsDir + QLatin1String("/") + e->userName() + QLatin1String("-") + e->level()->name); if (QFileInfo(fName + QLatin1String(".noo")).exists()) - fName += QLatin1String("-")+ QDateTime::currentDateTime().toString(QLatin1String("(dd-MMM-hhmmss)")); + fName += QLatin1String("-") + QDateTime::currentDateTime().toString(QLatin1String("(dd-MMM-hhmmss)")); return fName; } @@ -367,7 +366,7 @@ void TexamExecutor::askQuestion(bool isAttempt) { if (curQ->questionAsNote()) { if (curQ->melody()) { if (!isAttempt) { - // SCORE->askQuestion(curQ->melody()); + MAIN_SCORE->askQuestion(curQ->melody()); if (m_level.showStrNr) { // we may be sure that instrument is kind of a guitar for (int i = 0; i < curQ->melody()->length(); ++i) { // if (curQ->melody()->note(i)->g().str() > 1) @@ -386,18 +385,16 @@ void TexamExecutor::askQuestion(bool isAttempt) { } } else { char strNr = 0; - if ((curQ->answerAsFret() || curQ->answerAsSound()) - && !m_level.onlyLowPos && m_level.showStrNr) - strNr = curQ->qa.pos.str(); // do show string number or not - // if (m_level.useKeySign && !curQ->answerAsNote()) - // when answer is also asNote we determine key in preparing answer part - // SCORE->askQuestion(curQ->qa.note, curQ->key, strNr); - // else - // SCORE->askQuestion(curQ->qa.note, strNr); + if ((curQ->answerAsFret() || curQ->answerAsSound()) && !m_level.onlyLowPos && m_level.showStrNr) + strNr = curQ->qa.pos.str(); // do show string number or not + if (m_level.useKeySign && !curQ->answerAsNote()) + MAIN_SCORE->askQuestion(curQ->qa.note, curQ->key, strNr); // when answer is also asNote we determine key in preparing answer part + else + MAIN_SCORE->askQuestion(curQ->qa.note, strNr); if (curQ->answerAsName()) - m_answRequire.accid = true; + m_answRequire.accid = true; else if (curQ->answerAsSound()) - m_answRequire.accid = false; + m_answRequire.accid = false; } } @@ -1029,7 +1026,7 @@ void TexamExecutor::prepareToExam() { disableWidgets(); // connect all events to check an answer or display tip how to check - connect(SCORE, &TscoreObject::clicked, this, &TexamExecutor::expertAnswersSlot); + connect(MAIN_SCORE, &TmainScoreObject::clicked, this, &TexamExecutor::expertAnswersSlot); // connect(NOTENAME, SIGNAL(noteButtonClicked()), this, SLOT(expertAnswersSlot())); // TODO connect(INSTRUMENT, &TcommonInstrument::noteChanged, this, &TexamExecutor::expertAnswersSlot); if (m_level.instrument != Tinstrument::NoInstrument) @@ -1162,7 +1159,7 @@ void TexamExecutor::prepareToExam() { void TexamExecutor::disableWidgets() { // NOTENAME->setNameDisabled(true); - SCORE->setReadOnly(true); + MAIN_SCORE->setReadOnly(true); INSTRUMENT->setEnabled(false); if (NOTENAME) NOTENAME->setEnabled(false); @@ -1170,7 +1167,7 @@ void TexamExecutor::disableWidgets() { void TexamExecutor::clearWidgets() { - SCORE->clearScore(); + MAIN_SCORE->clearScore(); if (NOTENAME) NOTENAME->setNote(Tnote()); // INSTRUMENT->clearFingerBoard(); diff --git a/src/main/tmainscoreobject.cpp b/src/main/tmainscoreobject.cpp index f14146985c1d72b9721962803e8a45c7192e5a15..bf9c4fc8e47e6cd367617e82483e76b3e862990a 100644 --- a/src/main/tmainscoreobject.cpp +++ b/src/main/tmainscoreobject.cpp @@ -23,7 +23,11 @@ #include <qtr.h> #include <tnootkaqml.h> #include <tsound.h> +#include <tcolor.h> +#include <music/tkeysignature.h> +#include <QtGui/qguiapplication.h> +#include <QtGui/qpalette.h> #include <QtCore/qdebug.h> @@ -77,6 +81,7 @@ void TmainScoreObject::setScoreObject(TscoreObject* scoreObj) { return; } m_scoreObject = scoreObj; + connect(m_scoreObject, &TscoreObject::clicked, this, &TmainScoreObject::clicked); connect(m_showNamesAct, &Taction::triggered, [=]{ m_scoreObject->setShowNoteNames(m_showNamesAct->checked()); }); // connect(m_extraAccidsAct); connect(m_deleteLastAct, &Taction::triggered, [=]{ m_scoreObject->deleteLastNote(); }); @@ -88,6 +93,31 @@ void TmainScoreObject::setScoreObject(TscoreObject* scoreObj) { connect(GLOB, &Tglobals::isExamChanged, this, &TmainScoreObject::isExamChangedSlot); } + +void TmainScoreObject::setReadOnly(bool ro) { m_scoreObject->setReadOnly(ro); } + +void TmainScoreObject::clearScore() { m_scoreObject->clearScore(); } + + +void TmainScoreObject::askQuestion(Tmelody* mel) { + m_scoreObject->setBgColor(Tcolor::merge(Tcolor::alpha(GLOB->EquestionColor, 20), qApp->palette().window().color())); + m_scoreObject->setMelody(mel); + m_scoreObject->setReadOnly(true); +} + + +void TmainScoreObject::askQuestion(const Tnote& note, char realStr) { + m_scoreObject->setBgColor(Tcolor::merge(Tcolor::alpha(GLOB->EquestionColor, 20), qApp->palette().window().color())); + m_scoreObject->setNote(m_scoreObject->note(0), note); +} + + +void TmainScoreObject::askQuestion(const Tnote& note, const TkeySignature& key, char realStr) { + m_scoreObject->setKeySignature(static_cast<int>(key.value())); + askQuestion(note, realStr); +} + + //################################################################################################# //################### PROTECTED ############################################ //################################################################################################# diff --git a/src/main/tmainscoreobject.h b/src/main/tmainscoreobject.h index 1e8d5c575ad1285635ffb1b064522de57e123361..a7af0f769dc9cb231c97f274e66d10f20dbe4b63 100644 --- a/src/main/tmainscoreobject.h +++ b/src/main/tmainscoreobject.h @@ -25,6 +25,9 @@ class Taction; class TscoreObject; +class Tnote; +class TkeySignature; +class Tmelody; #define MAIN_SCORE TmainScoreObject::instance() @@ -77,8 +80,19 @@ public: QList<QObject*> scoreActions() { return m_scoreActions; } +// redirected from TscoreObject + void setReadOnly(bool ro); + void clearScore(); + +// exam/exercise related + void askQuestion(const Tnote& note, char realStr = 0); + void askQuestion(const Tnote& note, const TkeySignature& key, char realStr = 0); + void askQuestion(Tmelody* mel); + signals: void scoreActionsChanged(); + // redirected from TscoreObject + void clicked(); protected: void openXmlActSlot(); diff --git a/src/qml/MainScore.qml b/src/qml/MainScore.qml index 9ecc906626e261fdb004be4f5d6feaee238ceb5a..455850d5c7ac881b9e9fd3e28a916d24114e7e73 100644 --- a/src/qml/MainScore.qml +++ b/src/qml/MainScore.qml @@ -41,6 +41,7 @@ Score { scoreObj.nameColor: GLOB.nameColor scoreObj.nameStyle: GLOB.noteNameStyle scoreObj.enableDoubleAccidentals: GLOB.enableDoubleAccids + scoreObj.bgColor: Noo.alpha(activPal.base, 230) TmainScoreObject { id: mainObj diff --git a/src/qml/score/Score.qml b/src/qml/score/Score.qml index a8cec14a3b9b2cf711c9b7ff27a62fd47f69b518..ca9d705722968791044704c2a23904e03b1db3e5 100644 --- a/src/qml/score/Score.qml +++ b/src/qml/score/Score.qml @@ -87,7 +87,7 @@ Flickable { parent: score z: -1 width: score.width; height: score.height - color: Noo.alpha(activPal.base, 230) + color: scoreObj.bgColor border { width: recordMode ? 2 : 0; color: "red" } }