Skip to content

Commit 2160403

Browse files
committed
Fix #18437
1 parent 5ab5e82 commit 2160403

File tree

2 files changed

+32
-6
lines changed

2 files changed

+32
-6
lines changed

src/context/internal/globalcontext.cpp

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -95,6 +95,16 @@ void GlobalContext::doSetCurrentNotation(const INotationPtr& notation)
9595
return;
9696
}
9797

98+
// End note input on the outgoing notation to prevent stale InputState
99+
// that can cause corruption when notes are entered on the new notation
100+
// and propagated back via linked clones (see #18437)
101+
if (m_currentNotation) {
102+
auto noteInput = m_currentNotation->interaction()->noteInput();
103+
if (noteInput->isNoteInputMode()) {
104+
noteInput->endNoteInput(false);
105+
}
106+
}
107+
98108
m_currentNotation = notation;
99109

100110
if (m_currentNotation) {

src/engraving/dom/segment.cpp

Lines changed: 22 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -871,7 +871,13 @@ void Segment::remove(EngravingItem* el)
871871
case ElementType::CHORD:
872872
case ElementType::REST:
873873
{
874-
m_elist[track] = 0;
874+
// Only clear the slot if it actually holds the element being removed.
875+
// During linked-score propagation, an AddElement for a new ChordRest may
876+
// have already overwritten this slot; blindly zeroing it would silently
877+
// discard the new element and leave a gap in voice 0 (see #18437).
878+
if (m_elist[track] == el) {
879+
m_elist[track] = 0;
880+
}
875881
staff_idx_t staffIdx = el->staffIdx();
876882
measure()->checkMultiVoices(staffIdx);
877883
// spanners with this cr as start or end element will need relayout
@@ -898,7 +904,9 @@ void Segment::remove(EngravingItem* el)
898904
case ElementType::MMREST:
899905
case ElementType::MEASURE_REPEAT:
900906
case ElementType::TIME_TICK_ANCHOR:
901-
m_elist[track] = 0;
907+
if (m_elist[track] == el) {
908+
m_elist[track] = 0;
909+
}
902910
break;
903911

904912
case ElementType::HARMONY:
@@ -962,12 +970,16 @@ void Segment::remove(EngravingItem* el)
962970
break;
963971

964972
case ElementType::TIMESIG:
965-
m_elist[track] = 0;
973+
if (m_elist[track] == el) {
974+
m_elist[track] = 0;
975+
}
966976
el->staff()->removeTimeSig(toTimeSig(el));
967977
break;
968978

969979
case ElementType::KEYSIG:
970-
m_elist[track] = 0;
980+
if (m_elist[track] == el) {
981+
m_elist[track] = 0;
982+
}
971983
if (!el->generated()) {
972984
el->staff()->removeKey(tick());
973985
}
@@ -980,11 +992,15 @@ void Segment::remove(EngravingItem* el)
980992

981993
case ElementType::BAR_LINE:
982994
case ElementType::AMBITUS:
983-
m_elist[track] = 0;
995+
if (m_elist[track] == el) {
996+
m_elist[track] = 0;
997+
}
984998
break;
985999

9861000
case ElementType::BREATH:
987-
m_elist[track] = 0;
1001+
if (m_elist[track] == el) {
1002+
m_elist[track] = 0;
1003+
}
9881004
score()->setPause(tick(), 0);
9891005
break;
9901006

0 commit comments

Comments
 (0)