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;
|
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;
|
||||||
|
|
|
@ -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());
|
||||||
|
|
|
@ -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;
|
||||||
|
|
|
@ -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) {
|
||||||
|
|
|
@ -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) })); }
|
||||||
|
|
|
@ -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))
|
||||||
|
|
|
@ -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);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -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();
|
||||||
|
|
Loading…
Reference in a new issue