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:
parent
52a4af41b2
commit
ad6c8581d7
8 changed files with 40 additions and 21 deletions
|
@ -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;
|
||||
|
|
|
@ -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());
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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) {
|
||||
|
|
|
@ -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) })); }
|
||||
|
|
|
@ -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))
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
||||
|
|
|
@ -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();
|
||||
|
|
Loading…
Reference in a new issue