diff --git a/libmscore/note.cpp b/libmscore/note.cpp index b5d7c95091..54d3a86f3a 100644 --- a/libmscore/note.cpp +++ b/libmscore/note.cpp @@ -1496,7 +1496,7 @@ public: EditMode mode = EditMode_Undefined; QPointF delta; - static constexpr double MODE_TRANSITION_LIMIT_DEGREES = 15.0; + static constexpr double MODE_TRANSITION_LIMIT_DEGREES = 25.0; static inline EditMode editModeByDragDirection(const qreal& deltaX, const qreal& deltaY) { qreal x = qAbs(deltaX); @@ -1510,7 +1510,7 @@ public: qreal degrees = (qAcos(radians) * 180.0) / M_PI; - qDebug() << "YOPTA DEGREES " << degrees; + qDebug() << "NOTE DRAG DEGREES " << degrees; if (degrees >= MODE_TRANSITION_LIMIT_DEGREES) { return NoteEditData::EditMode_ChangePitch; @@ -2424,6 +2424,35 @@ void Note::verticalDrag(EditData &ed) } } +void Note::normalizeLeftDragDelta(Segment* seg, EditData &ed, NoteEditData* ned) + { + Segment* previous = seg->prev(); + + if (previous) { + + qreal minDist = previous->minHorizontalCollidingDistance(seg); + + qreal diff = (ed.pos.x()) - (previous->pageX() + minDist); + + qreal distanceBetweenSegments = (previous->pageX() + minDist) - seg->pageX(); + + if (diff < 0) + ned->delta.setX(distanceBetweenSegments); + } + else { + Measure* measure = seg->measure(); + + qreal minDist = score()->styleP(Sid::barNoteDistance); + + qreal diff = (ed.pos.x()) - (measure->pageX() + minDist); + + qreal distanceBetweenSegments = (measure->pageX() + minDist) - seg->pageX(); + + if (diff < 0) + ned->delta.setX(distanceBetweenSegments); + } + } + void Note::horizontalDrag(EditData &ed) { Chord* ch = chord(); @@ -2436,10 +2465,19 @@ void Note::horizontalDrag(EditData &ed) if (seg && (((ed.buttons & Qt::LeftButton) && !(ed.modifiers & Qt::ControlModifier)) || (ed.modifiers & Qt::ShiftModifier))) { - const Spatium deltaSp = Spatium(ned->delta.x() / spatium()); - seg->undoChangeProperty(Pid::LEADING_SPACE, seg->extraLeadingSpace() + deltaSp); + + if (ed.delta.x() < 0) + normalizeLeftDragDelta(seg, ed, ned); } + const Spatium deltaSp = Spatium(ned->delta.x() / spatium()); + + if (seg->extraLeadingSpace() + deltaSp < Spatium(0)) { + return; + } + + seg->undoChangeProperty(Pid::LEADING_SPACE, seg->extraLeadingSpace() + deltaSp); + triggerLayout(); } diff --git a/libmscore/note.h b/libmscore/note.h index 7c19a8d9f0..d3739e8ce9 100644 --- a/libmscore/note.h +++ b/libmscore/note.h @@ -40,6 +40,7 @@ class Accidental; class NoteDot; class Spanner; class StaffType; +class NoteEditData; enum class SymId; enum class AccidentalType : char; @@ -283,6 +284,8 @@ class Note final : public Element { bool isNoteName() const; SymId noteHead() const; + void normalizeLeftDragDelta(Segment* seg, EditData &ed, NoteEditData* ned); + public: Note(Score* s = 0); Note(const Note&, bool link = false);