Skip to content

Commit d53a8ed

Browse files
authored
Merge pull request #33675 from ajuncosa/fix-box-paste
Fix part syncing when a Box item is pasted
2 parents a0c4edb + e3cd441 commit d53a8ed

3 files changed

Lines changed: 29 additions & 19 deletions

File tree

src/engraving/dom/measure.cpp

Lines changed: 1 addition & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1827,16 +1827,7 @@ EngravingItem* Measure::drop(EditData& data)
18271827
case ElementType::TBOX:
18281828
case ElementType::FBOX:
18291829
case ElementType::HBOX:
1830-
{
1831-
MeasureBase* newBox = toMeasureBase(e);
1832-
Measure* m = isMMRest() ? mmRestFirst() : this;
1833-
newBox->setTick(m->tick());
1834-
newBox->setNext(m);
1835-
newBox->setPrev(m->prev());
1836-
score()->undo(new InsertMeasures(newBox, newBox));
1837-
return newBox;
1838-
}
1839-
break;
1830+
return score()->insertBox(toMeasureBase(e), this);
18401831

18411832
default:
18421833
LOGD("Measure: cannot drop %s here", e->typeName());

src/engraving/dom/score.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -939,6 +939,8 @@ class Score : public EngravingObject, public muse::Contextable
939939
const InsertMeasureOptions& options = InsertMeasureOptions());
940940
MeasureBase* insertBox(ElementType type, MeasureBase* beforeMeasure = nullptr,
941941
const InsertMeasureOptions& options = InsertMeasureOptions());
942+
MeasureBase* insertBox(MeasureBase* box, MeasureBase* beforeMeasure = nullptr,
943+
const InsertMeasureOptions& options = InsertMeasureOptions());
942944

943945
Audio* audio() const { return m_audio; }
944946
void setAudio(Audio* a) { m_audio = a; }

src/engraving/editing/edit.cpp

Lines changed: 26 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -4749,11 +4749,29 @@ MeasureBase* Score::insertMeasure(ElementType type, MeasureBase* beforeMeasure,
47494749
MeasureBase* Score::insertBox(ElementType type, MeasureBase* beforeMeasure, const InsertMeasureOptions& options)
47504750
{
47514751
const bool isFrame = type == ElementType::FBOX || type == ElementType::HBOX || type == ElementType::TBOX || type == ElementType::VBOX;
4752+
if (!isFrame) {
4753+
return nullptr;
4754+
}
4755+
4756+
return this->insertBox(toMeasureBase(Factory::createItem(type, dummy())), beforeMeasure, options);
4757+
}
4758+
4759+
MeasureBase* Score::insertBox(MeasureBase* box, MeasureBase* beforeMeasure, const InsertMeasureOptions& options)
4760+
{
4761+
IF_ASSERT_FAILED(box) {
4762+
return nullptr;
4763+
}
47524764

4765+
ElementType type = box->type();
4766+
const bool isFrame = type == ElementType::FBOX || type == ElementType::HBOX || type == ElementType::TBOX || type == ElementType::VBOX;
47534767
if (!isFrame) {
47544768
return nullptr;
47554769
}
47564770

4771+
if (box->score() != this) {
4772+
box->setScore(this);
4773+
}
4774+
47574775
Fraction tick;
47584776
bool isTitleFrame = type == ElementType::VBOX && beforeMeasure && beforeMeasure == beforeMeasure->score()->first();
47594777
if (beforeMeasure) {
@@ -4777,27 +4795,26 @@ MeasureBase* Score::insertBox(ElementType type, MeasureBase* beforeMeasure, cons
47774795
tick = last() ? last()->endTick() : Fraction(0, 1);
47784796
}
47794797

4780-
MeasureBase* newMeasureBase = toMeasureBase(Factory::createItem(type, dummy()));
4781-
newMeasureBase->setTick(tick);
4782-
newMeasureBase->setNext(beforeMeasure);
4783-
newMeasureBase->setPrev(beforeMeasure ? beforeMeasure->prev() : last());
4784-
newMeasureBase->setSizeIsSpatiumDependent(!isTitleFrame);
4798+
box->setTick(tick);
4799+
box->setNext(beforeMeasure);
4800+
box->setPrev(beforeMeasure ? beforeMeasure->prev() : last());
4801+
box->setSizeIsSpatiumDependent(!isTitleFrame);
47854802

47864803
if (type == ElementType::FBOX) {
4787-
toFBox(newMeasureBase)->init();
4804+
toFBox(box)->init();
47884805
}
47894806

4790-
undo(new InsertMeasures(newMeasureBase, newMeasureBase));
4807+
undo(new InsertMeasures(box, box));
47914808

47924809
if (options.needDeselectAll) {
47934810
deselectAll();
47944811
}
47954812

47964813
if (options.cloneBoxToAllParts) {
4797-
newMeasureBase->manageExclusionFromParts(/*exclude =*/ false);
4814+
box->manageExclusionFromParts(/*exclude =*/ false);
47984815
}
47994816

4800-
return newMeasureBase;
4817+
return box;
48014818
}
48024819

48034820
void Score::restoreInitialKeySigAndTimeSig()

0 commit comments

Comments
 (0)