\r
#include <QGraphicsScene>\r
#include <QEvent>\r
+#include <QGraphicsSceneContextMenuEvent>\r
+#include <QGraphicsSceneDragDropEvent>\r
+#include <QGraphicsSceneHelpEvent>\r
+#include <QGraphicsSceneHoverEvent>\r
#include <QGraphicsSceneMouseEvent>\r
+#include <QGraphicsSceneMoveEvent>\r
+#include <QGraphicsSceneResizeEvent>\r
+#include <QGraphicsSceneWheelEvent>\r
+#include <QInputDialog>\r
\r
#include "QNEPort.h"\r
#include "QNEConnection.h"\r
#include "QNEBlock.h"\r
\r
+// -------------------------------------------------------------------------\r
+#define PipelineEditor_QNodesEditor_Callback_SWITCH( E, e ) \\r
+ case QEvent::E: \\r
+ { \\r
+ Q##E##Event* evt = dynamic_cast< Q##E##Event* >( e ); \\r
+ if( evt != NULL ) \\r
+ this->_##E##_cbk( evt ); \\r
+ } \\r
+ break\r
+\r
+// -------------------------------------------------------------------------\r
+#define PipelineEditor_QNodesEditor_Callback_CODE( E ) \\r
+ void PipelineEditor::QNodesEditor::_##E##_cbk( Q##E##Event* evt )\r
+\r
// -------------------------------------------------------------------------\r
PipelineEditor::QNodesEditor::\r
QNodesEditor( QObject* parent )\r
- : Superclass( parent )\r
+ : Superclass( parent ),\r
+ m_Conn( NULL ),\r
+ m_Workspace( NULL )\r
{\r
- this->m_Conn = NULL;\r
}\r
\r
// -------------------------------------------------------------------------\r
{\r
}\r
\r
+// -------------------------------------------------------------------------\r
+PipelineEditor::QNodesEditor::\r
+TWorkspace* PipelineEditor::QNodesEditor::\r
+workspace( )\r
+{\r
+ return( this->m_Workspace );\r
+}\r
+\r
+// -------------------------------------------------------------------------\r
+const PipelineEditor::QNodesEditor::\r
+TWorkspace* PipelineEditor::QNodesEditor::\r
+workspace( ) const\r
+{\r
+ return( this->m_Workspace );\r
+}\r
+\r
+// -------------------------------------------------------------------------\r
+void PipelineEditor::QNodesEditor::\r
+setWorkspace( TWorkspace* ws )\r
+{\r
+ this->m_Workspace = ws;\r
+ this->m_Graph = TGraph::New( );\r
+\r
+ // Create 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
+ {\r
+ this->_CreateBlock(\r
+ dynamic_cast< TFilter* >( vIt->second.GetPointer( ) ),\r
+ QPointF( vIt->second->GetViewX( ), vIt->second->GetViewY( ) )\r
+ );\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
+ {\r
+ QNEBlock* orig = this->m_Graph->GetVertex( rIt->first );\r
+ auto cIt = rIt->second.begin( );\r
+ for( ; cIt != rIt->second.end( ); ++cIt )\r
+ {\r
+ QNEBlock* dest = this->m_Graph->GetVertex( cIt->first );\r
+ auto eIt = cIt->second.begin( );\r
+ for( ; eIt != cIt->second.end( ); ++eIt )\r
+ {\r
+ QNEOutputPort* op = orig->outputPort( eIt->first.c_str( ) );\r
+ QNEInputPort* ip = dest->inputPort( eIt->second.c_str( ) );\r
+ if( op == NULL || ip == NULL )\r
+ continue;\r
+\r
+ QNEConnection* c = new QNEConnection( 0, this->m_Scene );\r
+ c->setPort1( op );\r
+ c->setPort2( ip );\r
+ c->updatePosFromPorts( );\r
+ c->updatePath( );\r
+ this->m_Graph->AddConnection( rIt->first, cIt->first, c );\r
+\r
+ } // rof\r
+\r
+ } // rof\r
+\r
+ } // rof\r
+}\r
+\r
+// -------------------------------------------------------------------------\r
+std::string PipelineEditor::QNodesEditor::\r
+createFilter( const std::string& filter, const QPointF& pnt )\r
+{\r
+ std::string name = filter;\r
+ while( this->m_Workspace->HasFilter( name ) )\r
+ name += std::string( "_" );\r
+ if( this->m_Workspace->CreateFilter( filter, name ) )\r
+ {\r
+ this->_CreateBlock( this->m_Workspace->GetFilter( name ), pnt );\r
+ return( name );\r
+ }\r
+ else\r
+ return( "" );\r
+}\r
+\r
// -------------------------------------------------------------------------\r
void PipelineEditor::QNodesEditor::\r
install( QGraphicsScene* s )\r
}\r
\r
// -------------------------------------------------------------------------\r
-bool PipelineEditor::QNodesEditor::\r
-eventFilter( QObject* o, QEvent* e )\r
+void PipelineEditor::QNodesEditor::\r
+_CreateBlock( TFilter* f, const QPointF& pnt )\r
{\r
- QGraphicsSceneMouseEvent* me = ( QGraphicsSceneMouseEvent* ) e;\r
+ if( f == NULL )\r
+ return;\r
+\r
+ // Add block\r
+ QNEBlock* b = new QNEBlock( f, 0, this->m_Scene );\r
+ b->setPos( pnt );\r
\r
- switch ( ( int ) e->type( ) )\r
+ // Keep a trace of this visual graph\r
+ this->m_Graph->SetVertex( f->GetName( ), b );\r
+}\r
+\r
+// -------------------------------------------------------------------------\r
+/* TODO\r
+void PipelineEditor::QNodesEditor::\r
+_DoubleClick( QGraphicsSceneMouseEvent* evt, QGraphicsItem* item )\r
+{\r
+ switch( evt->button( ) )\r
{\r
- case QEvent::GraphicsThis->M_SceneMousePress:\r
+ case Qt::LeftButton:\r
{\r
- switch ( ( int ) me->button( ) )\r
- {\r
- case Qt::LeftButton:\r
+ QNEBlock* block = dynamic_cast< QNEBlock* >( item );\r
+ QNEPort* port = dynamic_cast< QNEPort* >( item );\r
+ QNEConnection* conn = dynamic_cast< QNEConnection* >( item );\r
+\r
+ if( block != NULL )\r
{\r
- QGraphicsItem* item = this->itemAt( me->this->m_ScenePos( ) );\r
- if( item && item->type( ) == QNEPort::Type )\r
+ QString old_name = block->namePort( );\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
- this->m_Conn = new QNEConnection( 0, this->m_Scene );\r
- this->m_Conn->setPort1( ( QNEPort* ) item );\r
- this->m_Conn->setPos1( item->this->m_ScenePos( ) );\r
- this->m_Conn->setPos2( me->this->m_ScenePos( ) );\r
- this->m_Conn->updatePath( );\r
+ ok = this->m_Graph->RenameVertex(\r
+ old_name.toStdString( ),\r
+ new_name.toStdString( )\r
+ );\r
+ if( ok )\r
+ {\r
+ block->setNamePort( new_name );\r
+ this->m_Workspace->GetGraph( )->RenameVertex(\r
+ old_name.toStdString( ),\r
+ new_name.toStdString( )\r
+ );\r
\r
- return( true );\r
- }\r
- else if( item && item->type( ) == QNEBlock::Type )\r
- {\r
- /* if( selBlock )\r
- selBlock->setSelected( ); */\r
- // selBlock = ( QNEBlock* ) item;\r
+ } // fi\r
\r
} // fi\r
- break;\r
}\r
- case Qt::RightButton:\r
+ else if( port != NULL )\r
{\r
- QGraphicsItem* item = itemAt( me->this->m_ScenePos( ) );\r
- if( item && ( item->type( ) == QNEConnection::Type || item->type( ) == QNEBlock::Type ) )\r
- delete item;\r
- // if( selBlock == ( QNEBlock* ) item )\r
- // selBlock = 0;\r
- break;\r
- }\r
}\r
+ else if( conn != NULL )\r
+ {\r
+ } // fi\r
}\r
- case QEvent::GraphicsThis->M_SceneMouseMove:\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
+ */\r
+\r
+// -------------------------------------------------------------------------\r
+bool PipelineEditor::QNodesEditor::\r
+eventFilter( QObject* o, QEvent* e )\r
+{\r
+ // Event type\r
+ switch( int( e->type( ) ) )\r
{\r
- if( this->m_Conn )\r
- {\r
- this->m_Conn->setPos2( me->this->m_ScenePos( ) );\r
- this->m_Conn->updatePath( );\r
- return( true );\r
- }\r
+ PipelineEditor_QNodesEditor_Callback_SWITCH( GraphicsSceneContextMenu, e );\r
+ PipelineEditor_QNodesEditor_Callback_SWITCH( GraphicsSceneDragEnter, e );\r
+ PipelineEditor_QNodesEditor_Callback_SWITCH( GraphicsSceneDragLeave, e );\r
+ PipelineEditor_QNodesEditor_Callback_SWITCH( GraphicsSceneDragMove, e );\r
+ PipelineEditor_QNodesEditor_Callback_SWITCH( GraphicsSceneDrop, e );\r
+ PipelineEditor_QNodesEditor_Callback_SWITCH( GraphicsSceneHelp, e );\r
+ PipelineEditor_QNodesEditor_Callback_SWITCH( GraphicsSceneHoverEnter, e );\r
+ PipelineEditor_QNodesEditor_Callback_SWITCH( GraphicsSceneHoverLeave, e );\r
+ PipelineEditor_QNodesEditor_Callback_SWITCH( GraphicsSceneHoverMove, e );\r
+ PipelineEditor_QNodesEditor_Callback_SWITCH( GraphicsSceneMouseDoubleClick, e );\r
+ PipelineEditor_QNodesEditor_Callback_SWITCH( GraphicsSceneMouseMove, e );\r
+ PipelineEditor_QNodesEditor_Callback_SWITCH( GraphicsSceneMousePress, e );\r
+ PipelineEditor_QNodesEditor_Callback_SWITCH( GraphicsSceneMouseRelease, e );\r
+ PipelineEditor_QNodesEditor_Callback_SWITCH( GraphicsSceneMove, e );\r
+ PipelineEditor_QNodesEditor_Callback_SWITCH( GraphicsSceneResize, e );\r
+ PipelineEditor_QNodesEditor_Callback_SWITCH( GraphicsSceneWheel, e );\r
+ default:\r
break;\r
- }\r
- case QEvent::GraphicsThis->M_SceneMouseRelease:\r
+ } // hctiws\r
+\r
+ return( this->Superclass::eventFilter( o, e ) );\r
+}\r
+\r
+// -------------------------------------------------------------------------\r
+PipelineEditor_QNodesEditor_Callback_CODE( GraphicsSceneContextMenu )\r
+{\r
+}\r
+\r
+// -------------------------------------------------------------------------\r
+PipelineEditor_QNodesEditor_Callback_CODE( GraphicsSceneDragEnter )\r
+{\r
+}\r
+\r
+// -------------------------------------------------------------------------\r
+PipelineEditor_QNodesEditor_Callback_CODE( GraphicsSceneDragLeave )\r
+{\r
+}\r
+\r
+// -------------------------------------------------------------------------\r
+PipelineEditor_QNodesEditor_Callback_CODE( GraphicsSceneDragMove )\r
+{\r
+}\r
+\r
+// -------------------------------------------------------------------------\r
+PipelineEditor_QNodesEditor_Callback_CODE( GraphicsSceneDrop )\r
+{\r
+}\r
+\r
+// -------------------------------------------------------------------------\r
+PipelineEditor_QNodesEditor_Callback_CODE( GraphicsSceneHelp )\r
+{\r
+}\r
+\r
+// -------------------------------------------------------------------------\r
+PipelineEditor_QNodesEditor_Callback_CODE( GraphicsSceneHoverEnter )\r
+{\r
+}\r
+\r
+// -------------------------------------------------------------------------\r
+PipelineEditor_QNodesEditor_Callback_CODE( GraphicsSceneHoverLeave )\r
+{\r
+}\r
+\r
+// -------------------------------------------------------------------------\r
+PipelineEditor_QNodesEditor_Callback_CODE( GraphicsSceneHoverMove )\r
+{\r
+}\r
+\r
+// -------------------------------------------------------------------------\r
+PipelineEditor_QNodesEditor_Callback_CODE( GraphicsSceneMouseDoubleClick )\r
+{\r
+ QGraphicsItem* item = this->itemAt( evt->scenePos( ) );\r
+ if( item == NULL )\r
+ return;\r
+\r
+ switch( evt->button( ) )\r
+ {\r
+ case Qt::LeftButton:\r
{\r
- if( this->m_Conn && me->button( ) == Qt::LeftButton )\r
+ QNEBlock* block = dynamic_cast< QNEBlock* >( item );\r
+ QNEPort* port = dynamic_cast< QNEPort* >( item );\r
+ QNEConnection* conn = dynamic_cast< QNEConnection* >( item );\r
+\r
+ if( block != NULL )\r
{\r
- QGraphicsItem* item = itemAt( me->this->m_ScenePos( ) );\r
- if( item && item->type( ) == QNEPort::Type )\r
+ QString old_name = block->namePort( );\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
- QNEPort* port1 = this->m_Conn->port1( );\r
- QNEPort* port2 = ( QNEPort* ) item;\r
+ ok = this->m_Graph->RenameVertex(\r
+ old_name.toStdString( ),\r
+ new_name.toStdString( )\r
+ );\r
+ if( ok )\r
+ {\r
+ block->setNamePort( new_name );\r
+ this->m_Workspace->GetGraph( )->RenameVertex(\r
+ old_name.toStdString( ),\r
+ new_name.toStdString( )\r
+ );\r
+\r
+ } // fi\r
\r
- if( port1->block( ) != port2->block( ) && port1->isOutput( ) != port2->isOutput( ) && !port1->isThis->M_Connected( port2 ) )\r
+ } // fi\r
+ }\r
+ else if( port != NULL )\r
+ {\r
+ if( evt->modifiers( ) == Qt::ControlModifier )\r
+ {\r
+ port->setExtend( !( port->isExtended( ) ) );\r
+ QNEInputPort* in_port = dynamic_cast< QNEInputPort* >( port );\r
+ QNEOutputPort* out_port = dynamic_cast< QNEOutputPort* >( port );\r
+ if( port->isExtended( ) )\r
{\r
- this->m_Conn->setPos2( port2->this->m_ScenePos( ) );\r
- this->m_Conn->setPort2( port2 );\r
- this->m_Conn->updatePath( );\r
- this->m_Conn = NULL;\r
- return( true );\r
+ if( in_port != NULL )\r
+ {\r
+ this->m_Workspace->AddInputPort(\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
+ } // fi\r
}\r
+ else\r
+ {\r
+ if( in_port != NULL )\r
+ {\r
+ }\r
+ else if( out_port != NULL )\r
+ {\r
+ } // fi\r
+\r
+ } // fi\r
+ this->m_Scene->update( );\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
+ // TODO: port->setExtendedName( new_name );\r
+ /* TODO\r
+ ok = this->m_Graph->RenameVertex(\r
+ old_name.toStdString( ),\r
+ new_name.toStdString( )\r
+ );\r
+ if( ok )\r
+ {\r
+ block->setNamePort( new_name );\r
+ this->m_Workspace->GetGraph( )->RenameVertex(\r
+ old_name.toStdString( ),\r
+ new_name.toStdString( )\r
+ );\r
\r
- delete this->m_Conn;\r
- this->m_Conn = NULL;\r
- return( true );\r
+ } // fi\r
+ */\r
+ } // fi\r
+\r
+ } // fi\r
+\r
+ } // fi\r
}\r
- break;\r
- }\r
+ else if( conn != NULL )\r
+ {\r
+ } // fi\r
}\r
- return( this->Superclass::eventFilter( o, e ) );\r
+ break;\r
+ /* TODO:\r
+ case Qt::RightButton:\r
+ {\r
+ }\r
+ break;\r
+ case Qt::MiddleButton:\r
+ {\r
+ }\r
+ break;\r
+ */\r
+ default:\r
+ break;\r
+ } // hctiws\r
}\r
\r
// -------------------------------------------------------------------------\r
-void PipelineEditor::QNodesEditor::\r
-save( QDataStream& ds )\r
+PipelineEditor_QNodesEditor_Callback_CODE( GraphicsSceneMouseMove )\r
{\r
- foreach( QGraphicsItem* item, this->m_Scene->items( ) )\r
- if( item->type( ) == QNEBlock::Type )\r
- {\r
- ds << item->type( );\r
- ( ( QNEBlock* ) item )->save( ds );\r
- }\r
+ if( this->m_Conn != NULL )\r
+ {\r
+ if( this->m_Conn->port1( ) == NULL )\r
+ this->m_Conn->setPos1( evt->scenePos( ) );\r
+ else if( this->m_Conn->port2( ) == NULL )\r
+ this->m_Conn->setPos2( evt->scenePos( ) );\r
+ this->m_Conn->updatePath( );\r
\r
- foreach( QGraphicsItem* item, this->m_Scene->items( ) )\r
- if( item->type( ) == QNEConnection::Type )\r
- {\r
- ds << item->type( );\r
- ( ( QNEConnection* ) item )->save( ds );\r
- }\r
+ } // fi\r
}\r
\r
// -------------------------------------------------------------------------\r
-void PipelineEditor::QNodesEditor::\r
-load( QDataStream& ds )\r
+PipelineEditor_QNodesEditor_Callback_CODE( GraphicsSceneMousePress )\r
{\r
- this->m_Scene->clear( );\r
-\r
- QMap<quint64, QNEPort*> portMap;\r
+ QNEInputPort* in_port =\r
+ dynamic_cast< QNEInputPort* >( this->itemAt( evt->scenePos( ) ) );\r
+ QNEOutputPort* out_port =\r
+ dynamic_cast< QNEOutputPort* >( this->itemAt( evt->scenePos( ) ) );\r
+ if( in_port == NULL && out_port == NULL )\r
+ return;\r
\r
- while ( !ds.atEnd( ) )\r
+ switch( evt->button( ) )\r
+ {\r
+ case Qt::LeftButton:\r
{\r
- int type;\r
- ds >> type;\r
- if( type == QNEBlock::Type )\r
+ if( out_port != NULL )\r
{\r
- QNEBlock* block = new QNEBlock( 0, this->m_Scene );\r
- block->load( ds, portMap );\r
- } else if( type == QNEConnection::Type )\r
+ if( out_port->block( ) != NULL )\r
+ {\r
+ // Start new connection\r
+ this->m_Conn = new QNEConnection( 0, this->m_Scene );\r
+ this->m_Conn->setPort1( out_port );\r
+ this->m_Conn->setPos1( out_port->scenePos( ) );\r
+ this->m_Conn->setPos2( evt->scenePos( ) );\r
+ this->m_Conn->updatePosFromPorts( );\r
+ this->m_Conn->updatePath( );\r
+\r
+ } // fi\r
+\r
+ } // fi\r
+ }\r
+ break;\r
+ default:\r
+ break;\r
+\r
+ } // hctiws\r
+}\r
+\r
+// -------------------------------------------------------------------------\r
+PipelineEditor_QNodesEditor_Callback_CODE( GraphicsSceneMouseRelease )\r
+{\r
+ if( this->m_Conn == NULL )\r
+ return;\r
+\r
+ switch( evt->button( ) )\r
+ {\r
+ case Qt::LeftButton:\r
+ {\r
+ QNEInputPort* port2 =\r
+ dynamic_cast< QNEInputPort* >( this->itemAt( evt->scenePos( ) ) );\r
+ if( port2 != NULL )\r
{\r
- QNEConnection* this->m_Conn = new QNEConnection( 0, this->m_Scene );\r
- this->m_Conn->load( ds, portMap );\r
+ QNEOutputPort* port1 =\r
+ dynamic_cast< QNEOutputPort* >( this->m_Conn->port1( ) );\r
+ if( port1 != NULL )\r
+ {\r
+ if(\r
+ port1->block( ) != port2->block( ) &&\r
+ !port2->hasConnection( ) &&\r
+ !port1->isConnected( port2 ) &&\r
+ !port2->isExtended( )\r
+ )\r
+ {\r
+ this->m_Conn->setPos2( port2->scenePos( ) );\r
+ this->m_Conn->setPort2( port2 );\r
+ this->m_Conn->updatePosFromPorts( );\r
+ this->m_Conn->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
+ this->m_Graph->AddConnection(\r
+ port1->block( )->namePort( ).toStdString( ),\r
+ port2->block( )->namePort( ).toStdString( ),\r
+ this->m_Conn\r
+ );\r
+ }\r
+ else\r
+ delete this->m_Conn;\r
+ }\r
+ else\r
+ delete this->m_Conn;\r
}\r
+ else\r
+ delete this->m_Conn;\r
+ this->m_Conn = NULL;\r
}\r
+ break;\r
+ default:\r
+ break;\r
+ } // hctisw\r
+}\r
+\r
+// -------------------------------------------------------------------------\r
+PipelineEditor_QNodesEditor_Callback_CODE( GraphicsSceneMove )\r
+{\r
+}\r
+\r
+// -------------------------------------------------------------------------\r
+PipelineEditor_QNodesEditor_Callback_CODE( GraphicsSceneResize )\r
+{\r
+}\r
+\r
+// -------------------------------------------------------------------------\r
+PipelineEditor_QNodesEditor_Callback_CODE( GraphicsSceneWheel )\r
+{\r
}\r
\r
// eof - $RCSfile$\r