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