diff --git a/framework/audioplugins/iknownaudiopluginsregister.h b/framework/audioplugins/iknownaudiopluginsregister.h index cf967e65e5..c5c2c7aa77 100644 --- a/framework/audioplugins/iknownaudiopluginsregister.h +++ b/framework/audioplugins/iknownaudiopluginsregister.h @@ -39,6 +39,7 @@ class IKnownAudioPluginsRegister : MODULE_GLOBAL_INTERFACE virtual ~IKnownAudioPluginsRegister() = default; virtual Ret load() = 0; + virtual Ret clear() = 0; using PluginInfoAccepted = std::function; diff --git a/framework/audioplugins/internal/knownaudiopluginsregister.cpp b/framework/audioplugins/internal/knownaudiopluginsregister.cpp index 6098aed728..3d46029d70 100644 --- a/framework/audioplugins/internal/knownaudiopluginsregister.cpp +++ b/framework/audioplugins/internal/knownaudiopluginsregister.cpp @@ -204,6 +204,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/framework/audioplugins/internal/knownaudiopluginsregister.h b/framework/audioplugins/internal/knownaudiopluginsregister.h index 521ebf76aa..42cb927b14 100644 --- a/framework/audioplugins/internal/knownaudiopluginsregister.h +++ b/framework/audioplugins/internal/knownaudiopluginsregister.h @@ -45,6 +45,7 @@ class KnownAudioPluginsRegister : public IKnownAudioPluginsRegister KnownAudioPluginsRegister() = default; Ret load() override; + Ret clear() override; AudioPluginInfoList pluginInfoList(PluginInfoAccepted accepted = PluginInfoAccepted()) const override; muse::async::Notification pluginInfoListChanged() const override; diff --git a/framework/audioplugins/internal/registeraudiopluginsscenario.cpp b/framework/audioplugins/internal/registeraudiopluginsscenario.cpp index 9ff03a5e48..b65fb79e69 100644 --- a/framework/audioplugins/internal/registeraudiopluginsscenario.cpp +++ b/framework/audioplugins/internal/registeraudiopluginsscenario.cpp @@ -152,6 +152,19 @@ PluginScanResult RegisterAudioPluginsScenario::scanPlugins(Progress* progress) c return result; } +Ret RegisterAudioPluginsScenario::rescanAllPlugins() +{ + TRACEFUNC; + + Ret ret = knownPluginsRegister()->clear(); + if (!ret) { + LOGE() << "Failed to clear plugins registry: " << ret.toString(); + return ret; + } + + return updatePluginsRegistry(); +} + Ret RegisterAudioPluginsScenario::updatePluginsRegistry() { TRACEFUNC; diff --git a/framework/audioplugins/internal/registeraudiopluginsscenario.h b/framework/audioplugins/internal/registeraudiopluginsscenario.h index 05e78d759f..187b752cbf 100644 --- a/framework/audioplugins/internal/registeraudiopluginsscenario.h +++ b/framework/audioplugins/internal/registeraudiopluginsscenario.h @@ -57,6 +57,8 @@ class RegisterAudioPluginsScenario : public IRegisterAudioPluginsScenario, publi PluginScanResult scanPlugins(Progress* progress = nullptr) const override; Ret updatePluginsRegistry() override; + Ret rescanAllPlugins() override; + Ret registerNewPlugins(const io::paths_t& pluginPaths, bool validate) override; Ret unregisterRemovedPlugins(const PluginResourceIdList& pluginIds) override; diff --git a/framework/audioplugins/iregisteraudiopluginsscenario.h b/framework/audioplugins/iregisteraudiopluginsscenario.h index 2c55501125..e0505ccb2f 100644 --- a/framework/audioplugins/iregisteraudiopluginsscenario.h +++ b/framework/audioplugins/iregisteraudiopluginsscenario.h @@ -45,6 +45,8 @@ class IRegisterAudioPluginsScenario : MODULE_CONTEXT_INTERFACE virtual PluginScanResult scanPlugins(Progress* progress = nullptr) const = 0; virtual Ret updatePluginsRegistry() = 0; + virtual Ret rescanAllPlugins() = 0; + // validate=false only persists Discovered placeholders, to be validated on the next scan virtual Ret registerNewPlugins(const io::paths_t& pluginPaths, bool validate = true) = 0; virtual Ret unregisterRemovedPlugins(const PluginResourceIdList& pluginIds) = 0; diff --git a/framework/audioplugins/tests/mocks/knownaudiopluginsregistermock.h b/framework/audioplugins/tests/mocks/knownaudiopluginsregistermock.h index d00d62600c..7ae7090684 100644 --- a/framework/audioplugins/tests/mocks/knownaudiopluginsregistermock.h +++ b/framework/audioplugins/tests/mocks/knownaudiopluginsregistermock.h @@ -30,6 +30,7 @@ class KnownAudioPluginsRegisterMock : public IKnownAudioPluginsRegister { public: MOCK_METHOD(Ret, load, (), (override)); + MOCK_METHOD(Ret, clear, (), (override)); MOCK_METHOD(AudioPluginInfoList, pluginInfoList, (PluginInfoAccepted), (const, override)); MOCK_METHOD(async::Notification, pluginInfoListChanged, (), (const, override)); diff --git a/framework/dockwindow/qml/Muse/Dock/dockpanelview.cpp b/framework/dockwindow/qml/Muse/Dock/dockpanelview.cpp index fa469a2bd4..cebeccbb5c 100644 --- a/framework/dockwindow/qml/Muse/Dock/dockpanelview.cpp +++ b/framework/dockwindow/qml/Muse/Dock/dockpanelview.cpp @@ -92,6 +92,10 @@ class DockPanelView::DockPanelMenuModel : public muse::uicomponents::AbstractMen connect(model, &AbstractMenuModel::itemChanged, this, [this](MenuItem* item) { updateItem(item); }); + + connect(model, &AbstractMenuModel::destroyed, this, [this]() { + m_customMenuModel = nullptr; + }); } private: diff --git a/framework/dockwindow/thirdparty/KDDockWidgets/src/private/LayoutWidget.cpp b/framework/dockwindow/thirdparty/KDDockWidgets/src/private/LayoutWidget.cpp index 5cc804b1e3..989bd50ac1 100644 --- a/framework/dockwindow/thirdparty/KDDockWidgets/src/private/LayoutWidget.cpp +++ b/framework/dockwindow/thirdparty/KDDockWidgets/src/private/LayoutWidget.cpp @@ -116,6 +116,10 @@ void LayoutWidget::restorePlaceholder(DockWidgetBase *dw, Layouting::Item *item, auto frame = qobject_cast(item->guestAsQObject()); Q_ASSERT(frame); + if (frame->beingDeletedLater()) { + return; + } + if (tabIndex != -1 && frame->dockWidgetCount() >= tabIndex) { frame->insertWidget(dw, tabIndex); } else { diff --git a/framework/dockwindow_v2/qml/Muse/Dock/dockpanelview.cpp b/framework/dockwindow_v2/qml/Muse/Dock/dockpanelview.cpp index 47cdc705ed..d6fa2a38ad 100644 --- a/framework/dockwindow_v2/qml/Muse/Dock/dockpanelview.cpp +++ b/framework/dockwindow_v2/qml/Muse/Dock/dockpanelview.cpp @@ -94,6 +94,10 @@ class DockPanelView::DockPanelMenuModel : public muse::uicomponents::AbstractMen connect(model, &AbstractMenuModel::itemChanged, this, [this](MenuItem* item) { updateItem(item); }); + + connect(model, &AbstractMenuModel::destroyed, this, [this]() { + m_customMenuModel = nullptr; + }); } private: