Skip to content

Commit 438ab6b

Browse files
authored
Merge pull request #5440 from dmitrio95/viewport-change-and-parts
Fix automatic viewport changes in scores with parts
2 parents 3dc7638 + 0a39d0a commit 438ab6b

File tree

2 files changed

+45
-17
lines changed

2 files changed

+45
-17
lines changed

libmscore/score.cpp

Lines changed: 19 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -4636,12 +4636,15 @@ void MasterScore::setLayoutAll(int staff, const Element* e)
46364636
_cmdState.setTick(Fraction(0,1));
46374637
_cmdState.setTick(measures()->last() ? measures()->last()->endTick() : Fraction(0,1));
46384638

4639-
const int startStaff = staff == -1 ? 0 : staff;
4640-
const int endStaff = staff == -1 ? (nstaves() - 1) : staff;
4641-
_cmdState.setStaff(startStaff);
4642-
_cmdState.setStaff(endStaff);
4639+
if (e && e->score() == this) {
4640+
// TODO: map staff number properly
4641+
const int startStaff = staff == -1 ? 0 : staff;
4642+
const int endStaff = staff == -1 ? (nstaves() - 1) : staff;
4643+
_cmdState.setStaff(startStaff);
4644+
_cmdState.setStaff(endStaff);
46434645

4644-
_cmdState.setElement(e);
4646+
_cmdState.setElement(e);
4647+
}
46454648
}
46464649

46474650
//---------------------------------------------------------
@@ -4653,9 +4656,11 @@ void MasterScore::setLayout(const Fraction& t, int staff, const Element* e)
46534656
if (t >= Fraction(0,1))
46544657
_cmdState.setTick(t);
46554658

4656-
// TODO: handle staff == -1
4657-
_cmdState.setStaff(staff);
4658-
_cmdState.setElement(e);
4659+
if (e && e->score() == this) {
4660+
// TODO: map staff number properly
4661+
_cmdState.setStaff(staff);
4662+
_cmdState.setElement(e);
4663+
}
46594664
}
46604665

46614666
void MasterScore::setLayout(const Fraction& tick1, const Fraction& tick2, int staff1, int staff2, const Element* e)
@@ -4665,11 +4670,13 @@ void MasterScore::setLayout(const Fraction& tick1, const Fraction& tick2, int st
46654670
if (tick2 >= Fraction(0,1))
46664671
_cmdState.setTick(tick2);
46674672

4668-
// TODO: handle staff == -1
4669-
_cmdState.setStaff(staff1);
4670-
_cmdState.setStaff(staff2);
4673+
if (e && e->score() == this) {
4674+
// TODO: map staff number properly
4675+
_cmdState.setStaff(staff1);
4676+
_cmdState.setStaff(staff2);
46714677

4672-
_cmdState.setElement(e);
4678+
_cmdState.setElement(e);
4679+
}
46734680
}
46744681

46754682
//---------------------------------------------------------

mscore/scoreview.cpp

Lines changed: 26 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -4805,6 +4805,25 @@ bool ScoreView::fotoMode() const
48054805
return false;
48064806
}
48074807

4808+
//---------------------------------------------------------
4809+
// visibleElementInScore
4810+
//---------------------------------------------------------
4811+
4812+
static const Element* visibleElementInScore(const Element* orig, const Score* s)
4813+
{
4814+
if (!orig)
4815+
return nullptr;
4816+
if (orig->score() == s && orig->bbox().isValid())
4817+
return orig;
4818+
4819+
for (const ScoreElement* se : orig->linkList()) {
4820+
const Element* e = toElement(se);
4821+
if (e->score() == s && e->bbox().isValid()) // bbox check to ensure the element is indeed visible
4822+
return e;
4823+
}
4824+
4825+
return nullptr;
4826+
}
48084827

48094828
//---------------------------------------------------------
48104829
// needViewportMove
@@ -4824,7 +4843,7 @@ static bool needViewportMove(Score* cs, ScoreView* cv)
48244843

48254844
const QRectF viewport = cv->canvasViewport(); // TODO: margins for intersection check?
48264845

4827-
const Element* editElement = state.element();
4846+
const Element* editElement = visibleElementInScore(state.element(), cs);
48284847
if (editElement && editElement->bbox().isValid() && !editElement->isSpanner())
48294848
return !viewport.intersects(editElement->canvasBoundingRect());
48304849

@@ -4836,8 +4855,9 @@ static bool needViewportMove(Score* cs, ScoreView* cv)
48364855
Measure* mEnd = cs->tick2measureMM(state.endTick());
48374856
mEnd = mEnd ? mEnd->nextMeasureMM() : nullptr;
48384857

4839-
const int startStaff = state.startStaff() == -1 ? 0 : state.startStaff();
4840-
const int endStaff = state.endStaff() == -1 ? (cs->nstaves() - 1) : state.endStaff();
4858+
const bool isExcerpt = !cs->isMaster();
4859+
const int startStaff = (isExcerpt || state.startStaff() == -1) ? 0 : state.startStaff();
4860+
const int endStaff = (isExcerpt || state.endStaff() == -1) ? (cs->nstaves() - 1) : state.endStaff();
48414861

48424862
for (Measure* m = mStart; m && m != mEnd; m = m->nextMeasureMM()) {
48434863
for (int st = startStaff; st <= endStaff; ++st) {
@@ -4876,7 +4896,8 @@ void ScoreView::moveViewportToLastEdit()
48764896
return;
48774897

48784898
const CmdState& state = s->cmdState();
4879-
const Element* editElement = state.element();
4899+
const Element* editElement = visibleElementInScore(state.element(), s);
4900+
48804901
const MeasureBase* mb = nullptr;
48814902
if (editElement)
48824903
mb = editElement->findMeasureBase();
@@ -4885,7 +4906,7 @@ void ScoreView::moveViewportToLastEdit()
48854906

48864907
const Element* viewportElement = (editElement && editElement->bbox().isValid() && !mb->isMeasure()) ? editElement : mb;
48874908

4888-
const int staff = state.startStaff(); // TODO: choose the closest staff to the current viewport?
4909+
const int staff = s->isMaster() ? state.startStaff() : -1; // TODO: choose the closest staff to the current viewport?
48894910
adjustCanvasPosition(viewportElement, /* playback */ false, staff);
48904911
}
48914912
}

0 commit comments

Comments
 (0)