]> Creatis software - cpPlugins.git/blobdiff - appli/cpPipelineEditor/cpPipelineEditor.cxx
...
[cpPlugins.git] / appli / cpPipelineEditor / cpPipelineEditor.cxx
index 87fd6c86e65984f7c81926d1aeac700462407da9..8d838b829e821b299014d71d70624a51b01ed203 100644 (file)
     this, SLOT( _Action##ACTION( ) )                    \
     )
 
+// -------------------------------------------------------------------------
+#define cpPipelineEditor_ConnectButton( BUTTON )        \
+  QObject::connect(                                     \
+    this->m_UI->Button##BUTTON, SIGNAL( clicked( ) ),   \
+    this, SLOT( _Button##BUTTON( ) )                    \
+    )
+
 // -------------------------------------------------------------------------
 cpPipelineEditor::
 cpPipelineEditor( QWidget* parent )
@@ -22,6 +29,8 @@ cpPipelineEditor( QWidget* parent )
   this->m_UI->setupUi( this );
 
   // Connect actions to slots
+  cpPipelineEditor_ConnectButton( LoadPluginsFile );
+  cpPipelineEditor_ConnectButton( LoadPluginsPath );
   cpPipelineEditor_ConnectAction( OpenWorkspace );
 }
 
@@ -34,6 +43,131 @@ cpPipelineEditor::
     delete this->m_Workspace;
 }
 
+// -------------------------------------------------------------------------
+void cpPipelineEditor::
+_UpdateLoadedPlugins( )
+{
+  typedef cpPlugins::Interface::Workspace::TStringContainer _TStrings;
+
+  if( this->m_Workspace == NULL )
+    return;
+
+  _TStrings categories;
+  this->m_Workspace->GetLoadedPluginCategories( categories );
+  for( auto cIt = categories.begin( ); cIt != categories.end( ); ++cIt )
+  {
+    // Create or get category
+    QList< QTreeWidgetItem* > cat_items =
+      this->m_UI->LoadedPlugins->findItems(
+        cIt->c_str( ), Qt::MatchExactly | Qt::MatchRecursive
+        );
+    QTreeWidgetItem* cat = NULL;
+    if( cat_items.size( ) == 0 )
+    {
+      cat = new QTreeWidgetItem(
+        ( QTreeWidgetItem* )( NULL ), QStringList( cIt->c_str( ) )
+        );
+      this->m_UI->LoadedPlugins->addTopLevelItem( cat );
+    }
+    else
+      cat = cat_items[ 0 ];
+
+    // Add filters
+    _TStrings filters = this->m_Workspace->GetLoadedPluginFilters( *cIt );
+    for( auto fIt = filters.begin( ); fIt != filters.end( ); ++fIt )
+    {
+      // Find filter
+      QList< QTreeWidgetItem* > filter_items =
+        this->m_UI->LoadedPlugins->findItems(
+          fIt->c_str( ), Qt::MatchExactly | Qt::MatchRecursive
+          );
+      auto fiIt = filter_items.begin( );
+      auto found_fiIt = filter_items.end( );
+      for( ; fiIt != filter_items.end( ); ++fiIt )
+        if( ( *fiIt )->parent( ) == cat )
+          found_fiIt = fiIt;
+
+      // Add filter
+      if( found_fiIt == filter_items.end( ) )
+        QTreeWidgetItem* filter = new QTreeWidgetItem(
+          cat, QStringList( fIt->c_str( ) )
+          );
+
+    } // rof
+
+  } // rof
+}
+
+// -------------------------------------------------------------------------
+void cpPipelineEditor::
+_ButtonLoadPluginsFile( )
+{
+  QFileDialog dlg( this );
+  dlg.setFileMode( QFileDialog::ExistingFiles );
+  dlg.setDirectory( "." );
+#ifdef _WIN32
+  dlg.setNameFilter( "Plugins file (*.dll);;All files (*)" );
+  dlg.setDefaultSuffix( "dll" );
+#else // _WIN32
+  dlg.setNameFilter( "Plugins file (*.so);;All files (*)" );
+  dlg.setDefaultSuffix( "so" );
+#endif // _WIN32
+  if( !( dlg.exec( ) ) )
+    return;
+
+  // Create a new workspace, if not ready
+  if( this->m_Workspace == NULL )
+    this->m_Workspace = new cpPlugins::Interface::Workspace( );
+
+  // Read
+  QStringList names = dlg.selectedFiles( );
+  std::stringstream err_str;
+  for( auto qIt = names.begin( ); qIt != names.end( ); ++qIt )
+    if( !( this->m_Workspace->LoadPlugins( qIt->toStdString( ) ) ) )
+      err_str << qIt->toStdString( ) << std::endl;
+
+  // Show an error message
+  std::string err = err_str.str( );
+  if( err.size( ) > 0 )
+    QMessageBox::critical(
+      this,
+      "Error loading plugins",
+      err.c_str( )
+      );
+
+  // Update view
+  this->m_UI->Canvas->setWorkspace( this->m_Workspace );
+  this->_UpdateLoadedPlugins( );
+}
+
+// -------------------------------------------------------------------------
+void cpPipelineEditor::
+_ButtonLoadPluginsPath( )
+{
+  QFileDialog dlg( this );
+  dlg.setFileMode( QFileDialog::DirectoryOnly );
+  dlg.setDirectory( "." );
+  if( !( dlg.exec( ) ) )
+    return;
+
+  // Create a new workspace, if not ready
+  if( this->m_Workspace == NULL )
+    this->m_Workspace = new cpPlugins::Interface::Workspace( );
+
+  // Read
+  std::string dir = dlg.selectedFiles( ).begin( )->toStdString( );
+  if( !( this->m_Workspace->LoadPluginsPath( dir, false ) ) )
+    QMessageBox::critical(
+      this,
+      "Error loading plugins directory",
+      dir.c_str( )
+      );
+
+  // Update view
+  this->m_UI->Canvas->setWorkspace( this->m_Workspace );
+  this->_UpdateLoadedPlugins( );
+}
+
 // -------------------------------------------------------------------------
 void cpPipelineEditor::
 _ActionOpenWorkspace( )