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;
ed.addData(bed);
QPointF pt(ed.startMove - pagePos());
QPointF pt(ed.normalizedStartMove - pagePos());
qreal ydiff = 100000000.0;
int idx = (_direction == Direction::AUTO || _direction == Direction::DOWN) ? 0 : 1;
int i = 0;

View file

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

View file

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

View file

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

View file

@ -120,9 +120,12 @@ class EditData {
QPointF pos;
QPointF startMove;
QPointF normalizedStartMove; ///< Introduced for transition of drag logic. Don't use in new code.
QPoint startMovePixel;
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 vRaster { false };
@ -535,6 +538,7 @@ class ElementEditData {
public:
Element* e;
QList<PropertyData> propertyData;
QPointF initOffset; ///< for dragging: difference between actual offset and editData.moveDelta
virtual ~ElementEditData() = default;
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)
{
setOffset(offset() + (ed.pos - ed.lastPos));
setOffset(offset() + ed.evtDelta);
setOffsetChanged(true);
if (isStyled(Pid::OFFSET))

View file

@ -2424,7 +2424,7 @@ QRectF Note::drag(EditData& ed)
return QRectF();
}
QPointF delta = ed.pos - ed.lastPos;
QPointF delta = ed.evtDelta;
noteEditData->delta = delta;
if (noteEditData->mode == NoteEditData::EditMode_Undefined) {
@ -2468,11 +2468,11 @@ void Note::editDrag(EditData& editData)
if (ch->notes().size() == 1) {
// if the chord contains only this note, then move the whole chord
// including stem, flag etc.
ch->undoChangeProperty(Pid::OFFSET, ch->offset() + offset() + editData.delta);
ch->undoChangeProperty(Pid::OFFSET, ch->offset() + offset() + editData.evtDelta);
setOffset(QPointF());
}
else
setOffset(offset() + editData.delta);
setOffset(offset() + editData.evtDelta);
triggerLayout();
}
@ -2495,7 +2495,7 @@ void Note::verticalDrag(EditData &ed)
qreal _spatium = spatium();
bool tab = st->isTabStaff();
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) {
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.modifiers & Qt::ShiftModifier))) {
if (ed.delta.x() < 0)
if (ed.moveDelta.x() < 0)
normalizeLeftDragDelta(seg, ed, ned);
}

View file

@ -31,7 +31,7 @@ void ScoreView::startDrag()
{
editData.grips = 0;
editData.clearData();
editData.startMove -= editData.element->offset();
editData.normalizedStartMove = editData.startMove - editData.element->offset();
_score->startCmd();
@ -47,21 +47,29 @@ void ScoreView::startDrag()
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");
QPointF pt(delta);
if (qApp->keyboardModifiers() == Qt::ShiftModifier)
pt.setX(editData.element->offset().x());
else if (qApp->keyboardModifiers() == Qt::ControlModifier)
pt.setY(editData.element->offset().y());
if (qApp->keyboardModifiers() == Qt::ShiftModifier) {
pt.setX(editData.delta.x());
evtDelta.setX(0.0);
}
else if (qApp->keyboardModifiers() == Qt::ControlModifier) {
pt.setY(editData.delta.y());
evtDelta.setY(0.0);
}
editData.lastPos = editData.pos;
editData.hRaster = mscore->hRaster();
editData.vRaster = mscore->vRaster();
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 bool filterType = sel.isRange();