Support multiple instrument subplugin categories (#5801)

This commit is contained in:
Dominic Clark
2020-11-24 23:55:10 +00:00
committed by GitHub
parent ed9abe58c6
commit 571c425f4a
2 changed files with 48 additions and 49 deletions

View File

@@ -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;
};

View File

@@ -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<Plugin::Descriptor*> 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 );
}
}