1 #include <cpBaseQtApplication/Block.h>
\r
4 #include <QFontMetrics>
\r
5 #include <QGraphicsScene>
\r
6 #include <QGraphicsSceneContextMenuEvent>
\r
7 #include <QGraphicsWidget>
\r
11 #include <QStyleOptionGraphicsItem>
\r
13 #include <cpBaseQtApplication/Port.h>
\r
14 #include <cpBaseQtApplication/Connection.h>
\r
15 #include <cpBaseQtApplication/Editor.h>
\r
16 #include <cpPlugins/BaseObjects/Widget.h>
\r
18 // -------------------------------------------------------------------------
\r
19 cpBaseQtApplication::Block::
\r
21 TFilter* filter, const QString& name,
\r
22 QGraphicsItem* parent, QGraphicsScene* scene
\r
24 : Superclass( parent, scene ),
\r
32 p.addRoundedRect( -50, -15, 100, 30, 5, 5 );
\r
35 this->setPen( QPen( Qt::darkGreen ) );
\r
36 this->setBrush( Qt::green );
\r
37 this->setFlag( QGraphicsItem::ItemIsMovable );
\r
38 this->setFlag( QGraphicsItem::ItemIsSelectable );
\r
40 this->m_Width = this->m_HorzMargin;
\r
41 this->m_Height = this->m_VertMargin;
\r
44 this->setNamePort( name );
\r
47 std::string( this->m_Filter->GetClassCategory( ) ) +
\r
48 std::string( "::" ) +
\r
49 std::string( this->m_Filter->GetClassName( ) )
\r
54 auto inputs = this->m_Filter->GetInputsNames( );
\r
55 for( auto iIt = inputs.begin( ); iIt != inputs.end( ); ++iIt )
\r
59 this->m_Filter->IsInputMultiple( iIt->c_str( ) )
\r
65 auto outputs = this->m_Filter->GetOutputsNames( );
\r
66 for( auto oIt = outputs.begin( ); oIt != outputs.end( ); ++oIt )
\r
67 this->addOutputPort( oIt->c_str( ) );
\r
70 // -------------------------------------------------------------------------
\r
71 cpBaseQtApplication::Block::
\r
76 // -------------------------------------------------------------------------
\r
77 cpBaseQtApplication::Block::
\r
78 TFilter* cpBaseQtApplication::Block::
\r
81 return( this->m_Filter );
\r
84 // -------------------------------------------------------------------------
\r
85 const cpBaseQtApplication::Block::
\r
86 TFilter* cpBaseQtApplication::Block::
\r
89 return( this->m_Filter );
\r
92 // -------------------------------------------------------------------------
\r
93 cpBaseQtApplication::Editor* cpBaseQtApplication::Block::
\r
96 return( this->m_Editor );
\r
99 // -------------------------------------------------------------------------
\r
100 const cpBaseQtApplication::Editor* cpBaseQtApplication::Block::
\r
103 return( this->m_Editor );
\r
106 // -------------------------------------------------------------------------
\r
107 void cpBaseQtApplication::Block::
\r
108 setEditor( cpBaseQtApplication::Editor* editor )
\r
110 this->m_Editor = editor;
\r
113 // -------------------------------------------------------------------------
\r
114 void cpBaseQtApplication::Block::
\r
115 setNamePort( const QString& txt )
\r
117 if( this->m_NamePort == NULL )
\r
118 this->m_NamePort = new NamePort( this );
\r
119 this->m_NamePort->setName( txt );
\r
120 this->_configPort( this->m_NamePort );
\r
123 // -------------------------------------------------------------------------
\r
124 cpBaseQtApplication::InputPort* cpBaseQtApplication::Block::
\r
125 addInputPort( const QString& txt, bool multiple )
\r
127 InputPort* ip = new InputPort( this, multiple );
\r
128 ip->setExtendedName( "" );
\r
129 ip->setName( txt );
\r
130 this->m_InputPorts[ txt.toStdString( ) ] = ip;
\r
131 this->_configPort( ip );
\r
135 // -------------------------------------------------------------------------
\r
136 cpBaseQtApplication::OutputPort* cpBaseQtApplication::Block::
\r
137 addOutputPort( const QString& txt )
\r
139 OutputPort* op = new OutputPort( this );
\r
140 op->setExtendedName( "" );
\r
141 op->setName( txt );
\r
142 this->m_OutputPorts[ txt.toStdString( ) ] = op;
\r
143 this->_configPort( op );
\r
147 // -------------------------------------------------------------------------
\r
148 cpBaseQtApplication::InputPort* cpBaseQtApplication::Block::
\r
149 inputPort( const QString& txt )
\r
151 auto i = this->m_InputPorts.find( txt.toStdString( ) );
\r
152 if( i != this->m_InputPorts.end( ) )
\r
153 return( i->second );
\r
158 // -------------------------------------------------------------------------
\r
159 cpBaseQtApplication::OutputPort* cpBaseQtApplication::Block::
\r
160 outputPort( const QString& txt )
\r
162 auto o = this->m_OutputPorts.find( txt.toStdString( ) );
\r
163 if( o != this->m_OutputPorts.end( ) )
\r
164 return( o->second );
\r
169 // -------------------------------------------------------------------------
\r
170 QString cpBaseQtApplication::Block::
\r
173 return( this->m_NamePort->name( ) );
\r
176 // -------------------------------------------------------------------------
\r
177 const cpBaseQtApplication::InputPort* cpBaseQtApplication::Block::
\r
178 inputPort( const QString& txt ) const
\r
180 auto i = this->m_InputPorts.find( txt.toStdString( ) );
\r
181 if( i != this->m_InputPorts.end( ) )
\r
182 return( i->second );
\r
187 // -------------------------------------------------------------------------
\r
188 const cpBaseQtApplication::OutputPort* cpBaseQtApplication::Block::
\r
189 outputPort( const QString& txt ) const
\r
191 auto o = this->m_OutputPorts.find( txt.toStdString( ) );
\r
192 if( o != this->m_OutputPorts.end( ) )
\r
193 return( o->second );
\r
198 // -------------------------------------------------------------------------
\r
199 void cpBaseQtApplication::Block::
\r
201 QPainter* painter, const QStyleOptionGraphicsItem* option, QWidget* widget
\r
204 Q_UNUSED( option );
\r
205 Q_UNUSED( widget );
\r
207 if( this->isSelected( ) )
\r
209 painter->setPen( QPen( Qt::darkYellow ) );
\r
210 painter->setBrush( Qt::yellow );
\r
214 painter->setPen( QPen( Qt::darkGreen ) );
\r
215 painter->setBrush( Qt::green );
\r
218 painter->drawPath( this->path( ) );
\r
221 // -------------------------------------------------------------------------
\r
222 QVariant cpBaseQtApplication::Block::
\r
223 itemChange( GraphicsItemChange change, const QVariant& value )
\r
228 // -------------------------------------------------------------------------
\r
229 void cpBaseQtApplication::Block::
\r
230 _setTypeInfo( const QString& txt )
\r
232 this->setToolTip( txt );
\r
235 // -------------------------------------------------------------------------
\r
236 void cpBaseQtApplication::Block::
\r
237 _configPort( Port* port )
\r
239 port->setBlock( this );
\r
241 QFontMetrics fm( this->scene( )->font( ) );
\r
243 foreach( QGraphicsItem* i, this->children( ) )
\r
245 Port* p = dynamic_cast< Port* >( i );
\r
248 int w = fm.width( p->name( ) ) + ( 4 * p->radius( ) );
\r
249 if( w > this->m_Width - this->m_HorzMargin )
\r
250 this->m_Width = w + this->m_HorzMargin;
\r
253 int h = fm.height( );
\r
254 this->m_Height = this->m_InputPorts.size( ) + this->m_OutputPorts.size( );
\r
255 this->m_Height += 3;
\r
256 this->m_Height *= h;
\r
259 pth.addRoundedRect(
\r
260 -this->m_Width / 2,
\r
261 -this->m_Height / 2,
\r
263 this->m_Height, 5, 5
\r
265 this->setPath( pth );
\r
267 int y = -this->m_Height / 2 + this->m_VertMargin + port->radius( );
\r
268 foreach( QGraphicsItem* i, this->children( ) )
\r
270 Port* p = dynamic_cast< Port* >( i );
\r
274 if( dynamic_cast< NamePort* >( i ) != NULL )
\r
276 i->setPos( -this->m_Width / 2 + port->radius( ), y );
\r
279 else if( dynamic_cast< InputPort* >( i ) != NULL )
\r
280 i->setPos( -this->m_Width / 2 - 2 * port->radius( ), y );
\r
281 else if( dynamic_cast< OutputPort* >( i ) != NULL )
\r
282 i->setPos( this->m_Width / 2, y );
\r
288 // -------------------------------------------------------------------------
\r
289 void cpBaseQtApplication::Block::
\r
290 mouseReleaseEvent( QGraphicsSceneMouseEvent* evt )
\r
292 if( this->m_Filter.IsNotNull( ) )
\r
293 this->m_Filter->SetViewCoords(
\r
294 this->scenePos( ).x( ), this->scenePos( ).y( )
\r
296 this->Superclass::mouseReleaseEvent( evt );
\r
299 // -------------------------------------------------------------------------
\r
300 void cpBaseQtApplication::Block::
\r
301 contextMenuEvent( QGraphicsSceneContextMenuEvent* evt )
\r
304 QAction* configureAction = menu.addAction( "Configure" );
\r
305 QAction* updateAction = menu.addAction( "Update" );
\r
307 dynamic_cast< cpPlugins::BaseObjects::Widget* >(
\r
308 this->m_Filter.GetPointer( )
\r
310 QAction* enableAction = NULL;
\r
311 if( widget != NULL )
\r
313 menu.addAction( ( widget->GetEnabled( ) )? "Disable": "Enable" );
\r
315 QAction* selectedAction = menu.exec( evt->screenPos( ) );
\r
316 if( selectedAction == configureAction )
\r
318 auto dlg = this->m_Filter->CreateQDialog( );
\r
322 else if( selectedAction == enableAction )
\r
324 if( widget != NULL )
\r
325 widget->SetEnabled( !( widget->GetEnabled( ) ) );
\r
327 else if( selectedAction == updateAction )
\r
328 this->m_Editor->updateFilter( this->namePort( ).toStdString( ) );
\r