4 #include <QGraphicsScene>
\r
5 #include <QGraphicsSceneContextMenuEvent>
\r
6 #include <QFontMetrics>
\r
9 #include <QStyleOptionGraphicsItem>
\r
10 #include <QGraphicsWidget>
\r
12 #include <cpPlugins/Interface/ParametersQtDialog.h>
\r
15 #include "Connection.h"
\r
18 // -------------------------------------------------------------------------
\r
19 cpPipelineEditor::Block::
\r
20 Block( TFilter* filter, QGraphicsItem* parent, QGraphicsScene* scene )
\r
21 : Superclass( parent, scene ),
\r
29 p.addRoundedRect( -50, -15, 100, 30, 5, 5 );
\r
32 this->setPen( QPen( Qt::darkGreen ) );
\r
33 this->setBrush( Qt::green );
\r
34 this->setFlag( QGraphicsItem::ItemIsMovable );
\r
35 this->setFlag( QGraphicsItem::ItemIsSelectable );
\r
37 this->m_Width = this->m_HorzMargin;
\r
38 this->m_Height = this->m_VertMargin;
\r
41 this->setNamePort( this->m_Filter->GetClassName( ) ); // TODO
\r
42 this->_setTypeInfo( this->m_Filter->GetClassName( ) );
\r
45 auto inputs = this->m_Filter->GetInputsNames( );
\r
46 for( auto iIt = inputs.begin( ); iIt != inputs.end( ); ++iIt )
\r
47 this->addInputPort( iIt->c_str( ) );
\r
50 auto outputs = this->m_Filter->GetOutputsNames( );
\r
51 for( auto oIt = outputs.begin( ); oIt != outputs.end( ); ++oIt )
\r
52 this->addOutputPort( oIt->c_str( ) );
\r
55 // -------------------------------------------------------------------------
\r
56 cpPipelineEditor::Block::
\r
61 // -------------------------------------------------------------------------
\r
62 cpPipelineEditor::Editor* cpPipelineEditor::Block::
\r
65 return( this->m_Editor );
\r
68 // -------------------------------------------------------------------------
\r
69 const cpPipelineEditor::Editor* cpPipelineEditor::Block::
\r
72 return( this->m_Editor );
\r
75 // -------------------------------------------------------------------------
\r
76 void cpPipelineEditor::Block::
\r
77 setEditor( cpPipelineEditor::Editor* editor )
\r
79 this->m_Editor = editor;
\r
82 // -------------------------------------------------------------------------
\r
83 void cpPipelineEditor::Block::
\r
84 setNamePort( const QString& txt )
\r
86 if( this->m_NamePort == NULL )
\r
87 this->m_NamePort = new NamePort( this );
\r
88 this->m_NamePort->setName( txt );
\r
89 this->_configPort( this->m_NamePort );
\r
92 // -------------------------------------------------------------------------
\r
93 cpPipelineEditor::InputPort* cpPipelineEditor::Block::
\r
94 addInputPort( const QString& txt )
\r
96 InputPort* ip = new InputPort( this );
\r
97 ip->setExtendedName(
\r
99 txt.toStdString( ) +
\r
100 std::string( "@" ) +
\r
101 this->namePort( ).toStdString( )
\r
104 ip->setName( txt );
\r
105 this->m_InputPorts[ txt.toStdString( ) ] = ip;
\r
106 this->_configPort( ip );
\r
110 // -------------------------------------------------------------------------
\r
111 cpPipelineEditor::OutputPort* cpPipelineEditor::Block::
\r
112 addOutputPort( const QString& txt )
\r
114 OutputPort* op = new OutputPort( this );
\r
115 op->setExtendedName(
\r
117 txt.toStdString( ) +
\r
118 std::string( "@" ) +
\r
119 this->namePort( ).toStdString( )
\r
122 op->setName( txt );
\r
123 this->m_OutputPorts[ txt.toStdString( ) ] = op;
\r
124 this->_configPort( op );
\r
128 // -------------------------------------------------------------------------
\r
129 cpPipelineEditor::InputPort* cpPipelineEditor::Block::
\r
130 inputPort( const QString& txt )
\r
132 auto i = this->m_InputPorts.find( txt.toStdString( ) );
\r
133 if( i != this->m_InputPorts.end( ) )
\r
134 return( i->second );
\r
139 // -------------------------------------------------------------------------
\r
140 cpPipelineEditor::OutputPort* cpPipelineEditor::Block::
\r
141 outputPort( const QString& txt )
\r
143 auto o = this->m_OutputPorts.find( txt.toStdString( ) );
\r
144 if( o != this->m_OutputPorts.end( ) )
\r
145 return( o->second );
\r
150 // -------------------------------------------------------------------------
\r
151 QString cpPipelineEditor::Block::
\r
154 return( this->m_NamePort->name( ) );
\r
157 // -------------------------------------------------------------------------
\r
158 const cpPipelineEditor::InputPort* cpPipelineEditor::Block::
\r
159 inputPort( const QString& txt ) const
\r
161 auto i = this->m_InputPorts.find( txt.toStdString( ) );
\r
162 if( i != this->m_InputPorts.end( ) )
\r
163 return( i->second );
\r
168 // -------------------------------------------------------------------------
\r
169 const cpPipelineEditor::OutputPort* cpPipelineEditor::Block::
\r
170 outputPort( const QString& txt ) const
\r
172 auto o = this->m_OutputPorts.find( txt.toStdString( ) );
\r
173 if( o != this->m_OutputPorts.end( ) )
\r
174 return( o->second );
\r
179 // -------------------------------------------------------------------------
\r
180 void cpPipelineEditor::Block::
\r
182 QPainter* painter, const QStyleOptionGraphicsItem* option, QWidget* widget
\r
185 Q_UNUSED( option );
\r
186 Q_UNUSED( widget );
\r
188 if( this->isSelected( ) )
\r
190 painter->setPen( QPen( Qt::darkYellow ) );
\r
191 painter->setBrush( Qt::yellow );
\r
195 painter->setPen( QPen( Qt::darkGreen ) );
\r
196 painter->setBrush( Qt::green );
\r
199 painter->drawPath( this->path( ) );
\r
202 // -------------------------------------------------------------------------
\r
203 QVariant cpPipelineEditor::Block::
\r
204 itemChange( GraphicsItemChange change, const QVariant& value )
\r
209 // -------------------------------------------------------------------------
\r
210 void cpPipelineEditor::Block::
\r
211 _setTypeInfo( const QString& txt )
\r
213 this->setToolTip( txt );
\r
216 // -------------------------------------------------------------------------
\r
217 void cpPipelineEditor::Block::
\r
218 _configPort( Port* port )
\r
220 port->setBlock( this );
\r
222 QFontMetrics fm( this->scene( )->font( ) );
\r
224 foreach( QGraphicsItem* i, this->children( ) )
\r
226 Port* p = dynamic_cast< Port* >( i );
\r
229 int w = fm.width( p->name( ) ) + ( 4 * p->radius( ) );
\r
230 if( w > this->m_Width - this->m_HorzMargin )
\r
231 this->m_Width = w + this->m_HorzMargin;
\r
234 int h = fm.height( );
\r
235 this->m_Height = this->m_InputPorts.size( ) + this->m_OutputPorts.size( );
\r
236 this->m_Height += 3;
\r
237 this->m_Height *= h;
\r
240 pth.addRoundedRect(
\r
241 -this->m_Width / 2,
\r
242 -this->m_Height / 2,
\r
244 this->m_Height, 5, 5
\r
246 this->setPath( pth );
\r
248 int y = -this->m_Height / 2 + this->m_VertMargin + port->radius( );
\r
249 foreach( QGraphicsItem* i, this->children( ) )
\r
251 Port* p = dynamic_cast< Port* >( i );
\r
255 if( dynamic_cast< NamePort* >( i ) != NULL )
\r
257 i->setPos( -this->m_Width / 2 + port->radius( ), y );
\r
260 else if( dynamic_cast< InputPort* >( i ) != NULL )
\r
261 i->setPos( -this->m_Width / 2 - 2 * port->radius( ), y );
\r
262 else if( dynamic_cast< OutputPort* >( i ) != NULL )
\r
263 i->setPos( this->m_Width / 2, y );
\r
269 // -------------------------------------------------------------------------
\r
270 void cpPipelineEditor::Block::
\r
271 mouseReleaseEvent( QGraphicsSceneMouseEvent* evt )
\r
273 if( this->m_Filter != NULL )
\r
274 this->m_Filter->SetViewCoords(
\r
275 this->scenePos( ).x( ), this->scenePos( ).y( )
\r
277 this->Superclass::mouseReleaseEvent( evt );
\r
280 // -------------------------------------------------------------------------
\r
281 void cpPipelineEditor::Block::
\r
282 contextMenuEvent( QGraphicsSceneContextMenuEvent* evt )
\r
285 QAction* configureAction = menu.addAction( "Configure" );
\r
286 QAction* updateAction = menu.addAction( "Update" );
\r
287 QAction* selectedAction = menu.exec( evt->screenPos( ) );
\r
289 if( selectedAction == configureAction )
\r
290 this->m_Filter->GetParametersDialog( )->exec( );
\r
291 else if( selectedAction == updateAction )
\r
292 this->m_Editor->updateFilter( this->namePort( ).toStdString( ) );
\r