]> Creatis software - cpPlugins.git/blobdiff - lib/cpBaseQtApplication/Pipeline/Port.cxx
yet another refactoring
[cpPlugins.git] / lib / cpBaseQtApplication / Pipeline / Port.cxx
diff --git a/lib/cpBaseQtApplication/Pipeline/Port.cxx b/lib/cpBaseQtApplication/Pipeline/Port.cxx
new file mode 100644 (file)
index 0000000..f5b0b01
--- /dev/null
@@ -0,0 +1,358 @@
+#include <cpBaseQtApplication/Pipeline/Port.h>\r
+#include <cpBaseQtApplication/Pipeline/Connection.h>\r
+#include <cpBaseQtApplication/Pipeline/Block.h>\r
+\r
+#include <QGraphicsScene>\r
+#include <QGraphicsSceneContextMenuEvent>\r
+#include <QFontMetrics>\r
+#include <QMenu>\r
+#include <QPainter>\r
+#include <QPen>\r
+\r
+// -------------------------------------------------------------------------\r
+cpBaseQtApplication::Pipeline::Port::\r
+Port( QGraphicsItem* parent, QGraphicsScene* scene )\r
+  : QObject( ),\r
+    Superclass( parent, scene ),\r
+    m_Radius( 5 ),\r
+    m_Margin( 2 )\r
+{\r
+  this->m_Label = new QGraphicsTextItem( this );\r
+  this->m_ExtendedLabel = new QGraphicsTextItem( this );\r
+  this->setExtend( false );\r
+\r
+  QPainterPath p;\r
+  p.addEllipse( 0, 0, 2 * this->m_Radius, 2 * this->m_Radius );\r
+\r
+  this->setPath( p );\r
+  this->setPen( QPen( Qt::darkRed ) );\r
+  this->setBrush( Qt::red );\r
+  this->setFlag( QGraphicsItem::ItemSendsScenePositionChanges );\r
+}\r
+\r
+// -------------------------------------------------------------------------\r
+cpBaseQtApplication::Pipeline::Port::\r
+~Port( )\r
+{\r
+}\r
+\r
+// -------------------------------------------------------------------------\r
+void cpBaseQtApplication::Pipeline::Port::\r
+setBlock( Block* b )\r
+{\r
+  this->m_Block = b;\r
+}\r
+\r
+// -------------------------------------------------------------------------\r
+void cpBaseQtApplication::Pipeline::Port::\r
+setName( const QString& n )\r
+{\r
+  this->m_Label->setPlainText( n );\r
+  this->_updateLabels( );\r
+}\r
+\r
+// -------------------------------------------------------------------------\r
+void cpBaseQtApplication::Pipeline::Port::\r
+setExtendedName( const QString& n )\r
+{\r
+  this->m_ExtendedLabel->setPlainText( n );\r
+  this->_updateLabels( );\r
+}\r
+\r
+// -------------------------------------------------------------------------\r
+void cpBaseQtApplication::Pipeline::Port::\r
+setExtend( bool extend )\r
+{\r
+  // Do nothing!\r
+  this->m_IsExtended = false;\r
+  this->m_ExtendedLabel->setVisible( false );\r
+}\r
+\r
+// -------------------------------------------------------------------------\r
+void cpBaseQtApplication::Pipeline::Port::\r
+paint(\r
+  QPainter* painter,\r
+  const QStyleOptionGraphicsItem* option,\r
+  QWidget* widget\r
+  )\r
+{\r
+  Q_UNUSED( option );\r
+  Q_UNUSED( widget );\r
+\r
+  if( this->isExtended( ) )\r
+  {\r
+    painter->setPen( QPen( Qt::darkBlue ) );\r
+    painter->setBrush( Qt::blue );\r
+  }\r
+  else\r
+  {\r
+    painter->setPen( QPen( Qt::darkRed ) );\r
+    painter->setBrush( Qt::red );\r
+\r
+  } // fi\r
+  painter->drawPath( this->path( ) );\r
+}\r
+\r
+// -------------------------------------------------------------------------\r
+cpBaseQtApplication::Pipeline::NamePort::\r
+NamePort( QGraphicsItem* parent, QGraphicsScene* scene )\r
+  : Superclass( parent, scene )\r
+{\r
+}\r
+\r
+// -------------------------------------------------------------------------\r
+cpBaseQtApplication::Pipeline::NamePort::\r
+~NamePort( )\r
+{\r
+}\r
+\r
+// -------------------------------------------------------------------------\r
+bool cpBaseQtApplication::Pipeline::NamePort::\r
+isConnected( Port* other )\r
+{\r
+  return( false );\r
+}\r
+\r
+// -------------------------------------------------------------------------\r
+void cpBaseQtApplication::Pipeline::NamePort::\r
+_updateLabels( )\r
+{\r
+  QFont font( this->scene( )->font( ) );\r
+  font.setBold( true );\r
+  this->m_Label->setFont( font );\r
+  this->m_ExtendedLabel->setFont( font );\r
+  this->setPath( QPainterPath( ) );\r
+}\r
+\r
+// -------------------------------------------------------------------------\r
+cpBaseQtApplication::Pipeline::InfoPort::\r
+InfoPort( QGraphicsItem* parent, QGraphicsScene* scene )\r
+  : Superclass( parent, scene )\r
+{\r
+}\r
+\r
+// -------------------------------------------------------------------------\r
+cpBaseQtApplication::Pipeline::InfoPort::\r
+~InfoPort( )\r
+{\r
+}\r
+\r
+// -------------------------------------------------------------------------\r
+bool cpBaseQtApplication::Pipeline::InfoPort::\r
+isConnected( Port* other )\r
+{\r
+  return( false );\r
+}\r
+\r
+// -------------------------------------------------------------------------\r
+void cpBaseQtApplication::Pipeline::InfoPort::\r
+_updateLabels( )\r
+{\r
+  QFont font( this->scene( )->font( ) );\r
+  font.setBold( false );\r
+  this->m_Label->setFont( font );\r
+  this->m_ExtendedLabel->setFont( font );\r
+  this->setPath( QPainterPath( ) );\r
+}\r
+\r
+// -------------------------------------------------------------------------\r
+cpBaseQtApplication::Pipeline::InputPort::\r
+InputPort( QGraphicsItem* parent, bool multiple, QGraphicsScene* scene )\r
+  : Superclass( parent, scene ),\r
+    m_IsMultiple( multiple )\r
+{\r
+}\r
+\r
+// -------------------------------------------------------------------------\r
+cpBaseQtApplication::Pipeline::InputPort::\r
+~InputPort( )\r
+{\r
+   this->m_Connection.clear( );\r
+}\r
+\r
+// -------------------------------------------------------------------------\r
+void cpBaseQtApplication::Pipeline::InputPort::\r
+_updateLabels( )\r
+{\r
+  QFontMetrics fm( this->scene( )->font( ) );\r
+  this->m_Label->setPos( this->m_Radius * 2, -fm.height( ) / 2 );\r
+  this->m_ExtendedLabel->setPos(\r
+    -fm.width( this->extendedName( ) ) - this->m_Radius * 2,\r
+    -fm.height( ) / 2\r
+    );\r
+}\r
+\r
+// -------------------------------------------------------------------------\r
+void cpBaseQtApplication::Pipeline::InputPort::\r
+setExtend( bool extend )\r
+{\r
+  if( this->m_Connection.size( ) == 0 )\r
+  {\r
+    this->m_IsExtended = extend;\r
+    this->m_ExtendedLabel->setVisible( extend );\r
+  }\r
+  else\r
+    this->Superclass::setExtend( false );\r
+}\r
+\r
+// -------------------------------------------------------------------------\r
+bool cpBaseQtApplication::Pipeline::InputPort::\r
+isConnected( Port* other )\r
+{\r
+  bool conn = false;\r
+  auto i = this->m_Connection.begin( );\r
+  for( ; i != this->m_Connection.end( ); ++i )\r
+    conn |= ( ( *i )->port1( ) == other && ( *i )->port2( ) == this );\r
+  return( conn );\r
+}\r
+\r
+// -------------------------------------------------------------------------\r
+void cpBaseQtApplication::Pipeline::InputPort::\r
+setConnection( Connection* c )\r
+{\r
+  if( this->m_IsMultiple || this->m_Connection.size( ) == 0 )\r
+    this->m_Connection.push_back( c );\r
+}\r
+\r
+// -------------------------------------------------------------------------\r
+void cpBaseQtApplication::Pipeline::InputPort::\r
+removeConnection( Connection* c )\r
+{\r
+  auto i = std::find(\r
+    this->m_Connection.begin( ),\r
+    this->m_Connection.end( ),\r
+    c\r
+    );\r
+  if( i != this->m_Connection.end( ) )\r
+  {\r
+    *i = NULL;\r
+    this->m_Connection.erase( i );\r
+\r
+  } // fi\r
+}\r
+\r
+// -------------------------------------------------------------------------\r
+QVariant cpBaseQtApplication::Pipeline::InputPort::\r
+itemChange( GraphicsItemChange change, const QVariant& value )\r
+{\r
+  if( change == ItemScenePositionHasChanged )\r
+  {\r
+    for(\r
+      auto i = this->m_Connection.begin( );\r
+      i != this->m_Connection.end( );\r
+      ++i\r
+      )\r
+    {\r
+      ( *i )->updatePosFromPorts( );\r
+      ( *i )->updatePath( );\r
+\r
+    } // fi\r
+\r
+  } // fi\r
+  return( value );\r
+}\r
+\r
+// -------------------------------------------------------------------------\r
+cpBaseQtApplication::Pipeline::OutputPort::\r
+OutputPort( QGraphicsItem* parent, QGraphicsScene* scene )\r
+  : Superclass( parent, scene )\r
+{\r
+}\r
+\r
+// -------------------------------------------------------------------------\r
+cpBaseQtApplication::Pipeline::OutputPort::\r
+~OutputPort( )\r
+{\r
+  foreach( Connection* conn, this->m_Connections )\r
+    delete conn;\r
+}\r
+\r
+// -------------------------------------------------------------------------\r
+void cpBaseQtApplication::Pipeline::OutputPort::\r
+_updateLabels( )\r
+{\r
+  QFontMetrics fm( this->scene( )->font( ) );\r
+  this->m_Label->setPos(\r
+    -fm.width( this->name( ) ) - this->m_Radius * 2, -fm.height( ) / 2\r
+    );\r
+  this->m_ExtendedLabel->setPos( this->m_Radius * 2, -fm.height( ) / 2 );\r
+\r
+}\r
+\r
+// -------------------------------------------------------------------------\r
+void cpBaseQtApplication::Pipeline::OutputPort::\r
+removeConnection( Connection* c )\r
+{\r
+  auto i = std::find(\r
+    this->m_Connections.begin( ),\r
+    this->m_Connections.end( ),\r
+    c\r
+    );\r
+  if( i != this->m_Connections.end( ) )\r
+  {\r
+    *i = NULL;\r
+    this->m_Connections.erase( i );\r
+\r
+  } // fi\r
+}\r
+\r
+// -------------------------------------------------------------------------\r
+void cpBaseQtApplication::Pipeline::OutputPort::\r
+setExtend( bool extend )\r
+{\r
+  this->m_IsExtended = extend;\r
+  this->m_ExtendedLabel->setVisible( extend );\r
+}\r
+\r
+// -------------------------------------------------------------------------\r
+bool cpBaseQtApplication::Pipeline::OutputPort::\r
+isConnected( Port* other )\r
+{\r
+  auto i = this->m_Connections.begin( );\r
+  bool conn = false;\r
+  for( ; i != this->m_Connections.end( ) && !conn; ++i )\r
+    conn |= ( ( *i )->port1( ) == this && ( *i )->port2( ) == other );\r
+  return( conn );\r
+}\r
+\r
+// -------------------------------------------------------------------------\r
+QVariant cpBaseQtApplication::Pipeline::OutputPort::\r
+itemChange( GraphicsItemChange change, const QVariant& value )\r
+{\r
+  if( change == ItemScenePositionHasChanged )\r
+  {\r
+    foreach( Connection* conn, this->m_Connections )\r
+    {\r
+      conn->updatePosFromPorts( );\r
+      conn->updatePath( );\r
+\r
+    } // rof\r
+\r
+  } // fi\r
+  return( value );\r
+}\r
+\r
+// -------------------------------------------------------------------------\r
+void cpBaseQtApplication::Pipeline::OutputPort::\r
+contextMenuEvent( QGraphicsSceneContextMenuEvent* evt )\r
+{\r
+  if( this->m_Block == NULL )\r
+    return;\r
+  \r
+  QMenu menu;\r
+  QAction* showAction = menu.addAction( "Show" );\r
+  QAction* hideAction = menu.addAction( "Hide" );\r
+  QAction* selectedAction = menu.exec( evt->screenPos( ) );\r
+\r
+  if( selectedAction == showAction || selectedAction == hideAction )\r
+  {\r
+    std::stringstream str;\r
+    str\r
+      << this->name( ).toStdString( ) << "@"\r
+      << this->m_Block->filter( )->GetName( );\r
+    emit viewData( str.str( ), ( selectedAction == showAction ) );\r
+\r
+  } // fi\r
+}\r
+\r
+// eof - $RCSfile$\r