Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

fix #291261: Make volta mouse drops apply only to first staff by default #5182

Merged
merged 1 commit into from Aug 30, 2019
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
6 changes: 4 additions & 2 deletions libmscore/cmd.cpp
Expand Up @@ -280,11 +280,13 @@ void Score::deletePostponed()
// HAIRPIN, LET_RING, VIBRATO and TEXTLINE
//---------------------------------------------------------

void Score::cmdAddSpanner(Spanner* spanner, const QPointF& pos)
void Score::cmdAddSpanner(Spanner* spanner, const QPointF& pos, bool firstStaffOnly)
{
int staffIdx;
Segment* segment;
MeasureBase* mb = pos2measure(pos, &staffIdx, 0, &segment, 0);
if (firstStaffOnly)
staffIdx = 0;
// ignore if we do not have a measure
if (mb == 0 || mb->type() != ElementType::MEASURE) {
qDebug("cmdAddSpanner: cannot put object here");
Expand All @@ -308,7 +310,7 @@ void Score::cmdAddSpanner(Spanner* spanner, const QPointF& pos)
Measure* m = toMeasure(mb);
QRectF b(m->canvasBoundingRect());

if (pos.x() >= (b.x() + b.width() * .5) && m != lastMeasureMM())
if (pos.x() >= (b.x() + b.width() * .5) && m != lastMeasureMM() && m->nextMeasure()->system() == m->system())
m = m->nextMeasure();
spanner->setTick(m->tick());
spanner->setTick2(m->endTick());
Expand Down
2 changes: 1 addition & 1 deletion libmscore/score.h
Expand Up @@ -1086,7 +1086,7 @@ class Score : public QObject, public ScoreElement {
bool isSpannerStartEnd(const Fraction& tick, int track) const;
void removeSpanner(Spanner*);
void addSpanner(Spanner*);
void cmdAddSpanner(Spanner* spanner, const QPointF& pos);
void cmdAddSpanner(Spanner* spanner, const QPointF& pos, bool firstStaffOnly = false);
void cmdAddSpanner(Spanner* spanner, int staffIdx, Segment* startSegment, Segment* endSegment);
void checkSpanner(const Fraction& startTick, const Fraction& lastTick);
const std::set<Spanner*> unmanagedSpanners() { return _unmanagedSpanner; }
Expand Down
33 changes: 24 additions & 9 deletions mscore/dragdrop.cpp
Expand Up @@ -172,16 +172,25 @@ bool ScoreView::dragTimeAnchorElement(const QPointF& pos)

bool ScoreView::dragMeasureAnchorElement(const QPointF& pos)
{
Measure* m = _score->searchMeasure(pos);
if (m) {
QRectF b(m->canvasBoundingRect());
int staffIdx;
Segment* seg;
MeasureBase* mb = _score->pos2measure(pos, &staffIdx, 0, &seg, 0);
if (!(editData.modifiers & Qt::ControlModifier))
staffIdx = 0;
int track = staffIdx * VOICES;

QPointF anchor;
if (pos.x() < (b.x() + b.width() * .5) || m == _score->lastMeasureMM())
anchor = m->canvasBoundingRect().topLeft();
else
anchor = m->canvasBoundingRect().topRight();
if (mb && mb->isMeasure()) {
Measure* m = toMeasure(mb);
System* s = m->system();
qreal y = s->staff(staffIdx)->y() + s->pos().y() + s->page()->pos().y();
QRectF b(m->canvasBoundingRect());
if (pos.x() >= (b.x() + b.width() * .5) && m != _score->lastMeasureMM() && m->nextMeasure()->system() == m->system())
m = m->nextMeasure();
QPointF anchor(m->canvasBoundingRect().x(), y);
setDropAnchor(QLineF(pos, anchor));
editData.dropElement->score()->addRefresh(editData.dropElement->canvasBoundingRect());
editData.dropElement->setTrack(track);
editData.dropElement->score()->addRefresh(editData.dropElement->canvasBoundingRect());
return true;
}
editData.dropElement->score()->addRefresh(editData.dropElement->canvasBoundingRect());
Expand Down Expand Up @@ -334,6 +343,8 @@ void ScoreView::dragMoveEvent(QDragMoveEvent* event)

switch (editData.dropElement->type()) {
case ElementType::VOLTA:
event->setAccepted(dragMeasureAnchorElement(pos));
break;
case ElementType::PEDAL:
case ElementType::LET_RING:
case ElementType::VIBRATO:
Expand Down Expand Up @@ -412,6 +423,7 @@ void ScoreView::dropEvent(QDropEvent* event)
editData.modifiers = event->keyboardModifiers();

if (editData.dropElement) {
bool firstStaffOnly = false;
bool applyUserOffset = false;
bool triggerSpannerDropApplyTour = editData.dropElement->isSpanner();
editData.dropElement->styleChanged();
Expand All @@ -420,6 +432,9 @@ void ScoreView::dropEvent(QDropEvent* event)
_score->addRefresh(editData.dropElement->canvasBoundingRect());
switch (editData.dropElement->type()) {
case ElementType::VOLTA:
// voltas drop to first staff by default, or closest staff if Control is held
firstStaffOnly = !(editData.modifiers & Qt::ControlModifier);
// fall-thru
case ElementType::OTTAVA:
case ElementType::TRILL:
case ElementType::PEDAL:
Expand All @@ -430,7 +445,7 @@ void ScoreView::dropEvent(QDropEvent* event)
case ElementType::TEXTLINE:
{
Spanner* spanner = static_cast<Spanner*>(editData.dropElement);
score()->cmdAddSpanner(spanner, pos);
score()->cmdAddSpanner(spanner, pos, firstStaffOnly);
score()->setUpdateAll();
event->acceptProposedAction();
}
Expand Down