Added boundaries for the left-side note dragging

This commit is contained in:
pereverzev_v 2019-12-21 15:09:33 +02:00 committed by Dmitri Ovodok
parent 6b7e2d25a2
commit e1073c5c98
2 changed files with 45 additions and 4 deletions

View file

@ -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();
}

View file

@ -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);