diff --git a/src/libs/core/instruments/tbandoneonbg.cpp b/src/libs/core/instruments/tbandoneonbg.cpp index 0c3a4d8aeaa4542f32c9bf693369f8f29997978e..a82543767f642a981ddf2b285d56df0bfb0f14c6 100644 --- a/src/libs/core/instruments/tbandoneonbg.cpp +++ b/src/libs/core/instruments/tbandoneonbg.cpp @@ -295,6 +295,18 @@ void TbandoneonBg::setRightX(qreal rx) { } } + +void TbandoneonBg::markSelected(const QColor& markColor) { + auto mc = markColor.alpha() ? markColor : Qt::blue; + m_circleLeftOpen.item->setProperty("color", mc); + m_circleRightOpen.item->setProperty("color", mc); + mc = markColor.alpha() ? markColor : Qt::red; + m_circleLeftClose.item->setProperty("color", mc); + m_circleRightClose.item->setProperty("color", mc); + m_circleCloseExtra.item->setProperty("color", mc); +} + + //################################################################################################# //################### PROTECTED ############################################ //################################################################################################# diff --git a/src/libs/core/instruments/tbandoneonbg.h b/src/libs/core/instruments/tbandoneonbg.h index 01bac14ba80fc40318ef127b945f3a1ba790c79a..f764f4713869c9dcc16b8bb52c9a6e344a00e4ff 100644 --- a/src/libs/core/instruments/tbandoneonbg.h +++ b/src/libs/core/instruments/tbandoneonbg.h @@ -77,6 +77,8 @@ public: void paint(QPainter*) override {} + void markSelected(const QColor & markColor) override; + signals: void closingChanged(); void openingChanged(); diff --git a/src/libs/core/instruments/tcommoninstrument.h b/src/libs/core/instruments/tcommoninstrument.h index e3acbd865a7137e10d15947698e5cab9d934a234..9dbb6214b1c9f0681dfa34176fc6dd04632ff527 100644 --- a/src/libs/core/instruments/tcommoninstrument.h +++ b/src/libs/core/instruments/tcommoninstrument.h @@ -61,6 +61,12 @@ public: */ virtual int technical() = 0; + /** + * Sets color of selected item (finger, button, key - depends on instrument type) + * to @p markColor if different than transparent, or to global color of selection + */ + virtual void markSelected(const QColor& markColor) = 0; + signals: void activeChanged(); void noteChanged(); diff --git a/src/libs/core/instruments/tguitarbg.cpp b/src/libs/core/instruments/tguitarbg.cpp index 38b2c8c83da18eb12f3317e5b778a452a44f97fc..18c684914d4dc0205bfdaeea9770a373676d7b53 100644 --- a/src/libs/core/instruments/tguitarbg.cpp +++ b/src/libs/core/instruments/tguitarbg.cpp @@ -297,6 +297,16 @@ void TguitarBg::updateGuitar() { } +void TguitarBg::markSelected(const QColor& markColor) { + auto mc = markColor.alpha() == 0 ? GLOB->GselectedColor : markColor; + for (int s = 0; s < 6; ++s) { + m_stringItems[s]->setProperty("color", mc); + m_fingerItems[s]->setProperty("color", mc); + } +} + + + //################################################################################################# //################### PROTECTED ############################################ //################################################################################################# diff --git a/src/libs/core/instruments/tguitarbg.h b/src/libs/core/instruments/tguitarbg.h index 56e668c7174b095e039a85c70c9056fc7533e924..e8f1f396abc95b0290d6ebb59f9a87679f6bd615 100644 --- a/src/libs/core/instruments/tguitarbg.h +++ b/src/libs/core/instruments/tguitarbg.h @@ -93,6 +93,8 @@ public: */ void updateGuitar(); + void markSelected(const QColor & markColor) override; + signals: void fretWidthChanged(); void stringsGapChanged(); diff --git a/src/libs/core/instruments/tpianobg.cpp b/src/libs/core/instruments/tpianobg.cpp index b35a6c69eee2b6661c65d1f1e8b64cf5559e72d9..11fb82d307e5ae841b55b5b2654ce0624fc1d388 100644 --- a/src/libs/core/instruments/tpianobg.cpp +++ b/src/libs/core/instruments/tpianobg.cpp @@ -130,6 +130,11 @@ CHECKTIME ( ) } + +void TpianoBg::markSelected(const QColor& markColor) { +} + + //################################################################################################# //################### PROTECTED ############################################ //################################################################################################# diff --git a/src/libs/core/instruments/tpianobg.h b/src/libs/core/instruments/tpianobg.h index 43adf75c4bce02f71444bdd1ad8f3b838ca179cd..73d49a6e0cca5081705490f25ed26a57f7f0c630 100644 --- a/src/libs/core/instruments/tpianobg.h +++ b/src/libs/core/instruments/tpianobg.h @@ -59,6 +59,8 @@ public: void paint(QPainter* painter) override; + void markSelected(const QColor & markColor) override; + signals: void keyRectChanged(); void selectedRectChanged(); diff --git a/src/libs/core/instruments/tsaxbg.cpp b/src/libs/core/instruments/tsaxbg.cpp index a8bf3d4598b510e1c569586aa5aba31a833c7576..7f7eac85985422d59f3c597a82dcedd8b036ebcb 100644 --- a/src/libs/core/instruments/tsaxbg.cpp +++ b/src/libs/core/instruments/tsaxbg.cpp @@ -137,3 +137,7 @@ CHECKTIME ( } ) } + + +void TsaxBg::markSelected(const QColor& markColor) { +} diff --git a/src/libs/core/instruments/tsaxbg.h b/src/libs/core/instruments/tsaxbg.h index 47fbd3cf78d8df8e3afad12334930fada57476cd..0c3765ba0ba5c5df0137a2a56ed4fc66d1ca078e 100644 --- a/src/libs/core/instruments/tsaxbg.h +++ b/src/libs/core/instruments/tsaxbg.h @@ -62,6 +62,8 @@ public: void paint(QPainter*) override {} + void markSelected(const QColor & markColor) override; + signals: void flapNumberChanged(); diff --git a/src/libs/core/score/tnoteobject.cpp b/src/libs/core/score/tnoteobject.cpp index 8dffd619b0efb950cf9c36e22ff2ca08a3e3619a..813237b28d5d670d3b586306f12cf5a19f2af70b 100644 --- a/src/libs/core/score/tnoteobject.cpp +++ b/src/libs/core/score/tnoteobject.cpp @@ -475,6 +475,16 @@ void TnoteObject::setFingerNumber(int fiNr) } +void TnoteObject::markNoteHead(const QColor& outlineColor) { + if (outlineColor.alpha() == 0) { + m_head->setProperty("style", 0); // In Qt private qquicktext_p.h it is first value of enum TextStyle + } else { + m_head->setProperty("style", 1); // In Qt private qquicktext_p.h it is second value of enum TextStyle + m_head->setProperty("styleColor", outlineColor); + } +} + + //################################################################################################# //################### PROTECTED ############################################ //################################################################################################# diff --git a/src/libs/core/score/tnoteobject.h b/src/libs/core/score/tnoteobject.h index cbc99ed8cc78112558a307d2508211f459306568..2e512365bce9ad67ce08f59712a4670715179ecd 100644 --- a/src/libs/core/score/tnoteobject.h +++ b/src/libs/core/score/tnoteobject.h @@ -141,6 +141,12 @@ public: void setBowing(EbowDirection bowDir); + /** + * If @p outLineColor differs from note color, outline is set over note head, + * but when it is the same, outline is unset (what means reset the mark) + */ + void markNoteHead(const QColor& outlineColor); + signals: void noteChanged(); void notePosYchanged(); diff --git a/src/libs/core/score/tnotepair.cpp b/src/libs/core/score/tnotepair.cpp index 6d9e499602f77dbf185546dbbe237284ddd6a126..7bfa54d650ea0cbae0038553846f4ae244590a6b 100644 --- a/src/libs/core/score/tnotepair.cpp +++ b/src/libs/core/score/tnotepair.cpp @@ -93,6 +93,7 @@ void TnotePair::disconnectTie(Euntie untie) { void TnotePair::flush() { + m_noteItem->markNoteHead(Qt::transparent); if (m_beam && this == m_beam->last()) delete m_beam; // TbeamObject destructor will reset this beam to nullptr if (this == m_noteItem->staff()->firstNote()) diff --git a/src/main/texamexecutor.cpp b/src/main/texamexecutor.cpp index 4d8862a1f1d50ef87cfd45b9769a2591194409f0..dc7bc07670a2cde4a0867aa62860e45e379aab1e 100755 --- a/src/main/texamexecutor.cpp +++ b/src/main/texamexecutor.cpp @@ -674,7 +674,7 @@ void TexamExecutor::checkAnswer(bool showResults) { } } -// markAnswer(curQ); + markAnswer(curQ); int waitTime = GLOB->E->questionDelay; if (m_melody) // increase minimal delay before next question for melodies to 500ms waitTime = qMax(waitTime, 500); @@ -838,43 +838,43 @@ void TexamExecutor::checkAnswer(bool showResults) { // m_exam->curQ()->lastAttempt()->melodyWasPlayed(); // we can suppose that user will play an answer for sure // askQuestion(true); // } -// -// -// void TexamExecutor::markAnswer(TQAunit* curQ) { -// QColor markColor = m_supp->answerColor(curQ); -// if (curQ->melody()) { -// for (int i = 0; i < curQ->lastAttempt()->mistakes.size(); ++i) { -// SCORE->markAnswered(m_supp->answerColor(curQ->lastAttempt()->mistakes[i]), i); -// } -// } else { -// switch (curQ->answerAs) { -// case TQAtype::e_asNote: -// SCORE->markAnswered(markColor); -// break; -// case TQAtype::e_asFretPos: -// INSTRUMENT->markAnswer(markColor); -// break; -// case TQAtype::e_asName: -// NOTENAME->markNameLabel(markColor); -// break; -// case TQAtype::e_asSound: + + +void TexamExecutor::markAnswer(TQAunit* curQ) { + QColor markColor = m_supp->answerColor(curQ); + if (curQ->melody()) { + for (int i = 0; i < curQ->lastAttempt()->mistakes.size(); ++i) { + MAIN_SCORE->markNoteHead(m_supp->answerColor(curQ->lastAttempt()->mistakes[i]), i); + } + } else { + switch (curQ->answerAs) { + case TQAtype::e_asNote: + MAIN_SCORE->markNoteHead(markColor, 0); + break; + case TQAtype::e_asFretPos: + INSTRUMENT->markSelected(markColor); + break; + case TQAtype::e_asName: + NOTENAME->setMarkColor(markColor); + break; + case TQAtype::e_asSound: // SOUND->pitchView()->markAnswer(markColor); -// break; -// } -// switch (curQ->questionAs) { -// case TQAtype::e_asNote: -// SCORE->markQuestion(markColor); -// break; -// case TQAtype::e_asFretPos: -// INSTRUMENT->markQuestion(markColor); -// break; -// case TQAtype::e_asName: -// NOTENAME->markNameLabel(markColor); -// break; -// case TQAtype::e_asSound: -// break; -// } -// } // TODO + break; + } + switch (curQ->questionAs) { + case TQAtype::e_asNote: + MAIN_SCORE->markNoteHead(markColor, 1); + break; + case TQAtype::e_asFretPos: + INSTRUMENT->markSelected(markColor); + break; + case TQAtype::e_asName: + NOTENAME->setMarkColor(markColor); + break; + case TQAtype::e_asSound: + break; + } + } // TODO // if (m_exercise && GLOB->E->showNameOfAnswered /*&& (!GLOB->E->autoNextQuest || (GLOB->E->autoNextQuest && GLOB->E->afterMistake != TexamParams::e_continue))*/) { // if (!curQ->questionAsName() && !curQ->answerAsName()) { // if (curQ->answerAsNote() || (curQ->answerAsSound() && curQ->questionAsNote())) @@ -892,9 +892,9 @@ void TexamExecutor::checkAnswer(bool showResults) { // } // } // } -// } -// -// +} + + // void TexamExecutor::repeatQuestion() { // m_tipHandler->tryAgainTip(3000); // m_lockRightButt = false; @@ -1115,9 +1115,12 @@ void TexamExecutor::disableWidgets() { void TexamExecutor::clearWidgets() { MAIN_SCORE->clearScore(); - if (NOTENAME) + if (NOTENAME) { NOTENAME->setNote(Tnote()); + NOTENAME->setMarkColor(Qt::transparent); + } INSTRUMENT->setNote(Tnote()); + INSTRUMENT->markSelected(Qt::transparent); // SOUND->restoreAfterAnswer(); } diff --git a/src/main/texamexecutor.h b/src/main/texamexecutor.h index 4e2e412d0cf3917f74c6382cc0888db03a4c1c70..42ae46a60f9c3e9d5c4b5aeaaf3ba30b72373070 100644 --- a/src/main/texamexecutor.h +++ b/src/main/texamexecutor.h @@ -151,7 +151,7 @@ protected: void sniffAfterPlaying(); /**< Starts sniffing when asked note is finished */ // void rightButtonSlot(); Q_INVOKABLE void tipLink(const QString& link); -// void markAnswer(TQAunit* curQ); + void markAnswer(TQAunit* curQ); // void delayerTip(); /**< This is QTimer slot invoking m_canvas->whatNextTip(true) method. */ void exerciseToExam(); /**< Stops exercising and starts exam. */ void stopSound(); /**< Common method called by exercises and exams to disable sniffing, lock right button, etc. */ diff --git a/src/main/tmainscoreobject.cpp b/src/main/tmainscoreobject.cpp index 96f4fe339c428ad1cdf551d07492d891ad21d341..5481cdbd63c3154b4e6b4f67e9bc8610c918b8e4 100644 --- a/src/main/tmainscoreobject.cpp +++ b/src/main/tmainscoreobject.cpp @@ -130,8 +130,11 @@ void TmainScoreObject::clearScore() { } m_questionMark->setVisible(false); m_scoreObj->setBgColor(qApp->palette().base().color()); - if (m_scoreObj->singleNote()) + if (m_scoreObj->singleNote()) { m_scoreObj->note(1)->setTechnical(255); + m_scoreObj->note(0)->markNoteHead(Qt::transparent); + m_scoreObj->note(1)->markNoteHead(Qt::transparent); + } } @@ -224,6 +227,12 @@ void TmainScoreObject::lockKeySignature(bool lock) { } +void TmainScoreObject::markNoteHead(const QColor& outColor, int noteNr) { + auto note = m_scoreObj->note(noteNr); + if (note) + note->markNoteHead(outColor); +} + //################################################################################################# //################### PROTECTED ############################################ diff --git a/src/main/tmainscoreobject.h b/src/main/tmainscoreobject.h index 572c46764d8cad8da83d621a6551ba3b7fdb5728..2e06121febd457b1cc9d6c54309252981697a1c9 100644 --- a/src/main/tmainscoreobject.h +++ b/src/main/tmainscoreobject.h @@ -108,6 +108,7 @@ public: void forceAccidental(int accid); void unLockScore(); void lockKeySignature(bool lock); + void markNoteHead(const QColor& outColor, int noteNr); signals: void scoreActionsChanged(); diff --git a/src/main/tnameitem.cpp b/src/main/tnameitem.cpp index 235d1c45abb5dfd5e972fa45aaef379488e30b4d..d1319fa17b1e5a6e70acb70c5b6fb78723132e3f 100644 --- a/src/main/tnameitem.cpp +++ b/src/main/tnameitem.cpp @@ -36,7 +36,8 @@ TnameItem* TnameItem::m_instance = nullptr; TnameItem::TnameItem(QQuickItem* parent) : QQuickItem(parent), m_nameStyle(Tnote::e_english_Bb), - m_buttonNameStyle(Tnote::e_english_Bb) + m_buttonNameStyle(Tnote::e_english_Bb), + m_outlineColor(Qt::transparent) { if (m_instance) { qDebug() << "TnameItem instance already exists!"; @@ -236,3 +237,11 @@ void TnameItem::forceAccidental(char accid) { m_note.alter = accid; emit alterChanged(); } + + +void TnameItem::setMarkColor(const QColor& outColor) { + if (m_outlineColor != outColor) { + m_outlineColor = outColor; + emit markColorChanged(); + } +} diff --git a/src/main/tnameitem.h b/src/main/tnameitem.h index 9fc4ffd67310b0f6fd21fc7449f804cc1d490291..07f17cf9831249f28ef2d0700d332abd89c3ce36 100644 --- a/src/main/tnameitem.h +++ b/src/main/tnameitem.h @@ -44,6 +44,7 @@ class TnameItem : public QQuickItem Q_PROPERTY(QString appendix READ appendix NOTIFY appendixChanged) Q_PROPERTY(QColor bgColor READ bgColor NOTIFY bgColorChanged) Q_PROPERTY(bool disabled READ disabled WRITE setDisabled NOTIFY disabledChanged) + Q_PROPERTY(QColor markColor READ markColor WRITE setMarkColor NOTIFY markColorChanged) public: @@ -75,6 +76,9 @@ public: bool disabled() const { return m_disabled; } void setDisabled(bool dis); + QColor markColor() const { return m_outlineColor; } + void setMarkColor(const QColor& outColor); + QString nameText() const; /** @@ -106,6 +110,7 @@ signals: void buttonNameStyleChanged(); void disabledChanged(); void noteButtonClicked(); + void markColorChanged(); private: void changeNameBgColor(const QColor& c) { m_bgColor = c; emit bgColorChanged(); } @@ -114,7 +119,7 @@ private: Tnote m_note; Tnote::EnameStyle m_nameStyle, m_buttonNameStyle; QString m_appendix; - QColor m_bgColor; + QColor m_bgColor, m_outlineColor; bool m_disabled = false; static TnameItem *m_instance; diff --git a/src/qml/NoteName.qml b/src/qml/NoteName.qml index 51c708fcd0dd72e87b02e915d37259d27bbad416..c878b5ee2e7876edf30e4d4814aed3a25293d29d 100644 --- a/src/qml/NoteName.qml +++ b/src/qml/NoteName.qml @@ -1,5 +1,5 @@ /** This file is part of Nootka (http://nootka.sf.net) * - * Copyright (C) 2017 by Tomasz Bojczuk (seelook@gmail.com) * + * Copyright (C) 2017-2018 by Tomasz Bojczuk (seelook@gmail.com) * * on the terms of GNU GPLv3 license (http://www.gnu.org/licenses) */ import QtQuick 2.9 @@ -51,6 +51,7 @@ TnameItem { y: -noteName.height * 0.17 text: nameText; color: activPal.text height: parent.height + style: Text.Outline; styleColor: markColor font { pixelSize: height * 0.8; family: "Scorek" } } Text {