]> Creatis software - cpPlugins.git/blob - lib/cpPipelineEditor/Block.cxx
...
[cpPlugins.git] / lib / cpPipelineEditor / Block.cxx
1 #include "Block.h"\r
2 \r
3 #include <QPen>\r
4 #include <QGraphicsScene>\r
5 #include <QGraphicsSceneContextMenuEvent>\r
6 #include <QFontMetrics>\r
7 #include <QMenu>\r
8 #include <QPainter>\r
9 #include <QStyleOptionGraphicsItem>\r
10 #include <QGraphicsWidget>\r
11 \r
12 #include <cpPlugins/ParametersQtDialog.h>\r
13 \r
14 #include "Port.h"\r
15 #include "Connection.h"\r
16 #include "Editor.h"\r
17 \r
18 // -------------------------------------------------------------------------\r
19 cpPipelineEditor::Block::\r
20 Block(\r
21   TFilter* filter, const QString& name,\r
22   QGraphicsItem* parent, QGraphicsScene* scene\r
23   )\r
24   : Superclass( parent, scene ),\r
25     m_HorzMargin( 20 ),\r
26     m_VertMargin( 5 ),\r
27     m_NamePort( NULL ),\r
28     m_Filter( filter ),\r
29     m_Editor( NULL )\r
30 {\r
31   QPainterPath p;\r
32   p.addRoundedRect( -50, -15, 100, 30, 5, 5 );\r
33 \r
34   this->setPath( p );\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
39 \r
40   this->m_Width = this->m_HorzMargin;\r
41   this->m_Height = this->m_VertMargin;\r
42 \r
43   // Configure names\r
44   this->setNamePort( name );\r
45   this->_setTypeInfo( this->m_Filter->GetClassName( ) );\r
46 \r
47   // Add input ports\r
48   auto inputs = this->m_Filter->GetInputsNames( );\r
49   for( auto iIt = inputs.begin( ); iIt != inputs.end( ); ++iIt )\r
50     this->addInputPort( iIt->c_str( ) );\r
51 \r
52   // Add output ports\r
53   auto outputs = this->m_Filter->GetOutputsNames( );\r
54   for( auto oIt = outputs.begin( ); oIt != outputs.end( ); ++oIt )\r
55     this->addOutputPort( oIt->c_str( ) );\r
56 }\r
57 \r
58 // -------------------------------------------------------------------------\r
59 cpPipelineEditor::Block::\r
60 ~Block( )\r
61 {\r
62 }\r
63 \r
64 // -------------------------------------------------------------------------\r
65 cpPipelineEditor::Block::\r
66 TFilter* cpPipelineEditor::Block::\r
67 filter( )\r
68 {\r
69   return( this->m_Filter );\r
70 }\r
71 \r
72 // -------------------------------------------------------------------------\r
73 const cpPipelineEditor::Block::\r
74 TFilter* cpPipelineEditor::Block::\r
75 filter( ) const\r
76 {\r
77   return( this->m_Filter );\r
78 }\r
79 \r
80 // -------------------------------------------------------------------------\r
81 cpPipelineEditor::Editor* cpPipelineEditor::Block::\r
82 editor( )\r
83 {\r
84   return( this->m_Editor );\r
85 }\r
86 \r
87 // -------------------------------------------------------------------------\r
88 const cpPipelineEditor::Editor* cpPipelineEditor::Block::\r
89 editor( ) const\r
90 {\r
91   return( this->m_Editor );\r
92 }\r
93 \r
94 // -------------------------------------------------------------------------\r
95 void cpPipelineEditor::Block::\r
96 setEditor( cpPipelineEditor::Editor* editor )\r
97 {\r
98   this->m_Editor = editor;\r
99 }\r
100 \r
101 // -------------------------------------------------------------------------\r
102 void cpPipelineEditor::Block::\r
103 setNamePort( const QString& txt )\r
104 {\r
105   if( this->m_NamePort == NULL )\r
106     this->m_NamePort = new NamePort( this );\r
107   this->m_NamePort->setName( txt );\r
108   this->_configPort( this->m_NamePort );\r
109 }\r
110 \r
111 // -------------------------------------------------------------------------\r
112 cpPipelineEditor::InputPort* cpPipelineEditor::Block::\r
113 addInputPort( const QString& txt )\r
114 {\r
115   InputPort* ip = new InputPort( this );\r
116   ip->setExtendedName(\r
117     (\r
118       txt.toStdString( ) +\r
119       std::string( "@" ) +\r
120       this->namePort( ).toStdString( )\r
121       ).c_str( )\r
122     );\r
123   ip->setName( txt );\r
124   this->m_InputPorts[ txt.toStdString( ) ] = ip;\r
125   this->_configPort( ip );\r
126   return( ip );\r
127 }\r
128 \r
129 // -------------------------------------------------------------------------\r
130 cpPipelineEditor::OutputPort* cpPipelineEditor::Block::\r
131 addOutputPort( const QString& txt )\r
132 {\r
133   OutputPort* op = new OutputPort( this );\r
134   op->setExtendedName(\r
135     (\r
136       txt.toStdString( ) +\r
137       std::string( "@" ) +\r
138       this->namePort( ).toStdString( )\r
139       ).c_str( )\r
140     );\r
141   op->setName( txt );\r
142   this->m_OutputPorts[ txt.toStdString( ) ] = op;\r
143   this->_configPort( op );\r
144   return( op );\r
145 }\r
146 \r
147 // -------------------------------------------------------------------------\r
148 cpPipelineEditor::InputPort* cpPipelineEditor::Block::\r
149 inputPort( const QString& txt )\r
150 {\r
151   auto i = this->m_InputPorts.find( txt.toStdString( ) );\r
152   if( i != this->m_InputPorts.end( ) )\r
153     return( i->second );\r
154   else\r
155     return( NULL );\r
156 }\r
157 \r
158 // -------------------------------------------------------------------------\r
159 cpPipelineEditor::OutputPort* cpPipelineEditor::Block::\r
160 outputPort( const QString& txt )\r
161 {\r
162   auto o = this->m_OutputPorts.find( txt.toStdString( ) );\r
163   if( o != this->m_OutputPorts.end( ) )\r
164     return( o->second );\r
165   else\r
166     return( NULL );\r
167 }\r
168 \r
169 // -------------------------------------------------------------------------\r
170 QString cpPipelineEditor::Block::\r
171 namePort( ) const\r
172 {\r
173   return( this->m_NamePort->name( ) );\r
174 }\r
175 \r
176 // -------------------------------------------------------------------------\r
177 const cpPipelineEditor::InputPort* cpPipelineEditor::Block::\r
178 inputPort( const QString& txt ) const\r
179 {\r
180   auto i = this->m_InputPorts.find( txt.toStdString( ) );\r
181   if( i != this->m_InputPorts.end( ) )\r
182     return( i->second );\r
183   else\r
184     return( NULL );\r
185 }\r
186 \r
187 // -------------------------------------------------------------------------\r
188 const cpPipelineEditor::OutputPort* cpPipelineEditor::Block::\r
189 outputPort( const QString& txt ) const\r
190 {\r
191   auto o = this->m_OutputPorts.find( txt.toStdString( ) );\r
192   if( o != this->m_OutputPorts.end( ) )\r
193     return( o->second );\r
194   else\r
195     return( NULL );\r
196 }\r
197 \r
198 // -------------------------------------------------------------------------\r
199 void cpPipelineEditor::Block::\r
200 paint(\r
201   QPainter* painter, const QStyleOptionGraphicsItem* option, QWidget* widget\r
202   )\r
203 {\r
204   Q_UNUSED( option );\r
205   Q_UNUSED( widget );\r
206 \r
207   if( this->isSelected( ) )\r
208   {\r
209     painter->setPen( QPen( Qt::darkYellow ) );\r
210     painter->setBrush( Qt::yellow );\r
211   }\r
212   else\r
213   {\r
214     painter->setPen( QPen( Qt::darkGreen ) );\r
215     painter->setBrush( Qt::green );\r
216 \r
217   } // fi\r
218   painter->drawPath( this->path( ) );\r
219 }\r
220 \r
221 // -------------------------------------------------------------------------\r
222 QVariant cpPipelineEditor::Block::\r
223 itemChange( GraphicsItemChange change, const QVariant& value )\r
224 {\r
225   return( value );\r
226 }\r
227 \r
228 // -------------------------------------------------------------------------\r
229 void cpPipelineEditor::Block::\r
230 _setTypeInfo( const QString& txt )\r
231 {\r
232   this->setToolTip( txt );\r
233 }\r
234 \r
235 // -------------------------------------------------------------------------\r
236 void cpPipelineEditor::Block::\r
237 _configPort( Port* port )\r
238 {\r
239   port->setBlock( this );\r
240 \r
241   QFontMetrics fm( this->scene( )->font( ) );\r
242   this->m_Width = 0;\r
243   foreach( QGraphicsItem* i, this->children( ) )\r
244   {\r
245     Port* p = dynamic_cast< Port* >( i );\r
246     if( p == NULL )\r
247       continue;\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
251 \r
252   } // rof\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
257 \r
258   QPainterPath pth;\r
259   pth.addRoundedRect(\r
260     -this->m_Width / 2,\r
261     -this->m_Height / 2,\r
262     this->m_Width,\r
263     this->m_Height, 5, 5\r
264     );\r
265   this->setPath( pth );\r
266 \r
267   int y = -this->m_Height / 2 + this->m_VertMargin + port->radius( );\r
268   foreach( QGraphicsItem* i, this->children( ) )\r
269   {\r
270     Port* p = dynamic_cast< Port* >( i );\r
271     if( p == NULL )\r
272       continue;\r
273 \r
274     if( dynamic_cast< NamePort* >( i ) != NULL )\r
275     {\r
276       i->setPos( -this->m_Width / 2 + port->radius( ), y );\r
277       y += h;\r
278     }\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
283     y += h;\r
284 \r
285   } // rof\r
286 }\r
287 \r
288 // -------------------------------------------------------------------------\r
289 void cpPipelineEditor::Block::\r
290 mouseReleaseEvent( QGraphicsSceneMouseEvent* evt )\r
291 {\r
292   if( this->m_Filter != NULL )\r
293     this->m_Filter->SetViewCoords(\r
294       this->scenePos( ).x( ), this->scenePos( ).y( )\r
295       );\r
296   this->Superclass::mouseReleaseEvent( evt );\r
297 }\r
298 \r
299 // -------------------------------------------------------------------------\r
300 void cpPipelineEditor::Block::\r
301 contextMenuEvent( QGraphicsSceneContextMenuEvent* evt )\r
302 {\r
303   QMenu menu;\r
304   QAction* configureAction = menu.addAction( "Configure" );\r
305   QAction* updateAction = menu.addAction( "Update" );\r
306   QAction* selectedAction = menu.exec( evt->screenPos( ) );\r
307 \r
308   if( selectedAction == configureAction )\r
309   {\r
310     auto dlg = this->m_Filter->CreateQtDialog( );\r
311     dlg->exec( );\r
312   }\r
313   else if( selectedAction == updateAction )\r
314     this->m_Editor->updateFilter( this->namePort( ).toStdString( ) );\r
315 }\r
316 \r
317 // eof - $RCSfile$\r