From c08171db1b07c52154a1b4e7603c85bd400f90f7 Mon Sep 17 00:00:00 2001 From: nasehim7 Date: Fri, 31 May 2024 18:46:18 +0100 Subject: [PATCH] Add: Accessibility Panel - Score Style Preset option --- share/styles/CMakeLists.txt | 2 +- share/styles/MSN/CMakeLists.txt | 8 + src/engraving/CMakeLists.txt | 1 + src/engraving/style/style.cpp | 32 +++- src/engraving/style/style.h | 6 + src/engraving/types/accessibilitystyle.h | 42 +++++ src/inspector/CMakeLists.txt | 2 + src/inspector/models/abstractinspectormodel.h | 1 + src/inspector/models/inspectorlistmodel.cpp | 7 +- .../score/scoreaccessibilitysettingsmodel.cpp | 153 ++++++++++++++++++ .../score/scoreaccessibilitysettingsmodel.h | 56 +++++++ src/inspector/view/inspector_resources.qrc | 1 + .../Inspector/InspectorSectionDelegate.qml | 20 +++ .../score/ScoreAccessibilityInspectorView.qml | 62 +++++++ 14 files changed, 390 insertions(+), 3 deletions(-) create mode 100644 share/styles/MSN/CMakeLists.txt create mode 100644 src/engraving/types/accessibilitystyle.h create mode 100644 src/inspector/models/score/scoreaccessibilitysettingsmodel.cpp create mode 100644 src/inspector/models/score/scoreaccessibilitysettingsmodel.h create mode 100644 src/inspector/view/qml/MuseScore/Inspector/score/ScoreAccessibilityInspectorView.qml diff --git a/share/styles/CMakeLists.txt b/share/styles/CMakeLists.txt index a5613cd4a252b..4710cb62ef07b 100644 --- a/share/styles/CMakeLists.txt +++ b/share/styles/CMakeLists.txt @@ -31,4 +31,4 @@ install(FILES cchords_sym.xml DESTINATION ${Mscore_SHARE_NAME}${Mscore_INSTALL_NAME}styles ) - +add_subdirectory(MSN) diff --git a/share/styles/MSN/CMakeLists.txt b/share/styles/MSN/CMakeLists.txt new file mode 100644 index 0000000000000..04250f2dbc904 --- /dev/null +++ b/share/styles/MSN/CMakeLists.txt @@ -0,0 +1,8 @@ +install(FILES + 16mm_MSN.mss + 18mm_MSN.mss + 20mm_MSN.mss + 22mm_MSN.mss + 25mm_MSN.mss + DESTINATION ${Mscore_SHARE_NAME}${Mscore_INSTALL_NAME}styles/MSN + ) diff --git a/src/engraving/CMakeLists.txt b/src/engraving/CMakeLists.txt index f04741338caae..96b3c83d024cb 100644 --- a/src/engraving/CMakeLists.txt +++ b/src/engraving/CMakeLists.txt @@ -191,6 +191,7 @@ set(MODULE_SRC ${CMAKE_CURRENT_LIST_DIR}/types/groupnode.h ${CMAKE_CURRENT_LIST_DIR}/types/propertyvalue.cpp ${CMAKE_CURRENT_LIST_DIR}/types/propertyvalue.h + ${CMAKE_CURRENT_LIST_DIR}/types/accessibilitystyle.h ${CMAKE_CURRENT_LIST_DIR}/style/styledef.cpp ${CMAKE_CURRENT_LIST_DIR}/style/styledef.h diff --git a/src/engraving/style/style.cpp b/src/engraving/style/style.cpp index 32f80294c2417..9e7823dd8701e 100644 --- a/src/engraving/style/style.cpp +++ b/src/engraving/style/style.cpp @@ -108,6 +108,30 @@ int MStyle::defaultStyleVersion() const return styleI(Sid::defaultsVersion); } +void MStyle::setStylePreset(AccessibilityStylePreset presetName) +{ + switch (presetName) { + case AccessibilityStylePreset::MSN_16MM: + m_stylepreset = String(u"16mm MSN"); + break; + case AccessibilityStylePreset::MSN_18MM: + m_stylepreset = String(u"18mm MSN"); + break; + case AccessibilityStylePreset::MSN_20MM: + m_stylepreset = String(u"20mm MSN"); + break; + case AccessibilityStylePreset::MSN_22MM: + m_stylepreset = String(u"22mm MSN"); + break; + case AccessibilityStylePreset::MSN_25MM: + m_stylepreset = String(u"25mm MSN"); + break; + default: + m_stylepreset = String(u"Default"); + break; + } +} + bool MStyle::readProperties(XmlReader& e) { const AsciiStringView tag(e.name()); @@ -279,6 +303,11 @@ void MStyle::readVersion(String versionTag) m_version = versionTag.toInt(); } +void MStyle::readStylePreset(String presetTag) +{ + m_stylepreset = presetTag; +} + bool MStyle::read(IODevice* device, bool ign) { UNUSED(ign); @@ -288,6 +317,7 @@ bool MStyle::read(IODevice* device, bool ign) readVersion(e.attribute("version")); while (e.readNextStartElement()) { if (e.name() == "Style") { + readStylePreset(e.attribute("preset")); read(e, nullptr); } else { e.unknown(); @@ -535,7 +565,7 @@ bool MStyle::write(IODevice* device) void MStyle::save(XmlWriter& xml, bool optimize) { - xml.startElement("Style"); + xml.startElement("Style", { { "preset", stylePreset() } }); for (const StyleDef::StyleValue& st : StyleDef::styleValues) { Sid idx = st.styleIdx(); diff --git a/src/engraving/style/style.h b/src/engraving/style/style.h index 53fb9e15746f1..e0adc283fa358 100644 --- a/src/engraving/style/style.h +++ b/src/engraving/style/style.h @@ -31,6 +31,7 @@ #include "../types/dimension.h" #include "../types/propertyvalue.h" +#include "../types/accessibilitystyle.h" #include "styledef.h" @@ -73,6 +74,9 @@ class MStyle void setDefaultStyleVersion(const int defaultsVersion); int defaultStyleVersion() const; + String stylePreset() const { return m_stylepreset; } + void setStylePreset(AccessibilityStylePreset presetName); + bool read(muse::io::IODevice* device, bool ign = false); bool write(muse::io::IODevice* device); void save(XmlWriter& xml, bool optimize); @@ -98,7 +102,9 @@ class MStyle std::array m_precomputedValues; void readVersion(String versionTag); + void readStylePreset(String presetTag); int m_version = 0; + String m_stylepreset = String(); }; } // namespace mu::engraving diff --git a/src/engraving/types/accessibilitystyle.h b/src/engraving/types/accessibilitystyle.h new file mode 100644 index 0000000000000..8fff0c72e44ae --- /dev/null +++ b/src/engraving/types/accessibilitystyle.h @@ -0,0 +1,42 @@ +/* + * SPDX-License-Identifier: GPL-3.0-only + * MuseScore-Studio-CLA-applies + * + * MuseScore Studio + * Music Composition & Notation + * + * Copyright (C) 2021 MuseScore Limited + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 3 as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ +#ifndef MU_ENGRAVING_ACCESSIBILITYSTYLEPRESET_H +#define MU_ENGRAVING_ACCESSIBILITYSTYLEPRESET_H + +namespace mu::engraving { +enum class AccessibilityStylePreset { + DEFAULT = 0, + DEFAULT_EDITED, + MSN_16MM, + MSN_16MM_EDITED, + MSN_18MM, + MSN_18MM_EDITED, + MSN_20MM, + MSN_20MM_EDITED, + MSN_22MM, + MSN_22MM_EDITED, + MSN_25MM, + MSN_25MM_EDITED +}; +} + +#endif // MU_ENGRAVING_ACCESSIBILITYSTYLEPRESET_H diff --git a/src/inspector/CMakeLists.txt b/src/inspector/CMakeLists.txt index 9806b49e81d72..2e1eb52636362 100644 --- a/src/inspector/CMakeLists.txt +++ b/src/inspector/CMakeLists.txt @@ -86,6 +86,8 @@ set(MODULE_SRC ${CMAKE_CURRENT_LIST_DIR}/models/measures/measuressettingsmodel.h ${CMAKE_CURRENT_LIST_DIR}/models/score/scoreappearancesettingsmodel.cpp ${CMAKE_CURRENT_LIST_DIR}/models/score/scoreappearancesettingsmodel.h + ${CMAKE_CURRENT_LIST_DIR}/models/score/scoreaccessibilitysettingsmodel.cpp + ${CMAKE_CURRENT_LIST_DIR}/models/score/scoreaccessibilitysettingsmodel.h ${CMAKE_CURRENT_LIST_DIR}/models/score/scoredisplaysettingsmodel.cpp ${CMAKE_CURRENT_LIST_DIR}/models/score/scoredisplaysettingsmodel.h ${CMAKE_CURRENT_LIST_DIR}/models/score/internal/pagetypelistmodel.cpp diff --git a/src/inspector/models/abstractinspectormodel.h b/src/inspector/models/abstractinspectormodel.h index dcb3b3eda10ba..034e4e42af8df 100644 --- a/src/inspector/models/abstractinspectormodel.h +++ b/src/inspector/models/abstractinspectormodel.h @@ -65,6 +65,7 @@ class AbstractInspectorModel : public QObject, public muse::async::Asyncable SECTION_TEXT, SECTION_SCORE_DISPLAY, SECTION_SCORE_APPEARANCE, + SECTION_SCORE_ACCESSIBILITY, SECTION_PARTS, }; Q_ENUM(InspectorSectionType) diff --git a/src/inspector/models/inspectorlistmodel.cpp b/src/inspector/models/inspectorlistmodel.cpp index 212951ddb1f05..bae2afc954328 100644 --- a/src/inspector/models/inspectorlistmodel.cpp +++ b/src/inspector/models/inspectorlistmodel.cpp @@ -28,6 +28,7 @@ #include "text/textsettingsmodel.h" #include "score/scoredisplaysettingsmodel.h" #include "score/scoreappearancesettingsmodel.h" +#include "score/scoreaccessibilitysettingsmodel.h" #include "notation/inotationinteraction.h" #include "internal/services/elementrepositoryservice.h" @@ -73,7 +74,8 @@ void InspectorListModel::buildModelsForEmptySelection() static const InspectorSectionTypeSet persistentSections { InspectorSectionType::SECTION_SCORE_DISPLAY, - InspectorSectionType::SECTION_SCORE_APPEARANCE + InspectorSectionType::SECTION_SCORE_APPEARANCE, + InspectorSectionType::SECTION_SCORE_ACCESSIBILITY }; removeUnusedModels({}, false /*isRangeSelection*/, {}, persistentSections); @@ -195,6 +197,9 @@ void InspectorListModel::createModelsBySectionType(const InspectorSectionTypeSet case InspectorSectionType::SECTION_SCORE_APPEARANCE: newModel = new ScoreAppearanceSettingsModel(this, m_repository); break; + case InspectorSectionType::SECTION_SCORE_ACCESSIBILITY: + newModel = new ScoreAccessibilitySettingsModel(this, m_repository); + break; case InspectorSectionType::SECTION_PARTS: newModel = new PartsSettingsModel(this, m_repository); break; diff --git a/src/inspector/models/score/scoreaccessibilitysettingsmodel.cpp b/src/inspector/models/score/scoreaccessibilitysettingsmodel.cpp new file mode 100644 index 0000000000000..c6871603e1624 --- /dev/null +++ b/src/inspector/models/score/scoreaccessibilitysettingsmodel.cpp @@ -0,0 +1,153 @@ +/* + * SPDX-License-Identifier: GPL-3.0-only + * MuseScore-Studio-CLA-applies + * + * MuseScore Studio + * Music Composition & Notation + * + * Copyright (C) 2021 MuseScore Limited + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 3 as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ +#include "scoreaccessibilitysettingsmodel.h" + +#include "translation.h" +#include "log.h" + +using namespace mu::inspector; +using namespace mu::engraving; + +ScoreAccessibilitySettingsModel::ScoreAccessibilitySettingsModel(QObject* parent, IElementRepositoryService* repository) + : AbstractInspectorModel(parent, repository) +{ + setSectionType(InspectorSectionType::SECTION_SCORE_ACCESSIBILITY); + setTitle(muse::qtrc("inspector", "Accessibility")); +} + +void ScoreAccessibilitySettingsModel::createProperties() +{ + // Placeholder +} + +void ScoreAccessibilitySettingsModel::requestElements() +{ + // Placeholder +} + +void ScoreAccessibilitySettingsModel::loadProperties() +{ + // Placeholder +} + +void ScoreAccessibilitySettingsModel::resetProperties() +{ + // Placeholder +} + +muse::io::path_t ScoreAccessibilitySettingsModel::getStyleFilePath(int preset) const +{ + muse::io::path_t basePath = globalConfiguration()->appDataPath() + "styles/MSN/"; + switch (static_cast(preset)) { + case AccessibilityStylePreset::DEFAULT: + return engravingConfiguration()->defaultStyleFilePath(); + case AccessibilityStylePreset::MSN_16MM: + return basePath + "16mm_MSN.mss"; + case AccessibilityStylePreset::MSN_18MM: + return basePath + "18mm_MSN.mss"; + case AccessibilityStylePreset::MSN_20MM: + return basePath + "20mm_MSN.mss"; + case AccessibilityStylePreset::MSN_22MM: + return basePath + "22mm_MSN.mss"; + case AccessibilityStylePreset::MSN_25MM: + return basePath + "25mm_MSN.mss"; + default: + return muse::io::path_t(); + } +} + +QVariantList ScoreAccessibilitySettingsModel::possibleScoreStylePreset() const +{ + QString text = "text"; + QString value = "value"; + + return QVariantList { + QVariantMap { + { text, muse::qtrc("inspector", "Default") }, + { value, static_cast(AccessibilityStylePreset::DEFAULT) }, + }, + QVariantMap { + //: Modified Stave Notation (MSN) with 16mm staff size. Intended for visually-impaired musicians. + { text, muse::qtrc("inspector", "16mm MSN") }, + { value, static_cast(AccessibilityStylePreset::MSN_16MM) }, + }, + QVariantMap { + //: Modified Stave Notation (MSN) with 18mm staff size. Intended for visually-impaired musicians. + { text, muse::qtrc("inspector", "18mm MSN") }, + { value, static_cast(AccessibilityStylePreset::MSN_18MM) }, + }, + QVariantMap { + //: Modified Stave Notation (MSN) with 20mm staff size. Intended for visually-impaired musicians. + { text, muse::qtrc("inspector", "20mm MSN") }, + { value, static_cast(AccessibilityStylePreset::MSN_20MM) }, + }, + QVariantMap { + //: Modified Stave Notation (MSN) with 22mm staff size. Intended for visually-impaired musicians. + { text, muse::qtrc("inspector", "22mm MSN") }, + { value, static_cast(AccessibilityStylePreset::MSN_22MM) }, + }, + QVariantMap { + //: Modified Stave Notation (MSN) with 25mm staff size. Intended for visually-impaired musicians. + { text, muse::qtrc("inspector", "25mm MSN") }, + { value, static_cast(AccessibilityStylePreset::MSN_25MM) }, + }, + }; +} + +void ScoreAccessibilitySettingsModel::loadStyle(int preset) const +{ + muse::io::path_t filePath = getStyleFilePath(preset); + AccessibilityStylePreset presetName = static_cast(preset); + + if (presetName == AccessibilityStylePreset::DEFAULT) { + if (filePath.empty()) { + StyleIdSet emptySet; + globalContext()->currentNotation()->style()->resetAllStyleValues(emptySet); + } else { + globalContext()->currentNotation()->style()->loadStyle(filePath, true); + } + } else if (!filePath.empty()) { + LOGI() << "Loading style from filePath:" << filePath; + globalContext()->currentNotation()->style()->loadStyle(filePath, true); + } else { + LOGI() << "filePath is empty"; + } + globalContext()->currentNotation()->elements()->msScore()->score()->style().setStylePreset(presetName); +} + +int ScoreAccessibilitySettingsModel::scoreStylePreset() const +{ + String presetValue = globalContext()->currentNotation()->elements()->msScore()->score()->style().stylePreset(); + if (presetValue == "Default") { + return 0; + } else if (presetValue == "16mm MSN") { + return 1; + } else if (presetValue == "18mm MSN") { + return 2; + } else if (presetValue == "20mm MSN") { + return 3; + } else if (presetValue == "22mm MSN") { + return 4; + } else if (presetValue == "25mm MSN") { + return 5; + } +} diff --git a/src/inspector/models/score/scoreaccessibilitysettingsmodel.h b/src/inspector/models/score/scoreaccessibilitysettingsmodel.h new file mode 100644 index 0000000000000..5d3f27f08c90f --- /dev/null +++ b/src/inspector/models/score/scoreaccessibilitysettingsmodel.h @@ -0,0 +1,56 @@ +/* + * SPDX-License-Identifier: GPL-3.0-only + * MuseScore-Studio-CLA-applies + * + * MuseScore Studio + * Music Composition & Notation + * + * Copyright (C) 2021 MuseScore Limited + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 3 as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ +#ifndef MU_INSPECTOR_SCOREACCESSIBILITYSETTINGSMODEL_H +#define MU_INSPECTOR_SCOREACCESSIBILITYSETTINGSMODEL_H + +#include + +#include "models/abstractinspectormodel.h" +#include "context/iglobalcontext.h" +#include "global/iglobalconfiguration.h" +#include "engraving/iengravingconfiguration.h" +#include "engraving/types/accessibilitystyle.h" + +namespace mu::inspector { +class ScoreAccessibilitySettingsModel : public AbstractInspectorModel +{ + Q_OBJECT + INJECT(mu::context::IGlobalContext, globalContext) + INJECT(muse::IGlobalConfiguration, globalConfiguration); + INJECT(engraving::IEngravingConfiguration, engravingConfiguration); + +public: + explicit ScoreAccessibilitySettingsModel(QObject* parent, IElementRepositoryService* repository); + + void createProperties() override; + void requestElements() override; + void loadProperties() override; + void resetProperties() override; + + muse::io::path_t getStyleFilePath(int preset) const; + Q_INVOKABLE QVariantList possibleScoreStylePreset() const; + Q_INVOKABLE void loadStyle(int preset) const; + Q_INVOKABLE int scoreStylePreset() const; +}; +} + +#endif // MU_INSPECTOR_SCOREACCESSIBILITYSETTINGSMODEL_H diff --git a/src/inspector/view/inspector_resources.qrc b/src/inspector/view/inspector_resources.qrc index 3d99c193f5753..5e0c7f8000b23 100644 --- a/src/inspector/view/inspector_resources.qrc +++ b/src/inspector/view/inspector_resources.qrc @@ -50,6 +50,7 @@ qml/MuseScore/Inspector/notation/fretdiagrams/internal/FretAdvancedSettingsTab.qml qml/MuseScore/Inspector/score/ScoreDisplayInspectorView.qml qml/MuseScore/Inspector/score/ScoreAppearanceInspectorView.qml + qml/MuseScore/Inspector/score/ScoreAccessibilityInspectorView.qml qml/MuseScore/Inspector/score/HideEmptyStavesSettings.qml qml/MuseScore/Inspector/common/InspectorPropertyView.qml qml/MuseScore/Inspector/common/TextSection.qml diff --git a/src/inspector/view/qml/MuseScore/Inspector/InspectorSectionDelegate.qml b/src/inspector/view/qml/MuseScore/Inspector/InspectorSectionDelegate.qml index 5455947ff5dd8..88d0576f5a52f 100644 --- a/src/inspector/view/qml/MuseScore/Inspector/InspectorSectionDelegate.qml +++ b/src/inspector/view/qml/MuseScore/Inspector/InspectorSectionDelegate.qml @@ -73,6 +73,7 @@ ExpandableBlank { } case Inspector.SECTION_SCORE_DISPLAY: return scoreSection case Inspector.SECTION_SCORE_APPEARANCE: return scoreAppearanceSection + case Inspector.SECTION_SCORE_ACCESSIBILITY: return scoreAccessibilitySection case Inspector.SECTION_PARTS: return partsSection } @@ -206,6 +207,25 @@ ExpandableBlank { } } + Component { + id: scoreAccessibilitySection + + ScoreAccessibilityInspectorView { + model: root.sectionModel + navigationPanel: root.navigationPanel + navigationRowStart: root.navigation.row + 1 + anchorItem: root.anchorItem + + onEnsureContentVisibleRequested: function(invisibleContentHeight) { + root.ensureContentVisibleRequested(-invisibleContentHeight) + } + + onPopupOpened: { + root.popupOpened(openedPopup, control) + } + } + } + Component { id: partsSection diff --git a/src/inspector/view/qml/MuseScore/Inspector/score/ScoreAccessibilityInspectorView.qml b/src/inspector/view/qml/MuseScore/Inspector/score/ScoreAccessibilityInspectorView.qml new file mode 100644 index 0000000000000..62fed9b1dfdf3 --- /dev/null +++ b/src/inspector/view/qml/MuseScore/Inspector/score/ScoreAccessibilityInspectorView.qml @@ -0,0 +1,62 @@ +/* + * SPDX-License-Identifier: GPL-3.0-only + * MuseScore-Studio-CLA-applies + * + * MuseScore Studio + * Music Composition & Notation + * + * Copyright (C) 2021 MuseScore Limited + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 3 as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ +import QtQuick 2.15 +import QtQuick.Controls 2.15 +import QtQuick.Layouts 1.15 + +import MuseScore.Inspector 1.0 +import Muse.UiComponents 1.0 +import Muse.Ui 1.0 + +import "../common" + +InspectorSectionView { + id: root + + implicitHeight: contentColumn.implicitHeight + + Column { + id: contentColumn + width: parent.width + spacing: 8 + + Text { + text: qsTr("Score style preset") + color: ui.theme.fontPrimaryColor + } + + StyledDropdown { + id: scoreStylePreset + width: parent.width + model: root.model ? root.model.possibleScoreStylePreset() : [] + + Component.onCompleted: { + scoreStylePreset.currentIndex = root.model.scoreStylePreset() + } + + onActivated: function(index, value) { + scoreStylePreset.currentIndex = index + root.model.loadStyle(value) + } + } + } +}