]> Creatis software - cpPlugins.git/blobdiff - appli/cpPipelineEditor/QNodesEditor.cxx
More on graph editor
[cpPlugins.git] / appli / cpPipelineEditor / QNodesEditor.cxx
index 039b45ebc1a01cdeaf4eadf896e0ac30ffd8acbe..46508ca6fb92cbfe69c34430d3e1e9260126e8d4 100644 (file)
 #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
@@ -76,54 +91,51 @@ workspace( ) const
 void PipelineEditor::QNodesEditor::\r
 setWorkspace( TWorkspace* ws )\r
 {\r
-  if( this->m_Workspace == ws )\r
-    return;\r
   this->m_Workspace = ws;\r
   this->m_Graph = TGraph::New( );\r
 \r
-  /* TODO\r
-     QGraphicsScene* scene = this->scene( );\r
-     // Add vertices and keep track of ports\r
-     std::map< std::string, std::map< std::string, QNEPort* > >\r
-     in_ports, out_ports;\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( dynamic_cast< TFilter* >( vIt->second.GetPointer( ) ) );\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
+  } // rof\r
 \r
   // Add edges\r
-  /* TODO\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
-     auto cIt = rIt->second.begin( );\r
-     for( ; cIt != rIt->second.end( ); ++cIt )\r
-     {\r
-     auto eIt = cIt->second.begin( );\r
-     for( ; eIt != cIt->second.end( ); ++eIt )\r
-     {\r
-     QNEPort* p1 = out_ports[ rIt->first ][ eIt->first ];\r
-     QNEPort* p2 = in_ports[ cIt->first ][ eIt->second ];\r
-     if( p1 != NULL && p2 != NULL )\r
-     {\r
-     QNEConnection* conn = new QNEConnection( 0, scene );\r
-     conn->setPort1( p1 );\r
-     conn->setPort2( p2 );\r
-     this->m_Graph->AddConnection( rIt->first, cIt->first, conn );\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
-     } // fi\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
+      } // rof\r
 \r
-     } // rof\r
+    } // rof\r
 \r
-     } // rof\r
-  */\r
+  } // rof\r
 }\r
 \r
 // -------------------------------------------------------------------------\r
@@ -163,8 +175,6 @@ itemAt( const QPointF& pos )
   return( NULL );\r
 }\r
 \r
-#include <iostream>\r
-\r
 // -------------------------------------------------------------------------\r
 void PipelineEditor::QNodesEditor::\r
 _CreateBlock( TFilter* f, const QPointF& pnt )\r
@@ -173,28 +183,15 @@ _CreateBlock( TFilter* f, const QPointF& pnt )
     return;\r
 \r
   // Add block\r
-  QNEBlock* b = new QNEBlock( 0, this->m_Scene );\r
-  b->setNamePort( f->GetName( ) );\r
-  b->setTypePort( f->GetClassName( ).c_str( ) );\r
-  // TODO: b->setScenePos( pnt );\r
-\r
-  // Add input ports\r
-  std::set< std::string > inputs;\r
-  f->GetInputsNames( inputs );\r
-  for( auto iIt = inputs.begin( ); iIt != inputs.end( ); ++iIt )\r
-    b->addInputPort( iIt->c_str( ) );\r
-\r
-  // Add output ports\r
-  std::set< std::string > outputs;\r
-  f->GetOutputsNames( outputs );\r
-  for( auto oIt = outputs.begin( ); oIt != outputs.end( ); ++oIt )\r
-    b->addOutputPort( oIt->c_str( ) );\r
+  QNEBlock* b = new QNEBlock( f, 0, this->m_Scene );\r
+  b->setPos( pnt );\r
 \r
   // Keep a trace of this visual graph\r
-  this->m_Graph->InsertVertex( f->GetName( ), b );\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
@@ -208,25 +205,34 @@ _DoubleClick( QGraphicsSceneMouseEvent* evt, QGraphicsItem* item )
 \r
     if( block != NULL )\r
     {\r
-      /* TODO\r
-         auto ports = block->ports( );\r
-         std::string name = "";\r
-         for(\r
-         auto pIt = ports.begin( );\r
-         pIt != ports.end( ) && name == "";\r
-         ++pIt\r
-         )\r
-         if(\r
-         ( *pIt )->portFlags( ) && QNEPort::NamePort == QNEPort::NamePort\r
-         )\r
-         name = ( *pIt )->portName( ).toStdString( );\r
-         if( name == "" )\r
-         return;\r
-         TFilter* filter = this->m_Workspace->GetFilter( name );\r
-         if( filter != NULL )\r
-         {\r
-         } // fi\r
-      */\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
+        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
+      } // fi\r
     }\r
     else if( port != NULL )\r
     {\r
@@ -236,7 +242,6 @@ _DoubleClick( QGraphicsSceneMouseEvent* evt, QGraphicsItem* item )
     } // fi\r
   }\r
   break;\r
-  /* TODO:\r
      case Qt::RightButton:\r
      {\r
      }\r
@@ -245,11 +250,11 @@ _DoubleClick( QGraphicsSceneMouseEvent* evt, QGraphicsItem* item )
      {\r
      }\r
      break;\r
-  */\r
   default:\r
     break;\r
   } // hctiws\r
 }\r
+  */\r
 \r
 // -------------------------------------------------------------------------\r
 bool PipelineEditor::QNodesEditor::\r
@@ -258,290 +263,334 @@ eventFilter( QObject* o, QEvent* e )
   // Event type\r
   switch( int( e->type( ) ) )\r
   {\r
-  case QEvent::GraphicsSceneContextMenu:\r
-  {\r
-    QGraphicsSceneContextMenuEvent* evt =\r
-      dynamic_cast< QGraphicsSceneContextMenuEvent* >( e );\r
-    if( evt != NULL )\r
-    {\r
-    } // fi\r
-  }\r
-  break;\r
-  case QEvent::GraphicsSceneDragEnter:\r
-  {\r
-    QGraphicsSceneDragDropEvent* evt =\r
-      dynamic_cast< QGraphicsSceneDragDropEvent* >( e );\r
-    if( evt != NULL )\r
-    {\r
-    } // fi\r
-  }\r
-  break;\r
-  case QEvent::GraphicsSceneDragLeave:\r
-  {\r
-    QGraphicsSceneDragDropEvent* evt =\r
-      dynamic_cast< QGraphicsSceneDragDropEvent* >( e );\r
-    if( evt != NULL )\r
-    {\r
-    } // fi\r
-  }\r
-  break;\r
-  case QEvent::GraphicsSceneDragMove:\r
-  {\r
-    QGraphicsSceneDragDropEvent* evt =\r
-      dynamic_cast< QGraphicsSceneDragDropEvent* >( e );\r
-    if( evt != NULL )\r
-    {\r
-    } // fi\r
-  }\r
-  break;\r
-  case QEvent::GraphicsSceneDrop:\r
-  {\r
-    QGraphicsSceneDragDropEvent* evt =\r
-      dynamic_cast< QGraphicsSceneDragDropEvent* >( e );\r
-    if( evt != NULL )\r
-    {\r
-    } // fi\r
-  }\r
-  break;\r
-  case QEvent::GraphicsSceneHelp:\r
-  {\r
-    QGraphicsSceneHelpEvent* evt =\r
-      dynamic_cast< QGraphicsSceneHelpEvent* >( e );\r
-    if( evt != NULL )\r
-    {\r
-    } // fi\r
-  }\r
-  break;\r
-  case QEvent::GraphicsSceneHoverEnter:\r
-  {\r
-    QGraphicsSceneHoverEvent* evt =\r
-      dynamic_cast< QGraphicsSceneHoverEvent* >( e );\r
-    if( evt != NULL )\r
-    {\r
-    } // fi\r
-  }\r
-  break;\r
-  case QEvent::GraphicsSceneHoverLeave:\r
-  {\r
-    QGraphicsSceneHoverEvent* evt =\r
-      dynamic_cast< QGraphicsSceneHoverEvent* >( e );\r
-    if( evt != NULL )\r
-    {\r
-    } // fi\r
-  }\r
-  break;\r
-  case QEvent::GraphicsSceneHoverMove:\r
-  {\r
-    QGraphicsSceneHoverEvent* evt =\r
-      dynamic_cast< QGraphicsSceneHoverEvent* >( e );\r
-    if( evt != NULL )\r
-    {\r
-    } // fi\r
-  }\r
-  break;\r
-  case QEvent::GraphicsSceneMouseDoubleClick:\r
-  {\r
-    QGraphicsSceneMouseEvent* evt =\r
-      dynamic_cast< QGraphicsSceneMouseEvent* >( e );\r
-    if( evt != NULL )\r
-    {\r
-      QGraphicsItem* item = this->itemAt( evt->scenePos( ) );\r
-      if( item != NULL )\r
-      {\r
-        this->_DoubleClick( evt, item );\r
-        return( true );\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
+  } // hctiws\r
 \r
-      } // fi\r
+  return( this->Superclass::eventFilter( o, e ) );\r
+}\r
 \r
-    } // fi\r
-  }\r
-  break;\r
-  case QEvent::GraphicsSceneMouseMove:\r
-  {\r
-    QGraphicsSceneMouseEvent* evt =\r
-      dynamic_cast< QGraphicsSceneMouseEvent* >( e );\r
-    if( evt != NULL )\r
-    {\r
-      if( this->m_Conn )\r
-      {\r
-        this->m_Conn->setPos2( evt->scenePos( ) );\r
-        this->m_Conn->updatePath( );\r
-        return( true );\r
+// -------------------------------------------------------------------------\r
+PipelineEditor_QNodesEditor_Callback_CODE( GraphicsSceneContextMenu )\r
+{\r
+}\r
 \r
-      } // fi\r
+// -------------------------------------------------------------------------\r
+PipelineEditor_QNodesEditor_Callback_CODE( GraphicsSceneDragEnter )\r
+{\r
+}\r
 \r
-    } // fi\r
-  }\r
-  break;\r
-  case QEvent::GraphicsSceneMousePress:\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
-    QGraphicsSceneMouseEvent* evt =\r
-      dynamic_cast< QGraphicsSceneMouseEvent* >( e );\r
-    if( evt != NULL )\r
+  case Qt::LeftButton:\r
+  {\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
-      switch( evt->button( ) )\r
-      {\r
-      case Qt::LeftButton:\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
-        QNEOutputPort* port =\r
-          dynamic_cast< QNEOutputPort* >( this->itemAt( evt->scenePos( ) ) );\r
-        if( port != NULL )\r
+        ok = this->m_Graph->RenameVertex(\r
+          old_name.toStdString( ),\r
+          new_name.toStdString( )\r
+          );\r
+        if( ok )\r
         {\r
-          this->m_Conn = new QNEConnection( 0, this->m_Scene );\r
-          this->m_Conn->setPort1( port );\r
-          this->m_Conn->setPos1( port->scenePos( ) );\r
-          this->m_Conn->setPos2( evt->scenePos( ) );\r
-          this->m_Conn->updatePath( );\r
-          return( true );\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
-      break;\r
-      default:\r
-        break;\r
 \r
-      } // hctiws\r
-\r
-    } // fi\r
-  }\r
-  break;\r
-  case QEvent::GraphicsSceneMouseRelease:\r
-  {\r
-    QGraphicsSceneMouseEvent* evt =\r
-      dynamic_cast< QGraphicsSceneMouseEvent* >( e );\r
-    if( evt != NULL )\r
+      } // fi\r
+    }\r
+    else if( port != NULL )\r
     {\r
-      if( this->m_Conn != NULL && evt->button( ) == Qt::LeftButton )\r
+      if( evt->modifiers( ) == Qt::ControlModifier )\r
       {\r
-        QNEInputPort* port2 =\r
-          dynamic_cast< QNEInputPort* >( this->itemAt( evt->scenePos( ) ) );\r
-        if( port2 != NULL )\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
+          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
-          QNEOutputPort* port1 =\r
-            dynamic_cast< QNEOutputPort* >( this->m_Conn->port1( ) );\r
-          if( port1 != NULL )\r
+          if( in_port != NULL )\r
           {\r
-            if(\r
-              port1->block( ) != port2->block( ) &&\r
-              !port2->hasConnection( ) &&\r
-              !port1->isConnected( port2 )\r
-              )\r
-            {\r
-              this->m_Conn->setPos2( port2->scenePos( ) );\r
-              this->m_Conn->setPort2( port2 );\r
-              this->m_Conn->updatePath( );\r
-\r
-              this->m_Workspace->Connect(\r
-                port1->block( )->namePort( )->name( ).toStdString( ),\r
-                port2->block( )->namePort( )->name( ).toStdString( ),\r
-                port1->name( ).toStdString( ),\r
-                port2->name( ).toStdString( )\r
-                );\r
-              this->m_Graph->AddConnection(\r
-                port1->block( )->namePort( )->name( ).toStdString( ),\r
-                port2->block( )->namePort( )->name( ).toStdString( ),\r
-                this->m_Conn\r
-                );\r
-\r
-              this->m_Conn = NULL;\r
-              return( true );\r
-\r
-            } // fi\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
+               } // fi\r
+            */\r
           } // fi\r
 \r
         } // fi\r
-        delete this->m_Conn;\r
-        this->m_Conn = NULL;\r
-        return( true );\r
 \r
       } // fi\r
-\r
-    } // fi\r
-  }\r
-  break;\r
-  case QEvent::GraphicsSceneMove:\r
-  {\r
-    QGraphicsSceneMoveEvent* evt =\r
-      dynamic_cast< QGraphicsSceneMoveEvent* >( e );\r
-    if( evt != NULL )\r
+    }\r
+    else if( conn != NULL )\r
     {\r
     } // fi\r
   }\r
   break;\r
-  case QEvent::GraphicsSceneResize:\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
+PipelineEditor_QNodesEditor_Callback_CODE( GraphicsSceneMouseMove )\r
+{\r
+  if( this->m_Conn != NULL )\r
   {\r
-    QGraphicsSceneResizeEvent* evt =\r
-      dynamic_cast< QGraphicsSceneResizeEvent* >( e );\r
-    if( evt != NULL )\r
-    {\r
-    } // fi\r
-  }\r
-  break;\r
-  case QEvent::GraphicsSceneWheel:\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
+  } // fi\r
+}\r
+\r
+// -------------------------------------------------------------------------\r
+PipelineEditor_QNodesEditor_Callback_CODE( GraphicsSceneMousePress )\r
+{\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
+  switch( evt->button( ) )\r
+  {\r
+  case Qt::LeftButton:\r
   {\r
-    QGraphicsSceneWheelEvent* evt =\r
-      dynamic_cast< QGraphicsSceneWheelEvent* >( e );\r
-    if( evt != NULL )\r
+    if( out_port != NULL )\r
     {\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
-  // Mouse event\r
-  /*\r
-    QGraphicsSceneMouseEvent* me =\r
-    dynamic_cast< QGraphicsSceneMouseEvent* >( e );\r
-    if( me != NULL )\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
-    } // fi\r
-  */\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
-  /* TODO\r
-     switch( ( int ) e->type( ) )\r
-     {\r
-     case QEvent::GraphicsSceneMouseMove:\r
-     {\r
-     if( this->m_Conn )\r
-     {\r
-     this->m_Conn->setPos2( me->scenePos( ) );\r
-     this->m_Conn->updatePath( );\r
-     return( true );\r
-     }\r
-     break;\r
-     }\r
-     case QEvent::GraphicsSceneMouseRelease:\r
-     {\r
-     if( this->m_Conn && me->button( ) == Qt::LeftButton )\r
-     {\r
-     QGraphicsItem* item = itemAt( me->scenePos( ) );\r
-     if( item && item->type( ) == QNEPort::Type )\r
-     {\r
-     QNEPort* port1 = this->m_Conn->port1( );\r
-     QNEPort* port2 = ( QNEPort* ) item;\r
-     if( port1->block( ) != port2->block( ) && port1->isOutput( ) != port2->isOutput( ) && !port1->isConnected( port2 ) )\r
-     {\r
-     this->m_Conn->setPos2( port2->scenePos( ) );\r
-     this->m_Conn->setPort2( port2 );\r
-     this->m_Conn->updatePath( );\r
-     this->m_Conn = NULL;\r
-     return( true );\r
-     }\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
-     delete this->m_Conn;\r
-     this->m_Conn = NULL;\r
-     return( true );\r
-     }\r
-     break;\r
-     }\r
-     } // hctiws\r
-  */\r
+// -------------------------------------------------------------------------\r
+PipelineEditor_QNodesEditor_Callback_CODE( GraphicsSceneMove )\r
+{\r
+}\r
 \r
-  return( this->Superclass::eventFilter( o, e ) );\r
+// -------------------------------------------------------------------------\r
+PipelineEditor_QNodesEditor_Callback_CODE( GraphicsSceneResize )\r
+{\r
+}\r
+\r
+// -------------------------------------------------------------------------\r
+PipelineEditor_QNodesEditor_Callback_CODE( GraphicsSceneWheel )\r
+{\r
 }\r
 \r
 // eof - $RCSfile$\r