From 0b802c6e5a9a2118152a88457c86b9b5e18a7877 Mon Sep 17 00:00:00 2001 From: SeeLook <SeeLook@localhost> Date: Tue, 26 Dec 2017 13:13:38 +0100 Subject: [PATCH] Manage key signatures value and enabling/disabling it only through score object, so score.keySignature is just alias to TscoreObject property. All dependent things on QML side adjust itself to it. There is less JS stuff that way. --- TODO | 1 - src/libs/core/score/tscoreobject.cpp | 18 ++++++----- src/libs/core/score/tscoreobject.h | 3 +- src/libs/core/tglobals.cpp | 14 ++++++-- src/qml/MainScore.qml | 5 +-- src/qml/score/KeySignature.qml | 32 ++++++++----------- src/qml/score/Meter.qml | 2 +- src/qml/score/Score.qml | 33 ++----------------- src/qml/score/Staff.qml | 46 ++++++++++----------------- src/qml/shared/InstrumentSelector.qml | 4 +++ 10 files changed, 65 insertions(+), 93 deletions(-) diff --git a/TODO b/TODO index 373d3b0e5..792decf96 100644 --- a/TODO +++ b/TODO @@ -29,7 +29,6 @@ TRANSLATION CONTEXT CHANGES ============================================================================ small glitches: - - clef is not approved when settings were accepted - sometimes setting a note doesn't scale tie - probably due to note width is not refreshed - meter can be too close to key signature - probably related with clef change diff --git a/src/libs/core/score/tscoreobject.cpp b/src/libs/core/score/tscoreobject.cpp index 6039ad8e0..59a64a838 100644 --- a/src/libs/core/score/tscoreobject.cpp +++ b/src/libs/core/score/tscoreobject.cpp @@ -175,8 +175,8 @@ int TscoreObject::meterToInt() const { return static_cast<int>(m_meter->meter()) void TscoreObject::setKeySignature(int k) { - if (m_keySignEnabled) { - qint8 key = static_cast<qint8>(k); + qint8 key = static_cast<qint8>(k); + if (m_keySignEnabled && key != m_keySignature) { if (key != m_keySignature) { m_keySignature = key; for (int i = 1; i < 8; i++) { @@ -192,6 +192,7 @@ void TscoreObject::setKeySignature(int k) { m->keySignatureChanged(); if (notesCount() > 0) adjustScoreWidth(); + emit keySignatureChanged(); } } } @@ -426,12 +427,9 @@ void TscoreObject::openMusicXml(const QString& musicFile) { } int newKey = static_cast<int>(melody->key().value()); if (newKey != keySignature()) { - if (!m_keySignEnabled && qAbs(newKey) != 0) { - m_keySignEnabled = true; - emit keySignatureEnabledChanged(); - } + if (!m_keySignEnabled && qAbs(newKey) != 0) + setKeySignatureEnabled(true); setKeySignature(newKey); - emit keySignatureChanged(); } for (int n = 0; n < melody->length(); ++n) { addNote(melody->note(n)->p()); @@ -452,6 +450,8 @@ void TscoreObject::saveMusicXml(const QString& musicFile) { auto melody = new Tmelody(QStringLiteral("Nootka melody"), TkeySignature(static_cast<char>(keySignature()))); melody->setClef(clefType()); melody->setMeter(m_meter->meter()); + if (m_keySignEnabled) + melody->setKey(TkeySignature(static_cast<char>(m_keySignature))); for (int n = 0; n < notesCount(); ++n) { melody->addNote(Tchunk(m_notes[n])); } @@ -467,8 +467,9 @@ void TscoreObject::saveMusicXml(const QString& musicFile) { void TscoreObject::setKeySignatureEnabled(bool enKey) { if (enKey != m_keySignEnabled) { if (!enKey) - setKeySignature(0); + m_keySignature = 0; m_keySignEnabled = enKey; + emit keySignatureEnabledChanged(); if (notesCount() > 0) adjustScoreWidth(); } @@ -531,6 +532,7 @@ CHECKTIME( void TscoreObject::setReadOnly(bool ro) { if (m_readOnly != ro) { m_readOnly = ro; + emit readOnlyChanged(); } } diff --git a/src/libs/core/score/tscoreobject.h b/src/libs/core/score/tscoreobject.h index 483704106..cb3839a41 100644 --- a/src/libs/core/score/tscoreobject.h +++ b/src/libs/core/score/tscoreobject.h @@ -73,7 +73,7 @@ class NOOTKACORE_EXPORT TscoreObject : public QObject Q_PROPERTY(bool showNoteNames READ showNoteNames WRITE setShowNoteNames) Q_PROPERTY(QColor nameColor READ nameColor WRITE setNameColor) Q_PROPERTY(int nameStyle READ nameStyle WRITE setNameStyle) - Q_PROPERTY(bool readOnly READ readOnly WRITE setReadOnly) + Q_PROPERTY(bool readOnly READ readOnly WRITE setReadOnly NOTIFY readOnlyChanged) 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) @@ -371,6 +371,7 @@ signals: void selectedItemChanged(); void selectedNoteChanged(); + void readOnlyChanged(); void singleNoteChanged(); void recordModeChanged(); void scaleFactorChanged(); diff --git a/src/libs/core/tglobals.cpp b/src/libs/core/tglobals.cpp index 1eb54490e..632050d6f 100755 --- a/src/libs/core/tglobals.cpp +++ b/src/libs/core/tglobals.cpp @@ -164,10 +164,20 @@ bool Tglobals::enableDoubleAccids() const { return S->doubleAccidentalsEnabled; void Tglobals::setEnableDoubleAccids(bool dblAcc) { S->doubleAccidentalsEnabled = dblAcc; emit enableDoubleAccidsChanged(); } bool Tglobals::keySignatureEnabled() const { return S->keySignatureEnabled; } -void Tglobals::setKeySignatureEnabled(bool enKey) { S->keySignatureEnabled = enKey; emit enableKeySignatureChanged(); } +void Tglobals::setKeySignatureEnabled(bool enKey) { + if (enKey != S->keySignatureEnabled) { + S->keySignatureEnabled = enKey; + emit enableKeySignatureChanged(); + } +} int Tglobals::clefType() const { return static_cast<int>(S->clef); } -void Tglobals::setClefType(int clType) { S->clef = static_cast<Tclef::EclefType>(clType); emit clefTypeChanged(); } +void Tglobals::setClefType(int clType) { + if (static_cast<Tclef::EclefType>(clType) != S->clef) { + S->clef = static_cast<Tclef::EclefType>(clType); + emit clefTypeChanged(); + } +} QString Tglobals::majorKeyNameSufix() const { return S->majKeyNameSufix; } void Tglobals::setMajorKeyNameSufix(const QString& mkns) { S->majKeyNameSufix = mkns; } diff --git a/src/qml/MainScore.qml b/src/qml/MainScore.qml index e5d256dd7..9ecc90662 100644 --- a/src/qml/MainScore.qml +++ b/src/qml/MainScore.qml @@ -37,7 +37,6 @@ Score { clef: GLOB.clefType enableDoubleAccids: GLOB.enableDoubleAccids - enableKeySign: GLOB.keySignatureEnabled scoreObj.showNoteNames: GLOB.namesOnScore scoreObj.nameColor: GLOB.nameColor scoreObj.nameStyle: GLOB.noteNameStyle @@ -98,14 +97,16 @@ Score { Connections { target: SOUND onInitialized: { - scoreObj.singleNote = GLOB.singleNoteMode + singleNote = GLOB.singleNoteMode scoreObj.allowAdding = Qt.binding(function() { return !GLOB.singleNoteMode }) + enableKeySign = Qt.binding(function() { return GLOB.keySignatureEnabled }) updateScord() } } Connections { target: GLOB onKeyNameChanged: keyName.text = Qt.binding(keyName.getKeyNameText) + onClefTypeChanged: score.clef = GLOB.clefType onSingleNoteModeChanged: { scoreObj.singleNote = GLOB.singleNoteMode if (GLOB.singleNoteMode) { diff --git a/src/qml/score/KeySignature.qml b/src/qml/score/KeySignature.qml index 5bf910547..2ad4270a2 100644 --- a/src/qml/score/KeySignature.qml +++ b/src/qml/score/KeySignature.qml @@ -11,24 +11,17 @@ import Score 1.0 Item { id: keySig - property int key: 0 - // private readonly property var sharpPos: [ 0, 3, -1, 2, 5, 1, 4 ] readonly property var flatPos: [ 4, 1, 5, 2, 6, 3, 7 ] x: staff.clef.x + staff.clef.width + 1 - width: Math.max(6, (Math.abs(key) + 1) * 1.8) + width: Math.max(6, (Math.abs(score.keySignature) + 1) * 1.8) height: 10 - signal keySignatureChanged(var k) - - onKeyChanged: keySignatureChanged(key) - function accidOffset(c) { var accidOff = 1 switch (c) { - case Tclef.Bass_F: case Tclef.Bass_F_8down: accidOff = -1; break; @@ -48,12 +41,12 @@ Item { Text { font { family: "Scorek"; pixelSize: 8 } color: activPal.text - text: key < 0 ? "\ue260" : (key > 0 ? "\ue262" : "") // flat or sharp symbols + text: score.keySignature < 0 ? "\ue260" : (score.keySignature > 0 ? "\ue262" : "") // flat or sharp symbols x: index * 1.8 - y: (key < 0 ? flatPos[index] : sharpPos[index]) - accidOffset(score.clef) - + (score.clef === Tclef.Tenor_C && key > 0 && (index === 0 || index === 2) ? 7 : 0) - opacity: index < Math.abs(key) ? 1.0 : 0.0 - Behavior on opacity { enabled: GLOB.useAnimations; NumberAnimation { property: "opacity"; duration: 200 }} + y: (score.keySignature < 0 ? flatPos[index] : sharpPos[index]) - accidOffset(score.clef) + + (score.clef === Tclef.Tenor_C && score.keySignature > 0 && (index === 0 || index === 2) ? 7 : 0) + opacity: index < Math.abs(score.keySignature) ? 1.0 : 0.0 + Behavior on opacity { enabled: GLOB.useAnimations; NumberAnimation { property: "opacity"; duration: 300 }} } } @@ -63,12 +56,13 @@ Item { Repeater { model: 7 Text { // accidentals at lower staff + property var upperAccid: accidRep.itemAt(index) font { family: "Scorek"; pixelSize: 8 } color: activPal.text - text: accidRep.itemAt(index).text - y: accidRep.itemAt(index).y + 16 - x: accidRep.itemAt(index).x - opacity: accidRep.itemAt(index).opacity + text: upperAccid ? upperAccid.text : "" + y: upperAccid ? upperAccid.y + 16 : 0 + x: upperAccid ? upperAccid.x : 0 + opacity: upperAccid ? upperAccid.opacity : 0 } } } @@ -115,8 +109,8 @@ Item { // stops switching keys too quick (by wheel on touch pad) Timer { id: wheelTimer; interval: 250 } - function keyUp() { if (key < 7) ++key } - function keyDown() { if (key > -7) --key } + function keyUp() { if (score.keySignature < 7) ++score.keySignature } + function keyDown() { if (score.keySignature > -7) --score.keySignature } function deltaUp() { if (!wheelTimer.running) { diff --git a/src/qml/score/Meter.qml b/src/qml/score/Meter.qml index c16862b54..dde27cd4c 100644 --- a/src/qml/score/Meter.qml +++ b/src/qml/score/Meter.qml @@ -20,7 +20,7 @@ Text { color: activPal.text text: Noo.meter(score.meter).symbol() y: score.upperLine - 9 - x: (parent.keySignature ? parent.keySignature.x + parent.keySignature.width : 0.5 + parent.clef.width) + 1.0 + x: (staff0.keySignItem ? staff0.keySignItem.x + staff0.keySignItem.width : staff0.clef.x + staff0.clef.width) + 1.0 Loader { sourceComponent: score.clef === Tclef.PianoStaffClefs ? lowerMeter : null } Component { diff --git a/src/qml/score/Score.qml b/src/qml/score/Score.qml index 016844bf7..a8cec14a3 100644 --- a/src/qml/score/Score.qml +++ b/src/qml/score/Score.qml @@ -18,7 +18,8 @@ Flickable { property alias upperLine: staff0.upperLine property alias meter: scoreObj.meter property alias bgColor: bgRect.color - property bool enableKeySign: scoreObj.keySignatureEnabled + property alias enableKeySign: scoreObj.keySignatureEnabled + property alias keySignature: scoreObj.keySignature property bool enableDoubleAccids: false property alias workRhythm: scoreObj.workRhythm property alias scaleFactor: scoreObj.scaleFactor @@ -49,18 +50,12 @@ Flickable { onStaffCreate: { var c = Qt.createComponent("qrc:/Staff.qml") - var lastStaff = c.createObject(score.contentItem/*, { "clef.type": score.clef }*/) + var lastStaff = c.createObject(score.contentItem) staves.push(lastStaff) - lastStaff.enableKeySignature(enableKeySign && score.clef !== Tclef.NoClef) lastStaff.onDestroing.connect(removeStaff) - if (enableKeySign && score.clef !== Tclef.NoClef) { - lastStaff.keySignature.onKeySignatureChanged.connect(setKeySignature) - lastStaff.keySignature.key = staff0.keySignature.key - } score.lastStaff = lastStaff } onStavesHeightChanged: score.contentHeight = Math.max(stavesHeight, score.height) - onKeySignatureChanged: setKeySignature(scoreObj.keySignature) onMeterChanged: { if (rtmControl && meter !== Tmeter.NoMeter) { rtmControl.rtm = meter <= Tmeter.Meter_7_4 ? Trhythm.Quarter : Trhythm.Eighth @@ -139,28 +134,6 @@ Flickable { } } - onEnableKeySignChanged: { - staff0.enableKeySignature(enableKeySign) - if (enableKeySign) - staff0.keySignature.onKeySignatureChanged.connect(setKeySignature) - for (var s = 1; s < staves.length; ++s) { - staves[s].enableKeySignature(enableKeySign) - if (enableKeySign) - staff0.keySignature.onKeySignatureChanged.connect(setKeySignature) - } - scoreObj.keySignatureEnabled = enableKeySign - } - - function setKeySignature(key) { - if (enableKeySign) { - for (var s = 0; s < staves.length; ++s) { - if (key !== staves[s].keySignature.key) - staves[s].keySignature.key = key - } - scoreObj.keySignature = key - } - } - function ensureVisible(yy, hh) { if (contentY >= yy) contentY = yy diff --git a/src/qml/score/Staff.qml b/src/qml/score/Staff.qml index b88a85040..4663e03a4 100644 --- a/src/qml/score/Staff.qml +++ b/src/qml/score/Staff.qml @@ -16,9 +16,9 @@ Item { property alias upperLine: staffObj.upperLine property real linesCount: score.clef === Tclef.PianoStaffClefs ? 44 : 38 - property var keySignature: null + property var keySignItem: null property var meter: null - property real firstNoteX: (meter ? meter.x + meter.width : (keySignature ? keySignature.x + keySignature.width : 0.5 + clef.width)) + 1.0 + property real firstNoteX: (meter ? meter.x + meter.width : (keySignItem ? keySignItem.x + keySignItem.width : clef.x + clef.width)) + 1.0 property alias scordSpace: staffObj.scordSpace signal destroing(var nr) @@ -71,10 +71,7 @@ Item { Connections { target: score - onClefChanged: { - if (keySignature && meter) - updateMeterPos() - } + onEnableKeySignChanged: checkIsKeyEnabled() } Text { // measure number @@ -87,29 +84,20 @@ Item { color: activPal.text } - function enableKeySignature(en) { // key signature created on demand - if (en) { - if (!keySignature) { - var c = Qt.createComponent("qrc:/KeySignature.qml") - keySignature = c.createObject(staff) - if (meter) { - keySignature.onWidthChanged.connect(updateMeterPos) - updateMeterPos() - } - } - } else { - if (keySignature) { - keySignature.destroy() - keySignature = null - } - if (meter) - meter.x = clef.x + clef.width - } - } - - function updateMeterPos() { - meter.x = keySignature.x + keySignature.width + function checkIsKeyEnabled() { // key signature created on demand + if (score.enableKeySign) { + if (!keySignItem) { + var c = Qt.createComponent("qrc:/KeySignature.qml") + keySignItem = c.createObject(staff) + } + } else { + if (keySignItem) { + keySignItem.destroy() + keySignItem = null + } + } } - Component.onDestruction: { destroing(staffObj.number) } + Component.onCompleted: checkIsKeyEnabled() + Component.onDestruction: destroing(staffObj.number) } diff --git a/src/qml/shared/InstrumentSelector.qml b/src/qml/shared/InstrumentSelector.qml index ab983a436..05c1f707a 100644 --- a/src/qml/shared/InstrumentSelector.qml +++ b/src/qml/shared/InstrumentSelector.qml @@ -25,6 +25,10 @@ Tumbler { text: Noo.instr(modelData).glyph anchors.horizontalCenter: parent.horizontalCenter color: instrTumb.currentIndex === modelData ? activPal.highlightedText : activPal.text + MouseArea { + anchors.fill: parent + onClicked: instrTumb.currentIndex = modelData + } } Text { anchors.horizontalCenter: parent.horizontalCenter -- GitLab