EffectSelectDialog: rewritten using Designer

All of the GUI code of EffectSelectDialog has been replaced by an
according UI file. Also merged EffectListWidget class into
EffectSelectDialog to further simplify logic.
(cherry picked from commit cb85bfc906)
This commit is contained in:
Tobias Doerffel committed 2009-08-29 00:02:20 +02:00
1 parent c32567ce2f
commit fc72b1a6a4
3 files changed
+189 -212

No files matched your search

+72 -175
View File
@@ -22,129 +22,30 @@
*
*/
#include <QtGui/QGroupBox>
#include <QtGui/QLayout>
#include <QtGui/QLineEdit>
#include <QtGui/QListView>
#include <QtGui/QPushButton>
#include <QtGui/QScrollArea>
#include "EffectSelectDialog.h"
#include "ui_EffectSelectDialog.h"
#include "gui_templates.h"
#include "embed.h"
EffectSelectDialog::EffectSelectDialog( QWidget * _parent ) :
QDialog( _parent )
{
setWindowIcon( embed::getIconPixmap( "setup_audio" ) );
setWindowTitle( tr( "Effects Selector" ) );
setModal( true );
QVBoxLayout * vlayout = new QVBoxLayout( this );
vlayout->setSpacing( 10 );
vlayout->setMargin( 10 );
EffectListWidget * elist = new EffectListWidget( this );
elist->setMinimumSize( 540, 400 );
connect( elist, SIGNAL( doubleClicked( const effectKey & ) ),
this, SLOT( selectPlugin() ) );
connect( elist, SIGNAL( highlighted( const effectKey & ) ),
this, SLOT( setSelection( const effectKey & ) ) );
m_currentSelection = elist->getSelected();
QWidget * buttons = new QWidget( this );
QHBoxLayout * btn_layout = new QHBoxLayout( buttons );
btn_layout->setSpacing( 0 );
btn_layout->setMargin( 0 );
QPushButton * select_btn = new QPushButton(
embed::getIconPixmap( "add" ),
tr( "Add" ), buttons );
connect( select_btn, SIGNAL( clicked() ),
this, SLOT( selectPlugin() ) );
QPushButton * cancel_btn = new QPushButton(
embed::getIconPixmap( "cancel" ),
tr( "Cancel" ), buttons );
connect( cancel_btn, SIGNAL( clicked() ),
this, SLOT( reject() ) );
btn_layout->addStretch();
btn_layout->addSpacing( 10 );
btn_layout->addWidget( select_btn );
btn_layout->addSpacing( 10 );
btn_layout->addWidget( cancel_btn );
btn_layout->addSpacing( 10 );
vlayout->addWidget( elist );
vlayout->addSpacing( 10 );
vlayout->addWidget( buttons );
vlayout->addSpacing( 10 );
//vlayout->addStretch();
show();
}
EffectSelectDialog::~EffectSelectDialog()
{
}
Effect * EffectSelectDialog::instantiateSelectedPlugin( EffectChain * _parent )
{
if( !m_currentSelection.name.isEmpty() && m_currentSelection.desc )
{
return Effect::instantiate( m_currentSelection.desc->name,
_parent,
&m_currentSelection );
}
return( NULL );
}
void EffectSelectDialog::setSelection( const EffectKey & _selection )
{
m_currentSelection = _selection;
}
void EffectSelectDialog::selectPlugin()
{
if( m_currentSelection.isValid() )
{
accept();
}
}
EffectListWidget::EffectListWidget( QWidget * _parent ) :
QWidget( _parent ),
QDialog( _parent ),
ui( new Ui::EffectSelectDialog ),
m_sourceModel(),
m_model(),
m_descriptionWidget( NULL )
{
ui->setupUi( this );
setWindowIcon( embed::getIconPixmap( "setup_audio" ) );
// query effects
Plugin::getDescriptorsOfAvailPlugins( m_pluginDescriptors );
for( QVector<Plugin::Descriptor>::iterator it =
m_pluginDescriptors.begin();
it != m_pluginDescriptors.end(); ++it )
for( QVector<Plugin::Descriptor>::Iterator it = m_pluginDescriptors.begin();
it != m_pluginDescriptors.end(); ++it )
{
if( it->type != Plugin::Effect )
{
@@ -168,82 +69,90 @@ EffectListWidget::EffectListWidget( QWidget * _parent ) :
}
}
QStringList plugin_names;
// and fill our source model
QStringList pluginNames;
for( EffectKeyList::ConstIterator it = m_effectKeys.begin();
it != m_effectKeys.end(); ++it )
it != m_effectKeys.end(); ++it )
{
plugin_names += QString( ( *it ).desc->displayName ) +
pluginNames += QString( ( *it ).desc->displayName ) +
( ( ( *it ).desc->sub_plugin_features != NULL ) ?
": " + ( *it ).name
:
"" );
}
int row = 0;
for( QStringList::iterator it = plugin_names.begin();
it != plugin_names.end(); ++it )
for( QStringList::ConstIterator it = pluginNames.begin();
it != pluginNames.end(); ++it )
{
m_sourceModel.setItem( row, 0, new QStandardItem( *it ) );
++row;
}
// setup filtering
m_model.setSourceModel( &m_sourceModel );
m_model.setFilterCaseSensitivity( Qt::CaseInsensitive );
m_filterEdit = new QLineEdit( this );
connect( m_filterEdit, SIGNAL( textChanged( const QString & ) ),
&m_model, SLOT( setFilterRegExp( const QString & ) ) );
connect( m_filterEdit, SIGNAL( textChanged( const QString & ) ),
connect( ui->filterEdit, SIGNAL( textChanged( const QString & ) ),
&m_model, SLOT( setFilterRegExp( const QString & ) ) );
connect( ui->filterEdit, SIGNAL( textChanged( const QString & ) ),
this, SLOT( updateSelection() ) );
m_pluginList = new QListView( this );
m_pluginList->setModel( &m_model );
QItemSelectionModel * sm = new QItemSelectionModel( &m_model );
m_pluginList->setSelectionModel( sm );
m_pluginList->setSelectionBehavior( QAbstractItemView::SelectRows );
m_pluginList->setSelectionMode( QAbstractItemView::SingleSelection );
m_pluginList->setHorizontalScrollBarPolicy( Qt::ScrollBarAlwaysOff );
connect( sm, SIGNAL( currentRowChanged( const QModelIndex &,
const QModelIndex & ) ),
SLOT( rowChanged( const QModelIndex &,
const QModelIndex & ) ) );
connect( m_pluginList, SIGNAL( doubleClicked( const QModelIndex & ) ),
SLOT( onDoubleClicked( const QModelIndex & ) ) );
ui->pluginList->setModel( &m_model );
QGroupBox * groupbox = new QGroupBox( tr( "Description" ), this );
groupbox->setFixedHeight( 200 );
QVBoxLayout * gbl = new QVBoxLayout( groupbox );
gbl->setMargin( 0 );
gbl->setSpacing( 10 );
m_scrollArea = new QScrollArea( groupbox );
m_scrollArea->setFrameStyle( 0 );
gbl->addWidget( m_scrollArea );
QVBoxLayout * vboxl = new QVBoxLayout( this );
vboxl->setMargin( 0 );
vboxl->setSpacing( 10 );
vboxl->addWidget( m_filterEdit );
vboxl->addWidget( m_pluginList );
vboxl->addWidget( groupbox );
// setup selection model
QItemSelectionModel * selectionModel = new QItemSelectionModel( &m_model );
ui->pluginList->setSelectionModel( selectionModel );
connect( selectionModel, SIGNAL( currentRowChanged( const QModelIndex &,
const QModelIndex & ) ),
SLOT( rowChanged( const QModelIndex &, const QModelIndex & ) ) );
connect( ui->pluginList, SIGNAL( doubleClicked( const QModelIndex & ) ),
SLOT( acceptSelection() ) );
// try to accept current selection when pressing "OK"
connect( ui->buttonBox, SIGNAL( accepted() ),
this, SLOT( acceptSelection() ) );
updateSelection();
show();
}
EffectListWidget::~EffectListWidget()
EffectSelectDialog::~EffectSelectDialog()
{
}
void EffectListWidget::rowChanged( const QModelIndex & _idx, const QModelIndex & )
Effect * EffectSelectDialog::instantiateSelectedPlugin( EffectChain * _parent )
{
if( !m_currentSelection.name.isEmpty() && m_currentSelection.desc )
{
return Effect::instantiate( m_currentSelection.desc->name,
_parent, &m_currentSelection );
}
return NULL;
}
void EffectSelectDialog::acceptSelection()
{
if( m_currentSelection.isValid() )
{
accept();
}
}
void EffectSelectDialog::rowChanged( const QModelIndex & _idx,
const QModelIndex & )
{
delete m_descriptionWidget;
m_descriptionWidget = NULL;
@@ -251,13 +160,11 @@ void EffectListWidget::rowChanged( const QModelIndex & _idx, const QModelIndex &
if( m_model.mapToSource( _idx ).row() < 0 )
{
// invalidate current selection
m_currentSelection =
Plugin::Descriptor::SubPluginFeatures::Key();
m_currentSelection = Plugin::Descriptor::SubPluginFeatures::Key();
}
else
{
m_currentSelection =
m_effectKeys[m_model.mapToSource( _idx ).row()];
m_currentSelection = m_effectKeys[m_model.mapToSource( _idx ).row()];
}
if( m_currentSelection.desc &&
m_currentSelection.desc->sub_plugin_features )
@@ -267,13 +174,11 @@ void EffectListWidget::rowChanged( const QModelIndex & _idx, const QModelIndex &
l->setMargin( 4 );
l->setSpacing( 0 );
m_scrollArea->setWidget( m_descriptionWidget );
ui->scrollArea->setWidget( m_descriptionWidget );
m_currentSelection.desc->sub_plugin_features->
fillDescriptionWidget( m_descriptionWidget,
&m_currentSelection );
foreach( QWidget * w,
m_descriptionWidget->findChildren<QWidget *>() )
fillDescriptionWidget( m_descriptionWidget, &m_currentSelection );
foreach( QWidget * w, m_descriptionWidget->findChildren<QWidget *>() )
{
if( w->parent() == m_descriptionWidget )
{
@@ -283,32 +188,24 @@ void EffectListWidget::rowChanged( const QModelIndex & _idx, const QModelIndex &
l->setSizeConstraint( QLayout::SetFixedSize );
m_descriptionWidget->show();
}
emit highlighted( m_currentSelection );
}
void EffectListWidget::onDoubleClicked( const QModelIndex & )
{
emit doubleClicked( m_currentSelection );
}
void EffectListWidget::updateSelection()
void EffectSelectDialog::updateSelection()
{
// no valid selection anymore due to changed filter?
if( m_pluginList->selectionModel()->selection().size() <= 0 )
if( ui->pluginList->selectionModel()->selection().size() <= 0 )
{
// then select our first item
m_pluginList->selectionModel()->select( m_model.index( 0, 0 ),
QItemSelectionModel::ClearAndSelect );
ui->pluginList->selectionModel()->select( m_model.index( 0, 0 ),
QItemSelectionModel::ClearAndSelect );
rowChanged( m_model.index( 0, 0 ), QModelIndex() );
}
}
#include "moc_EffectSelectDialog.cxx"