diff --git a/libmscore/element.h b/libmscore/element.h index 6de33c8e747e..fcbcb014fceb 100644 --- a/libmscore/element.h +++ b/libmscore/element.h @@ -462,7 +462,7 @@ class Element : public ScoreElement { } virtual void triggerLayout() const; - void triggerLayoutAll() const; + virtual void triggerLayoutAll() const; virtual void drawEditMode(QPainter*, EditData&); void autoplaceSegmentElement(bool above, bool add); // helper functions diff --git a/libmscore/spanner.cpp b/libmscore/spanner.cpp index 88fc9e429950..b1b0d8e0d372 100644 --- a/libmscore/spanner.cpp +++ b/libmscore/spanner.cpp @@ -1033,10 +1033,21 @@ void Spanner::setTicks(const Fraction& f) void Spanner::triggerLayout() const { + // Spanners do not have parent even when added to a score, so can't check parent here const int tr2 = track2() == -1 ? track() : track2(); score()->setLayout(_tick, _tick + _ticks, staffIdx(), track2staff(tr2), this); } +void Spanner::triggerLayoutAll() const + { + // Spanners do not have parent even when added to a score, so can't check parent here + score()->setLayoutAll(staffIdx(), this); + + const int tr2 = track2(); + if (tr2 != -1 && tr2 != track()) + score()->setLayoutAll(track2staff(tr2), this); + } + //--------------------------------------------------------- // pushUnusedSegment //--------------------------------------------------------- diff --git a/libmscore/spanner.h b/libmscore/spanner.h index 6c5413dc3e8f..41a8228ddd1c 100644 --- a/libmscore/spanner.h +++ b/libmscore/spanner.h @@ -217,6 +217,7 @@ class Spanner : public Element { virtual void layoutSystemsDone(); virtual void triggerLayout() const override; + virtual void triggerLayoutAll() const override; virtual void add(Element*) override; virtual void remove(Element*) override; virtual void scanElements(void* data, void (*func)(void*, Element*), bool all=true) override; diff --git a/mscore/scoreview.cpp b/mscore/scoreview.cpp index 6845841ca3d2..661d1fff85f7 100644 --- a/mscore/scoreview.cpp +++ b/mscore/scoreview.cpp @@ -4823,7 +4823,7 @@ static bool needViewportMove(Score* cs, ScoreView* cv) const QRectF viewport = cv->canvasViewport(); // TODO: margins for intersection check? const Element* editElement = state.element(); - if (editElement && editElement->bbox().isValid()) + if (editElement && editElement->bbox().isValid() && !editElement->isSpanner()) return !viewport.intersects(editElement->canvasBoundingRect()); if (state.startTick().isZero() && state.endTick() == cs->endTick())