Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 0 additions & 1 deletion demos/Dawn.mscx
Original file line number Diff line number Diff line change
Expand Up @@ -37,7 +37,6 @@
<metaTag name="lyricist"></metaTag>
<metaTag name="movementNumber"></metaTag>
<metaTag name="movementTitle"></metaTag>
<metaTag name="mscVersion">3.02</metaTag>
<metaTag name="platform">Microsoft Windows</metaTag>
<metaTag name="source"></metaTag>
<metaTag name="translator"></metaTag>
Expand Down
31 changes: 31 additions & 0 deletions src/engraving/compat/engravingcompat.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -295,6 +295,12 @@ void EngravingCompat::doPostLayoutCompatIfNeeded(MasterScore* score)

int mscVersion = score->mscVersion();

if (mscVersion < 300) {
resetAllElementsPositions(score);
resetCrossBeams(score);
needRelayout = true;
Copy link
Copy Markdown
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Question to the team: do we think it's necessary to do this after initial layout, requiring a second layout? Or is it not necessary to do a layout before it?

fullCross only seems to be updated at layout time, that's why I was thinking it would be necessary. But it is not entirely clear to me whether a layout has already been done by the time that IProjectMigrator does its job, where these resets were performed previously.

}

if (mscVersion < 440) {
needRelayout |= relayoutUserModifiedCrossStaffBeams(score);
}
Expand All @@ -304,6 +310,31 @@ void EngravingCompat::doPostLayoutCompatIfNeeded(MasterScore* score)
}
}

void EngravingCompat::resetAllElementsPositions(MasterScore* score)
{
score->scanElements([](EngravingItem* e) {
if (e->generated()) {
return;
}
e->resetProperty(Pid::AUTOPLACE);
e->resetProperty(Pid::OFFSET);
e->resetProperty(Pid::LEADING_SPACE);
e->setOffsetChanged(false);
if (e->isSpanner()) {
e->resetProperty(Pid::OFFSET2);
}
});
}

void EngravingCompat::resetCrossBeams(MasterScore* score)
{
score->scanElements([](EngravingItem* e) {
if (e->isBeam() && toBeam(e)->fullCross()) {
e->reset();
}
});
}

bool EngravingCompat::relayoutUserModifiedCrossStaffBeams(MasterScore* score)
{
if (score->mscVersion() >= 440) {
Expand Down
3 changes: 3 additions & 0 deletions src/engraving/compat/engravingcompat.h
Original file line number Diff line number Diff line change
Expand Up @@ -44,5 +44,8 @@ class EngravingCompat
static void migrateNoteParens(MasterScore* masterScore);

static bool relayoutUserModifiedCrossStaffBeams(MasterScore* score);

static void resetAllElementsPositions(MasterScore* score);
static void resetCrossBeams(MasterScore* score);
};
} // namespace mu::engraving::compat
15 changes: 3 additions & 12 deletions src/engraving/dom/score.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -4360,10 +4360,11 @@ void Score::undo(UndoCommand* cmd, EditData* ed) const
// and all part scores (if there are any)
//---------------------------------------------------------

std::list<Score*> Score::scoreList()
std::vector<Score*> Score::scoreList()
{
std::list<Score*> scores;
std::vector<Score*> scores;
MasterScore* root = masterScore();
scores.reserve(1 + root->excerpts().size());
scores.push_back(root);
for (const Excerpt* ex : root->excerpts()) {
if (ex->excerptScore()) {
Expand Down Expand Up @@ -5977,16 +5978,6 @@ void Score::doLayoutRange(const Fraction& st, const Fraction& et)
}

renderer()->layoutScore(this, start, end);

if (m_resetAutoplace) {
m_resetAutoplace = false;
resetAutoplace();
}

if (m_resetCrossBeams) {
m_resetCrossBeams = false;
resetCrossBeams();
}
}

void Score::createPaddingTable()
Expand Down
14 changes: 3 additions & 11 deletions src/engraving/dom/score.h
Original file line number Diff line number Diff line change
Expand Up @@ -379,16 +379,9 @@ class Score : public EngravingObject, public muse::Contextable
void removeStaff(Staff*);
void addMeasure(MeasureBase*, MeasureBase*);
void linkMeasures(Score* score);
void setResetAutoplace() { m_resetAutoplace = true; }
void setResetCrossBeams() { m_resetCrossBeams = true; }

Excerpt* excerpt() { return m_excerpt; }
void setExcerpt(Excerpt* e) { m_excerpt = e; }

// methods for resetting elements for pre-4.0 score migration
void resetAutoplace();
void resetCrossBeams();

void cmdAddBracket();
void cmdToggleParentheses();
void cmdToggleParentheses(EngravingItem* el);
Expand Down Expand Up @@ -418,7 +411,7 @@ class Score : public EngravingObject, public muse::Contextable
void cmdAddStretch(double);
void cmdAddGrace(NoteType, int);
void cmdResetNoteAndRestGroupings();
void cmdResetAllPositions(bool undoable = true);

void cmdDoubleDuration() { cmdIncDecDuration(-1, false); }
void cmdHalfDuration() { cmdIncDecDuration(1, false); }
void cmdIncDurationDotted() { cmdIncDecDuration(-1, true); }
Expand Down Expand Up @@ -955,7 +948,7 @@ class Score : public EngravingObject, public muse::Contextable
PlayMode playMode() const { return m_playMode; }
void setPlayMode(PlayMode v) { m_playMode = v; }

std::list<Score*> scoreList();
std::vector<Score*> scoreList();

void appendMeasures(int numMeasures);

Expand Down Expand Up @@ -1215,8 +1208,7 @@ class Score : public EngravingObject, public muse::Contextable
ShowAnchors m_showAnchors;

ScoreOrder m_scoreOrder; // used for score ordering
bool m_resetAutoplace = false;
bool m_resetCrossBeams = false;

int m_mscVersion = Constants::MSC_VERSION; // version of current loading *.msc file

bool m_isOpen = false;
Expand Down
38 changes: 0 additions & 38 deletions src/engraving/editing/cmd.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -2897,44 +2897,6 @@ void Score::cmdResetNoteAndRestGroupings()
selection().updateSelectedElements();
}

static void resetBeamOffSet(EngravingItem* e)
{
// Reset completely cross staff beams from MU1&2
if (e->isBeam() && toBeam(e)->fullCross()) {
e->reset();
}
}

//---------------------------------------------------------
// cmdResetAllPositions
//---------------------------------------------------------
void Score::cmdResetAllPositions(bool undoable)
{
TRACEFUNC;

if (undoable) {
startCmd(TranslatableString("undoableAction", "Reset all positions"));
}
resetAutoplace();
if (undoable) {
endCmd();
}
}

void Score::resetAutoplace()
{
TRACEFUNC;

scanElements(resetElementPosition);
}

void Score::resetCrossBeams()
{
TRACEFUNC;

scanElements(resetBeamOffSet);
}

//---------------------------------------------------------
// move
// move current selection
Expand Down
5 changes: 2 additions & 3 deletions src/engraving/engravingproject.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -112,7 +112,6 @@ Ret EngravingProject::setupMasterScore(bool forceMode)
{
TRACEFUNC;

m_masterScore->createPaddingTable();
m_masterScore->connectTies();
m_masterScore->undoRemoveStaleTieJumpPoints(false);

Expand All @@ -121,10 +120,10 @@ Ret EngravingProject::setupMasterScore(bool forceMode)
}

m_masterScore->rebuildMidiMapping();
m_masterScore->setPlaylistDirty();
m_masterScore->setLayoutAll();

for (Score* s : m_masterScore->scoreList()) {
s->setPlaylistDirty();
s->setLayoutAll();
s->createPaddingTable();
}

Expand Down
20 changes: 20 additions & 0 deletions src/engraving/rw/compat/compatutils.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -161,6 +161,7 @@ void CompatUtils::doCompatibilityConversions(MasterScore* masterScore)

// TODO: collect all compatibility conversions here
if (masterScore->mscVersion() < 400) {
migrateStyleForPre400(masterScore);
replaceStaffTextWithPlayTechniqueAnnotation(masterScore);
}
if (masterScore->mscVersion() < 410) {
Expand All @@ -187,6 +188,25 @@ void CompatUtils::doCompatibilityConversions(MasterScore* masterScore)
}
}

void CompatUtils::migrateStyleForPre400(MasterScore* score)
{
// TODO: move to style compat reader when it is implemented
MStyle& style = score->style();
const double sp = style.spatium();
style.set(Sid::dynamicsFontSize, 10.0);
double doubleBarDistance = style.styleAbsolute(Sid::doubleBarDistance);
doubleBarDistance -= style.styleAbsolute(Sid::doubleBarWidth);
style.set(Sid::doubleBarDistance, doubleBarDistance / sp);
double endBarDistance = style.styleAbsolute(Sid::endBarDistance);
endBarDistance -= (style.styleAbsolute(Sid::barWidth) + style.styleAbsolute(Sid::endBarWidth)) / 2;
style.set(Sid::endBarDistance, endBarDistance / sp);
double repeatBarlineDotSeparation = style.styleAbsolute(Sid::repeatBarlineDotSeparation);
double dotWidth = score->engravingFont()->width(SymId::repeatDot, 1.0);
repeatBarlineDotSeparation -= (style.styleAbsolute(Sid::barWidth) + dotWidth) / 2;
style.set(Sid::repeatBarlineDotSeparation, repeatBarlineDotSeparation / sp);
style.set(Sid::measureSpacing, DefaultStyle::defaultStyle().value(Sid::measureSpacing));
}

void CompatUtils::replaceStaffTextWithPlayTechniqueAnnotation(MasterScore* score)
{
TRACEFUNC;
Expand Down
1 change: 1 addition & 0 deletions src/engraving/rw/compat/compatutils.h
Original file line number Diff line number Diff line change
Expand Up @@ -57,6 +57,7 @@ class CompatUtils

private:
static Sid positionStyleFromAlign(Sid align);
static void migrateStyleForPre400(MasterScore* score);
static void replaceStaffTextWithPlayTechniqueAnnotation(MasterScore* score);
static void replaceOldWithNewOrnaments(MasterScore* score);
static void replaceOldWithNewExpressions(MasterScore* score);
Expand Down
2 changes: 0 additions & 2 deletions src/engraving/rw/read206/read206.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -3695,8 +3695,6 @@ Ret Read206::readScoreFile(Score* score, XmlReader& e, ReadInOutData* out)
}
}

compat::CompatUtils::doCompatibilityConversions(score->masterScore());

return make_ok();
}

Expand Down
22 changes: 0 additions & 22 deletions src/engraving/tests/readwriteundoreset_tests.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -35,28 +35,6 @@ class Engraving_ReadWriteUndoResetTests : public ::testing::Test
{
};

TEST_F(Engraving_ReadWriteUndoResetTests, testReadWriteResetPositions)
{
std::vector<const char16_t*> files = {
u"barlines",
u"slurs",
u"mmrestBarlineTextLinks" // see issue #296426
};

for (const char16_t* file : files) {
String readFile(RWUNDORESET_DATA_DIR + file + u".mscx");
String writeFile(String(file) + u"-undoreset-test.mscx");

MasterScore* score = ScoreRW::readScore(readFile);
EXPECT_TRUE(score);
score->cmdResetAllPositions();
score->undoRedo(/* undo */ true, nullptr);
EXPECT_TRUE(ScoreComp::saveCompareScore(score, writeFile, readFile));

delete score;
}
}

//---------------------------------------------------------
// testMMRestLinksRecreateMMRest
/// For barlines links with MM rests a separate test is
Expand Down
6 changes: 2 additions & 4 deletions src/project/internal/iprojectmigrator.h
Original file line number Diff line number Diff line change
Expand Up @@ -19,8 +19,8 @@
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
#ifndef MU_PROJECT_IPROJECTMIGRATOR_H
#define MU_PROJECT_IPROJECTMIGRATOR_H

#pragma once

#include "modularity/imoduleinterface.h"
#include "types/ret.h"
Expand All @@ -37,5 +37,3 @@ class IProjectMigrator : MODULE_CONTEXT_INTERFACE
virtual muse::Ret migrateEngravingProjectIfNeed(engraving::EngravingProjectPtr project) = 0;
};
}

#endif // MU_PROJECT_IPROJECTMIGRATOR_H
52 changes: 0 additions & 52 deletions src/project/internal/projectmigrator.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -71,7 +71,6 @@ Ret ProjectMigrator::migrateEngravingProjectIfNeed(engraving::EngravingProjectPt
//! When migrating, the version becomes the current one, so remember the version of the default style before migrating
project->masterScore()->style().setDefaultStyleVersion(ReadStyleHook::styleDefaultByMscVersion(project->mscVersion()));
MigrationType migrationType = migrationTypeFromMscVersion(project->mscVersion());
m_resetStyleSettings = true;

MigrationOptions migrationOptions = configuration()->migrationOptions(migrationType);
if (migrationOptions.isAskAgain) {
Expand Down Expand Up @@ -135,33 +134,6 @@ Ret ProjectMigrator::askAboutMigration(MigrationOptions& out, const QString& app
return true;
}

void ProjectMigrator::resetStyleSettings(mu::engraving::MasterScore* score)
{
// there are a few things that need to be updated no matter which version the score is from (#10499)
// primarily, the differences made concerning barline thickness and distance
// these updates take place no matter whether or not the other migration options are checked
qreal sp = score->style().spatium();
mu::engraving::MStyle* style = &score->style();
style->set(mu::engraving::Sid::dynamicsFontSize, 10.0);
qreal doubleBarDistance = style->styleAbsolute(mu::engraving::Sid::doubleBarDistance);
doubleBarDistance -= style->styleAbsolute(mu::engraving::Sid::doubleBarWidth);
style->set(mu::engraving::Sid::doubleBarDistance, doubleBarDistance / sp);
qreal endBarDistance = style->styleAbsolute(mu::engraving::Sid::endBarDistance);
endBarDistance -= (style->styleAbsolute(mu::engraving::Sid::barWidth) + style->styleAbsolute(mu::engraving::Sid::endBarWidth)) / 2;
style->set(mu::engraving::Sid::endBarDistance, endBarDistance / sp);
qreal repeatBarlineDotSeparation = style->styleAbsolute(mu::engraving::Sid::repeatBarlineDotSeparation);
qreal dotWidth = score->engravingFont()->width(mu::engraving::SymId::repeatDot, 1.0);
repeatBarlineDotSeparation -= (style->styleAbsolute(mu::engraving::Sid::barWidth) + dotWidth) / 2;
style->set(mu::engraving::Sid::repeatBarlineDotSeparation, repeatBarlineDotSeparation / sp);
score->resetStyleValue(mu::engraving::Sid::measureSpacing);
}

bool ProjectMigrator::resetCrossBeams(engraving::MasterScore* score)
{
score->setResetCrossBeams();
return true;
}

Ret ProjectMigrator::migrateProject(engraving::EngravingProjectPtr project, const MigrationOptions& opt)
{
TRACEFUNC;
Expand All @@ -176,34 +148,16 @@ Ret ProjectMigrator::migrateProject(engraving::EngravingProjectPtr project, cons
bool ok = true;
if (opt.isApplyLeland) {
ok = applyLelandStyle(score);
m_resetStyleSettings = false;
}

if (ok && opt.isApplyEdwin) {
ok = applyEdwinStyle(score);
m_resetStyleSettings = false;
}

if (ok && opt.isRemapPercussion) {
MdlMigrator(score).remapPercussion();
}

if (ok && score->mscVersion() < 300) {
ok = resetAllElementsPositions(score);
}

if (ok && score->mscVersion() <= 206) {
ok = resetCrossBeams(score);
}

if (ok && score->mscVersion() != mu::engraving::Constants::MSC_VERSION) {
score->undo(new mu::engraving::ChangeMetaText(score, u"mscVersion", String::fromAscii(mu::engraving::Constants::MSC_VERSION_STR)));
}

if (ok && m_resetStyleSettings) {
resetStyleSettings(score);
score->setLayoutAll();
}
score->endCmd();

return ok ? make_ret(Ret::Code::Ok) : make_ret(Ret::Code::InternalError);
Expand Down Expand Up @@ -232,9 +186,3 @@ bool ProjectMigrator::applyEdwinStyle(mu::engraving::MasterScore* score)

return score->loadStyle(styleFile, /*ign*/ false, /*overlap*/ true);
}

bool ProjectMigrator::resetAllElementsPositions(mu::engraving::MasterScore* score)
{
score->setResetAutoplace();
return true;
}
Loading
Loading