diff --git a/libmscore/cmd.cpp b/libmscore/cmd.cpp index 9b57a828a4a4..b755e2e137f7 100644 --- a/libmscore/cmd.cpp +++ b/libmscore/cmd.cpp @@ -1900,6 +1900,32 @@ void Score::cmdResetNoteAndRestGroupings() endCmd(); } +//--------------------------------------------------------- +// resetElementShapePosition +// For use with Score::scanElements. +// Reset positions and autoplacement for the given +// element. +//--------------------------------------------------------- + +static void resetElementPosition(void*, Element* e) + { + e->undoResetProperty(Pid::AUTOPLACE); + e->undoResetProperty(Pid::OFFSET); + if (e->isSpanner()) + e->undoResetProperty(Pid::OFFSET2); + } + +//--------------------------------------------------------- +// cmdResetAllPositions +//--------------------------------------------------------- + +void Score::cmdResetAllPositions() + { + startCmd(); + scanElements(nullptr, resetElementPosition); + endCmd(); + } + //--------------------------------------------------------- // processMidiInput //--------------------------------------------------------- diff --git a/libmscore/score.h b/libmscore/score.h index d7ae9a7f4c63..a9f0551f9330 100644 --- a/libmscore/score.h +++ b/libmscore/score.h @@ -586,6 +586,7 @@ class Score : public QObject, public ScoreElement { void cmdAddOttava(OttavaType); void cmdAddStretch(qreal); void cmdResetNoteAndRestGroupings(); + void cmdResetAllPositions(); void cmdDoubleDuration() { cmdIncDecDuration(-1, 0); } void cmdHalfDuration() { cmdIncDecDuration( 1, 0); } void cmdIncDurationDotted() { cmdIncDecDuration(-1, 1); } diff --git a/mscore/file.cpp b/mscore/file.cpp index 10666f358783..1c7b093fef6b 100644 --- a/mscore/file.cpp +++ b/mscore/file.cpp @@ -370,6 +370,7 @@ MasterScore* MuseScore::readScore(const QString& name) allowShowMidiPanel(name); if (score) addRecentScore(score); + return score; } diff --git a/mscore/musescore.cpp b/mscore/musescore.cpp index a081b0eb1617..9479ecf20669 100644 --- a/mscore/musescore.cpp +++ b/mscore/musescore.cpp @@ -423,8 +423,10 @@ void MuseScore::closeEvent(QCloseEvent* ev) // remove all new created/not save score so they are // note saved as session data - for (MasterScore* score : removeList) + for (MasterScore* score : removeList) { scoreList.removeAll(score); + scoreWasShown.remove(score); + } writeSessionFile(true); for (MasterScore* score : scoreList) { @@ -2071,6 +2073,7 @@ int MuseScore::appendScore(MasterScore* score) } } scoreList.insert(index, score); + scoreWasShown[score] = false; tab1->insertTab(score); if (tab2) tab2->insertTab(score); @@ -2191,6 +2194,27 @@ void MuseScore::reloadInstrumentTemplates() } } +//--------------------------------------------------------- +// askResetOldScorePositions +//--------------------------------------------------------- + +void MuseScore::askResetOldScorePositions(Score* score) + { + if (score->mscVersion() < 300 && score->mscVersion() > 114) { + QMessageBox msgBox; + QString question = tr("Reset all elements positions?"); + msgBox.setWindowTitle(question); + msgBox.setText(tr("This score was created in older versions of MuseScore. For a better experience of using MuseScore 3.0 it is recommended to reset elements positions to their default values.") + "\n\n" + question); + msgBox.setIcon(QMessageBox::Question); + msgBox.setStandardButtons( + QMessageBox::Yes | QMessageBox::No + ); + + if (msgBox.exec() == QMessageBox::Yes) + score->cmdResetAllPositions(); + } + } + //--------------------------------------------------------- // setCurrentView //--------------------------------------------------------- @@ -2338,6 +2362,11 @@ void MuseScore::setCurrentScoreView(ScoreView* view) timeline()->setScoreView(view); } ScoreAccessibility::instance()->updateAccessibilityInfo(); + + if (!scoreWasShown[cs]) { + scoreWasShown[cs] = true; + askResetOldScorePositions(cs); + } } //--------------------------------------------------------- @@ -2841,6 +2870,7 @@ void MuseScore::removeTab(int i) midiPanelOnCloseFile(score->importedFilePath()); scoreList.removeAt(i); + scoreWasShown.remove(score); tab1->removeTab(i, /* noCurrentChangedSignals */ true); if (tab2) @@ -7024,8 +7054,6 @@ int main(int argc, char* av[]) // TODO: delete old session backups // restoredSession = mscore->restoreSession((preferences.sessionStart() == SessionStart::LAST && (files == 0))); - if (!restoredSession || files) - loadScores(argv); } errorMessage = new QErrorMessage(mscore); @@ -7045,6 +7073,9 @@ int main(int argc, char* av[]) mscore->changeState(mscore->noScore() ? STATE_DISABLED : STATE_NORMAL); mscore->show(); + if (!restoredSession || files) + loadScores(argv); + #ifndef MSCORE_NO_UPDATE_CHECKER if (mscore->hasToCheckForUpdate()) mscore->checkForUpdate(); diff --git a/mscore/musescore.h b/mscore/musescore.h index fe5b02b6e6bd..b8034014f042 100644 --- a/mscore/musescore.h +++ b/mscore/musescore.h @@ -223,6 +223,7 @@ class MuseScore : public QMainWindow, public MuseScoreCore { QSettings settings; ScoreView* cv { 0 }; + QMap scoreWasShown; // whether each score in scoreList has ever been shown ScoreState _sstate; UpdateChecker* ucheck; ExtensionsUpdateChecker* packUChecker = nullptr; @@ -473,6 +474,7 @@ class MuseScore : public QMainWindow, public MuseScoreCore { void setPlayRepeats(bool repeat); ScoreTab* createScoreTab(); + void askResetOldScorePositions(Score* score); QString getUtmParameters(QString medium) const;