]> Creatis software - cpPlugins.git/blobdiff - lib/cpBaseQtApplication/Editor.cxx
...
[cpPlugins.git] / lib / cpBaseQtApplication / Editor.cxx
index f379f6416d0672e10bce9a12e49fc5b51f69eeb1..b039f3f16b33f7483483ab0dbe6663366f91ce07 100644 (file)
 #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
@@ -29,7 +31,7 @@
   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
@@ -37,8 +39,14 @@ cpBaseQtApplication::Editor::
 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
@@ -75,73 +83,87 @@ setWorkspace( TWorkspace* ws )
 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
@@ -152,7 +174,7 @@ createFilter(
 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
@@ -165,8 +187,11 @@ deleteConnection(
   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
@@ -175,13 +200,10 @@ deleteConnection(
 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
@@ -211,50 +233,9 @@ _createBlock( TFilter* f, const QString& name, const QPointF& pnt )
 {\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
@@ -291,34 +272,34 @@ eventFilter( QObject* o, QEvent* e )
 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
@@ -369,19 +350,17 @@ cpBaseQtApplication_Editor_Callback_CODE( HoverMove )
 // -------------------------------------------------------------------------\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
@@ -396,111 +375,104 @@ cpBaseQtApplication_Editor_Callback_CODE( MouseDoubleClick )
           );\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
@@ -564,35 +536,41 @@ cpBaseQtApplication_Editor_Callback_CODE( MouseRelease )
   {\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