#include "cpPipelineEditor.h" #include "ui_cpPipelineEditor.h" #include "QNodesEditor.h" #include #include #include // ------------------------------------------------------------------------- #define cpPipelineEditor_ConnectAction( ACTION ) \ QObject::connect( \ this->m_UI->Action##ACTION, SIGNAL( triggered( ) ), \ 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 ) : QMainWindow( parent ), m_UI( new Ui::cpPipelineEditor ), m_Workspace( NULL ) { this->m_UI->setupUi( this ); // Connect actions to slots cpPipelineEditor_ConnectButton( LoadPluginsFile ); cpPipelineEditor_ConnectButton( LoadPluginsPath ); cpPipelineEditor_ConnectAction( OpenWorkspace ); cpPipelineEditor_ConnectAction( SaveWorkspace ); } // ------------------------------------------------------------------------- cpPipelineEditor:: ~cpPipelineEditor( ) { delete this->m_UI; if( this->m_Workspace != NULL ) 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->editor( )->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->editor( )->setWorkspace( this->m_Workspace ); this->_UpdateLoadedPlugins( ); } // ------------------------------------------------------------------------- void cpPipelineEditor:: _ActionOpenWorkspace( ) { QFileDialog dlg( this ); dlg.setFileMode( QFileDialog::ExistingFile ); dlg.setDirectory( "." ); 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( ); if( this->m_Workspace != NULL ) delete this->m_Workspace; this->m_Workspace = new cpPlugins::Interface::Workspace( ); std::string err = this->m_Workspace->LoadWorkspace( fname ); if( err == "" ) { this->m_UI->Canvas->editor( )->setWorkspace( this->m_Workspace ); this->_UpdateLoadedPlugins( ); } else { delete this->m_Workspace; this->m_Workspace = NULL; QMessageBox::critical( this, QMessageBox::tr( "Error loading workspace" ), QMessageBox::tr( err.c_str( ) ) ); } // 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$