diff --git a/src/framework/audioplugins/iknownaudiopluginsregister.h b/src/framework/audioplugins/iknownaudiopluginsregister.h index 5b24242db911c..2117ea2b75470 100644 --- a/src/framework/audioplugins/iknownaudiopluginsregister.h +++ b/src/framework/audioplugins/iknownaudiopluginsregister.h @@ -38,6 +38,7 @@ class IKnownAudioPluginsRegister : MODULE_CONTEXT_INTERFACE virtual ~IKnownAudioPluginsRegister() = default; virtual Ret load() = 0; + virtual Ret clear() = 0; using PluginInfoAccepted = std::function; diff --git a/src/framework/audioplugins/internal/knownaudiopluginsregister.cpp b/src/framework/audioplugins/internal/knownaudiopluginsregister.cpp index 4d3e9ddc8acc6..28ca8b446a769 100644 --- a/src/framework/audioplugins/internal/knownaudiopluginsregister.cpp +++ b/src/framework/audioplugins/internal/knownaudiopluginsregister.cpp @@ -151,6 +151,17 @@ Ret KnownAudioPluginsRegister::load() return muse::make_ok(); } +Ret KnownAudioPluginsRegister::clear() +{ + m_pluginInfoMap.clear(); + m_pluginPaths.clear(); + + Ret ret = writePluginsInfo(); + m_pluginInfoListChanged.notify(); + + return ret; +} + AudioPluginInfoList KnownAudioPluginsRegister::pluginInfoList(PluginInfoAccepted accepted) const { if (!accepted) { diff --git a/src/framework/audioplugins/internal/knownaudiopluginsregister.h b/src/framework/audioplugins/internal/knownaudiopluginsregister.h index 755387b2ed312..8e2e240e78185 100644 --- a/src/framework/audioplugins/internal/knownaudiopluginsregister.h +++ b/src/framework/audioplugins/internal/knownaudiopluginsregister.h @@ -40,6 +40,7 @@ class KnownAudioPluginsRegister : public IKnownAudioPluginsRegister, public Cont : Contextable(iocCtx) {} Ret load() override; + Ret clear() override; AudioPluginInfoList pluginInfoList(PluginInfoAccepted accepted = PluginInfoAccepted()) const override; muse::async::Notification pluginInfoListChanged() const override; diff --git a/src/framework/audioplugins/internal/registeraudiopluginsscenario.cpp b/src/framework/audioplugins/internal/registeraudiopluginsscenario.cpp index b41b46b90aad0..10387e3d3f7f9 100644 --- a/src/framework/audioplugins/internal/registeraudiopluginsscenario.cpp +++ b/src/framework/audioplugins/internal/registeraudiopluginsscenario.cpp @@ -76,6 +76,18 @@ PluginScanResult RegisterAudioPluginsScenario::scanPlugins() const return result; } +void RegisterAudioPluginsScenario::rescanAllPlugins() +{ + TRACEFUNC; + + Ret ret = knownPluginsRegister()->clear(); + if (!ret) { + LOGE() << "Failed to clear plugins registry: " << ret.toString(); + } + + updatePluginsRegistry(); +} + void RegisterAudioPluginsScenario::updatePluginsRegistry() { TRACEFUNC; diff --git a/src/framework/audioplugins/internal/registeraudiopluginsscenario.h b/src/framework/audioplugins/internal/registeraudiopluginsscenario.h index c880a36540645..39d912798d694 100644 --- a/src/framework/audioplugins/internal/registeraudiopluginsscenario.h +++ b/src/framework/audioplugins/internal/registeraudiopluginsscenario.h @@ -53,6 +53,7 @@ class RegisterAudioPluginsScenario : public IRegisterAudioPluginsScenario, publi PluginScanResult scanPlugins() const override; void updatePluginsRegistry() override; + void rescanAllPlugins() override; Ret registerNewPlugins(const io::paths_t& pluginPaths) override; Ret unregisterRemovedPlugins(const audio::AudioResourceIdList& pluginIds) override; diff --git a/src/framework/audioplugins/iregisteraudiopluginsscenario.h b/src/framework/audioplugins/iregisteraudiopluginsscenario.h index d9874fd35a602..48294ab905d66 100644 --- a/src/framework/audioplugins/iregisteraudiopluginsscenario.h +++ b/src/framework/audioplugins/iregisteraudiopluginsscenario.h @@ -44,6 +44,7 @@ class IRegisterAudioPluginsScenario : MODULE_CONTEXT_INTERFACE virtual PluginScanResult scanPlugins() const = 0; virtual void updatePluginsRegistry() = 0; + virtual void rescanAllPlugins() = 0; virtual Ret registerNewPlugins(const io::paths_t& pluginPaths) = 0; virtual Ret unregisterRemovedPlugins(const audio::AudioResourceIdList& pluginIds) = 0; diff --git a/src/preferences/qml/MuseScore/Preferences/folderspreferencesmodel.cpp b/src/preferences/qml/MuseScore/Preferences/folderspreferencesmodel.cpp index 3ad5bb7c45268..92e74774ce589 100644 --- a/src/preferences/qml/MuseScore/Preferences/folderspreferencesmodel.cpp +++ b/src/preferences/qml/MuseScore/Preferences/folderspreferencesmodel.cpp @@ -33,6 +33,15 @@ FoldersPreferencesModel::FoldersPreferencesModel(QObject* parent) { } +bool FoldersPreferencesModel::vstEnabled() const +{ +#ifdef MUSE_MODULE_VST + return true; +#else + return false; +#endif +} + int FoldersPreferencesModel::rowCount(const QModelIndex&) const { return m_folders.count(); @@ -235,6 +244,13 @@ QModelIndex FoldersPreferencesModel::folderIndex(FoldersPreferencesModel::Folder return QModelIndex(); } +void FoldersPreferencesModel::rescanVstPlugins() +{ + if (registerAudioPluginsScenario()) { + registerAudioPluginsScenario()->rescanAllPlugins(); + } +} + QString FoldersPreferencesModel::pathsToString(const io::paths_t& paths) const { return QString::fromStdString(io::pathsToString(paths)); diff --git a/src/preferences/qml/MuseScore/Preferences/folderspreferencesmodel.h b/src/preferences/qml/MuseScore/Preferences/folderspreferencesmodel.h index 0184b4123f51c..26138b9e61e12 100644 --- a/src/preferences/qml/MuseScore/Preferences/folderspreferencesmodel.h +++ b/src/preferences/qml/MuseScore/Preferences/folderspreferencesmodel.h @@ -34,12 +34,15 @@ #include "extensions/iextensionsconfiguration.h" #include "audio/main/iaudioconfiguration.h" #include "vst/ivstconfiguration.h" +#include "audioplugins/iregisteraudiopluginsscenario.h" namespace mu::preferences { class FoldersPreferencesModel : public QAbstractListModel, public muse::Contextable, public muse::async::Asyncable { Q_OBJECT - QML_ELEMENT; + QML_ELEMENT + + Q_PROPERTY(bool vstEnabled READ vstEnabled CONSTANT) muse::GlobalInject globalConfiguration; muse::GlobalInject projectConfiguration; @@ -47,16 +50,20 @@ class FoldersPreferencesModel : public QAbstractListModel, public muse::Contexta muse::GlobalInject extensionsConfiguration; muse::GlobalInject audioConfiguration; muse::GlobalInject vstConfiguration; + muse::ContextInject registerAudioPluginsScenario = { this }; public: explicit FoldersPreferencesModel(QObject* parent = nullptr); + bool vstEnabled() const; + int rowCount(const QModelIndex& parent = QModelIndex()) const override; QVariant data(const QModelIndex& index, int role) const override; bool setData(const QModelIndex& index, const QVariant& value, int role) override; QHash roleNames() const override; Q_INVOKABLE void load(); + Q_INVOKABLE void rescanVstPlugins(); private: void setupConnections(); diff --git a/src/preferences/qml/MuseScore/Preferences/internal/FoldersSection.qml b/src/preferences/qml/MuseScore/Preferences/internal/FoldersSection.qml index b9fb00ce30e69..7fbac7d331914 100644 --- a/src/preferences/qml/MuseScore/Preferences/internal/FoldersSection.qml +++ b/src/preferences/qml/MuseScore/Preferences/internal/FoldersSection.qml @@ -75,4 +75,23 @@ BaseSection { } } } + + RowLayout { + visible: root.model.vstEnabled + width: parent.width + + Item { Layout.fillWidth: true } + + FlatButton { + text: qsTrc("preferences", "Rescan VST3 plugins") + + navigation.name: "rescanVstPluginsButton" + navigation.panel: root.navigation + navigation.row: view.count + 1 + + onClicked: { + Qt.callLater(root.model.rescanVstPlugins) + } + } + } }