1 #include <cpBaseQtApplication/Pipeline/Block.h>
\r
4 #include <QFontMetrics>
\r
5 #include <QGraphicsScene>
\r
6 #include <QGraphicsSceneContextMenuEvent>
\r
7 #include <QGraphicsWidget>
\r
9 #include <QMessageBox>
\r
12 #include <QStyleOptionGraphicsItem>
\r
14 #include <cpBaseQtApplication/Blocker.h>
\r
15 #include <cpBaseQtApplication/Pipeline/Port.h>
\r
16 #include <cpBaseQtApplication/Pipeline/Connection.h>
\r
17 #include <cpPlugins/Pipeline/Widget.h>
\r
18 #include <cpPlugins/Pipeline/Events.h>
\r
20 // -------------------------------------------------------------------------
\r
21 QColor cpBaseQtApplication::Pipeline::Block::
\r
22 SelectedAndUpdated = Qt::green;
\r
23 QColor cpBaseQtApplication::Pipeline::Block::
\r
24 NotSelectedAndUpdated = Qt::blue;
\r
25 QColor cpBaseQtApplication::Pipeline::Block::
\r
26 SelectedAndNotUpdated = Qt::yellow;
\r
27 QColor cpBaseQtApplication::Pipeline::Block::
\r
28 NotSelectedAndNotUpdated = Qt::lightGray;
\r
30 // -------------------------------------------------------------------------
\r
31 void cpBaseQtApplication::Pipeline::Block::_TFilterObserver::
\r
32 Execute( const itk::Object* c, const itk::EventObject& e )
\r
34 typedef cpPlugins::Pipeline::Events::Modified _TModified;
\r
35 const _TModified* mod_evt = dynamic_cast< const _TModified* >( &e );
\r
36 if( mod_evt != NULL )
\r
38 std::stringstream str;
\r
40 << "(" << mod_evt->Time << "/"
\r
41 << double( mod_evt->Span ) / double( 1000 ) << "s)";
\r
42 this->ObservedBlock->setInfoPort( str.str( ).c_str( ) );
\r
47 // -------------------------------------------------------------------------
\r
48 cpBaseQtApplication::Pipeline::Block::
\r
51 QGraphicsItem* parent, QGraphicsScene* scene
\r
53 : Superclass( parent, scene ),
\r
61 p.addRoundedRect( -50, -15, 100, 30, 5, 5 );
\r
64 this->setPen( QPen( Qt::darkGreen ) );
\r
65 this->setBrush( Qt::green );
\r
66 this->setFlag( QGraphicsItem::ItemIsMovable );
\r
67 this->setFlag( QGraphicsItem::ItemIsSelectable );
\r
69 this->m_Width = this->m_HorzMargin;
\r
70 this->m_Height = this->m_VertMargin;
\r
73 this->setNamePort( filter->GetName( ) );
\r
74 this->setInfoPort( "(-/-)" );
\r
77 std::string( this->m_Filter->GetClassCategory( ) ) +
\r
78 std::string( "::" ) +
\r
79 std::string( this->m_Filter->GetClassName( ) )
\r
84 auto inputs = this->m_Filter->GetInputsNames( );
\r
85 for( auto iIt = inputs.begin( ); iIt != inputs.end( ); ++iIt )
\r
89 this->m_Filter->IsInputMultiple( iIt->c_str( ) )
\r
95 auto outputs = this->m_Filter->GetOutputsNames( );
\r
96 for( auto oIt = outputs.begin( ); oIt != outputs.end( ); ++oIt )
\r
97 this->addOutputPort( oIt->c_str( ) );
\r
100 this->m_FilterObserver = _TFilterObserver::New( );
\r
101 this->m_FilterObserver->ObservedBlock = this;
\r
102 this->m_FilterObserverId =
\r
103 this->m_Filter->AddObserver(
\r
104 cpPlugins::Pipeline::Events::Modified( ), this->m_FilterObserver
\r
108 // -------------------------------------------------------------------------
\r
109 cpBaseQtApplication::Pipeline::Block::
\r
112 this->m_Filter->RemoveObserver( this->m_FilterObserverId );
\r
115 // -------------------------------------------------------------------------
\r
116 cpBaseQtApplication::Pipeline::Block::
\r
117 TFilter* cpBaseQtApplication::Pipeline::Block::
\r
120 return( this->m_Filter );
\r
123 // -------------------------------------------------------------------------
\r
124 const cpBaseQtApplication::Pipeline::Block::
\r
125 TFilter* cpBaseQtApplication::Pipeline::Block::
\r
128 return( this->m_Filter );
\r
131 // -------------------------------------------------------------------------
\r
132 void cpBaseQtApplication::Pipeline::Block::
\r
133 setNamePort( const QString& txt )
\r
135 if( this->m_NamePort == NULL )
\r
136 this->m_NamePort = new NamePort( this );
\r
137 this->m_NamePort->setName( txt );
\r
138 this->_configPort( this->m_NamePort );
\r
141 // -------------------------------------------------------------------------
\r
142 void cpBaseQtApplication::Pipeline::Block::
\r
143 setInfoPort( const QString& txt )
\r
145 if( this->m_InfoPort == NULL )
\r
146 this->m_InfoPort = new InfoPort( this );
\r
147 this->m_InfoPort->setName( txt );
\r
148 this->_configPort( this->m_InfoPort );
\r
151 // -------------------------------------------------------------------------
\r
152 cpBaseQtApplication::Pipeline::InputPort*
\r
153 cpBaseQtApplication::Pipeline::Block::
\r
154 addInputPort( const QString& txt, bool multiple )
\r
156 InputPort* ip = new InputPort( this, multiple );
\r
157 ip->setExtendedName( "" );
\r
158 ip->setName( txt );
\r
159 this->m_InputPorts[ txt.toStdString( ) ] = ip;
\r
160 this->_configPort( ip );
\r
164 // -------------------------------------------------------------------------
\r
165 cpBaseQtApplication::Pipeline::OutputPort*
\r
166 cpBaseQtApplication::Pipeline::Block::
\r
167 addOutputPort( const QString& txt )
\r
169 OutputPort* op = new OutputPort( this );
\r
170 op->setExtendedName( "" );
\r
171 op->setName( txt );
\r
172 this->m_OutputPorts[ txt.toStdString( ) ] = op;
\r
173 this->_configPort( op );
\r
177 // -------------------------------------------------------------------------
\r
178 cpBaseQtApplication::Pipeline::InputPort*
\r
179 cpBaseQtApplication::Pipeline::Block::
\r
180 inputPort( const QString& txt )
\r
182 auto i = this->m_InputPorts.find( txt.toStdString( ) );
\r
183 if( i != this->m_InputPorts.end( ) )
\r
184 return( i->second );
\r
189 // -------------------------------------------------------------------------
\r
190 cpBaseQtApplication::Pipeline::OutputPort*
\r
191 cpBaseQtApplication::Pipeline::Block::
\r
192 outputPort( const QString& txt )
\r
194 auto o = this->m_OutputPorts.find( txt.toStdString( ) );
\r
195 if( o != this->m_OutputPorts.end( ) )
\r
196 return( o->second );
\r
201 // -------------------------------------------------------------------------
\r
202 QString cpBaseQtApplication::Pipeline::Block::
\r
205 return( this->m_NamePort->name( ) );
\r
208 // -------------------------------------------------------------------------
\r
209 const cpBaseQtApplication::Pipeline::InputPort*
\r
210 cpBaseQtApplication::Pipeline::Block::
\r
211 inputPort( const QString& txt ) const
\r
213 auto i = this->m_InputPorts.find( txt.toStdString( ) );
\r
214 if( i != this->m_InputPorts.end( ) )
\r
215 return( i->second );
\r
220 // -------------------------------------------------------------------------
\r
221 const cpBaseQtApplication::Pipeline::OutputPort*
\r
222 cpBaseQtApplication::Pipeline::Block::
\r
223 outputPort( const QString& txt ) const
\r
225 auto o = this->m_OutputPorts.find( txt.toStdString( ) );
\r
226 if( o != this->m_OutputPorts.end( ) )
\r
227 return( o->second );
\r
233 // -------------------------------------------------------------------------
\r
234 bool cpBaseQtApplication::Pipeline::Block::
\r
235 connectOutputPortSlot( QObject* receiver, const char* slot )
\r
238 for( auto p : this->m_OutputPorts )
\r
239 ok &= QObject::connect(
\r
240 p.second, SIGNAL( viewData( const std::string&, bool ) ),
\r
246 // -------------------------------------------------------------------------
\r
247 void cpBaseQtApplication::Pipeline::Block::
\r
248 setPos( const QPointF& pos )
\r
250 this->m_Filter->SetViewCoords( pos.x( ), pos.y( ) );
\r
251 this->Superclass::setPos( pos );
\r
254 // -------------------------------------------------------------------------
\r
255 void cpBaseQtApplication::Pipeline::Block::
\r
256 setPos( qreal x, qreal y )
\r
258 this->m_Filter->SetViewCoords( x, y );
\r
259 this->Superclass::setPos( x, y );
\r
262 // -------------------------------------------------------------------------
\r
263 void cpBaseQtApplication::Pipeline::Block::
\r
265 QPainter* painter, const QStyleOptionGraphicsItem* option, QWidget* widget
\r
268 Q_UNUSED( option );
\r
269 Q_UNUSED( widget );
\r
271 if( this->isSelected( ) )
\r
273 painter->setPen( QPen( Qt::darkYellow ) );
\r
274 painter->setBrush( Qt::yellow );
\r
278 painter->setPen( QPen( Qt::darkGreen ) );
\r
279 painter->setBrush( Qt::green );
\r
282 painter->drawPath( this->path( ) );
\r
285 // -------------------------------------------------------------------------
\r
286 QVariant cpBaseQtApplication::Pipeline::Block::
\r
287 itemChange( GraphicsItemChange change, const QVariant& value )
\r
292 // -------------------------------------------------------------------------
\r
293 void cpBaseQtApplication::Pipeline::Block::
\r
294 _setTypeInfo( const QString& txt )
\r
296 this->setToolTip( txt );
\r
299 // -------------------------------------------------------------------------
\r
300 void cpBaseQtApplication::Pipeline::Block::
\r
301 _configPort( Port* port )
\r
303 port->setBlock( this );
\r
305 QFontMetrics fm( this->scene( )->font( ) );
\r
307 foreach( QGraphicsItem* i, this->children( ) )
\r
309 Port* p = dynamic_cast< Port* >( i );
\r
312 int w = fm.width( p->name( ) ) + ( 4 * p->radius( ) );
\r
313 if( w > this->m_Width - this->m_HorzMargin )
\r
314 this->m_Width = w + this->m_HorzMargin;
\r
317 int h = fm.height( );
\r
318 this->m_Height = this->m_InputPorts.size( ) + this->m_OutputPorts.size( );
\r
319 this->m_Height += 4;
\r
320 this->m_Height *= h;
\r
323 pth.addRoundedRect(
\r
324 -this->m_Width / 2,
\r
325 -this->m_Height / 2,
\r
327 this->m_Height, 5, 5
\r
329 this->setPath( pth );
\r
331 int y = -this->m_Height / 2 + this->m_VertMargin + port->radius( );
\r
332 foreach( QGraphicsItem* i, this->children( ) )
\r
334 Port* p = dynamic_cast< Port* >( i );
\r
339 dynamic_cast< NamePort* >( i ) != NULL ||
\r
340 dynamic_cast< InfoPort* >( i ) != NULL
\r
343 i->setPos( -this->m_Width / 2 + port->radius( ), y );
\r
346 else if( dynamic_cast< InputPort* >( i ) != NULL )
\r
347 i->setPos( -this->m_Width / 2 - 2 * port->radius( ), y );
\r
348 else if( dynamic_cast< OutputPort* >( i ) != NULL )
\r
349 i->setPos( this->m_Width / 2, y );
\r
355 // -------------------------------------------------------------------------
\r
356 void cpBaseQtApplication::Pipeline::Block::
\r
357 mouseReleaseEvent( QGraphicsSceneMouseEvent* evt )
\r
359 if( this->m_Filter.IsNotNull( ) )
\r
360 this->m_Filter->SetViewCoords(
\r
361 this->scenePos( ).x( ),
\r
362 this->scenePos( ).y( )
\r
364 this->Superclass::mouseReleaseEvent( evt );
\r
367 // -------------------------------------------------------------------------
\r
368 void cpBaseQtApplication::Pipeline::Block::
\r
369 contextMenuEvent( QGraphicsSceneContextMenuEvent* evt )
\r
372 QAction* configureAction = menu.addAction( "Configure" );
\r
373 QAction* updateAction = menu.addAction( "Update" );
\r
375 dynamic_cast< cpPlugins::Pipeline::Widget* >(
\r
376 this->m_Filter.GetPointer( )
\r
378 QAction* enableAction = NULL;
\r
379 if( widget != NULL )
\r
381 menu.addAction( ( widget->GetEnabled( ) )? "Disable": "Enable" );
\r
383 QAction* selectedAction = menu.exec( evt->screenPos( ) );
\r
384 if( selectedAction == configureAction )
\r
386 auto dlg = this->m_Filter->CreateQDialog( );
\r
390 else if( selectedAction == enableAction )
\r
392 if( widget != NULL )
\r
393 widget->SetEnabled( !( widget->GetEnabled( ) ) );
\r
395 else if( selectedAction == updateAction )
\r
397 cpBaseQtApplication::Blocker blocker;
\r
401 this->m_Filter->Update( );
\r
402 blocker.unblock( );
\r
404 catch( std::exception& err )
\r
406 blocker.unblock( );
\r
407 QMessageBox::critical(
\r
409 QMessageBox::tr( "Error updating filter" ),
\r
410 QMessageBox::tr( err.what( ) )
\r