diff --git a/src/appshell/qml/Preferences/MidiDeviceMappingPreferencesPage.qml b/src/appshell/qml/Preferences/MidiDeviceMappingPreferencesPage.qml index f86a3d130e..dcd3644171 100644 --- a/src/appshell/qml/Preferences/MidiDeviceMappingPreferencesPage.qml +++ b/src/appshell/qml/Preferences/MidiDeviceMappingPreferencesPage.qml @@ -33,6 +33,10 @@ PreferencesPage { return page.apply() } + function reset() { + page.reset() + } + MidiDeviceMappingPage { id: page diff --git a/src/appshell/qml/Preferences/PreferencesDialog.qml b/src/appshell/qml/Preferences/PreferencesDialog.qml index cffa4d7277..f0e38bae7e 100644 --- a/src/appshell/qml/Preferences/PreferencesDialog.qml +++ b/src/appshell/qml/Preferences/PreferencesDialog.qml @@ -146,6 +146,14 @@ StyledDialogView { navigation.order: 100000 onRevertFactorySettingsRequested: { + var pages = preferencesModel.availablePages() + + for (var i in pages) { + var page = pages[i] + var obj = root.prv.pagesObjects[page.id] + obj.reset() + } + preferencesModel.resetFactorySettings() } diff --git a/src/appshell/qml/Preferences/PreferencesPage.qml b/src/appshell/qml/Preferences/PreferencesPage.qml index 0d31d29289..58c73d053a 100644 --- a/src/appshell/qml/Preferences/PreferencesPage.qml +++ b/src/appshell/qml/Preferences/PreferencesPage.qml @@ -49,6 +49,9 @@ Rectangle { return true } + function reset() { + } + function ensureContentVisibleRequested(contentRect) { if (flickable.contentY + flickable.height < contentRect.y + contentRect.height) { flickable.contentY += contentRect.y + contentRect.height - (flickable.contentY + flickable.height) diff --git a/src/appshell/qml/Preferences/ShortcutsPreferencesPage.qml b/src/appshell/qml/Preferences/ShortcutsPreferencesPage.qml index b8805ff530..d55554578f 100644 --- a/src/appshell/qml/Preferences/ShortcutsPreferencesPage.qml +++ b/src/appshell/qml/Preferences/ShortcutsPreferencesPage.qml @@ -36,6 +36,10 @@ PreferencesPage { return page.apply() } + function reset() { + page.reset() + } + ShortcutsPage { id: page diff --git a/src/appshell/view/preferences/preferencesmodel.cpp b/src/appshell/view/preferences/preferencesmodel.cpp index dcfaa64baa..167452e468 100644 --- a/src/appshell/view/preferences/preferencesmodel.cpp +++ b/src/appshell/view/preferences/preferencesmodel.cpp @@ -197,7 +197,8 @@ void PreferencesModel::load(const QString& currentPageId) void PreferencesModel::resetFactorySettings() { - configuration()->revertToFactorySettings(); + static constexpr bool KEEP_DEFAULT_SETTINGS = true; + configuration()->revertToFactorySettings(KEEP_DEFAULT_SETTINGS); configuration()->startEditSettings(); } diff --git a/src/framework/shortcuts/imidiremote.h b/src/framework/shortcuts/imidiremote.h index 2180fa1171..d21a3f5d2d 100644 --- a/src/framework/shortcuts/imidiremote.h +++ b/src/framework/shortcuts/imidiremote.h @@ -36,6 +36,8 @@ public: virtual const MidiMappingList& midiMappings() const = 0; virtual Ret setMidiMappings(const MidiMappingList& midiMappings) = 0; + virtual void resetMidiMappings() = 0; + virtual async::Notification midiMappinsChanged() const = 0; // Setting virtual void setIsSettingMode(bool arg) = 0; diff --git a/src/framework/shortcuts/internal/midiremote.cpp b/src/framework/shortcuts/internal/midiremote.cpp index e7a77b65f5..77f6f97d4d 100644 --- a/src/framework/shortcuts/internal/midiremote.cpp +++ b/src/framework/shortcuts/internal/midiremote.cpp @@ -68,11 +68,26 @@ mu::Ret MidiRemote::setMidiMappings(const MidiMappingList& midiMappings) if (ok) { m_midiMappings = midiMappings; + m_midiMappingsChanged.notify(); } return ok; } +void MidiRemote::resetMidiMappings() +{ + mi::WriteResourceLockGuard resource_guard(multiInstancesProvider(), MIDI_MAPPING_RESOURCE_NAME); + fileSystem()->remove(configuration()->midiMappingUserAppDataPath()); + + m_midiMappings = {}; + m_midiMappingsChanged.notify(); +} + +mu::async::Notification MidiRemote::midiMappinsChanged() const +{ + return m_midiMappingsChanged; +} + void MidiRemote::setIsSettingMode(bool arg) { m_isSettingMode = arg; diff --git a/src/framework/shortcuts/internal/midiremote.h b/src/framework/shortcuts/internal/midiremote.h index 5587554fd0..b7d2d06a84 100644 --- a/src/framework/shortcuts/internal/midiremote.h +++ b/src/framework/shortcuts/internal/midiremote.h @@ -25,9 +25,11 @@ #include "async/asyncable.h" #include "modularity/ioc.h" +#include "system/ifilesystem.h" #include "actions/iactionsdispatcher.h" #include "multiinstances/imultiinstancesprovider.h" #include "ishortcutsconfiguration.h" + #include "shortcutstypes.h" #include "../imidiremote.h" @@ -39,9 +41,10 @@ class XmlWriter; namespace mu::shortcuts { class MidiRemote : public IMidiRemote, public async::Asyncable { - INJECT(shortcuts, IShortcutsConfiguration, configuration) - INJECT(shortcuts, actions::IActionsDispatcher, dispatcher) + INJECT(shortcuts, system::IFileSystem, fileSystem) INJECT(shortcuts, mi::IMultiInstancesProvider, multiInstancesProvider) + INJECT(shortcuts, actions::IActionsDispatcher, dispatcher) + INJECT(shortcuts, IShortcutsConfiguration, configuration) public: MidiRemote() = default; @@ -50,6 +53,8 @@ public: const MidiMappingList& midiMappings() const override; Ret setMidiMappings(const MidiMappingList& midiMappings) override; + void resetMidiMappings() override; + async::Notification midiMappinsChanged() const override; // Setting void setIsSettingMode(bool arg) override; @@ -74,6 +79,7 @@ private: bool m_isSettingMode = false; MidiMappingList m_midiMappings; + async::Notification m_midiMappingsChanged; }; } diff --git a/src/framework/shortcuts/internal/shortcutsregister.cpp b/src/framework/shortcuts/internal/shortcutsregister.cpp index 7eb21151cb..31b7db0f08 100644 --- a/src/framework/shortcuts/internal/shortcutsregister.cpp +++ b/src/framework/shortcuts/internal/shortcutsregister.cpp @@ -318,6 +318,14 @@ mu::Ret ShortcutsRegister::setShortcuts(const ShortcutList& shortcuts) return ok; } +void ShortcutsRegister::resetShortcuts() +{ + mi::WriteResourceLockGuard(multiInstancesProvider(), SHORTCUTS_RESOURCE_NAME); + fileSystem()->remove(configuration()->shortcutsUserAppDataPath()); + + reload(); +} + bool ShortcutsRegister::writeToFile(const ShortcutList& shortcuts, const io::path& path) const { TRACEFUNC; diff --git a/src/framework/shortcuts/internal/shortcutsregister.h b/src/framework/shortcuts/internal/shortcutsregister.h index 3d005035eb..75a608af0f 100644 --- a/src/framework/shortcuts/internal/shortcutsregister.h +++ b/src/framework/shortcuts/internal/shortcutsregister.h @@ -50,6 +50,7 @@ public: const ShortcutList& shortcuts() const override; Ret setShortcuts(const ShortcutList& shortcuts) override; + void resetShortcuts() override; async::Notification shortcutsChanged() const override; Ret setAdditionalShortcuts(const std::string& context, const ShortcutList& shortcuts) override; diff --git a/src/framework/shortcuts/ishortcutsregister.h b/src/framework/shortcuts/ishortcutsregister.h index 6ff4b7b02d..2dfebd8ad9 100644 --- a/src/framework/shortcuts/ishortcutsregister.h +++ b/src/framework/shortcuts/ishortcutsregister.h @@ -39,6 +39,7 @@ public: virtual const ShortcutList& shortcuts() const = 0; virtual Ret setShortcuts(const ShortcutList& shortcuts) = 0; + virtual void resetShortcuts() = 0; virtual async::Notification shortcutsChanged() const = 0; virtual Ret setAdditionalShortcuts(const std::string& context, const ShortcutList& shortcuts) = 0; diff --git a/src/framework/shortcuts/qml/MuseScore/Shortcuts/MidiDeviceMappingPage.qml b/src/framework/shortcuts/qml/MuseScore/Shortcuts/MidiDeviceMappingPage.qml index 059e690ee7..1120f01fc6 100644 --- a/src/framework/shortcuts/qml/MuseScore/Shortcuts/MidiDeviceMappingPage.qml +++ b/src/framework/shortcuts/qml/MuseScore/Shortcuts/MidiDeviceMappingPage.qml @@ -38,6 +38,10 @@ Item { return mappingsModel.apply() } + function reset() { + mappingsModel.reset() + } + EditMidiMappingDialog { id: editMappingDialog diff --git a/src/framework/shortcuts/qml/MuseScore/Shortcuts/ShortcutsPage.qml b/src/framework/shortcuts/qml/MuseScore/Shortcuts/ShortcutsPage.qml index d9c37b0260..a2d2c459bc 100644 --- a/src/framework/shortcuts/qml/MuseScore/Shortcuts/ShortcutsPage.qml +++ b/src/framework/shortcuts/qml/MuseScore/Shortcuts/ShortcutsPage.qml @@ -47,6 +47,10 @@ Item { return shortcutsModel.apply() } + function reset() { + shortcutsModel.reset() + } + Component.onCompleted: { shortcutsModel.load() diff --git a/src/framework/shortcuts/view/mididevicemappingmodel.cpp b/src/framework/shortcuts/view/mididevicemappingmodel.cpp index 0e5702cba4..18e0208309 100644 --- a/src/framework/shortcuts/view/mididevicemappingmodel.cpp +++ b/src/framework/shortcuts/view/mididevicemappingmodel.cpp @@ -148,6 +148,10 @@ void MidiDeviceMappingModel::load() } } + midiRemote()->midiMappinsChanged().onNotify(this, [this](){ + load(); + }); + endResetModel(); } @@ -166,6 +170,11 @@ bool MidiDeviceMappingModel::apply() return ret; } +void MidiDeviceMappingModel::reset() +{ + midiRemote()->resetMidiMappings(); +} + bool MidiDeviceMappingModel::useRemoteControl() const { return midiConfiguration()->useRemoteControl(); diff --git a/src/framework/shortcuts/view/mididevicemappingmodel.h b/src/framework/shortcuts/view/mididevicemappingmodel.h index f98ea11ed3..9d89080e07 100644 --- a/src/framework/shortcuts/view/mididevicemappingmodel.h +++ b/src/framework/shortcuts/view/mididevicemappingmodel.h @@ -26,6 +26,8 @@ #include #include +#include "async/asyncable.h" + #include "modularity/ioc.h" #include "midi/miditypes.h" #include "midi/imidiconfiguration.h" @@ -36,7 +38,7 @@ #include "ui/uitypes.h" namespace mu::shortcuts { -class MidiDeviceMappingModel : public QAbstractListModel +class MidiDeviceMappingModel : public QAbstractListModel, public async::Asyncable { Q_OBJECT @@ -63,6 +65,7 @@ public: Q_INVOKABLE void load(); Q_INVOKABLE bool apply(); + Q_INVOKABLE void reset(); Q_INVOKABLE void clearSelectedActions(); Q_INVOKABLE void clearAllActions(); diff --git a/src/framework/shortcuts/view/shortcutsmodel.cpp b/src/framework/shortcuts/view/shortcutsmodel.cpp index 42f0ac1177..2bacd9f30d 100644 --- a/src/framework/shortcuts/view/shortcutsmodel.cpp +++ b/src/framework/shortcuts/view/shortcutsmodel.cpp @@ -129,6 +129,11 @@ bool ShortcutsModel::apply() return ret; } +void ShortcutsModel::reset() +{ + shortcutsRegister()->resetShortcuts(); +} + QItemSelection ShortcutsModel::selection() const { return m_selection; diff --git a/src/framework/shortcuts/view/shortcutsmodel.h b/src/framework/shortcuts/view/shortcutsmodel.h index 44c6d55ad0..2eb87f7e9d 100644 --- a/src/framework/shortcuts/view/shortcutsmodel.h +++ b/src/framework/shortcuts/view/shortcutsmodel.h @@ -62,6 +62,7 @@ public: Q_INVOKABLE void load(); Q_INVOKABLE bool apply(); + Q_INVOKABLE void reset(); Q_INVOKABLE void importShortcutsFromFile(); Q_INVOKABLE void exportShortcutsToFile();