#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 );
}
// -------------------------------------------------------------------------
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( );
}
// -------------------------------------------------------------------------
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;
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$