From 8b3556c0c92b900eeed58fc3b908b48c23a67425 Mon Sep 17 00:00:00 2001 From: Eism Date: Fri, 3 Mar 2023 10:43:03 +0200 Subject: [PATCH 1/8] Regression, print the main score also --- src/converter/internal/compat/backendapi.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/src/converter/internal/compat/backendapi.cpp b/src/converter/internal/compat/backendapi.cpp index 82456c00fc840..3700e2208d7de 100644 --- a/src/converter/internal/compat/backendapi.cpp +++ b/src/converter/internal/compat/backendapi.cpp @@ -565,6 +565,7 @@ Ret BackendApi::doExportScorePartsPdfs(const IMasterNotationPtr masterNotation, jsonForPdfs["scoreBin"] = QString::fromLatin1(scoreBin); INotationPtrList notations; + notations.push_back(masterNotation->notation()); QJsonArray partsArray; QJsonArray partsNamesArray; From 6ec7e4d7a7d10eedff553d9845f0bc3d5ed6e117 Mon Sep 17 00:00:00 2001 From: Eism Date: Fri, 3 Mar 2023 11:05:18 +0200 Subject: [PATCH 2/8] Excerpts also should be in page mode --- src/converter/internal/compat/backendapi.cpp | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/converter/internal/compat/backendapi.cpp b/src/converter/internal/compat/backendapi.cpp index 3700e2208d7de..421dc1c618fc6 100644 --- a/src/converter/internal/compat/backendapi.cpp +++ b/src/converter/internal/compat/backendapi.cpp @@ -223,6 +223,9 @@ RetVal BackendApi::openProject(const io::path_t& p } notation->setViewMode(ViewMode::PAGE); + for (IExcerptNotationPtr excerpt : notationProject->masterNotation()->excerpts().val) { + excerpt->notation()->setViewMode(ViewMode::PAGE); + } return RetVal::make_ok(notationProject); } From 6d615feacbf76c6f6eb4c790ff233d6f2279fb6f Mon Sep 17 00:00:00 2001 From: Eism Date: Fri, 3 Mar 2023 10:43:32 +0200 Subject: [PATCH 3/8] Work only with Page mode --- .../internal/exportprojectscenario.cpp | 38 +++++++++++++++++++ src/project/internal/exportprojectscenario.h | 4 ++ 2 files changed, 42 insertions(+) diff --git a/src/project/internal/exportprojectscenario.cpp b/src/project/internal/exportprojectscenario.cpp index 57f45c837d55c..e7b856139019e 100644 --- a/src/project/internal/exportprojectscenario.cpp +++ b/src/project/internal/exportprojectscenario.cpp @@ -24,6 +24,7 @@ #include "async/async.h" #include "translation.h" +#include "defer.h" #include "log.h" using namespace mu::project; @@ -113,6 +114,15 @@ bool ExportProjectScenario::exportScores(const notation::INotationPtrList& notat } } + // Backup view modes + std::vector viewModes = this->viewModes(notations); + setViewModes(notations, ViewMode::PAGE); + + DEFER { + // Restore view modes + setViewModes(notations, viewModes); + }; + bool isCreatingOnlyOneFile = this->isCreatingOnlyOneFile(notations, unitType); // If isCreatingOnlyOneFile, the save dialog has already asked whether to replace @@ -361,3 +371,31 @@ void ExportProjectScenario::openFolder(const io::path_t& path) const LOGE() << "Could not open folder: " << path.toQString(); } } + +std::vector ExportProjectScenario::viewModes(const notation::INotationPtrList& notations) const +{ + std::vector modes; + for (INotationPtr notation : notations) { + modes.push_back(notation->painting()->viewMode()); + } + + return modes; +} + +void ExportProjectScenario::setViewModes(const notation::INotationPtrList& notations, + const std::vector& viewModes) const +{ + IF_ASSERT_FAILED(notations.size() == viewModes.size()) { + return; + } + + for (size_t i = 0; i < notations.size(); ++i) { + notations[i]->painting()->setViewMode(viewModes[i]); + } +} + +void ExportProjectScenario::setViewModes(const notation::INotationPtrList& notations, ViewMode viewMode) const +{ + std::vector modes(notations.size(), viewMode); + setViewModes(notations, modes); +} diff --git a/src/project/internal/exportprojectscenario.h b/src/project/internal/exportprojectscenario.h index 2b461220af9bd..0afed8a586b19 100644 --- a/src/project/internal/exportprojectscenario.h +++ b/src/project/internal/exportprojectscenario.h @@ -79,6 +79,10 @@ class ExportProjectScenario : public IExportProjectScenario, public async::Async void openFolder(const io::path_t& path) const; + std::vector viewModes(const notation::INotationPtrList& notations) const; + void setViewModes(const notation::INotationPtrList& notations, const std::vector& viewModes) const; + void setViewModes(const notation::INotationPtrList& notations, notation::ViewMode viewMode) const; + mutable FileConflictPolicy m_fileConflictPolicy = FileConflictPolicy::Undefined; mutable INotationWriterPtr m_currentWriter; mutable std::string m_currentSuffix; From 31988c9ede4fcfdac05dadfcae42c433255292fa Mon Sep 17 00:00:00 2001 From: Roman Pudashkin Date: Fri, 3 Mar 2023 11:59:12 +0200 Subject: [PATCH 4/8] the "cue size" option will always affect the entire chord --- .../models/abstractinspectormodel.cpp | 13 ++++++++---- src/inspector/models/abstractinspectormodel.h | 5 ++++- .../models/general/generalsettingsmodel.cpp | 21 +++++++++++++++++-- .../models/general/generalsettingsmodel.h | 2 ++ 4 files changed, 34 insertions(+), 7 deletions(-) diff --git a/src/inspector/models/abstractinspectormodel.cpp b/src/inspector/models/abstractinspectormodel.cpp index cb0d31f2ffd99..23fa8d95bc6fa 100644 --- a/src/inspector/models/abstractinspectormodel.cpp +++ b/src/inspector/models/abstractinspectormodel.cpp @@ -518,10 +518,15 @@ void AbstractInspectorModel::initPropertyItem(PropertyItem* propertyItem, }); } -void AbstractInspectorModel::loadPropertyItem(PropertyItem* propertyItem, - std::function convertElementPropertyValueFunc) +void AbstractInspectorModel::loadPropertyItem(PropertyItem* propertyItem, ConvertPropertyValueFunc convertElementPropertyValueFunc) { - if (!propertyItem || m_elementList.isEmpty()) { + loadPropertyItem(propertyItem, m_elementList, convertElementPropertyValueFunc); +} + +void AbstractInspectorModel::loadPropertyItem(PropertyItem* propertyItem, const QList& elements, + ConvertPropertyValueFunc convertElementPropertyValueFunc) +{ + if (!propertyItem || elements.isEmpty()) { return; } @@ -535,7 +540,7 @@ void AbstractInspectorModel::loadPropertyItem(PropertyItem* propertyItem, bool isUndefined = false; - for (const mu::engraving::EngravingItem* element : m_elementList) { + for (const mu::engraving::EngravingItem* element : elements) { IF_ASSERT_FAILED(element) { continue; } diff --git a/src/inspector/models/abstractinspectormodel.h b/src/inspector/models/abstractinspectormodel.h index 0e094b44b37fd..51cb28c4a60d9 100644 --- a/src/inspector/models/abstractinspectormodel.h +++ b/src/inspector/models/abstractinspectormodel.h @@ -169,7 +169,10 @@ public slots: PointFPropertyItem* buildPointFPropertyItem(const mu::engraving::Pid& pid, std::function onPropertyChangedCallBack = nullptr); - void loadPropertyItem(PropertyItem* propertyItem, std::function convertElementPropertyValueFunc = nullptr); + using ConvertPropertyValueFunc = std::function; + void loadPropertyItem(PropertyItem* propertyItem, ConvertPropertyValueFunc convertElementPropertyValueFunc = nullptr); + void loadPropertyItem(PropertyItem* propertyItem, const QList& elements, + ConvertPropertyValueFunc convertElementPropertyValueFunc = nullptr); bool isNotationExisting() const; diff --git a/src/inspector/models/general/generalsettingsmodel.cpp b/src/inspector/models/general/generalsettingsmodel.cpp index b67c269a774e5..ba7f6b124b00a 100644 --- a/src/inspector/models/general/generalsettingsmodel.cpp +++ b/src/inspector/models/general/generalsettingsmodel.cpp @@ -43,14 +43,31 @@ void GeneralSettingsModel::createProperties() onVisibleChanged(newValue.toBool()); }); + m_isSmall = buildPropertyItem(Pid::SMALL, [this](const mu::engraving::Pid, const QVariant& newValue) { + setPropertyValue(m_elementsForIsSmallProperty, Pid::SMALL, newValue.toBool()); + }); + m_isAutoPlaceAllowed = buildPropertyItem(Pid::AUTOPLACE); m_isPlayable = buildPropertyItem(Pid::PLAY); - m_isSmall = buildPropertyItem(Pid::SMALL); } void GeneralSettingsModel::requestElements() { m_elementList = m_repository->takeAllElements(); + + QSet elementsForIsSmallProperty; + + for (EngravingItem* element : m_elementList) { + EngravingItem* chord = element->findAncestor(ElementType::CHORD); + + if (chord) { + elementsForIsSmallProperty.insert(chord); + } else { + elementsForIsSmallProperty.insert(element); + } + } + + m_elementsForIsSmallProperty = elementsForIsSmallProperty.values(); } void GeneralSettingsModel::loadProperties() @@ -98,7 +115,7 @@ void GeneralSettingsModel::loadProperties(const mu::engraving::PropertyIdSet& pr } if (mu::contains(propertyIdSet, Pid::SMALL)) { - loadPropertyItem(m_isSmall); + loadPropertyItem(m_isSmall, m_elementsForIsSmallProperty); } } diff --git a/src/inspector/models/general/generalsettingsmodel.h b/src/inspector/models/general/generalsettingsmodel.h index 471e2400cfbc2..d22256a501c37 100644 --- a/src/inspector/models/general/generalsettingsmodel.h +++ b/src/inspector/models/general/generalsettingsmodel.h @@ -76,6 +76,8 @@ public slots: PlaybackProxyModel* m_playbackProxyModel = nullptr; AppearanceSettingsModel* m_appearanceSettingsModel = nullptr; + + QList m_elementsForIsSmallProperty; }; } From 2a8a5f7999d5c00a6e4d9dc550848274aadea20b Mon Sep 17 00:00:00 2001 From: Roman Pudashkin Date: Fri, 3 Mar 2023 13:15:44 +0200 Subject: [PATCH 5/8] fixed displaying the offset property --- .../appearance/appearancesettingsmodel.cpp | 51 +++++++++---------- .../appearance/appearancesettingsmodel.h | 4 +- 2 files changed, 26 insertions(+), 29 deletions(-) diff --git a/src/inspector/models/general/appearance/appearancesettingsmodel.cpp b/src/inspector/models/general/appearance/appearancesettingsmodel.cpp index c0783c4b7c317..dec3ef0794bda 100644 --- a/src/inspector/models/general/appearance/appearancesettingsmodel.cpp +++ b/src/inspector/models/general/appearance/appearancesettingsmodel.cpp @@ -49,13 +49,35 @@ void AppearanceSettingsModel::createProperties() m_color = buildPropertyItem(Pid::COLOR); m_arrangeOrder = buildPropertyItem(Pid::Z); m_offset = buildPointFPropertyItem(Pid::OFFSET, [this](const mu::engraving::Pid, const QVariant& newValue) { - onOffsetChanged(newValue); + setPropertyValue(m_elementsForOffsetProperty, Pid::OFFSET, newValue); }); } void AppearanceSettingsModel::requestElements() { m_elementList = m_repository->takeAllElements(); + + static const std::unordered_set applyOffsetToChordTypes { + ElementType::NOTE, + ElementType::STEM, + ElementType::HOOK, + }; + + QSet elementsForOffsetProperty; + + for (EngravingItem* element : m_elementList) { + if (!mu::contains(applyOffsetToChordTypes, element->type())) { + elementsForOffsetProperty.insert(element); + continue; + } + + EngravingItem* parent = element->parentItem(); + if (parent && parent->isChord()) { + elementsForOffsetProperty.insert(parent); + } + } + + m_elementsForOffsetProperty = elementsForOffsetProperty.values(); } void AppearanceSettingsModel::loadProperties() @@ -110,37 +132,12 @@ void AppearanceSettingsModel::loadProperties(const PropertyIdSet& propertyIdSet) } if (mu::contains(propertyIdSet, Pid::OFFSET)) { - loadPropertyItem(m_offset); + loadPropertyItem(m_offset, m_elementsForOffsetProperty); } emit isSnappedToGridChanged(isSnappedToGrid()); } -void AppearanceSettingsModel::onOffsetChanged(const QVariant& offset) -{ - QList items; - - static const std::unordered_set applyOffsetToChordTypes { - ElementType::NOTE, - ElementType::STEM, - ElementType::HOOK, - }; - - for (EngravingItem* item : m_elementList) { - if (!mu::contains(applyOffsetToChordTypes, item->type())) { - items.push_back(item); - continue; - } - - EngravingItem* parent = item->parentItem(); - if (parent && parent->isChord()) { - items.push_back(parent); - } - } - - setPropertyValue(items, Pid::OFFSET, offset); -} - Page* AppearanceSettingsModel::page() const { return toPage(m_elementList.first()->findAncestor(ElementType::PAGE)); diff --git a/src/inspector/models/general/appearance/appearancesettingsmodel.h b/src/inspector/models/general/appearance/appearancesettingsmodel.h index afd8723814e7f..76c5432fb2568 100644 --- a/src/inspector/models/general/appearance/appearancesettingsmodel.h +++ b/src/inspector/models/general/appearance/appearancesettingsmodel.h @@ -74,8 +74,6 @@ public slots: private: void onNotationChanged(const mu::engraving::PropertyIdSet& changedPropertyIdSet, const mu::engraving::StyleIdSet& changedStyleIdSet) override; - void onOffsetChanged(const QVariant& offset); - void loadProperties(const mu::engraving::PropertyIdSet& allowedPropertyIdSet); mu::engraving::Page* page() const; @@ -88,6 +86,8 @@ public slots: PropertyItem* m_color = nullptr; PropertyItem* m_arrangeOrder = nullptr; PointFPropertyItem* m_offset = nullptr; + + QList m_elementsForOffsetProperty; }; } From 0e4e9d0b84258fd51001366f876ea93165e34c43 Mon Sep 17 00:00:00 2001 From: Eism Date: Fri, 3 Mar 2023 16:26:37 +0200 Subject: [PATCH 6/8] Corrected the logic of the variable --- src/project/internal/projectactionscontroller.cpp | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/src/project/internal/projectactionscontroller.cpp b/src/project/internal/projectactionscontroller.cpp index cf0a6ca45ec6f..e03f435e87388 100644 --- a/src/project/internal/projectactionscontroller.cpp +++ b/src/project/internal/projectactionscontroller.cpp @@ -950,13 +950,13 @@ bool ProjectActionsController::askIfUserAgreesToSaveCorruptedScore(const SaveLoc if (newlyCreated) { showErrCorruptedScoreCannotBeSaved(location, errorText); } else { - warnCorruptedScoreCannotBeSavedOnCloud(errorText, newlyCreated); + warnCorruptedScoreCannotBeSavedOnCloud(errorText, !newlyCreated); } return false; } case SaveLocationType::Local: - return askIfUserAgreesToSaveCorruptedScoreLocally(errorText, newlyCreated); + return askIfUserAgreesToSaveCorruptedScoreLocally(errorText, !newlyCreated); case SaveLocationType::Undefined: return false; } @@ -972,7 +972,7 @@ void ProjectActionsController::warnCorruptedScoreCannotBeSavedOnCloud(const std: IInteractive::ButtonDatas buttons; buttons.push_back(interactive()->buttonData(IInteractive::Button::Cancel)); - IInteractive::ButtonData saveCopyBtn(IInteractive::Button::CustomButton, trc("project", "Save as…"), canRevert /*accent*/); + IInteractive::ButtonData saveCopyBtn(IInteractive::Button::CustomButton, trc("project", "Save as…"), !canRevert /*accent*/); buttons.push_back(saveCopyBtn); int defaultBtn = saveCopyBtn.btn; @@ -980,7 +980,7 @@ void ProjectActionsController::warnCorruptedScoreCannotBeSavedOnCloud(const std: IInteractive::ButtonData revertToLastSavedBtn(saveCopyBtn.btn + 1, trc("project", "Revert to last saved"), true /*accent*/); - if (!canRevert) { + if (canRevert) { buttons.push_back(revertToLastSavedBtn); defaultBtn = revertToLastSavedBtn.btn; } @@ -999,8 +999,8 @@ bool ProjectActionsController::askIfUserAgreesToSaveCorruptedScoreLocally(const bool canRevert) { std::string title = trc("project", "This score has become corrupted and contains errors"); - std::string body = canRevert ? trc("project", "You can continue saving it locally, although the file may become unusable. " - "You can try to fix the errors manually, or get help for this issue on musescore.org.") + std::string body = !canRevert ? trc("project", "You can continue saving it locally, although the file may become unusable. " + "You can try to fix the errors manually, or get help for this issue on musescore.org.") : trc("project", "You can continue saving it locally, although the file may become unusable. " "To preserve your score, revert to the last saved version, or fix the errors manually. " "You can also get help for this issue on musescore.org."); From 0c7774e7b3a6b490865deac3d988b327d8fa4409 Mon Sep 17 00:00:00 2001 From: Eism Date: Mon, 6 Mar 2023 08:44:07 +0200 Subject: [PATCH 7/8] Do not reset value when saving score --- src/engraving/engravingproject.cpp | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/engraving/engravingproject.cpp b/src/engraving/engravingproject.cpp index bbf3102b488d9..7cc4b348cca21 100644 --- a/src/engraving/engravingproject.cpp +++ b/src/engraving/engravingproject.cpp @@ -156,8 +156,6 @@ bool EngravingProject::writeMscz(MscWriter& writer, bool onlySelection, bool cre m_masterScore->update(); } - m_isCorruptedUponLoading = false; - return ok; } From 15d2c68458aceb4de9cad06040e7b6cd1f06c674 Mon Sep 17 00:00:00 2001 From: Eism Date: Mon, 6 Mar 2023 13:10:48 +0200 Subject: [PATCH 8/8] If the current project is valid then we should resetup the playback --- src/playback/internal/playbackcontroller.cpp | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/playback/internal/playbackcontroller.cpp b/src/playback/internal/playbackcontroller.cpp index c05f628708e2b..e7984009a93f3 100644 --- a/src/playback/internal/playbackcontroller.cpp +++ b/src/playback/internal/playbackcontroller.cpp @@ -72,6 +72,9 @@ void PlaybackController::init() globalContext()->currentProjectChanged().onNotify(this, [this]() { if (m_currentSequenceId != -1) { resetCurrentSequence(); + } + + if (!globalContext()->currentProject()) { return; }