mirror of
https://github.com/LMMS/lmms.git
synced 2026-02-23 17:56:31 -05:00
PluginBrowser: Tree layout and search bar
This commit is contained in:
@@ -31,6 +31,10 @@
|
||||
#include "SideBarWidget.h"
|
||||
#include "Plugin.h"
|
||||
|
||||
class QLineEdit;
|
||||
class QTreeWidget;
|
||||
class QTreeWidgetItem;
|
||||
|
||||
|
||||
class PluginBrowser : public SideBarWidget
|
||||
{
|
||||
@@ -39,18 +43,18 @@ public:
|
||||
PluginBrowser( QWidget * _parent );
|
||||
virtual ~PluginBrowser() = default;
|
||||
|
||||
private slots:
|
||||
void onFilterChanged( const QString & filter );
|
||||
|
||||
private:
|
||||
void addPlugins();
|
||||
void updateRootVisibility( int index );
|
||||
void updateRootVisibilities();
|
||||
|
||||
QWidget * m_view;
|
||||
};
|
||||
|
||||
|
||||
|
||||
|
||||
class PluginDescList : public QWidget
|
||||
{
|
||||
Q_OBJECT
|
||||
public:
|
||||
PluginDescList(QWidget* parent);
|
||||
QTreeWidget * m_descTree;
|
||||
QTreeWidgetItem * m_lmmsRoot;
|
||||
QTreeWidgetItem * m_lv2Root;
|
||||
};
|
||||
|
||||
|
||||
@@ -62,6 +66,7 @@ class PluginDescWidget : public QWidget
|
||||
public:
|
||||
typedef Plugin::Descriptor::SubPluginFeatures::Key PluginKey;
|
||||
PluginDescWidget( const PluginKey & _pk, QWidget * _parent );
|
||||
QString name() const;
|
||||
|
||||
|
||||
protected:
|
||||
|
||||
@@ -24,11 +24,13 @@
|
||||
|
||||
#include "PluginBrowser.h"
|
||||
|
||||
#include <QHeaderView>
|
||||
#include <QLabel>
|
||||
#include <QPainter>
|
||||
#include <QLineEdit>
|
||||
#include <QMouseEvent>
|
||||
#include <QScrollArea>
|
||||
#include <QPainter>
|
||||
#include <QStyleOption>
|
||||
#include <QTreeWidget>
|
||||
|
||||
#include "embed.h"
|
||||
#include "Engine.h"
|
||||
@@ -60,23 +62,91 @@ PluginBrowser::PluginBrowser( QWidget * _parent ) :
|
||||
m_view );
|
||||
hint->setWordWrap( true );
|
||||
|
||||
QScrollArea* scrollarea = new QScrollArea( m_view );
|
||||
PluginDescList* descList = new PluginDescList( m_view );
|
||||
scrollarea->setWidget(descList);
|
||||
scrollarea->setWidgetResizable(true);
|
||||
QLineEdit * searchBar = new QLineEdit( m_view );
|
||||
searchBar->setPlaceholderText( "Search" );
|
||||
searchBar->setMaxLength( 64 );
|
||||
searchBar->setClearButtonEnabled( true );
|
||||
|
||||
view_layout->addWidget(hint);
|
||||
view_layout->addWidget(scrollarea);
|
||||
m_descTree = new QTreeWidget( m_view );
|
||||
m_descTree->setColumnCount( 1 );
|
||||
m_descTree->header()->setVisible( false );
|
||||
m_descTree->setIndentation( 10 );
|
||||
m_descTree->setSelectionMode( QAbstractItemView::NoSelection );
|
||||
|
||||
connect( searchBar, SIGNAL( textEdited( const QString & ) ),
|
||||
this, SLOT( onFilterChanged( const QString & ) ) );
|
||||
|
||||
view_layout->addWidget( hint );
|
||||
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
|
||||
addPlugins();
|
||||
|
||||
// Resize
|
||||
m_descTree->header()->setSectionResizeMode( QHeaderView::ResizeToContents );
|
||||
|
||||
// Hide empty roots
|
||||
updateRootVisibilities();
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
PluginDescList::PluginDescList(QWidget *parent) :
|
||||
QWidget(parent)
|
||||
void PluginBrowser::updateRootVisibility( int rootIndex )
|
||||
{
|
||||
QVBoxLayout* layout = new QVBoxLayout(this);
|
||||
QTreeWidgetItem * root = m_descTree->topLevelItem( rootIndex );
|
||||
root->setHidden( !root->childCount() );
|
||||
}
|
||||
|
||||
|
||||
void PluginBrowser::updateRootVisibilities()
|
||||
{
|
||||
int rootCount = m_descTree->topLevelItemCount();
|
||||
for (int rootIndex = 0; rootIndex < rootCount; ++rootIndex)
|
||||
{
|
||||
updateRootVisibility( rootIndex );
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
void PluginBrowser::onFilterChanged( const QString & filter )
|
||||
{
|
||||
int rootCount = m_descTree->topLevelItemCount();
|
||||
for (int rootIndex = 0; rootIndex < rootCount; ++rootIndex)
|
||||
{
|
||||
QTreeWidgetItem * root = m_descTree->topLevelItem( rootIndex );
|
||||
|
||||
int itemCount = root->childCount();
|
||||
for (int itemIndex = 0; itemIndex < itemCount; ++itemIndex)
|
||||
{
|
||||
QTreeWidgetItem * item = root->child( itemIndex );
|
||||
PluginDescWidget * descWidget = static_cast<PluginDescWidget *>
|
||||
(m_descTree->itemWidget( item, 0));
|
||||
if (descWidget->name().contains(filter, Qt::CaseInsensitive))
|
||||
{
|
||||
item->setHidden( false );
|
||||
}
|
||||
else
|
||||
{
|
||||
item->setHidden( true );
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
void PluginBrowser::addPlugins()
|
||||
{
|
||||
QList<Plugin::Descriptor*> descs = pluginFactory->descriptors(Plugin::Instrument);
|
||||
std::sort(
|
||||
descs.begin(),
|
||||
@@ -93,7 +163,7 @@ PluginDescList::PluginDescList(QWidget *parent) :
|
||||
|
||||
for (const Plugin::Descriptor* desc: descs)
|
||||
{
|
||||
if( desc->subPluginFeatures )
|
||||
if ( desc->subPluginFeatures )
|
||||
{
|
||||
desc->subPluginFeatures->listSubPluginKeys(
|
||||
desc,
|
||||
@@ -109,13 +179,18 @@ PluginDescList::PluginDescList(QWidget *parent) :
|
||||
|
||||
for (const PluginKey& key : pluginKeys)
|
||||
{
|
||||
PluginDescWidget* p = new PluginDescWidget( key, this );
|
||||
p->show();
|
||||
layout->addWidget(p);
|
||||
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 );
|
||||
}
|
||||
|
||||
setLayout(layout);
|
||||
layout->addStretch();
|
||||
}
|
||||
|
||||
|
||||
@@ -137,6 +212,14 @@ PluginDescWidget::PluginDescWidget(const PluginKey &_pk,
|
||||
|
||||
|
||||
|
||||
QString PluginDescWidget::name() const
|
||||
{
|
||||
return m_pluginKey.displayName();
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
void PluginDescWidget::paintEvent( QPaintEvent * )
|
||||
{
|
||||
|
||||
@@ -190,7 +273,7 @@ void PluginDescWidget::leaveEvent( QEvent * _e )
|
||||
|
||||
void PluginDescWidget::mousePressEvent( QMouseEvent * _me )
|
||||
{
|
||||
if( _me->button() == Qt::LeftButton )
|
||||
if ( _me->button() == Qt::LeftButton )
|
||||
{
|
||||
Engine::setDndPluginKey(&m_pluginKey);
|
||||
new StringPairDrag("instrument",
|
||||
|
||||
Reference in New Issue
Block a user