]> Creatis software - cpPlugins.git/blobdiff - appli/cpPipelineEditor/cpPipelineEditor.cxx
More on graph editor
[cpPlugins.git] / appli / cpPipelineEditor / cpPipelineEditor.cxx
index 87fd6c86e65984f7c81926d1aeac700462407da9..6bda2a75087139d916155dfd18612aca04a1ffc7 100644 (file)
@@ -1,6 +1,8 @@
 #include "cpPipelineEditor.h"
 #include "ui_cpPipelineEditor.h"
 
+#include "QNodesEditor.h"
+
 #include <QFileDialog>
 #include <QMessageBox>
 #include <cpPlugins/Interface/Workspace.h>
     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 )
+cpPipelineEditor( int argc, char* argv[], QWidget* parent )
   : QMainWindow( parent ),
     m_UI( new Ui::cpPipelineEditor ),
     m_Workspace( NULL )
 {
   this->m_UI->setupUi( this );
 
+  // Prepare plugins interface
+  this->m_Plugins = new cpPlugins::Interface::Interface( );
+  QFileInfo info( argv[ 0 ] );
+  if( info.exists( ) )
+  {
+    std::string path = info.canonicalPath( ).toStdString( );
+    if( !( this->m_Plugins->LoadDefaultConfiguration( path ) ) )
+      if( this->m_Plugins->LoadFromFolder( path, false ) )
+        if( !( this->m_Plugins->SaveDefaultConfiguration( path ) ) )
+          QMessageBox::critical(
+            this,
+            "Error creating default plugins configuration",
+            "Could not save default plugins configuration"
+            );
+    this->_UpdateLoadedPlugins( );
+
+  } // fi
+
+  // Create an empty workspace
+  this->m_Workspace = new cpPlugins::Interface::Workspace( );
+  this->m_Workspace->SetInterface( this->m_Plugins );
+  this->m_UI->Canvas->editor( )->setWorkspace( this->m_Workspace );
+
   // Connect actions to slots
+  cpPipelineEditor_ConnectButton( LoadPluginsFile );
+  cpPipelineEditor_ConnectButton( LoadPluginsPath );
   cpPipelineEditor_ConnectAction( OpenWorkspace );
+  cpPipelineEditor_ConnectAction( SaveWorkspace );
 }
 
 // -------------------------------------------------------------------------
@@ -32,6 +67,127 @@ cpPipelineEditor::
   delete this->m_UI;
   if( this->m_Workspace != NULL )
     delete this->m_Workspace;
+  delete this->m_Plugins;
+}
+
+// -------------------------------------------------------------------------
+void cpPipelineEditor::
+_UpdateLoadedPlugins( )
+{
+  auto& classes = this->m_Plugins->GetClasses( );
+
+  if( classes.size( ) == 0 )
+  {
+    QMessageBox::critical(
+      this,
+      "Error loading default plugins",
+      "No plugins loaded: remember to load some!!!"
+      );
+    return;
+
+  } // fi
+
+  auto catIt = classes.begin( );
+  for( ; catIt != classes.end( ); ++catIt )
+  {
+    // Create or get category
+    QList< QTreeWidgetItem* > cat_items =
+      this->m_UI->LoadedPlugins->findItems(
+        catIt->first.c_str( ), Qt::MatchExactly | Qt::MatchRecursive
+        );
+    QTreeWidgetItem* cat = NULL;
+    if( cat_items.size( ) == 0 )
+    {
+      cat = new QTreeWidgetItem(
+        ( QTreeWidgetItem* )( NULL ), QStringList( catIt->first.c_str( ) )
+        );
+      this->m_UI->LoadedPlugins->addTopLevelItem( cat );
+    }
+    else
+      cat = cat_items[ 0 ];
+
+    // Create filters
+    auto fIt = catIt->second.begin( );
+    for( ; fIt != catIt->second.end( ); ++fIt )
+    {
+      QList< QTreeWidgetItem* > filter_items =
+        this->m_UI->LoadedPlugins->findItems(
+          fIt->first.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->first.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;
+
+  // Read
+  QStringList names = dlg.selectedFiles( );
+  std::stringstream err_str;
+  for( auto qIt = names.begin( ); qIt != names.end( ); ++qIt )
+    if( !( this->m_Plugins->Load( 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->_UpdateLoadedPlugins( );
+}
+
+// -------------------------------------------------------------------------
+void cpPipelineEditor::
+_ButtonLoadPluginsPath( )
+{
+  QFileDialog dlg( this );
+  dlg.setFileMode( QFileDialog::DirectoryOnly );
+  dlg.setDirectory( "." );
+  if( !( dlg.exec( ) ) )
+    return;
+
+  // Read
+  std::string dir = dlg.selectedFiles( ).begin( )->toStdString( );
+  if( !( this->m_Plugins->LoadFromFolder( dir, false ) ) )
+    QMessageBox::critical(
+      this,
+      "Error loading plugins directory",
+      dir.c_str( )
+      );
+
+  // Update view
+  this->_UpdateLoadedPlugins( );
 }
 
 // -------------------------------------------------------------------------
@@ -52,12 +208,9 @@ _ActionOpenWorkspace( )
   if( this->m_Workspace != NULL )
     delete this->m_Workspace;
   this->m_Workspace = new cpPlugins::Interface::Workspace( );
+  this->m_Workspace->SetInterface( this->m_Plugins );
   std::string err = this->m_Workspace->LoadWorkspace( fname );
-  if( err == "" )
-  {
-    this->m_UI->Canvas->setWorkspace( this->m_Workspace );
-  }
-  else
+  if( err != "" )
   {
     delete this->m_Workspace;
     this->m_Workspace = NULL;
@@ -66,8 +219,37 @@ _ActionOpenWorkspace( )
       QMessageBox::tr( "Error loading workspace" ),
       QMessageBox::tr( err.c_str( ) )
       );
+  }
+  else
+    this->m_UI->Canvas->editor( )->setWorkspace( this->m_Workspace );
+}
 
-  } // fi
+// -------------------------------------------------------------------------
+void cpPipelineEditor::
+_ActionSaveWorkspace( )
+{
+  if( this->m_Workspace == NULL )
+    return;
+
+  QFileDialog dlg( this );
+  dlg.setFileMode( QFileDialog::AnyFile );
+  dlg.setDirectory( "." );
+  dlg.setAcceptMode( QFileDialog::AcceptSave );
+  dlg.setNameFilter(
+    QFileDialog::tr( "Workspace file (*.xml);;All files (*)" )
+    );
+  dlg.setDefaultSuffix( QFileDialog::tr( "xml" ) );
+  if( !( dlg.exec( ) ) )
+    return;
+  std::string fname = dlg.selectedFiles( ).at( 0 ).toStdString( );
+
+  std::string err = this->m_Workspace->SaveWorkspace( fname );
+  if( err != "" )
+    QMessageBox::critical(
+      this,
+      QMessageBox::tr( "Error saving workspace" ),
+      QMessageBox::tr( err.c_str( ) )
+      );
 }
 
 // eof - $RCSfile$