From b8fdbfca299b91b61e84bacbe8fe2770e1e404ca Mon Sep 17 00:00:00 2001
From: SeeLook <SeeLook@localhost>
Date: Sun, 7 Jan 2018 13:27:44 +0100
Subject: [PATCH] Fixed guitar to show properly just clicked position. Common
 method for that.

---
 src/libs/core/CMakeLists.txt            |  1 +
 src/libs/core/instruments/tguitarbg.cpp | 45 +++++++++++++++----------
 src/libs/core/instruments/tguitarbg.h   |  2 ++
 src/libs/core/tglobals.cpp              |  2 +-
 4 files changed, 32 insertions(+), 18 deletions(-)

diff --git a/src/libs/core/CMakeLists.txt b/src/libs/core/CMakeLists.txt
index 06b5b4850..72974745b 100644
--- a/src/libs/core/CMakeLists.txt
+++ b/src/libs/core/CMakeLists.txt
@@ -32,6 +32,7 @@ set(LIB_NOOTKACORE_SRC
   music/tmelody.cpp
   music/tmeter.cpp
   music/tnotestruct.cpp
+  music/tnotedata.cpp
 
   score/tscoreobject.cpp
   score/tstaffobject.cpp
diff --git a/src/libs/core/instruments/tguitarbg.cpp b/src/libs/core/instruments/tguitarbg.cpp
index 4e8e8d910..26ad24027 100644
--- a/src/libs/core/instruments/tguitarbg.cpp
+++ b/src/libs/core/instruments/tguitarbg.cpp
@@ -99,6 +99,25 @@ void TguitarBg::setNote(const Tnote& n) {
 }
 
 
+void TguitarBg::setFingerPos(const TfingerPos& fp) {
+  QPoint p = fretToPos(fp).toPoint();
+  for (int s = 0; s < 6; ++ s) {
+    if (fp.fret() == 0) { // open string
+        m_fingerItems[s]->setVisible(false);
+        m_stringItems[s]->setVisible(fp.str() == s + 1);
+    } else { // some fret
+        if (fp.isValid() && fp.str() == s + 1) {
+            m_fingerItems[s]->setVisible(true);
+            m_fingerItems[s]->setX(p.x());
+            m_fingerItems[s]->setY(p.y() - m_fingerItems[s]->height() * 0.15);
+        } else
+            m_fingerItems[s]->setVisible(false);
+        m_stringItems[s]->setVisible(false);
+    }
+  }
+}
+
+
 qreal TguitarBg::xiiFret() const {
   return static_cast<qreal>(m_fretsPos[11]);
 }
@@ -260,21 +279,7 @@ void TguitarBg::paint(QPainter* painter) {
 void TguitarBg::askQuestion(const Tnote& n, int noteData) {
   p_note = n;
   TfingerPos fp(static_cast<quint8>(noteData));
-  QPoint p = fretToPos(fp).toPoint(); 
-  for (int s = 0; s < 6; ++ s) {
-    if (fp.fret() == 0) { // open string
-        m_fingerItems[s]->setVisible(false);
-        m_stringItems[s]->setVisible(fp.str() == s + 1);
-    } else { // some fret
-        if (fp.str() == s + 1) {
-            m_fingerItems[s]->setVisible(true);
-            m_fingerItems[s]->setX(p.x());
-            m_fingerItems[s]->setY(p.y() - m_fingerItems[s]->height() * 0.15);
-        } else
-            m_fingerItems[s]->setVisible(false);
-        m_stringItems[s]->setVisible(false);
-    }
-  }
+  setFingerPos(fp);
 }
 
 
@@ -364,11 +369,17 @@ void TguitarBg::mousePressEvent(QMouseEvent* event) {
 CHECKTIME (
   if (event->buttons() & Qt::LeftButton) {
     if (m_curStr < 7) {
-      Tnote n(GLOB->Gtune()->strChromatic(m_curStr + 1) + m_curFret);
-      setNote(n);
       m_selectedPos.setPos(m_curStr + 1, m_curFret);
+      Tnote n(GLOB->Gtune()->strChromatic(m_curStr + 1) + m_curFret);
+      if (GLOB->showOtherPos())
+          setNote(n); // selects all possible positions on the fingerboard
+      else { // it selects only just clicked position
+          p_note = n;
+          setFingerPos(m_selectedPos);
+      }
       emit fingerPosChanged();
       emit noteChanged();
+      hoverLeaveEvent(nullptr); // hide highlight that covers selected fret/string
     }
   }
 )
diff --git a/src/libs/core/instruments/tguitarbg.h b/src/libs/core/instruments/tguitarbg.h
index 232a3756a..0d837990e 100644
--- a/src/libs/core/instruments/tguitarbg.h
+++ b/src/libs/core/instruments/tguitarbg.h
@@ -63,6 +63,8 @@ public:
 
   void setNote(const Tnote& n) override;
 
+  void setFingerPos(const TfingerPos& fp);
+
   void paint(QPainter* painter) override;
 
   void askQuestion(const Tnote& n, int noteData) override;
diff --git a/src/libs/core/tglobals.cpp b/src/libs/core/tglobals.cpp
index af57c6616..3218c27ff 100755
--- a/src/libs/core/tglobals.cpp
+++ b/src/libs/core/tglobals.cpp
@@ -489,7 +489,7 @@ void Tglobals::loadSettings(QSettings* cfg) {
       if (cfg->contains("fingerColor"))
           GfingerColor = cfg->value(QStringLiteral("fingerColor")).value<QColor>();
       else
-          GfingerColor = QColor(255, 0, 127, 200); // nice pink
+          GfingerColor = QColor(255, 0, 127, 150); // nice pink with translucency
       if (cfg->contains("selectedColor"))
           GselectedColor = cfg->value(QStringLiteral("selectedColor")).value<QColor>();
       else
-- 
GitLab