X-Git-Url: https://git.creatis.insa-lyon.fr/pubgit/?a=blobdiff_plain;f=appli%2FcpPipelineEditor%2FcpPipelineEditor.cxx;h=6bda2a75087139d916155dfd18612aca04a1ffc7;hb=c06908465eb6da50572779f423d1e2c9e03b68dd;hp=3516270e45ac90095c97f81a9c0951eed0a23de4;hpb=950ea6d252c9a5bc5be29d413497fe0ef69e6703;p=cpPlugins.git diff --git a/appli/cpPipelineEditor/cpPipelineEditor.cxx b/appli/cpPipelineEditor/cpPipelineEditor.cxx index 3516270..6bda2a7 100644 --- a/appli/cpPipelineEditor/cpPipelineEditor.cxx +++ b/appli/cpPipelineEditor/cpPipelineEditor.cxx @@ -1,6 +1,8 @@ #include "cpPipelineEditor.h" #include "ui_cpPipelineEditor.h" +#include "QNodesEditor.h" + #include #include #include @@ -12,17 +14,50 @@ 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,13 +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->GraphCanvas->setWorkspace( this->m_Workspace ); - this->m_UI->GraphCanvas->draw( ); - } - else + if( err != "" ) { delete this->m_Workspace; this->m_Workspace = NULL; @@ -67,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$