#include <QGraphicsSceneMoveEvent>\r
#include <QGraphicsSceneResizeEvent>\r
#include <QGraphicsSceneWheelEvent>\r
+#include <QGraphicsView>\r
#include <QInputDialog>\r
#include <QMessageBox>\r
\r
#include <cpBaseQtApplication/Port.h>\r
#include <cpBaseQtApplication/Connection.h>\r
#include <cpBaseQtApplication/Block.h>\r
+#include <cpBaseQtApplication/MainWindow.h>\r
\r
// -------------------------------------------------------------------------\r
-#define cpBaseQtApplication_Editor_Callback_SWITCH( E, e ) \\r
+#define cpBaseQtApplication_Editor_Callback_SWITCH( E, e ) \\r
case QEvent::GraphicsScene##E: \\r
{ \\r
QGraphicsScene##E##Event* evt = \\r
break;\r
\r
// -------------------------------------------------------------------------\r
-#define cpBaseQtApplication_Editor_Callback_CODE( E ) \\r
+#define cpBaseQtApplication_Editor_Callback_CODE( E ) \\r
void cpBaseQtApplication::Editor::_##E##_cbk( QGraphicsScene##E##Event* evt )\r
\r
// -------------------------------------------------------------------------\r
Editor( QObject* parent )\r
: Superclass( parent ),\r
m_ActualConnection( NULL ),\r
- m_Workspace( NULL )\r
+ m_Workspace( NULL ),\r
+ m_MainWindow( NULL )\r
{\r
+ // Infere MainWindow\r
+ QObject* pIt = parent;\r
+ while( pIt != NULL && dynamic_cast< MainWindow* >( pIt ) == NULL )\r
+ pIt = pIt->parent( );\r
+ this->m_MainWindow = dynamic_cast< MainWindow* >( pIt );\r
}\r
\r
// -------------------------------------------------------------------------\r
void cpBaseQtApplication::Editor::\r
redrawWorkspace( )\r
{\r
- if( this->m_Workspace == NULL )\r
+ this->clear( );\r
+ if( this->m_Workspace.IsNull( ) )\r
return;\r
- \r
+\r
// Create blocks\r
std::map< std::string, Block* > blocks;\r
- auto vIt = this->m_Workspace->GetGraph( )->BeginVertices( );\r
- auto vIt_end = this->m_Workspace->GetGraph( )->EndVertices( );\r
- for( ; vIt != vIt_end; ++vIt )\r
+ auto filters = this->m_Workspace->GetFiltersNames( );\r
+ for( auto f = filters.begin( ); f != filters.end( ); ++f )\r
{\r
- auto b = this->_createBlock(\r
- dynamic_cast< TFilter* >( vIt->second.GetPointer( ) ),\r
- vIt->first.c_str( ),\r
- QPointF( vIt->second->GetViewX( ), vIt->second->GetViewY( ) )\r
+ auto obj = this->m_Workspace->GetFilter( *f );\r
+ blocks[ *f ] = this->_createBlock(\r
+ obj, f->c_str( ),\r
+ QPointF( obj->GetViewX( ), obj->GetViewY( ) )\r
);\r
- blocks[ vIt->first ] = b;\r
\r
} // rof\r
\r
- // Add edges\r
- auto rIt = this->m_Workspace->GetGraph( )->BeginEdgesRows( );\r
- auto rIt_end = this->m_Workspace->GetGraph( )->EndEdgesRows( );\r
- for( ; rIt != rIt_end; ++rIt )\r
+ // Create edges\r
+ for( auto f = filters.begin( ); f != filters.end( ); ++f )\r
{\r
- Block* orig = blocks[ rIt->first ];\r
- auto cIt = rIt->second.begin( );\r
- for( ; cIt != rIt->second.end( ); ++cIt )\r
+ auto bf = blocks[ *f ];\r
+ for( auto e = filters.begin( ); e != filters.end( ); ++e )\r
{\r
- Block* dest = blocks[ cIt->first ];\r
- auto eIt = cIt->second.begin( );\r
- for( ; eIt != cIt->second.end( ); ++eIt )\r
+ auto be = blocks[ *e ];\r
+ auto edges = this->m_Workspace->GetConnections( *f, *e );\r
+ for( auto c = edges.begin( ); c != edges.end( ); ++c )\r
{\r
- OutputPort* op = orig->outputPort( eIt->first.c_str( ) );\r
- InputPort* ip = dest->inputPort( eIt->second.c_str( ) );\r
+ OutputPort* op = bf->outputPort( c->first.c_str( ) );\r
+ InputPort* ip = be->inputPort( c->second.c_str( ) );\r
if( op == NULL || ip == NULL )\r
continue;\r
\r
- Connection* c = new Connection( 0, this->m_Scene );\r
- c->setPort1( op );\r
- c->setPort2( ip );\r
- c->updatePosFromPorts( );\r
- c->updatePath( );\r
+ Connection* conn = new Connection( 0, this->m_Scene );\r
+ conn->setPort1( op );\r
+ conn->setPort2( ip );\r
+ conn->updatePosFromPorts( );\r
+ conn->updatePath( );\r
\r
} // rof\r
\r
} // rof\r
\r
} // rof\r
+\r
+ // Exposed inputs\r
+ const auto& exp_inputs = this->m_Workspace->GetExposedInputs( );\r
+ for( auto eIt = exp_inputs.begin( ); eIt != exp_inputs.end( ); ++eIt )\r
+ {\r
+ auto bl = blocks[ eIt->second.first ];\r
+ auto ip = bl->inputPort( eIt->second.second.c_str( ) );\r
+ ip->setExtend( true );\r
+ ip->setExtendedName( eIt->first.c_str( ) );\r
+\r
+ } // rof\r
+\r
+ // Exposed outputs\r
+ const auto& exp_outputs = this->m_Workspace->GetExposedOutputs( );\r
+ for( auto eIt = exp_outputs.begin( ); eIt != exp_outputs.end( ); ++eIt )\r
+ {\r
+ auto bl = blocks[ eIt->second.first ];\r
+ auto op = bl->outputPort( eIt->second.second.c_str( ) );\r
+ op->setExtend( true );\r
+ op->setExtendedName( eIt->first.c_str( ) );\r
+\r
+ } // rof\r
}\r
\r
// -------------------------------------------------------------------------\r
std::string cpBaseQtApplication::Editor::\r
createFilter(\r
- const std::string& category,\r
- const std::string& filter,\r
- const QPointF& pnt\r
+ const std::string& category, const std::string& filter, const QPointF& pnt\r
)\r
{\r
std::string name = filter;\r
while( this->m_Workspace->HasFilter( name ) )\r
name += std::string( "_" );\r
- if( this->m_Workspace->CreateFilter( category, filter, name ) )\r
+\r
+ auto obj = this->m_Workspace->CreateFilter( category, filter, name );\r
+ if( obj != NULL )\r
{\r
- auto b = this->_createBlock(\r
- this->m_Workspace->GetFilter( name ),\r
- name.c_str( ),\r
- pnt\r
- );\r
+ this->_createBlock( obj, name.c_str( ), pnt );\r
return( name );\r
}\r
else\r
bool cpBaseQtApplication::Editor::\r
deleteFilter( const std::string& name )\r
{\r
- if( this->m_Workspace != NULL )\r
+ if( this->m_Workspace.IsNotNull( ) )\r
return( this->m_Workspace->RemoveFilter( name ) );\r
else\r
return( false );\r
const std::string& in, const std::string& out\r
)\r
{\r
- if( this->m_Workspace != NULL )\r
- return( this->m_Workspace->Disconnect( src, des, in, out ) );\r
+ if( this->m_Workspace.IsNotNull( ) )\r
+ {\r
+ this->m_Workspace->Disconnect( src, des, in, out );\r
+ return( true );\r
+ }\r
else\r
return( false );\r
}\r
void cpBaseQtApplication::Editor::\r
clear( )\r
{\r
- std::cout << "Editor: clear" << std::endl;\r
- /* TODO\r
- auto vIt = this->m_Graph.BeginVertices( );\r
- for( ; vIt != this->m_Graph.EndVertices( ); ++vIt )\r
- {\r
- } // rof\r
- */\r
+ this->m_Scene->clear( );\r
+ auto views = this->m_Scene->views( );\r
+ for( auto i = views.begin( ); i != views.end( ); ++i )\r
+ ( *i )->viewport( )->update( );\r
}\r
\r
// -------------------------------------------------------------------------\r
{\r
if( f == NULL )\r
return( NULL );\r
-\r
- // Add block\r
Block* b = new Block( f, name, 0, this->m_Scene );\r
b->setEditor( this );\r
b->setPos( pnt );\r
-\r
- // Mark exposed inputs\r
- auto& e_in = this->m_Workspace->GetExposedInputPorts( );\r
- auto f_in = f->GetInputsNames( );\r
- for( auto iIt = f_in.begin( ); iIt != f_in.end( ); ++iIt )\r
- {\r
- auto eIt = e_in.begin( );\r
- auto fIt = e_in.end( );\r
- for( ; eIt != e_in.end( ) && fIt == e_in.end( ); ++eIt )\r
- if( eIt->second.second == *iIt )\r
- fIt = eIt;\r
- if( fIt == e_in.end( ) )\r
- continue;\r
-\r
- auto port = b->inputPort( iIt->c_str( ) );\r
- port->setExtendedName( fIt->first.c_str( ) );\r
- port->setExtend( true );\r
-\r
- } // rof\r
-\r
- // Mark exposed outputs\r
- auto& e_out = this->m_Workspace->GetExposedOutputPorts( );\r
- auto f_out = f->GetOutputsNames( );\r
- for( auto iIt = f_out.begin( ); iIt != f_out.end( ); ++iIt )\r
- {\r
- auto eIt = e_out.begin( );\r
- auto fIt = e_out.end( );\r
- for( ; eIt != e_out.end( ) && fIt == e_out.end( ); ++eIt )\r
- if( eIt->second.second == *iIt )\r
- fIt = eIt;\r
- if( fIt == e_out.end( ) )\r
- continue;\r
-\r
- auto port = b->outputPort( iIt->c_str( ) );\r
- port->setExtendedName( fIt->first.c_str( ) );\r
- port->setExtend( true );\r
-\r
- } // rof\r
-\r
return( b );\r
}\r
\r
void cpBaseQtApplication::Editor::\r
updateFilter( const std::string& filter_name )\r
{\r
- emit execFilter( filter_name );\r
+ if( this->m_MainWindow != NULL )\r
+ this->m_MainWindow->updateFilter( filter_name );\r
}\r
\r
// -------------------------------------------------------------------------\r
void cpBaseQtApplication::Editor::\r
-showOutputData(\r
- const std::string& filter_name, const std::string& output_name\r
- )\r
+showData( const std::string& name, const std::string& port )\r
{\r
- emit showFilterOutput( filter_name, output_name );\r
+ if( this->m_MainWindow != NULL )\r
+ this->m_MainWindow->showData( name, port );\r
}\r
\r
// -------------------------------------------------------------------------\r
void cpBaseQtApplication::Editor::\r
-hideOutputData(\r
- const std::string& filter_name, const std::string& output_name\r
- )\r
+hideData( const std::string& name, const std::string& port )\r
{\r
- emit hideFilterOutput( filter_name, output_name );\r
+ /* TODO\r
+ if( this->m_MainWindow != NULL )\r
+ this->m_MainWindow->hideData( name, port );\r
+ */\r
}\r
\r
// -------------------------------------------------------------------------\r
void cpBaseQtApplication::Editor::\r
-visualPropertiesOutputData(\r
- const std::string& filter_name, const std::string& output_name\r
- )\r
+dataProperties( const std::string& name, const std::string& port )\r
{\r
- emit visualPropertiesFilterOutput( filter_name, output_name );\r
+ if( this->m_MainWindow != NULL )\r
+ this->m_MainWindow->dataProperties( name, port );\r
}\r
\r
// -------------------------------------------------------------------------\r
// -------------------------------------------------------------------------\r
cpBaseQtApplication_Editor_Callback_CODE( MouseDoubleClick )\r
{\r
+ // Get clicked item\r
QGraphicsItem* item = this->itemAt( evt->scenePos( ) );\r
if( item == NULL )\r
return;\r
+ Block* block = dynamic_cast< Block* >( item );\r
+ Port* port = dynamic_cast< Port* >( item );\r
+ Connection* conn = dynamic_cast< Connection* >( item );\r
\r
- switch( evt->button( ) )\r
- {\r
- case Qt::LeftButton:\r
+ if( block != NULL && evt->button( ) == Qt::LeftButton )\r
{\r
- Block* block = dynamic_cast< Block* >( item );\r
- Port* port = dynamic_cast< Port* >( item );\r
- Connection* conn = dynamic_cast< Connection* >( item );\r
-\r
- if( block != NULL )\r
+ if( evt->modifiers( ) == Qt::NoModifier )\r
{\r
QString old_name = block->namePort( );\r
bool ok;\r
);\r
if( ok && !new_name.isEmpty( ) && old_name != new_name )\r
{\r
- block->setNamePort( new_name );\r
- this->m_Workspace->RenameFilter(\r
- old_name.toStdString( ),\r
- new_name.toStdString( )\r
- );\r
+ if(\r
+ this->m_Workspace->RenameFilter(\r
+ old_name.toStdString( ), new_name.toStdString( )\r
+ )\r
+ )\r
+ block->setNamePort( new_name );\r
\r
} // fi\r
- }\r
- else if( port != NULL )\r
+\r
+ } // fi\r
+ }\r
+ else if( port != NULL && evt->button( ) == Qt::LeftButton )\r
+ {\r
+ if( evt->modifiers( ) == Qt::ControlModifier )\r
{\r
- if( evt->modifiers( ) == Qt::ControlModifier )\r
+ port->setExtend( !( port->isExtended( ) ) );\r
+ InputPort* in_port = dynamic_cast< InputPort* >( port );\r
+ OutputPort* out_port = dynamic_cast< OutputPort* >( port );\r
+ if( port->isExtended( ) )\r
{\r
- port->setExtend( !( port->isExtended( ) ) );\r
- InputPort* in_port = dynamic_cast< InputPort* >( port );\r
- OutputPort* out_port = dynamic_cast< OutputPort* >( port );\r
- if( port->isExtended( ) )\r
+ auto ename = port->extendedName( ).toStdString( );\r
+ if( ename == "" )\r
{\r
- if( in_port != NULL )\r
- {\r
- this->m_Workspace->ExposeInputPort(\r
- in_port->extendedName( ).toStdString( ),\r
- in_port->block( )->namePort( ).toStdString( ),\r
- in_port->name( ).toStdString( )\r
- );\r
- }\r
- else if( out_port != NULL )\r
- {\r
- this->m_Workspace->ExposeOutputPort(\r
- out_port->extendedName( ).toStdString( ),\r
- out_port->block( )->namePort( ).toStdString( ),\r
- out_port->name( ).toStdString( )\r
- );\r
-\r
- } // fi\r
- }\r
- else\r
- {\r
- if( in_port != NULL )\r
- this->m_Workspace->HideInputPort(\r
- in_port->extendedName( ).toStdString( )\r
- );\r
- else if( out_port != NULL )\r
- this->m_Workspace->HideOutputPort(\r
- out_port->extendedName( ).toStdString( )\r
- );\r
+ auto fname = port->block( )->namePort( ).toStdString( );\r
+ auto pname = port->name( ).toStdString( );\r
+ ename = pname + std::string( "@" ) + fname;\r
+ port->setExtendedName( ename.c_str( ) );\r
\r
} // fi\r
- this->m_Scene->update( );\r
+\r
+ if( in_port != NULL )\r
+ this->m_Workspace->ExposeInput(\r
+ in_port->extendedName( ).toStdString( ),\r
+ in_port->block( )->namePort( ).toStdString( ),\r
+ in_port->name( ).toStdString( )\r
+ );\r
+ else if( out_port != NULL )\r
+ this->m_Workspace->ExposeOutput(\r
+ out_port->extendedName( ).toStdString( ),\r
+ out_port->block( )->namePort( ).toStdString( ),\r
+ out_port->name( ).toStdString( )\r
+ );\r
}\r
- else if( evt->modifiers( ) == Qt::NoModifier )\r
+ else\r
{\r
- if( port->isExtended( ) )\r
+ if( in_port != NULL )\r
+ this->m_Workspace->HideInput(\r
+ in_port->extendedName( ).toStdString( )\r
+ );\r
+ else if( out_port != NULL )\r
+ this->m_Workspace->HideOutput(\r
+ out_port->extendedName( ).toStdString( )\r
+ );\r
+\r
+ } // fi\r
+ }\r
+ else if( evt->modifiers( ) == Qt::NoModifier )\r
+ {\r
+ if( port->isExtended( ) )\r
+ {\r
+ QString old_name = port->extendedName( );\r
+ bool ok;\r
+ QString new_name =\r
+ QInputDialog::getText(\r
+ dynamic_cast< QWidget* >( this->parent( ) ),\r
+ "Change filter name",\r
+ "Filter name:",\r
+ QLineEdit::Normal,\r
+ old_name,\r
+ &ok\r
+ );\r
+ if( ok && !new_name.isEmpty( ) && old_name != new_name )\r
{\r
- QString old_name = port->extendedName( );\r
- bool ok;\r
- QString new_name =\r
- QInputDialog::getText(\r
- dynamic_cast< QWidget* >( this->parent( ) ),\r
- "Change filter name",\r
- "Filter name:",\r
- QLineEdit::Normal,\r
- old_name,\r
- &ok\r
+ InputPort* in_port = dynamic_cast< InputPort* >( port );\r
+ OutputPort* out_port = dynamic_cast< OutputPort* >( port );\r
+ bool success = false;\r
+ if( in_port != NULL )\r
+ success = this->m_Workspace->RenameExposedInput(\r
+ old_name.toStdString( ), new_name.toStdString( )\r
);\r
- if( ok && !new_name.isEmpty( ) && old_name != new_name )\r
+ else if( out_port != NULL )\r
+ success = this->m_Workspace->RenameExposedOutput(\r
+ old_name.toStdString( ), new_name.toStdString( )\r
+ );\r
+ if( success )\r
{\r
port->setExtendedName( new_name );\r
- InputPort* in_port = dynamic_cast< InputPort* >( port );\r
- OutputPort* out_port = dynamic_cast< OutputPort* >( port );\r
- if( in_port != NULL )\r
- this->m_Workspace->\r
- RenameExposedInputPort(\r
- old_name.toStdString( ),\r
- new_name.toStdString( )\r
- );\r
- else if( out_port != NULL )\r
- this->m_Workspace->\r
- RenameExposedOutputPort(\r
- old_name.toStdString( ),\r
- new_name.toStdString( )\r
- );\r
this->m_Scene->update( );\r
\r
} // fi\r
-\r
+ \r
} // fi\r
\r
} // fi\r
- }\r
- else if( conn != NULL )\r
- {\r
+\r
} // fi\r
- }\r
- break;\r
- case Qt::RightButton:\r
- {\r
- }\r
- break;\r
- case Qt::MiddleButton:\r
- {\r
- }\r
- break;\r
- default:\r
- break;\r
- } // hctiws\r
+\r
+ } // fi\r
}\r
\r
// -------------------------------------------------------------------------\r
{\r
case Qt::LeftButton:\r
{\r
- InputPort* port2 =\r
+ InputPort* in =\r
dynamic_cast< InputPort* >( this->itemAt( evt->scenePos( ) ) );\r
- if( port2 != NULL )\r
+ OutputPort* out =\r
+ dynamic_cast< OutputPort* >( this->m_ActualConnection->port1( ) );\r
+ if( in != NULL && out != NULL )\r
{\r
- OutputPort* port1 =\r
- dynamic_cast< OutputPort* >( this->m_ActualConnection->port1( ) );\r
- if( port1 != NULL )\r
+ if(\r
+ in->block( ) != out->block( ) &&\r
+ ( !in->hasConnection( ) || in->isMultiple( ) ) &&\r
+ !in->isConnected( out ) &&\r
+ !out->isExtended( )\r
+ )\r
{\r
- if(\r
- port1->block( ) != port2->block( ) &&\r
- !port2->hasConnection( ) &&\r
- !port1->isConnected( port2 ) &&\r
- !port2->isExtended( )\r
- )\r
+ std::string d_filter = in->block( )->namePort( ).toStdString( );\r
+ std::string o_filter = out->block( )->namePort( ).toStdString( );\r
+ std::string d_port = in->name( ).toStdString( );\r
+ std::string o_port = out->name( ).toStdString( );\r
+ try\r
{\r
- this->m_ActualConnection->setPos2( port2->scenePos( ) );\r
- this->m_ActualConnection->setPort2( port2 );\r
+ this->m_Workspace->Connect( o_filter, d_filter, o_port, d_port );\r
+ this->m_ActualConnection->setPos2( in->scenePos( ) );\r
+ this->m_ActualConnection->setPort2( in );\r
this->m_ActualConnection->updatePosFromPorts( );\r
this->m_ActualConnection->updatePath( );\r
-\r
- this->m_Workspace->Connect(\r
- port1->block( )->namePort( ).toStdString( ),\r
- port2->block( )->namePort( ).toStdString( ),\r
- port1->name( ).toStdString( ),\r
- port2->name( ).toStdString( )\r
- );\r
}\r
- else\r
+ catch( std::exception& err )\r
+ {\r
delete this->m_ActualConnection;\r
+ QMessageBox::critical(\r
+ NULL,\r
+ QMessageBox::tr( "Error connecting ports" ),\r
+ QMessageBox::tr( err.what( ) )\r
+ );\r
+\r
+ } // yrt\r
}\r
else\r
delete this->m_ActualConnection;\r