diff --git a/src/libs/core/score/tmeasureobject.h b/src/libs/core/score/tmeasureobject.h index 7ed22818791ac6c93fc3fee22b623df1de99ce68..587123c16ca4c85a4ac21ef6ebf11908333bb91b 100644 --- a/src/libs/core/score/tmeasureobject.h +++ b/src/libs/core/score/tmeasureobject.h @@ -127,6 +127,8 @@ protected: * Checks notes rhythms of group @p segmentId belongs to * for 8ths and 16ths and crates beams (@p TbeamObject) if they occurs * It can be called before @p TnoteObject will be created + * When beam was set or note was added to it it returns number of that group + * or -1 if no beams were added */ int beamGroup(int segmentId); diff --git a/src/libs/core/score/tnoteobject.cpp b/src/libs/core/score/tnoteobject.cpp index 041b0d0636e235ff6141f51b6342d919f6fd8a59..adc9425caf9aa8a9c21fa52069f8ce311c4a12a9 100644 --- a/src/libs/core/score/tnoteobject.cpp +++ b/src/libs/core/score/tnoteobject.cpp @@ -99,6 +99,7 @@ TnoteObject::TnoteObject(TstaffObject* staffObj, TnotePair* wrapper) : m_alter = qobject_cast<QQuickItem*>(comp.create()); m_alter->setParentItem(m_head); + connect(m_alter, &QQuickItem::widthChanged, this, &TnoteObject::alterWidthChanged); m_flag = qobject_cast<QQuickItem*>(comp.create()); m_flag->setParentItem(m_stem); @@ -107,6 +108,7 @@ TnoteObject::TnoteObject(TstaffObject* staffObj, TnotePair* wrapper) : setColor(qApp->palette().text().color()); setHeight(staffObj->staffItem()->height()); + setAcceptHoverEvents(true); } @@ -226,12 +228,12 @@ void TnoteObject::setX(qreal xx) { } -qreal TnoteObject::rightX() { +qreal TnoteObject::rightX() const { return x() + width() + staff()->gapFactor() * rhythmFactor() - m_alter->width(); } -qreal TnoteObject::rhythmFactor() { +qreal TnoteObject::rhythmFactor() const { if (m_note->rhythm() == Trhythm::NoRhythm) return 0.0; @@ -360,6 +362,22 @@ void TnoteObject::keySignatureChanged() { } +void TnoteObject::hoverEnterEvent(QHoverEvent*) { + m_measure->score()->changeActiveNote(this); +} + + +void TnoteObject::hoverLeaveEvent(QHoverEvent*) { + m_measure->score()->changeActiveNote(nullptr); +} + + +void TnoteObject::hoverMoveEvent(QHoverEvent* event) { + if (static_cast<int>(m_measure->score()->activeYpos()) != static_cast<int>(event->pos().y())) + m_measure->score()->setActiveNotePos(qFloor(event->pos().y())); +} + + //################################################################################################# //################### PRIVATE ############################################ //################################################################################################# @@ -389,7 +407,7 @@ void TnoteObject::updateAlter() { void TnoteObject::updateWidth() { - setWidth(m_alter->width() + m_head->width() + (m_note->rtm.stemDown() ? 0.0 : m_flag->width() - 0.5)); + setWidth(m_alter->width() + m_head->width() + (m_note->isRest() ? 0.0 : m_note->rtm.stemDown() ? 0.0 : m_flag->width() - 0.5)); updateTieScale(); } @@ -428,4 +446,6 @@ void TnoteObject::checkStem() { m_stem->setVisible(true); } else m_stem->setVisible(false); + if (m_stemHeight != m_stem->height()) + m_stemHeight = m_stem->height(); } diff --git a/src/libs/core/score/tnoteobject.h b/src/libs/core/score/tnoteobject.h index 11de61a7b5665f22ce0c6aeeb859f628bf413f0a..a01c496d2299d2e2a4b663843756741aee3da262 100644 --- a/src/libs/core/score/tnoteobject.h +++ b/src/libs/core/score/tnoteobject.h @@ -40,7 +40,9 @@ class NOOTKACORE_EXPORT TnoteObject : public QQuickItem Q_OBJECT - Q_PROPERTY(qreal notePosY READ notePosY WRITE setNotePosY NOTIFY notePosYchanged) + Q_PROPERTY(qreal notePosY READ notePosY NOTIFY notePosYchanged) + Q_PROPERTY(qreal alterWidth READ alterWidth NOTIFY alterWidthChanged) + Q_PROPERTY(int index READ index) friend class TscoreObject; friend class TstaffObject; @@ -71,6 +73,8 @@ public: qreal stemHeight() const { return m_stemHeight; } void setStemHeight(qreal sh); + qreal alterWidth() { return m_alter->width(); } + QColor color() { return m_head->property("color").value<QColor>(); } void setColor(const QColor& c); @@ -84,12 +88,12 @@ public: /** * shortcut to X coordinate of right note corner plus gap related to rhythm and staff gap factor */ - qreal rightX(); + qreal rightX() const; /** * Returns gap factor after this note item depends on current rhythm value */ - qreal rhythmFactor(); + qreal rhythmFactor() const; /** * Returns position of the top of this note stem in staff coordinates @@ -105,6 +109,7 @@ public: signals: void notePosYchanged(); + void alterWidthChanged(); protected: QString getAccidText(); @@ -128,6 +133,10 @@ protected: */ void checkTie(); + void hoverEnterEvent(QHoverEvent*) override; + void hoverLeaveEvent(QHoverEvent*) override; + void hoverMoveEvent(QHoverEvent* event) override; + private: TstaffObject *m_staff; diff --git a/src/libs/core/score/tstaffobject.h b/src/libs/core/score/tstaffobject.h index 013ef49a7bad55d7b6ffe67bbabb1f0a9e23df1a..dea0fc514ae49380b605a010d53e3121c25d4c57 100644 --- a/src/libs/core/score/tstaffobject.h +++ b/src/libs/core/score/tstaffobject.h @@ -68,7 +68,7 @@ public: /** * Y coordinate of upper staff line */ - qreal upperLine() { return m_upperLine; } + qreal upperLine() const { return m_upperLine; } void setUpperLine(qreal upLine); QQuickItem* staffItem() { return m_staffItem; } @@ -77,7 +77,7 @@ public: /** * X coordinate of first note (or width of clef + key sign. + meter) */ - qreal notesIndent() { return m_notesIndent; } + qreal notesIndent() const { return m_notesIndent; } void setNotesIndent(qreal ni); int firstMeasureNr(); @@ -111,9 +111,9 @@ public: /** * Width of all notes on the staff */ - qreal allNotesWidth() { return m_allNotesWidth; } + qreal allNotesWidth() const { return m_allNotesWidth; } - qreal gapsSum() { return m_gapsSum; } + qreal gapsSum() const { return m_gapsSum; } /** * Scaling factor of the staff @@ -136,9 +136,9 @@ protected: void fit(); void updateNotesPos(int startMeasure = 0); - int firstMeasureId() { return m_firstMeasureId; } + int firstMeasureId() const { return m_firstMeasureId; } void setFirstMeasureId(int firstId) { m_firstMeasureId = firstId; emit firstMeasureNrChanged(); } - int lastMeasureId() { return m_lastMeasureId; } + int lastMeasureId() const { return m_lastMeasureId; } void setLastMeasureId(int lastId) { m_lastMeasureId = lastId; } /**