diff --git a/src/libs/core/score/tscoreobject.h b/src/libs/core/score/tscoreobject.h index ccf9cadd0f7dd0cdebdaa2eabcf346a6f123c382..1160f8a48105a050c149b97e734f7d33267884aa 100644 --- a/src/libs/core/score/tscoreobject.h +++ b/src/libs/core/score/tscoreobject.h @@ -325,6 +325,12 @@ public: Q_INVOKABLE void clearScore(); + /** + * By keeping those objects available we are reducing QML components creation time when called from C++ + */ + QQmlComponent* component() { return m_qmlComponent; } + QQmlEngine* qmlEngine() { return m_qmlEngine; } + signals: void meterChanged(); @@ -385,12 +391,6 @@ signals: void bgColorChanged(); protected: - /** - * By keeping those objects available we are reducing QML components creation time when called from C++ - */ - QQmlComponent* component() { return m_qmlComponent; } - QQmlEngine* qmlEngine() { return m_qmlEngine; } - void addStaff(TstaffObject* st); TclefOffset clefOffset() const { return m_clefOffset; } diff --git a/src/main/tmainscoreobject.cpp b/src/main/tmainscoreobject.cpp index bf9c4fc8e47e6cd367617e82483e76b3e862990a..c4a6c77104f94b04a134c2fbdabcae26b13d5168 100644 --- a/src/main/tmainscoreobject.cpp +++ b/src/main/tmainscoreobject.cpp @@ -28,6 +28,9 @@ #include <QtGui/qguiapplication.h> #include <QtGui/qpalette.h> +#include <QtQml/qqmlengine.h> +#include <QtQml/qqmlcomponent.h> +#include <QtQuick/qquickitem.h> #include <QtCore/qdebug.h> @@ -48,7 +51,7 @@ TmainScoreObject::TmainScoreObject(QObject* parent) : m_showNamesAct = new Taction(tr("Show note names"), QString(), this); m_showNamesAct->setCheckable(true); m_showNamesAct->setChecked(GLOB->namesOnScore()); - + m_extraAccidsAct = new Taction(tr("Additional accidentals"), QString(), this); m_extraAccidsAct->setCheckable(true); // m_showNamesAct->setChecked(GLOB->????); @@ -65,6 +68,8 @@ TmainScoreObject::TmainScoreObject(QObject* parent) : m_saveXmlAct = new Taction(qTR("QShortcut", "Save"), QStringLiteral("save"), this); connect(m_saveXmlAct, &Taction::triggered, this, &TmainScoreObject::saveXmlActSlot); + connect(qApp, &QGuiApplication::paletteChanged, this, &TmainScoreObject::paletteSlot); + isExamChangedSlot(); } @@ -76,44 +81,46 @@ TmainScoreObject::~TmainScoreObject() void TmainScoreObject::setScoreObject(TscoreObject* scoreObj) { - if (m_scoreObject) { + if (m_scoreObj) { qDebug() << "[TmainScoreObject] score object was already set. FIX IT!"; return; } - m_scoreObject = scoreObj; - connect(m_scoreObject, &TscoreObject::clicked, this, &TmainScoreObject::clicked); - connect(m_showNamesAct, &Taction::triggered, [=]{ m_scoreObject->setShowNoteNames(m_showNamesAct->checked()); }); + m_scoreObj = scoreObj; + connect(m_scoreObj, &TscoreObject::clicked, this, &TmainScoreObject::clicked); + connect(m_showNamesAct, &Taction::triggered, [=]{ m_scoreObj->setShowNoteNames(m_showNamesAct->checked()); }); // connect(m_extraAccidsAct); - connect(m_deleteLastAct, &Taction::triggered, [=]{ m_scoreObject->deleteLastNote(); }); - connect(m_clearScoreAct, &Taction::triggered, [=]{ m_scoreObject->clearScore(); }); + connect(m_deleteLastAct, &Taction::triggered, [=]{ m_scoreObj->deleteLastNote(); }); + connect(m_clearScoreAct, &Taction::triggered, [=]{ m_scoreObj->clearScore(); }); connect(m_playAct, &Taction::triggered, SOUND, &Tsound::playScore); - connect(m_recModeAct, &Taction::triggered, [=]{ m_scoreObject->setRecordMode(!m_scoreObject->recordMode()); }); - connect(m_zoomOutAct, &Taction::triggered, [=]{ m_scoreObject->setScaleFactor(qMax(0.4, m_scoreObject->scaleFactor() - 0.2)); }); - connect(m_zoomInAct, &Taction::triggered, [=]{ m_scoreObject->setScaleFactor(qMin(m_scoreObject->scaleFactor() + 0.2, 1.4)); }); + connect(m_recModeAct, &Taction::triggered, [=]{ m_scoreObj->setRecordMode(!m_scoreObj->recordMode()); }); + connect(m_zoomOutAct, &Taction::triggered, [=]{ m_scoreObj->setScaleFactor(qMax(0.4, m_scoreObj->scaleFactor() - 0.2)); }); + connect(m_zoomInAct, &Taction::triggered, [=]{ m_scoreObj->setScaleFactor(qMin(m_scoreObj->scaleFactor() + 0.2, 1.4)); }); connect(GLOB, &Tglobals::isExamChanged, this, &TmainScoreObject::isExamChangedSlot); } -void TmainScoreObject::setReadOnly(bool ro) { m_scoreObject->setReadOnly(ro); } +void TmainScoreObject::setReadOnly(bool ro) { m_scoreObj->setReadOnly(ro); } -void TmainScoreObject::clearScore() { m_scoreObject->clearScore(); } +void TmainScoreObject::clearScore() { m_scoreObj->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); + m_scoreObj->setBgColor(Tcolor::merge(Tcolor::alpha(GLOB->EquestionColor, 20), qApp->palette().base().color())); + m_scoreObj->setMelody(mel); + m_scoreObj->setReadOnly(true); + m_questionMark->setVisible(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); + m_scoreObj->setBgColor(Tcolor::merge(Tcolor::alpha(GLOB->EquestionColor, 20), qApp->palette().base().color())); + m_scoreObj->setNote(m_scoreObj->note(0), note); + m_questionMark->setVisible(true); } void TmainScoreObject::askQuestion(const Tnote& note, const TkeySignature& key, char realStr) { - m_scoreObject->setKeySignature(static_cast<int>(key.value())); + m_scoreObj->setKeySignature(static_cast<int>(key.value())); askQuestion(note, realStr); } @@ -124,24 +131,45 @@ void TmainScoreObject::askQuestion(const Tnote& note, const TkeySignature& key, void TmainScoreObject::openXmlActSlot() { SOUND->stopListen(); - m_scoreObject->openMusicXml(NOO->getXmlToOpen()); + m_scoreObj->openMusicXml(NOO->getXmlToOpen()); SOUND->startListen(); } void TmainScoreObject::saveXmlActSlot() { SOUND->stopListen(); - m_scoreObject->saveMusicXml(NOO->getXmlToSave()); + m_scoreObj->saveMusicXml(NOO->getXmlToSave()); SOUND->startListen(); } void TmainScoreObject::isExamChangedSlot() { m_scoreActions.clear(); - if (GLOB->isExam()) - m_scoreActions << m_zoomOutAct << m_zoomInAct << m_deleteLastAct << m_clearScoreAct; - else - m_scoreActions << m_playAct << m_recModeAct << m_openXmlAct << m_saveXmlAct << m_showNamesAct << m_extraAccidsAct - << m_zoomOutAct << m_zoomInAct << m_deleteLastAct << m_clearScoreAct; + if (GLOB->isExam()) { + m_scoreActions << m_zoomOutAct << m_zoomInAct << m_deleteLastAct << m_clearScoreAct; + if (!m_questionMark) { + m_scoreObj->component()->setData("import QtQuick 2.9; Text { anchors.centerIn: parent ? parent : undefined; scale: parent ? parent.height / height : 1; text: \"?\"; font { family: \"Nootka\"; pixelSize: 20 }}", + QUrl()); + m_questionMark = qobject_cast<QQuickItem*>(m_scoreObj->component()->create()); + if (m_questionMark) { + m_questionMark->setParentItem(qvariant_cast<QQuickItem*>(qobject_cast<QQuickItem*>(m_scoreObj->parent())->property("bgRect"))); + m_questionMark->setVisible(false); + paletteSlot(); + } + } + } else { + m_scoreActions << m_playAct << m_recModeAct << m_openXmlAct << m_saveXmlAct << m_showNamesAct << m_extraAccidsAct + << m_zoomOutAct << m_zoomInAct << m_deleteLastAct << m_clearScoreAct; + if (m_questionMark) { + delete m_questionMark; + m_questionMark = nullptr; + } + } emit scoreActionsChanged(); } + + +void TmainScoreObject::paletteSlot() { + if (m_questionMark) + m_questionMark->setProperty("color", Tcolor::merge(NOO->alpha(GLOB->wrongColor(), 40), qApp->palette().base().color())); +} diff --git a/src/main/tmainscoreobject.h b/src/main/tmainscoreobject.h index a7af0f769dc9cb231c97f274e66d10f20dbe4b63..e38e9ea727366ba80e21b1cf8892fa1ee113ac94 100644 --- a/src/main/tmainscoreobject.h +++ b/src/main/tmainscoreobject.h @@ -28,6 +28,7 @@ class TscoreObject; class Tnote; class TkeySignature; class Tmelody; +class QQuickItem; #define MAIN_SCORE TmainScoreObject::instance() @@ -64,7 +65,7 @@ public: static TmainScoreObject* instance() { return m_instance; } - TscoreObject* scoreObject() { return m_scoreObject; } + TscoreObject* scoreObject() { return m_scoreObj; } void setScoreObject(TscoreObject* scoreObj); Taction* playAct() { return m_playAct; } @@ -98,9 +99,10 @@ protected: void openXmlActSlot(); void saveXmlActSlot(); void isExamChangedSlot(); + void paletteSlot(); private: - TscoreObject *m_scoreObject = nullptr; + TscoreObject *m_scoreObj = nullptr; Taction *m_playAct, *m_recModeAct; Taction *m_showNamesAct, *m_extraAccidsAct; Taction *m_zoomOutAct, *m_zoomInAct; @@ -108,6 +110,8 @@ private: Taction *m_openXmlAct, *m_saveXmlAct; QList<QObject*> m_scoreActions; + QQuickItem *m_questionMark = nullptr; + static TmainScoreObject *m_instance; }; diff --git a/src/qml/MainScore.qml b/src/qml/MainScore.qml index 455850d5c7ac881b9e9fd3e28a916d24114e7e73..b492f0f5fa70f035ea7ac1cdaecad120dee7c5e1 100644 --- a/src/qml/MainScore.qml +++ b/src/qml/MainScore.qml @@ -41,15 +41,15 @@ Score { scoreObj.nameColor: GLOB.nameColor scoreObj.nameStyle: GLOB.noteNameStyle scoreObj.enableDoubleAccidentals: GLOB.enableDoubleAccids - scoreObj.bgColor: Noo.alpha(activPal.base, 230) + scoreObj.bgColor: activPal.base TmainScoreObject { id: mainObj scoreObject: scoreObj - deleteLastAct.shortcut: Shortcut { sequence: "Del"; onActivated: deleteLastAct.triggered(); enabled: !GLOB.singleNoteMode } - clearScoreAct.shortcut: Shortcut { sequence: "Shift+Del"; onActivated: clearScoreAct.triggered(); enabled: !GLOB.singleNoteMode } - openXmlAct.shortcut: Shortcut { sequence: StandardKey.Open; onActivated: openXmlAct.triggered(); enabled: !GLOB.singleNoteMode } - saveXmlAct.shortcut: Shortcut { sequence: StandardKey.Save; onActivated: saveXmlAct.triggered(); enabled: !GLOB.singleNoteMode } + deleteLastAct.shortcut: Shortcut { sequence: "Del"; onActivated: deleteLastAct.triggered(); enabled: !GLOB.singleNoteMode && !readOnly } + clearScoreAct.shortcut: Shortcut { sequence: "Shift+Del"; onActivated: clearScoreAct.triggered(); enabled: !GLOB.singleNoteMode && !readOnly } + openXmlAct.shortcut: Shortcut { sequence: StandardKey.Open; onActivated: openXmlAct.triggered(); enabled: !GLOB.singleNoteMode && !GLOB.isExam } + saveXmlAct.shortcut: Shortcut { sequence: StandardKey.Save; onActivated: saveXmlAct.triggered(); enabled: !GLOB.singleNoteMode && !GLOB.isExam } zoomOutAct.shortcut: Shortcut { sequence: StandardKey.ZoomOut; onActivated: zoomOutAct.triggered(); enabled: !GLOB.singleNoteMode } zoomInAct.shortcut: Shortcut { sequence: StandardKey.ZoomIn; onActivated: zoomInAct.triggered(); enabled: !GLOB.singleNoteMode } recModeAct.text: recordMode ? qsTr("Note by note") : qsTr("Edit") @@ -169,11 +169,12 @@ Score { } } Keys.onSpacePressed: { - enabled: !GLOB.singleNoteMode - if (event.modifiers & Qt.ControlModifier) - recModeAct.triggered() - else - playAct.triggered() + if (!GLOB.singleNoteMode && !GLOB.isExam) { + if (event.modifiers & Qt.ControlModifier) + recModeAct.triggered() + else + playAct.triggered() + } } } diff --git a/src/qml/score/Score.qml b/src/qml/score/Score.qml index ca9d705722968791044704c2a23904e03b1db3e5..c974b045a15435f373e670bb74641acb219ddca5 100644 --- a/src/qml/score/Score.qml +++ b/src/qml/score/Score.qml @@ -29,6 +29,7 @@ Flickable { property alias readOnly: scoreObj.readOnly property alias singleNote: scoreObj.singleNote property alias recordMode: scoreObj.recordMode + property alias bgRect: bgRect // private property var staves: [ staff0 ] @@ -87,7 +88,7 @@ Flickable { parent: score z: -1 width: score.width; height: score.height - color: scoreObj.bgColor + color: Noo.alpha(scoreObj.bgColor, 230) border { width: recordMode ? 2 : 0; color: "red" } }