Skip to content

Commit 9300794

Browse files
committed
Fix element stacking during partial layout
Elements (text, dynamics) were stacking on top of each other after edits, only returning to correct positions after save/reload. This occurred because partial layout reset only affected the edited measure range while skyline collision detection processed entire systems, creating mixed stale/fresh data. Changes: - Enable position reset in LayoutData::reset() to force clean recalculation - Reset autoplace state to ensure proper collision detection - Expand PassResetLayoutData to reset all measures in affected systems, not just the edited range Fixes the mismatch between partial reset scope and full system processing.
1 parent 5115975 commit 9300794

File tree

2 files changed

+23
-3
lines changed

2 files changed

+23
-3
lines changed

src/engraving/dom/engravingitem.h

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -514,8 +514,9 @@ class EngravingItem : public EngravingObject
514514
{
515515
m_shape.reset();
516516
m_mask.reset();
517-
//! NOTE Temporary removed, have problems, need investigation
518-
//m_pos.reset();
517+
m_pos.reset();
518+
autoplace.offsetChanged = OffsetChange::NONE;
519+
autoplace.changedPos = PointF();
519520
}
520521

521522
virtual bool isValid() const { return m_shape.has_value() && m_shape.value().bbox().isValid(); }

src/engraving/rendering/score/passresetlayoutdata.cpp

Lines changed: 20 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@
2222
#include "passresetlayoutdata.h"
2323

2424
#include "dom/score.h"
25+
#include "dom/system.h"
2526

2627
#include "layoutcontext.h"
2728

@@ -44,10 +45,28 @@ void PassResetLayoutData::doRun(Score* score, LayoutContext& ctx)
4445
if (ctx.state().isLayoutAll()) {
4546
resetLayoutData(score->rootItem());
4647
} else {
48+
std::vector<System*> affectedSystems;
4749
MeasureBase* m = ctx.mutState().nextMeasure();
4850
while (m && m->tick() <= ctx.state().endTick()) {
49-
resetLayoutData(m);
51+
if (m->system()) {
52+
bool found = false;
53+
for (System* sys : affectedSystems) {
54+
if (sys == m->system()) {
55+
found = true;
56+
break;
57+
}
58+
}
59+
if (!found) {
60+
affectedSystems.push_back(m->system());
61+
}
62+
}
5063
m = m->next();
5164
}
65+
66+
for (System* sys : affectedSystems) {
67+
for (MeasureBase* mb : sys->measures()) {
68+
resetLayoutData(mb);
69+
}
70+
}
5271
}
5372
}

0 commit comments

Comments
 (0)