diff --git a/TODO b/TODO index 373d3b0e5ea19f4696e1c2187202ce25d9fec86e..792decf96c9184ecfc09518fe2dae38ecdae4da9 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 6039ad8e05a7852d4eb21b1d64fae88f43ed7a98..59a64a838326cac9dee62147631047d3a420c445 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 483704106eb4100cbeb401a01e6117828d3d4ac9..cb3839a414a47afc6a15b8e8639a1be2d2f15e0c 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 1eb54490e9df82823a536a0e21f9a219f08d87cd..632050d6fb112e2d197da74a53d8dd8ee8df5eb1 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 e5d256dd7fb52294110e1bb0edcb9b6b275bcdd7..9ecc906626e261fdb004be4f5d6feaee238ceb5a 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 5bf91054715365e1967d408602e5df9ced3e48ea..2ad4270a23cd98c58db6d63002b703965b280dae 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 c16862b54ec073d4f179095646e5f6363de079c0..dde27cd4c09f456cbb68e86e19c4ad399ee39db9 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 016844bf7bb5d9ad096dd5b2df15843a8eb9870e..a8cec14a3b9b2cf711c9b7ff27a62fd47f69b518 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 b88a850409e8f6cb9d29328dccdfe38fb7f69125..4663e03a429add0ce8badbadea14bc7e2bf290a1 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 ab983a436b3327c73bbe4daeeee336ac1628da68..05c1f707a1690404ea7150b95cba447e396394d6 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