Restructure drag-related variables to have them defined more clearly

Also restore an ability to use Ctrl or Shift for horizontal/vertical drag of lines
This commit is contained in:
Dmitri Ovodok 2020-02-12 14:27:45 +02:00
parent 52a4af41b2
commit ad6c8581d7
8 changed files with 40 additions and 21 deletions

View file

@ -2565,7 +2565,7 @@ void Beam::initBeamEditData(EditData& ed)
bed->editFragment = 0; bed->editFragment = 0;
ed.addData(bed); ed.addData(bed);
QPointF pt(ed.startMove - pagePos()); QPointF pt(ed.normalizedStartMove - pagePos());
qreal ydiff = 100000000.0; qreal ydiff = 100000000.0;
int idx = (_direction == Direction::AUTO || _direction == Direction::DOWN) ? 0 : 1; int idx = (_direction == Direction::AUTO || _direction == Direction::DOWN) ? 0 : 1;
int i = 0; int i = 0;

View file

@ -603,7 +603,7 @@ Element* Box::drop(EditData& data)
QRectF HBox::drag(EditData& data) QRectF HBox::drag(EditData& data)
{ {
QRectF r(canvasBoundingRect()); QRectF r(canvasBoundingRect());
qreal diff = data.delta.x(); qreal diff = data.evtDelta.x();
qreal x1 = offset().x() + diff; qreal x1 = offset().x() + diff;
if (parent()->type() == ElementType::VBOX) { if (parent()->type() == ElementType::VBOX) {
VBox* vb = toVBox(parent()); VBox* vb = toVBox(parent());

View file

@ -359,15 +359,18 @@ QRectF Dynamic::drag(EditData& ed)
if (km != (Qt::ShiftModifier | Qt::ControlModifier)) { if (km != (Qt::ShiftModifier | Qt::ControlModifier)) {
int si = staffIdx(); int si = staffIdx();
Segment* seg = segment(); Segment* seg = segment();
score()->dragPosition(ed.pos, &si, &seg); score()->dragPosition(canvasPos(), &si, &seg);
if (seg != segment() || staffIdx() != si) { if (seg != segment() || staffIdx() != si) {
const QPointF oldOffset = offset();
QPointF pos1(canvasPos()); QPointF pos1(canvasPos());
score()->undo(new ChangeParent(this, seg, si)); score()->undo(new ChangeParent(this, seg, si));
setOffset(QPointF()); setOffset(QPointF());
layout(); layout();
QPointF pos2(canvasPos()); QPointF pos2(canvasPos());
setOffset(pos1 - pos2); const QPointF newOffset = pos1 - pos2;
ed.startMove = pos2; setOffset(newOffset);
ElementEditData* eed = ed.getData(this);
eed->initOffset += newOffset - oldOffset;
} }
} }
return f; return f;

View file

@ -1946,6 +1946,7 @@ void Element::startDrag(EditData& ed)
eed->e = this; eed->e = this;
eed->pushProperty(Pid::OFFSET); eed->pushProperty(Pid::OFFSET);
eed->pushProperty(Pid::AUTOPLACE); eed->pushProperty(Pid::AUTOPLACE);
eed->initOffset = offset();
ed.addData(eed); ed.addData(eed);
if (ed.modifiers & Qt::AltModifier) if (ed.modifiers & Qt::AltModifier)
setAutoplace(false); setAutoplace(false);
@ -1963,8 +1964,11 @@ QRectF Element::drag(EditData& ed)
const QRectF r0(canvasBoundingRect()); const QRectF r0(canvasBoundingRect());
qreal x = ed.delta.x(); const ElementEditData* eed = ed.getData(this);
qreal y = ed.delta.y();
const QPointF offset0 = ed.moveDelta + eed->initOffset;
qreal x = offset0.x();
qreal y = offset0.y();
qreal _spatium = spatium(); qreal _spatium = spatium();
if (ed.hRaster) { if (ed.hRaster) {

View file

@ -120,9 +120,12 @@ class EditData {
QPointF pos; QPointF pos;
QPointF startMove; QPointF startMove;
QPointF normalizedStartMove; ///< Introduced for transition of drag logic. Don't use in new code.
QPoint startMovePixel; QPoint startMovePixel;
QPointF lastPos; QPointF lastPos;
QPointF delta; QPointF delta; ///< This property is deprecated, use evtDelta or moveDelta instead. In normal drag equals to moveDelta, in edit drag - to evtDelta
QPointF evtDelta; ///< Mouse offset for the last mouse move event
QPointF moveDelta; ///< Mouse offset from the start of mouse move
bool hRaster { false }; bool hRaster { false };
bool vRaster { false }; bool vRaster { false };
@ -535,6 +538,7 @@ class ElementEditData {
public: public:
Element* e; Element* e;
QList<PropertyData> propertyData; QList<PropertyData> propertyData;
QPointF initOffset; ///< for dragging: difference between actual offset and editData.moveDelta
virtual ~ElementEditData() = default; virtual ~ElementEditData() = default;
void pushProperty(Pid pid) { propertyData.push_back(PropertyData({ pid, e->getProperty(pid), e->propertyFlags(pid) })); } void pushProperty(Pid pid) { propertyData.push_back(PropertyData({ pid, e->getProperty(pid), e->propertyFlags(pid) })); }

View file

@ -547,7 +547,7 @@ QVector<QLineF> LineSegment::dragAnchorLines() const
QRectF LineSegment::drag(EditData& ed) QRectF LineSegment::drag(EditData& ed)
{ {
setOffset(offset() + (ed.pos - ed.lastPos)); setOffset(offset() + ed.evtDelta);
setOffsetChanged(true); setOffsetChanged(true);
if (isStyled(Pid::OFFSET)) if (isStyled(Pid::OFFSET))

View file

@ -2424,7 +2424,7 @@ QRectF Note::drag(EditData& ed)
return QRectF(); return QRectF();
} }
QPointF delta = ed.pos - ed.lastPos; QPointF delta = ed.evtDelta;
noteEditData->delta = delta; noteEditData->delta = delta;
if (noteEditData->mode == NoteEditData::EditMode_Undefined) { if (noteEditData->mode == NoteEditData::EditMode_Undefined) {
@ -2468,11 +2468,11 @@ void Note::editDrag(EditData& editData)
if (ch->notes().size() == 1) { if (ch->notes().size() == 1) {
// if the chord contains only this note, then move the whole chord // if the chord contains only this note, then move the whole chord
// including stem, flag etc. // including stem, flag etc.
ch->undoChangeProperty(Pid::OFFSET, ch->offset() + offset() + editData.delta); ch->undoChangeProperty(Pid::OFFSET, ch->offset() + offset() + editData.evtDelta);
setOffset(QPointF()); setOffset(QPointF());
} }
else else
setOffset(offset() + editData.delta); setOffset(offset() + editData.evtDelta);
triggerLayout(); triggerLayout();
} }
@ -2495,7 +2495,7 @@ void Note::verticalDrag(EditData &ed)
qreal _spatium = spatium(); qreal _spatium = spatium();
bool tab = st->isTabStaff(); bool tab = st->isTabStaff();
qreal step = _spatium * (tab ? st->lineDistance().val() : 0.5); qreal step = _spatium * (tab ? st->lineDistance().val() : 0.5);
int lineOffset = lrint(ed.delta.y() / step); int lineOffset = lrint(ed.moveDelta.y() / step);
if (tab) { if (tab) {
const StringData* strData = staff()->part()->instrument()->stringData(); const StringData* strData = staff()->part()->instrument()->stringData();
@ -2582,7 +2582,7 @@ void Note::horizontalDrag(EditData &ed)
(((ed.buttons & Qt::LeftButton) && !(ed.modifiers & Qt::ControlModifier)) (((ed.buttons & Qt::LeftButton) && !(ed.modifiers & Qt::ControlModifier))
|| (ed.modifiers & Qt::ShiftModifier))) { || (ed.modifiers & Qt::ShiftModifier))) {
if (ed.delta.x() < 0) if (ed.moveDelta.x() < 0)
normalizeLeftDragDelta(seg, ed, ned); normalizeLeftDragDelta(seg, ed, ned);
} }

View file

@ -31,7 +31,7 @@ void ScoreView::startDrag()
{ {
editData.grips = 0; editData.grips = 0;
editData.clearData(); editData.clearData();
editData.startMove -= editData.element->offset(); editData.normalizedStartMove = editData.startMove - editData.element->offset();
_score->startCmd(); _score->startCmd();
@ -47,21 +47,29 @@ void ScoreView::startDrag()
void ScoreView::doDragElement(QMouseEvent* ev) void ScoreView::doDragElement(QMouseEvent* ev)
{ {
QPointF delta = toLogical(ev->pos()) - editData.startMove; const QPointF logicalPos = toLogical(ev->pos());
QPointF delta = logicalPos - editData.normalizedStartMove;
QPointF evtDelta = logicalPos - editData.pos;
TourHandler::startTour("autoplace-tour"); TourHandler::startTour("autoplace-tour");
QPointF pt(delta); QPointF pt(delta);
if (qApp->keyboardModifiers() == Qt::ShiftModifier) if (qApp->keyboardModifiers() == Qt::ShiftModifier) {
pt.setX(editData.element->offset().x()); pt.setX(editData.delta.x());
else if (qApp->keyboardModifiers() == Qt::ControlModifier) evtDelta.setX(0.0);
pt.setY(editData.element->offset().y()); }
else if (qApp->keyboardModifiers() == Qt::ControlModifier) {
pt.setY(editData.delta.y());
evtDelta.setY(0.0);
}
editData.lastPos = editData.pos; editData.lastPos = editData.pos;
editData.hRaster = mscore->hRaster(); editData.hRaster = mscore->hRaster();
editData.vRaster = mscore->vRaster(); editData.vRaster = mscore->vRaster();
editData.delta = pt; editData.delta = pt;
editData.pos = toLogical(ev->pos()); editData.moveDelta = pt + (editData.normalizedStartMove - editData.startMove); // TODO: restructure
editData.evtDelta = evtDelta;
editData.pos = logicalPos;
const Selection& sel = _score->selection(); const Selection& sel = _score->selection();
const bool filterType = sel.isRange(); const bool filterType = sel.isRange();