]> Creatis software - cpPlugins.git/blobdiff - lib/cpPlugins/Interface/ParametersQtDialog.cxx
...
[cpPlugins.git] / lib / cpPlugins / Interface / ParametersQtDialog.cxx
index 0891a2b5c09c409c9c5d80381ef5114a27b441cd..32cd8c4bea84b706d1c7f7d83045a39f2831874c 100644 (file)
@@ -4,19 +4,16 @@
 
 #include <limits>
 
-#include <cpPlugins/Interface/ParametersListWidget.h>
-
-#include <vtkSmartPointer.h>
-#include <cpExtensions/Interaction/SeedWidget.h>
-#include <vtkPointHandleRepresentation3D.h>
-#include <vtkProperty.h>
-#include <vtkSeedRepresentation.h>
+#include <cpPlugins/Interface/ProcessObject.h>
 
 #include <QCheckBox>
-#include <QDialogButtonBox>
+#include <QComboBox>
 #include <QDoubleSpinBox>
+#include <QFileDialog>
 #include <QHBoxLayout>
+#include <QInputDialog>
 #include <QLineEdit>
+#include <QPushButton>
 #include <QWidget>
 
 // -------------------------------------------------------------------------
@@ -24,8 +21,7 @@ cpPlugins::Interface::ParametersQtDialog::
 ParametersQtDialog( QWidget* parent, Qt::WindowFlags f )
   : QDialog( parent, f ),
     m_Parameters( NULL ),
-    m_IsModal( false ),
-    m_Interactor( NULL )
+    m_WidgetsUpdated( false )
 {
   this->m_Title = new QLabel( this );
   this->m_Title->setText( "Parameters dialog title" );
@@ -43,133 +39,492 @@ cpPlugins::Interface::ParametersQtDialog::
   delete this->m_Title;
   delete this->m_ToolsLayout;
   delete this->m_MainLayout;
+}
 
-  for( unsigned int i = 0; i < this->m_Widgets.size( ); ++i )
-    this->m_Widgets[ i ]->Delete( );
+// -------------------------------------------------------------------------
+cpPlugins::Interface::
+Parameters* cpPlugins::Interface::ParametersQtDialog::
+getParameters( ) const
+{
+  return( this->m_Parameters );
 }
 
 // -------------------------------------------------------------------------
 bool cpPlugins::Interface::ParametersQtDialog::
-IsModal( ) const
+setParameters( Parameters* parameters )
 {
-  return( this->m_IsModal );
+  if( this->m_Parameters != NULL || parameters == NULL )
+    return( false );
+  this->m_Parameters = parameters;
+  this->m_WidgetsUpdated = false;
+  return( true );
 }
 
 // -------------------------------------------------------------------------
-cpPlugins::Interface::
-Parameters* cpPlugins::Interface::ParametersQtDialog::
-getParameters( ) const
+int cpPlugins::Interface::ParametersQtDialog::
+exec( )
 {
-  return( this->m_Parameters );
+  this->_updateWidgets( );
+  this->updateView( );
+
+  int ret = this->QDialog::exec( );
+  if( ret == 1 )
+    this->updateParameters( );
+  else
+    this->updateView( );
+  return( ret );
 }
 
 // -------------------------------------------------------------------------
 void cpPlugins::Interface::ParametersQtDialog::
-setInteractor( vtkRenderWindowInteractor* interactor )
+updateParameters( )
 {
-  this->m_Interactor = interactor;
+  if( this->m_Parameters == NULL )
+    return;
+
+  // Put values
+  auto& raw_params = this->m_Parameters->GetRawParameters( );
+  for( auto pIt = raw_params.begin( ); pIt != raw_params.end( ); ++pIt )
+  {
+    QString pName = pIt->first.c_str( );
+    switch( pIt->second.first )
+    {
+    case Parameters::String:
+    case Parameters::OpenFileName:
+    case Parameters::SaveFileName:
+    case Parameters::PathName:
+    case Parameters::IntList:
+    case Parameters::UintList:
+    case Parameters::RealList:
+    case Parameters::OpenFileNameList:
+    {
+      QLineEdit* v_string = this->findChild< QLineEdit* >( pName );
+      if( v_string != NULL )
+        pIt->second.second = v_string->text( ).toStdString( );
+    }
+    break;
+    case Parameters::Bool:
+    {
+      QCheckBox* v_bool = this->findChild< QCheckBox* >( pName );
+      if( v_bool != NULL )
+        pIt->second.second = ( v_bool->isChecked( ) )? "1": "0";
+    }
+    break;
+    case Parameters::Int:
+    case Parameters::Uint:
+    {
+      QSpinBox* v_uint = this->findChild< QSpinBox* >( pName );
+      if( v_uint )
+      {
+        std::stringstream str;
+        str << v_uint->value( );
+        pIt->second.second = str.str( );
+
+      } // fi
+    }
+    break;
+    case Parameters::Real:
+    {
+      QDoubleSpinBox* v_double = this->findChild< QDoubleSpinBox* >( pName );
+      if( v_double )
+      {
+        std::stringstream str;
+        str << v_double->value( );
+        pIt->second.second = str.str( );
+
+      } // fi
+    }
+    break;
+    case Parameters::StringList:
+      break;
+    case Parameters::BoolList:
+      break;
+    case Parameters::SaveFileNameList:
+      break;
+    case Parameters::PathNameList:
+      break;
+    case Parameters::Choices:
+    {
+      QComboBox* v_choices = this->findChild< QComboBox* >( pName );
+      if( v_choices != NULL )
+      {
+        std::istringstream str_choices( pIt->second.second );
+        std::string real_choices;
+        std::getline( str_choices, real_choices, '@' );
+        pIt->second.second =
+          real_choices + "@" +
+          v_choices->currentText( ).toStdString( );
+
+      } // fi
+    }
+    break;
+    default:
+      break;
+    } // hctiws
+
+  } // rof
+  this->m_Parameters->Modified( );
 }
 
 // -------------------------------------------------------------------------
-bool cpPlugins::Interface::ParametersQtDialog::
-setParameters( Parameters* parameters )
+void cpPlugins::Interface::ParametersQtDialog::
+updateView( )
 {
-  this->m_IsModal = true;
-  this->m_Parameters = parameters;
   if( this->m_Parameters == NULL )
-    return( false );
+    return;
 
   // Put values
-  std::vector< std::string > names;
-  this->m_Parameters->GetNames( names );
-  std::vector< std::string >::const_iterator nIt = names.begin( );
-  for( ; nIt != names.end( ); ++nIt )
+  auto& raw_params = this->m_Parameters->GetRawParameters( );
+  for( auto pIt = raw_params.begin( ); pIt != raw_params.end( ); ++pIt )
   {
-    Parameters::Type pt = this->m_Parameters->GetType( *nIt );
+    QString pName = pIt->first.c_str( );
+    switch( pIt->second.first )
+    {
+    case Parameters::String:
+    case Parameters::OpenFileName:
+    case Parameters::SaveFileName:
+    case Parameters::PathName:
+    case Parameters::IntList:
+    case Parameters::UintList:
+    case Parameters::RealList:
+    case Parameters::OpenFileNameList:
+    {
+      QLineEdit* v_string = this->findChild< QLineEdit* >( pName );
+      if( v_string != NULL )
+        v_string->setText( pIt->second.second.c_str( ) );
+    }
+    break;
+    case Parameters::Bool:
+    {
+      QCheckBox* v_bool = this->findChild< QCheckBox* >( pName );
+      if( v_bool != NULL )
+        v_bool->setChecked( pIt->second.second == "1" );
+    }
+    break;
+    case Parameters::Int:
+    case Parameters::Uint:
+    {
+      QSpinBox* v_uint = this->findChild< QSpinBox* >( pName );
+      if( v_uint )
+      {
+        std::istringstream tok_str( pIt->second.second );
+        int v;
+        tok_str >> v;
+        v_uint->setValue( v );
+
+      } // fi
+    }
+    break;
+    case Parameters::Real:
+    {
+      QDoubleSpinBox* v_double = this->findChild< QDoubleSpinBox* >( pName );
+      if( v_double )
+      {
+        std::istringstream tok_str( pIt->second.second );
+        double v;
+        tok_str >> v;
+        v_double->setValue( v );
+
+      } // fi
+    }
+    break;
+    case Parameters::StringList:
+      break;
+    case Parameters::BoolList:
+      break;
+    case Parameters::SaveFileNameList:
+      break;
+    case Parameters::PathNameList:
+      break;
+    case Parameters::Choices:
+    {
+      QComboBox* v_choices = this->findChild< QComboBox* >( pName );
+      if( v_choices != NULL )
+      {
+        std::istringstream str_choices( pIt->second.second );
+        std::string choices, real_choice;
+        std::getline( str_choices, choices, '@' );
+        std::getline( str_choices, real_choice, '@' );
+        std::istringstream str( choices );
+        std::string token;
+        int id = -1, cont = 0;
+        while( std::getline( str, token, '#' ) )
+        {
+          if( token == real_choice )
+            id = cont;
+          cont++;
+
+        } // elihw
+
+        if( id > -1 )
+          v_choices->setCurrentIndex( id );
+
+      } // fi
+    }
+    break;
+    default:
+      break;
+    } // hctiws
+
+  } // rof
+}
+
+// -------------------------------------------------------------------------
+void cpPlugins::Interface::ParametersQtDialog::
+_addButtons( )
+{
+  // Add buttons
+  this->m_Buttons = new QDialogButtonBox(
+    QDialogButtonBox::Ok | QDialogButtonBox::Cancel
+    );
+  this->connect(
+    this->m_Buttons, SIGNAL( accepted( ) ), this, SLOT( accept( ) )
+    );
+  this->connect(
+    this->m_Buttons, SIGNAL( rejected( ) ), this, SLOT( reject( ) )
+    );
+  this->m_ToolsLayout->addWidget( this->m_Buttons );
+
+  this->updateView( );
+  this->m_WidgetsUpdated = true;
+}
+
+// -------------------------------------------------------------------------
+void cpPlugins::Interface::ParametersQtDialog::
+_updateWidgets( )
+{
+  if( this->m_WidgetsUpdated || this->m_Parameters == NULL )
+    return;
 
+  // Set dialog title
+  auto filter = this->m_Parameters->GetProcessObject( );
+  std::stringstream title;
+  title << "Parameters for \"" << filter->GetName( ) << "\"";
+  this->m_Title->setText( title.str( ).c_str( ) );
+
+  // Put values
+  auto& raw_params = this->m_Parameters->GetRawParameters( );
+  for( auto pIt = raw_params.begin( ); pIt != raw_params.end( ); ++pIt )
+  {
     QWidget* w_input = NULL;
-    if( pt == Parameters::String )
+    switch( pIt->second.first )
+    {
+    case Parameters::String:
     {
       QLineEdit* v_string = new QLineEdit( this );
-      v_string->setText( "Enter some text!!!" );
+      v_string->setObjectName( pIt->first.c_str( ) );
+      v_string->setText( pIt->second.second.c_str( ) );
       w_input = v_string;
     }
-    else if( pt == Parameters::Bool )
+    break;
+    case Parameters::Bool:
     {
       QCheckBox* v_bool = new QCheckBox( this );
+      v_bool->setObjectName( pIt->first.c_str( ) );
       v_bool->setText( "[ON/OFF]" );
-      v_bool->setChecked( this->m_Parameters->GetBool( *nIt ) );
+      v_bool->setChecked( pIt->second.second == "1" );
       w_input = v_bool;
     }
-    else if( pt == Parameters::Uint )
+    break;
+    case Parameters::Int:
+    case Parameters::Uint:
     {
+      std::istringstream tok_str( pIt->second.second );
+      int v;
+      tok_str >> v;
       QSpinBox* v_uint = new QSpinBox( this );
-      v_uint->setMinimum( 0 );
+      v_uint->setObjectName( pIt->first.c_str( ) );
+      if( pIt->second.first == Parameters::Uint )
+        v_uint->setMinimum( 0 );
+      else
+        v_uint->setMinimum( -std::numeric_limits< int >::max( ) );
       v_uint->setMaximum( std::numeric_limits< int >::max( ) );
-      v_uint->setValue( this->m_Parameters->GetUint( *nIt ) );
+      v_uint->setValue( v );
       w_input = v_uint;
     }
-    else if( pt == Parameters::Int )
-    {
-      QSpinBox* v_int = new QSpinBox( this );
-      v_int->setMinimum( -std::numeric_limits< int >::max( ) );
-      v_int->setMaximum(  std::numeric_limits< int >::max( ) );
-      v_int->setValue( this->m_Parameters->GetInt( *nIt ) );
-      w_input = v_int;
-    }
-    else if( pt == Parameters::Real )
+    break;
+    case Parameters::Real:
     {
+      std::istringstream tok_str( pIt->second.second );
+      double v;
+      tok_str >> v;
       QDoubleSpinBox* v_double = new QDoubleSpinBox( this );
+      v_double->setObjectName( pIt->first.c_str( ) );
       v_double->setDecimals( 3 );
       v_double->setMinimum( -std::numeric_limits< double >::max( ) );
       v_double->setMaximum(  std::numeric_limits< double >::max( ) );
-      v_double->setValue( this->m_Parameters->GetReal( *nIt ) );
+      v_double->setValue( v );
       w_input = v_double;
     }
-    else if(
-      pt == Parameters::StringList ||
-      pt == Parameters::IntList ||
-      pt == Parameters::UintList ||
-      pt == Parameters::RealList
-      )
-    {
-      cpPlugins::Interface::ParametersListWidget* l_double =
-        new cpPlugins::Interface::ParametersListWidget( *nIt, this );
-      w_input = l_double;
+    break;
+    case Parameters::OpenFileName:
+    {
+      QFrame* frame = new QFrame( this );
+      QHBoxLayout* layout = new QHBoxLayout( frame );
+      QLineEdit* v_string = new QLineEdit( frame );
+      v_string->setObjectName( pIt->first.c_str( ) );
+      v_string->setText( pIt->second.second.c_str( ) );
+      QPushButton* v_button = new QPushButton( frame );
+      v_button->setObjectName( ( pIt->first + "_=?btn" ).c_str( ) );
+      v_button->setText( "..." );
+      v_button->connect(
+        v_button, SIGNAL( clicked( ) ),
+        this, SLOT( _dlg_OpenSingleFile( ) )
+        );
+      layout->addWidget( v_string );
+      layout->addWidget( v_button );
+      w_input = frame;
     }
-    else if( pt == Parameters::Point || pt == Parameters::Index )
+    case Parameters::SaveFileName:
     {
-      if( this->m_Interactor != NULL )
-      {
-        // Create a point widget and its representation
-        vtkSmartPointer< vtkPointHandleRepresentation3D > handle =
-          vtkSmartPointer< vtkPointHandleRepresentation3D >::New( );
-        handle->GetProperty( )->SetColor( 1, 0, 0 );
-        vtkSmartPointer< vtkSeedRepresentation > rep =
-          vtkSmartPointer< vtkSeedRepresentation >::New( );
-        rep->SetHandleRepresentation( handle );
-
-        cpExtensions::Interaction::SeedWidget* widget =
-          cpExtensions::Interaction::SeedWidget::New( );
-        widget->SetInteractor( this->m_Interactor );
-        widget->SetRepresentation( rep );
-        widget->On( );
-
-        this->m_Widgets.push_back( widget );
-        this->m_IsModal = false;
-
-      } // fi
-
-    } // fi
+      QFrame* frame = new QFrame( this );
+      QHBoxLayout* layout = new QHBoxLayout( frame );
+      QLineEdit* v_string = new QLineEdit( frame );
+      v_string->setObjectName( pIt->first.c_str( ) );
+      v_string->setText( pIt->second.second.c_str( ) );
+      QPushButton* v_button = new QPushButton( frame );
+      v_button->setObjectName( ( pIt->first + "_=?btn" ).c_str( ) );
+      v_button->setText( "..." );
+      v_button->connect(
+        v_button, SIGNAL( clicked( ) ),
+        this, SLOT( _dlg_SaveSingleFile( ) )
+        );
+      layout->addWidget( v_string );
+      layout->addWidget( v_button );
+      w_input = frame;
+    }
+    break;
+    case Parameters::PathName:
+    {
+      QFrame* frame = new QFrame( this );
+      QHBoxLayout* layout = new QHBoxLayout( frame );
+      QLineEdit* v_string = new QLineEdit( frame );
+      v_string->setObjectName( pIt->first.c_str( ) );
+      v_string->setText( pIt->second.second.c_str( ) );
+      QPushButton* v_button = new QPushButton( frame );
+      v_button->setObjectName( ( pIt->first + "_=?btn" ).c_str( ) );
+      v_button->setText( "..." );
+      v_button->connect(
+        v_button, SIGNAL( clicked( ) ),
+        this, SLOT( _dlg_OpenSinglePath( ) )
+        );
+      layout->addWidget( v_string );
+      layout->addWidget( v_button );
+      w_input = frame;
+    }
+    break;
+    case Parameters::StringList:
+      break;
+    case Parameters::BoolList:
+      break;
+    case Parameters::IntList:
+    {
+      QFrame* frame = new QFrame( this );
+      QHBoxLayout* layout = new QHBoxLayout( frame );
+      QLineEdit* v_string = new QLineEdit( frame );
+      v_string->setObjectName( pIt->first.c_str( ) );
+      v_string->setText( pIt->second.second.c_str( ) );
+      QPushButton* v_button = new QPushButton( frame );
+      v_button->setObjectName( ( pIt->first + "_=?btn" ).c_str( ) );
+      v_button->setText( "+" );
+      v_button->connect(
+        v_button, SIGNAL( clicked( ) ),
+        this, SLOT( _dlg_AddInt( ) )
+        );
+      layout->addWidget( v_string );
+      layout->addWidget( v_button );
+      w_input = frame;
+    }
+    break;
+    case Parameters::UintList:
+    {
+      QFrame* frame = new QFrame( this );
+      QHBoxLayout* layout = new QHBoxLayout( frame );
+      QLineEdit* v_string = new QLineEdit( frame );
+      v_string->setObjectName( pIt->first.c_str( ) );
+      v_string->setText( pIt->second.second.c_str( ) );
+      QPushButton* v_button = new QPushButton( frame );
+      v_button->setObjectName( ( pIt->first + "_=?btn" ).c_str( ) );
+      v_button->setText( "+" );
+      v_button->connect(
+        v_button, SIGNAL( clicked( ) ),
+        this, SLOT( _dlg_AddUint( ) )
+        );
+      layout->addWidget( v_string );
+      layout->addWidget( v_button );
+      w_input = frame;
+    }
+    break;
+    case Parameters::RealList:
+    {
+      QFrame* frame = new QFrame( this );
+      QHBoxLayout* layout = new QHBoxLayout( frame );
+      QLineEdit* v_string = new QLineEdit( frame );
+      v_string->setObjectName( pIt->first.c_str( ) );
+      v_string->setText( pIt->second.second.c_str( ) );
+      QPushButton* v_button = new QPushButton( frame );
+      v_button->setObjectName( ( pIt->first + "_=?btn" ).c_str( ) );
+      v_button->setText( "+" );
+      v_button->connect(
+        v_button, SIGNAL( clicked( ) ),
+        this, SLOT( _dlg_AddReal( ) )
+        );
+      layout->addWidget( v_string );
+      layout->addWidget( v_button );
+      w_input = frame;
+    }
+    break;
+    case Parameters::OpenFileNameList:
+    {
+      QFrame* frame = new QFrame( this );
+      QHBoxLayout* layout = new QHBoxLayout( frame );
+      QLineEdit* v_string = new QLineEdit( frame );
+      v_string->setObjectName( pIt->first.c_str( ) );
+      v_string->setMaxLength( std::numeric_limits< int >::max( ) );
+      v_string->setText( pIt->second.second.c_str( ) );
+      QPushButton* v_button = new QPushButton( frame );
+      v_button->setObjectName( ( pIt->first + "_=?btn" ).c_str( ) );
+      v_button->setText( "..." );
+      v_button->connect(
+        v_button, SIGNAL( clicked( ) ),
+        this, SLOT( _dlg_OpenMultipleFiles( ) )
+        );
+      layout->addWidget( v_string );
+      layout->addWidget( v_button );
+      w_input = frame;
+    }
+    break;
+    case Parameters::SaveFileNameList:
+      break;
+    case Parameters::PathNameList:
+      break;
+    case Parameters::Choices:
+    {
+      QComboBox* v_choices = new QComboBox( this );
+      v_choices->setObjectName( pIt->first.c_str( ) );
+
+      std::istringstream str0( pIt->second.second );
+      std::string choices;
+      std::getline( str0, choices, '@' );
+      std::istringstream str1( choices );
+      std::string token;
+      int id = 0;
+      while( std::getline( str1, token, '#' ) )
+        v_choices->insertItem( id++, token.c_str( ) );
+      w_input = v_choices;
+    }
+    break;
+    default:
+      w_input = NULL;
+      break;
+    } // hctiws
 
     // Ok, a representation was created
     if( w_input != NULL )
     {
-      w_input->setObjectName( QString( nIt->c_str( ) ) );
-
       QHBoxLayout* new_layout = new QHBoxLayout( );
       QLabel* label = new QLabel( this );
-      label->setText( QString( nIt->c_str( ) ) );
+      label->setText( QString( pIt->first.c_str( ) ) );
       new_layout->addWidget( label );
       new_layout->addWidget( w_input );
       this->m_ToolsLayout->addLayout( new_layout );
@@ -177,216 +532,323 @@ setParameters( Parameters* parameters )
     } // fi
 
   } // rof
-  return( this->m_IsModal );
+
+  // Update values
+  this->_addButtons( );
 }
 
 // -------------------------------------------------------------------------
 void cpPlugins::Interface::ParametersQtDialog::
-setTitle( const std::string& title )
+_dlg_OpenSingleFile( )
 {
-  this->m_Title->setText( title.c_str( ) );
+  QPushButton* btn = dynamic_cast< QPushButton* >( this->sender( ) );
+  if( btn != NULL )
+  {
+    std::string bName = btn->objectName( ).toStdString( );
+    std::string line_name = bName.substr( 0, bName.find( "_=?btn" ) );
+    QLineEdit* line = this->findChild< QLineEdit* >( line_name.c_str( ) );
+    if( line != NULL )
+    {
+      std::string param_name = line->objectName( ).toStdString( );
+      if( param_name != "" )
+      {
+        std::string param_value =
+          this->m_Parameters->GetOpenFileName( param_name );
+        if( param_value == "" )
+          param_value = ".";
+        QStringList dialog_filters;
+        std::string extensions =
+          this->m_Parameters->GetAcceptedFileExtensions( param_name );
+        if( extensions != "" )
+          dialog_filters << extensions.c_str( );
+        dialog_filters << "Any file (*)";
+
+        // Show dialog and check if it was accepted
+        QFileDialog dialog( this );
+        dialog.setFileMode( QFileDialog::ExistingFile );
+        dialog.setDirectory( QFileDialog::tr( param_value.c_str( ) ) );
+        dialog.setNameFilters( dialog_filters );
+        dialog.setAcceptMode( QFileDialog::AcceptOpen );
+        if( dialog.exec( ) )
+          line->setText( *( dialog.selectedFiles( ).begin( ) ) );
+
+      } // fi
+
+    } // fi
+
+  } // fi
 }
 
 // -------------------------------------------------------------------------
-int cpPlugins::Interface::ParametersQtDialog::
-exec( )
+void cpPlugins::Interface::ParametersQtDialog::
+_dlg_SaveSingleFile( )
 {
-  if( !this->m_IsModal )
-    return( 0 );
+  QPushButton* btn = dynamic_cast< QPushButton* >( this->sender( ) );
+  if( btn != NULL )
+  {
+    std::string bName = btn->objectName( ).toStdString( );
+    std::string line_name = bName.substr( 0, bName.find( "_=?btn" ) );
+    QLineEdit* line = this->findChild< QLineEdit* >( line_name.c_str( ) );
+    if( line != NULL )
+    {
+      std::string param_name = line->objectName( ).toStdString( );
+      if( param_name != "" )
+      {
+        std::string param_value =
+          this->m_Parameters->GetSaveFileName( param_name );
+        if( param_value == "" )
+          param_value = ".";
+        QStringList dialog_filters;
+        std::string extensions =
+          this->m_Parameters->GetAcceptedFileExtensions( param_name );
+        if( extensions != "" )
+          dialog_filters << extensions.c_str( );
+        dialog_filters << "Any file (*)";
+
+        // Show dialog and check if it was accepted
+        QFileDialog dialog( this );
+        dialog.setFileMode( QFileDialog::AnyFile );
+        dialog.setDirectory( QFileDialog::tr( param_value.c_str( ) ) );
+        dialog.setNameFilters( dialog_filters );
+        dialog.setAcceptMode( QFileDialog::AcceptSave );
+        if( dialog.exec( ) )
+          line->setText( *( dialog.selectedFiles( ).begin( ) ) );
 
-  // Add buttons
-  QDialogButtonBox* bb = new QDialogButtonBox(
-    QDialogButtonBox::Ok | QDialogButtonBox::Cancel
-    );
-  QObject::connect( bb, SIGNAL( accepted( ) ), this, SLOT( accept( ) ) );
-  QObject::connect( bb, SIGNAL( rejected( ) ), this, SLOT( reject( ) ) );
-  this->m_ToolsLayout->addWidget( bb );
+      } // fi
 
-  int ret = this->QDialog::exec( );
-  if( ret == 1 )
-    this->syncParameters( );
-  return( ret );
+    } // fi
+
+  } // fi
 }
 
 // -------------------------------------------------------------------------
 void cpPlugins::Interface::ParametersQtDialog::
-show( )
+_dlg_OpenSinglePath( )
 {
-  if( this->m_IsModal )
-    return;
+  QPushButton* btn = dynamic_cast< QPushButton* >( this->sender( ) );
+  if( btn != NULL )
+  {
+    std::string bName = btn->objectName( ).toStdString( );
+    std::string line_name = bName.substr( 0, bName.find( "_=?btn" ) );
+    QLineEdit* line = this->findChild< QLineEdit* >( line_name.c_str( ) );
+    if( line != NULL )
+    {
+      std::string param_name = line->objectName( ).toStdString( );
+      if( param_name != "" )
+      {
+        std::string param_value =
+          this->m_Parameters->GetPathName( param_name );
+        if( param_value == "" )
+          param_value = ".";
+
+        // Show dialog and check if it was accepted
+        QFileDialog dialog( this );
+        dialog.setFileMode( QFileDialog::Directory );
+        dialog.setDirectory( QFileDialog::tr( param_value.c_str( ) ) );
+        dialog.setAcceptMode( QFileDialog::AcceptOpen );
+        if( dialog.exec( ) )
+          line->setText( *( dialog.selectedFiles( ).begin( ) ) );
 
-  this->QDialog::show( );
+      } // fi
+
+    } // fi
+
+  } // fi
 }
 
 // -------------------------------------------------------------------------
 void cpPlugins::Interface::ParametersQtDialog::
-syncParameters( )
+_dlg_OpenMultipleFiles( )
 {
-  if( this->m_Parameters == NULL )
-    return;
-
-  // Get values
-  std::vector< std::string > names;
-  this->m_Parameters->GetNames( names );
-  std::vector< std::string >::const_iterator nIt = names.begin( );
-  for( ; nIt != names.end( ); ++nIt )
+  QPushButton* btn = dynamic_cast< QPushButton* >( this->sender( ) );
+  if( btn != NULL )
   {
-    Parameters::Type pt = this->m_Parameters->GetType( *nIt );
+    std::string bName = btn->objectName( ).toStdString( );
+    std::string line_name = bName.substr( 0, bName.find( "_=?btn" ) );
 
-    if( pt == Parameters::String )
+    QLineEdit* line = this->findChild< QLineEdit* >( line_name.c_str( ) );
+    if( line != NULL )
     {
-      QLineEdit* v = this->findChild< QLineEdit* >( nIt->c_str( ) );
-      if( v != NULL )
-        this->m_Parameters->SetString( *nIt, v->text( ).toStdString( ) );
-    }
-    else if( pt == Parameters::Bool )
-    {
-      QCheckBox* v = this->findChild< QCheckBox* >( nIt->c_str( ) );
-      if( v != NULL )
-        this->m_Parameters->SetBool( *nIt, v->isChecked( ) );
-    }
-    else if( pt == Parameters::Uint )
-    {
-      QSpinBox* v = this->findChild< QSpinBox* >( nIt->c_str( ) );
-      if( v != NULL )
-        this->m_Parameters->SetUint( *nIt, v->value( ) );
-    }
-    else if( pt == Parameters::Int )
-    {
-      QSpinBox* v = this->findChild< QSpinBox* >( nIt->c_str( ) );
-      if( v != NULL )
-        this->m_Parameters->SetInt( *nIt, v->value( ) );
-    }
-    else if( pt == Parameters::Real )
-    {
-      QDoubleSpinBox* v = this->findChild< QDoubleSpinBox* >( nIt->c_str( ) );
-      if( v != NULL )
-        this->m_Parameters->SetReal( *nIt, v->value( ) );
-    }
-    else if(
-      pt == Parameters::StringList ||
-      pt == Parameters::IntList ||
-      pt == Parameters::UintList ||
-      pt == Parameters::RealList
-      )
-    {
-      cpPlugins::Interface::ParametersListWidget* lst =
-        this->findChild< cpPlugins::Interface::ParametersListWidget* >(
-          nIt->c_str( )
-          );
-      if( lst != NULL )
+      std::string param_name = line->objectName( ).toStdString( );
+      if( param_name != "" )
       {
-        if( pt == Parameters::StringList )
-        {
-          this->m_Parameters->ClearStringList( *nIt );
-          std::vector< std::string > values = lst->GetStringValues( );
-          for( int r = 0; r < values.size( ); ++r )
-            this->m_Parameters->AddToStringList( *nIt, values[ r ] );
-        }
-        else if( pt == Parameters::IntList )
-        {
-          this->m_Parameters->ClearIntList( *nIt );
-          std::vector< int > values = lst->GetIntValues( );
-          for( int r = 0; r < values.size( ); ++r )
-            this->m_Parameters->AddToIntList( *nIt, values[ r ] );
-        }
-        else if( pt == Parameters::UintList )
+        QStringList dialog_filters;
+        std::string extensions =
+          this->m_Parameters->GetAcceptedFileExtensions( param_name );
+        if( extensions != "" )
+          dialog_filters << extensions.c_str( );
+        dialog_filters << "Any file (*)";
+
+        // Show dialog and check if it was accepted
+        QFileDialog dialog( this );
+        dialog.setFileMode( QFileDialog::ExistingFiles );
+        dialog.setNameFilters( dialog_filters );
+        dialog.setAcceptMode( QFileDialog::AcceptOpen );
+        if( dialog.exec( ) )
         {
-          this->m_Parameters->ClearUintList( *nIt );
-          std::vector< unsigned int > values = lst->GetUintValues( );
-          for( int r = 0; r < values.size( ); ++r )
-            this->m_Parameters->AddToUintList( *nIt, values[ r ] );
-        }
-        else if( pt == Parameters::RealList )
-        {
-          this->m_Parameters->ClearRealList( *nIt );
-          std::vector< double > values = lst->GetDoubleValues( );
-          for( int r = 0; r < values.size( ); ++r )
-            this->m_Parameters->AddToRealList( *nIt, values[ r ] );
+          if( dialog.selectedFiles( ).size( ) > 0 )
+          {
+            std::stringstream str;
+            auto files = dialog.selectedFiles( );
+            auto fIt = files.begin( );
+            str << fIt->toStdString( );
+            ++fIt;
+            for( ; fIt != files.end( ); ++fIt )
+              str << "#" << fIt->toStdString( );
+            line->setText( str.str( ).c_str( ) );
+
+          } // fi
 
         } // fi
 
       } // fi
-    }
-    else if( pt == Parameters::Point || pt == Parameters::Index )
-    {
+
     } // fi
 
-  } // rof
+  } // fi
 }
 
+// -------------------------------------------------------------------------
+void cpPlugins::Interface::ParametersQtDialog::
+_dlg_AddInt( )
+{
+  QPushButton* btn = dynamic_cast< QPushButton* >( this->sender( ) );
+  if( btn != NULL )
+  {
+    std::string bName = btn->objectName( ).toStdString( );
+    std::string line_name = bName.substr( 0, bName.find( "_=?btn" ) );
+    QLineEdit* line = this->findChild< QLineEdit* >( line_name.c_str( ) );
+    if( line != NULL )
+    {
+      std::string param_name = line->objectName( ).toStdString( );
+      if( param_name != "" )
+      {
+        bool ok;
+        int value =
+          QInputDialog::getInt(
+            this,
+            (
+              std::string( "Add new value to \"" ) +
+              param_name +
+              std::string( "\"" )
+              ).c_str( ),
+            "Value:",
+            0,
+            -std::numeric_limits< int >::max( ),
+            std::numeric_limits< int >::max( ),
+            1, &ok
+            );
+        if( ok )
+        {
+          std::string values = line->text( ).toStdString( );
+          if( values != "" )
+            values += "#";
+          std::stringstream str;
+          str << values << value;
+          line->setText( str.str( ).c_str( ) );
 
+        } // fi
 
+      } // fi
 
+    } // fi
+
+  } // fi
+}
+
+// -------------------------------------------------------------------------
+void cpPlugins::Interface::ParametersQtDialog::
+_dlg_AddUint( )
+{
+  QPushButton* btn = dynamic_cast< QPushButton* >( this->sender( ) );
+  if( btn != NULL )
+  {
+    std::string bName = btn->objectName( ).toStdString( );
+    std::string line_name = bName.substr( 0, bName.find( "_=?btn" ) );
+    QLineEdit* line = this->findChild< QLineEdit* >( line_name.c_str( ) );
+    if( line != NULL )
+    {
+      std::string param_name = line->objectName( ).toStdString( );
+      if( param_name != "" )
+      {
+        bool ok;
+        int value =
+          QInputDialog::getInt(
+            this,
+            (
+              std::string( "Add new value to \"" ) +
+              param_name +
+              std::string( "\"" )
+              ).c_str( ),
+            "Value:",
+            0, 0, std::numeric_limits< int >::max( ), 1,
+            &ok
+            );
+        if( ok )
+        {
+          std::string values = line->text( ).toStdString( );
+          if( values != "" )
+            values += "#";
+          std::stringstream str;
+          str << values << value;
+          line->setText( str.str( ).c_str( ) );
 
+        } // fi
 
+      } // fi
 
+    } // fi
 
+  } // fi
+}
 
-/* TODO
-   enum Type
-   {
-   Index,
-   Point,
-   StringList,
-   BoolList,
-   IntList,
-   UintList,
-   IndexList,
-   PointList,
-   Choices,
-   NoType
-   };
-*/
-/*
-    }
-    else if(
-    pt == Parameters::StringList ||
-    pt == Parameters::IntList ||
-    pt == Parameters::UintList ||
-    pt == Parameters::RealList
-    )
-    {
-    cpPlugins::Interface::ParametersListWidget* lst =
-    this->findChild< cpPlugins::Interface::ParametersListWidget* >(
-    nIt->c_str( )
-    );
-    if( lst != NULL )
-    {
-    if( pt == Parameters::StringList )
-    {
-    std::vector< std::string > values = lst->GetStringValues( );
-    for( int r = 0; r < values.size( ); ++r )
-    this->m_Parameters->AddToStringList( *nIt, values[ r ] );
-    }
-    else if( pt == Parameters::IntList )
-    {
-    std::vector< int > values = lst->GetIntValues( );
-    for( int r = 0; r < values.size( ); ++r )
-    this->m_Parameters->AddToIntList( *nIt, values[ r ] );
-    }
-    else if( pt == Parameters::UintList )
-    {
-    std::vector< unsigned int > values = lst->GetUintValues( );
-    for( int r = 0; r < values.size( ); ++r )
-    this->m_Parameters->AddToUintList( *nIt, values[ r ] );
-    }
-    else if( pt == Parameters::RealList )
+// -------------------------------------------------------------------------
+void cpPlugins::Interface::ParametersQtDialog::
+_dlg_AddReal( )
+{
+  QPushButton* btn = dynamic_cast< QPushButton* >( this->sender( ) );
+  if( btn != NULL )
+  {
+    std::string bName = btn->objectName( ).toStdString( );
+    std::string line_name = bName.substr( 0, bName.find( "_=?btn" ) );
+    QLineEdit* line = this->findChild< QLineEdit* >( line_name.c_str( ) );
+    if( line != NULL )
     {
-    std::vector< double > values = lst->GetDoubleValues( );
-    for( int r = 0; r < values.size( ); ++r )
-    this->m_Parameters->AddToRealList( *nIt, values[ r ] );
+      std::string param_name = line->objectName( ).toStdString( );
+      if( param_name != "" )
+      {
+        bool ok;
+        double value =
+          QInputDialog::getDouble(
+            this,
+            (
+              std::string( "Add new value to \"" ) +
+              param_name +
+              std::string( "\"" )
+              ).c_str( ),
+            "Value:",
+            0,
+            -std::numeric_limits< double >::max( ),
+            std::numeric_limits< double >::max( ),
+            1, &ok
+            );
+        if( ok )
+        {
+          std::string values = line->text( ).toStdString( );
+          if( values != "" )
+            values += "#";
+          std::stringstream str;
+          str << values << value;
+          line->setText( str.str( ).c_str( ) );
 
-    } // fi
+        } // fi
 
-    } // fi
+      } // fi
 
     } // fi
 
-    } // rof
-    return( true );
-    }
-*/
+  } // fi
+}
 
 #endif // cpPlugins_Interface_QT4