From 571c425f4acb26141104b58ba00f036f83b46d35 Mon Sep 17 00:00:00 2001 From: Dominic Clark Date: Tue, 24 Nov 2020 23:55:10 +0000 Subject: [PATCH] Support multiple instrument subplugin categories (#5801) --- include/PluginBrowser.h | 3 -- src/gui/PluginBrowser.cpp | 94 ++++++++++++++++++++------------------- 2 files changed, 48 insertions(+), 49 deletions(-) diff --git a/include/PluginBrowser.h b/include/PluginBrowser.h index 3cc54c6e4..fa13f2469 100644 --- a/include/PluginBrowser.h +++ b/include/PluginBrowser.h @@ -33,7 +33,6 @@ class QLineEdit; class QTreeWidget; -class QTreeWidgetItem; class PluginBrowser : public SideBarWidget @@ -53,8 +52,6 @@ private: QWidget * m_view; QTreeWidget * m_descTree; - QTreeWidgetItem * m_lmmsRoot; - QTreeWidgetItem * m_lv2Root; }; diff --git a/src/gui/PluginBrowser.cpp b/src/gui/PluginBrowser.cpp index 7fd1a6301..f27ba51c3 100644 --- a/src/gui/PluginBrowser.cpp +++ b/src/gui/PluginBrowser.cpp @@ -79,18 +79,7 @@ PluginBrowser::PluginBrowser( QWidget * _parent ) : view_layout->addWidget( searchBar ); view_layout->addWidget( m_descTree ); - // Add LMMS root to the tree - m_lmmsRoot = new QTreeWidgetItem(); - m_lmmsRoot->setText( 0, "LMMS" ); - m_descTree->insertTopLevelItem( 0, m_lmmsRoot ); - m_lmmsRoot->setExpanded( true ); - - // Add LV2 root to the tree - m_lv2Root = new QTreeWidgetItem(); - m_lv2Root->setText( 0, "LV2" ); - m_descTree->insertTopLevelItem( 1, m_lv2Root ); - - // Add plugins to the tree roots + // Add plugins to the tree addPlugins(); // Resize @@ -146,50 +135,63 @@ void PluginBrowser::onFilterChanged( const QString & filter ) void PluginBrowser::addPlugins() { - QList descs = pluginFactory->descriptors(Plugin::Instrument); - std::sort( - descs.begin(), - descs.end(), - []( const Plugin::Descriptor* d1, const Plugin::Descriptor* d2 ) -> bool - { - return qstricmp( d1->displayName, d2->displayName ) < 0 ? true : false; - } + // Add a root node to the plugin tree with the specified `label` and return it + const auto addRoot = [this](auto label) + { + const auto root = new QTreeWidgetItem(); + root->setText(0, label); + m_descTree->addTopLevelItem(root); + return root; + }; + + // Add the plugin identified by `key` to the tree under the root node `root` + const auto addPlugin = [this](const auto& key, auto root) + { + const auto item = new QTreeWidgetItem(); + root->addChild(item); + m_descTree->setItemWidget(item, 0, new PluginDescWidget(key, m_descTree)); + }; + + // Remove any existing plugins from the tree + m_descTree->clear(); + + // Fetch and sort all instrument plugin descriptors + auto descs = pluginFactory->descriptors(Plugin::Instrument); + std::sort(descs.begin(), descs.end(), + [](auto d1, auto d2) + { + return qstricmp(d1->displayName, d2->displayName) < 0; + } ); - typedef Plugin::Descriptor::SubPluginFeatures::KeyList PluginKeyList; - typedef Plugin::Descriptor::SubPluginFeatures::Key PluginKey; - PluginKeyList subPluginKeys, pluginKeys; + // Add a root node to the tree for native LMMS plugins + const auto lmmsRoot = addRoot("LMMS"); + lmmsRoot->setExpanded(true); - for (const Plugin::Descriptor* desc: descs) + // Add all of the descriptors to the tree + for (const auto desc : descs) { - if ( desc->subPluginFeatures ) + if (desc->subPluginFeatures) { - desc->subPluginFeatures->listSubPluginKeys( - desc, - subPluginKeys ); + // Fetch and sort all subplugins for this plugin descriptor + auto subPluginKeys = Plugin::Descriptor::SubPluginFeatures::KeyList{}; + desc->subPluginFeatures->listSubPluginKeys(desc, subPluginKeys); + std::sort(subPluginKeys.begin(), subPluginKeys.end(), + [](const auto& l, const auto& r) + { + return QString::compare(l.displayName(), r.displayName(), Qt::CaseInsensitive) < 0; + } + ); + + // Create a root node for this plugin and add the subplugins under it + const auto root = addRoot(desc->displayName); + for (const auto& key : subPluginKeys) { addPlugin(key, root); } } else { - pluginKeys << PluginKey( desc, desc->name ); + addPlugin(Plugin::Descriptor::SubPluginFeatures::Key(desc, desc->name), lmmsRoot); } } - - pluginKeys += subPluginKeys; - - for (const PluginKey& key : pluginKeys) - { - QTreeWidgetItem * item = new QTreeWidgetItem(); - if ( key.desc->name == QStringLiteral("lv2instrument") ) - { - m_lv2Root->addChild( item ); - } - else - { - m_lmmsRoot->addChild( item ); - } - PluginDescWidget* p = new PluginDescWidget( key, m_descTree ); - m_descTree->setItemWidget( item, 0, p ); - } }