]> 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/Interface/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( TFilter* filter, QGraphicsItem* parent, QGraphicsScene* scene )\r
21   : Superclass( parent, scene ),\r
22     m_HorzMargin( 20 ),\r
23     m_VertMargin( 5 ),\r
24     m_NamePort( NULL ),\r
25     m_Filter( filter ),\r
26     m_Editor( NULL )\r
27 {\r
28   QPainterPath p;\r
29   p.addRoundedRect( -50, -15, 100, 30, 5, 5 );\r
30 \r
31   this->setPath( p );\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
36 \r
37   this->m_Width = this->m_HorzMargin;\r
38   this->m_Height = this->m_VertMargin;\r
39 \r
40   // Configure names\r
41   this->setNamePort( this->m_Filter->GetName( ) );\r
42   this->_setTypeInfo( this->m_Filter->GetClassName( ) );\r
43 \r
44   // Add input ports\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
48 \r
49   // Add output ports\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
53 }\r
54 \r
55 // -------------------------------------------------------------------------\r
56 cpPipelineEditor::Block::\r
57 ~Block( )\r
58 {\r
59 }\r
60 \r
61 // -------------------------------------------------------------------------\r
62 cpPipelineEditor::Editor* cpPipelineEditor::Block::\r
63 editor( )\r
64 {\r
65   return( this->m_Editor );\r
66 }\r
67 \r
68 // -------------------------------------------------------------------------\r
69 const cpPipelineEditor::Editor* cpPipelineEditor::Block::\r
70 editor( ) const\r
71 {\r
72   return( this->m_Editor );\r
73 }\r
74 \r
75 // -------------------------------------------------------------------------\r
76 void cpPipelineEditor::Block::\r
77 setEditor( cpPipelineEditor::Editor* editor )\r
78 {\r
79   this->m_Editor = editor;\r
80 }\r
81 \r
82 // -------------------------------------------------------------------------\r
83 void cpPipelineEditor::Block::\r
84 setNamePort( const QString& txt )\r
85 {\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
90 }\r
91 \r
92 // -------------------------------------------------------------------------\r
93 cpPipelineEditor::InputPort* cpPipelineEditor::Block::\r
94 addInputPort( const QString& txt )\r
95 {\r
96   InputPort* ip = new InputPort( this );\r
97   ip->setExtendedName(\r
98     (\r
99       txt.toStdString( ) +\r
100       std::string( "@" ) +\r
101       this->namePort( ).toStdString( )\r
102       ).c_str( )\r
103     );\r
104   ip->setName( txt );\r
105   this->m_InputPorts[ txt.toStdString( ) ] = ip;\r
106   this->_configPort( ip );\r
107   return( ip );\r
108 }\r
109 \r
110 // -------------------------------------------------------------------------\r
111 cpPipelineEditor::OutputPort* cpPipelineEditor::Block::\r
112 addOutputPort( const QString& txt )\r
113 {\r
114   OutputPort* op = new OutputPort( this );\r
115   op->setExtendedName(\r
116     (\r
117       txt.toStdString( ) +\r
118       std::string( "@" ) +\r
119       this->namePort( ).toStdString( )\r
120       ).c_str( )\r
121     );\r
122   op->setName( txt );\r
123   this->m_OutputPorts[ txt.toStdString( ) ] = op;\r
124   this->_configPort( op );\r
125   return( op );\r
126 }\r
127 \r
128 // -------------------------------------------------------------------------\r
129 cpPipelineEditor::InputPort* cpPipelineEditor::Block::\r
130 inputPort( const QString& txt )\r
131 {\r
132   auto i = this->m_InputPorts.find( txt.toStdString( ) );\r
133   if( i != this->m_InputPorts.end( ) )\r
134     return( i->second );\r
135   else\r
136     return( NULL );\r
137 }\r
138 \r
139 // -------------------------------------------------------------------------\r
140 cpPipelineEditor::OutputPort* cpPipelineEditor::Block::\r
141 outputPort( const QString& txt )\r
142 {\r
143   auto o = this->m_OutputPorts.find( txt.toStdString( ) );\r
144   if( o != this->m_OutputPorts.end( ) )\r
145     return( o->second );\r
146   else\r
147     return( NULL );\r
148 }\r
149 \r
150 // -------------------------------------------------------------------------\r
151 QString cpPipelineEditor::Block::\r
152 namePort( ) const\r
153 {\r
154   return( this->m_NamePort->name( ) );\r
155 }\r
156 \r
157 // -------------------------------------------------------------------------\r
158 const cpPipelineEditor::InputPort* cpPipelineEditor::Block::\r
159 inputPort( const QString& txt ) const\r
160 {\r
161   auto i = this->m_InputPorts.find( txt.toStdString( ) );\r
162   if( i != this->m_InputPorts.end( ) )\r
163     return( i->second );\r
164   else\r
165     return( NULL );\r
166 }\r
167 \r
168 // -------------------------------------------------------------------------\r
169 const cpPipelineEditor::OutputPort* cpPipelineEditor::Block::\r
170 outputPort( const QString& txt ) const\r
171 {\r
172   auto o = this->m_OutputPorts.find( txt.toStdString( ) );\r
173   if( o != this->m_OutputPorts.end( ) )\r
174     return( o->second );\r
175   else\r
176     return( NULL );\r
177 }\r
178 \r
179 // -------------------------------------------------------------------------\r
180 void cpPipelineEditor::Block::\r
181 paint(\r
182   QPainter* painter, const QStyleOptionGraphicsItem* option, QWidget* widget\r
183   )\r
184 {\r
185   Q_UNUSED( option );\r
186   Q_UNUSED( widget );\r
187 \r
188   if( this->isSelected( ) )\r
189   {\r
190     painter->setPen( QPen( Qt::darkYellow ) );\r
191     painter->setBrush( Qt::yellow );\r
192   }\r
193   else\r
194   {\r
195     painter->setPen( QPen( Qt::darkGreen ) );\r
196     painter->setBrush( Qt::green );\r
197 \r
198   } // fi\r
199   painter->drawPath( this->path( ) );\r
200 }\r
201 \r
202 // -------------------------------------------------------------------------\r
203 QVariant cpPipelineEditor::Block::\r
204 itemChange( GraphicsItemChange change, const QVariant& value )\r
205 {\r
206   return( value );\r
207 }\r
208 \r
209 // -------------------------------------------------------------------------\r
210 void cpPipelineEditor::Block::\r
211 _setTypeInfo( const QString& txt )\r
212 {\r
213   this->setToolTip( txt );\r
214 }\r
215 \r
216 // -------------------------------------------------------------------------\r
217 void cpPipelineEditor::Block::\r
218 _configPort( Port* port )\r
219 {\r
220   port->setBlock( this );\r
221 \r
222   QFontMetrics fm( this->scene( )->font( ) );\r
223   this->m_Width = 0;\r
224   foreach( QGraphicsItem* i, this->children( ) )\r
225   {\r
226     Port* p = dynamic_cast< Port* >( i );\r
227     if( p == NULL )\r
228       continue;\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
232 \r
233   } // rof\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
238 \r
239   QPainterPath pth;\r
240   pth.addRoundedRect(\r
241     -this->m_Width / 2,\r
242     -this->m_Height / 2,\r
243     this->m_Width,\r
244     this->m_Height, 5, 5\r
245     );\r
246   this->setPath( pth );\r
247 \r
248   int y = -this->m_Height / 2 + this->m_VertMargin + port->radius( );\r
249   foreach( QGraphicsItem* i, this->children( ) )\r
250   {\r
251     Port* p = dynamic_cast< Port* >( i );\r
252     if( p == NULL )\r
253       continue;\r
254 \r
255     if( dynamic_cast< NamePort* >( i ) != NULL )\r
256     {\r
257       i->setPos( -this->m_Width / 2 + port->radius( ), y );\r
258       y += h;\r
259     }\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
264     y += h;\r
265 \r
266   } // rof\r
267 }\r
268 \r
269 // -------------------------------------------------------------------------\r
270 void cpPipelineEditor::Block::\r
271 mouseReleaseEvent( QGraphicsSceneMouseEvent* evt )\r
272 {\r
273   if( this->m_Filter != NULL )\r
274     this->m_Filter->SetViewCoords(\r
275       this->scenePos( ).x( ), this->scenePos( ).y( )\r
276       );\r
277   this->Superclass::mouseReleaseEvent( evt );\r
278 }\r
279 \r
280 // -------------------------------------------------------------------------\r
281 void cpPipelineEditor::Block::\r
282 contextMenuEvent( QGraphicsSceneContextMenuEvent* evt )\r
283 {\r
284   QMenu menu;\r
285   QAction* configureAction = menu.addAction( "Configure" );\r
286   QAction* updateAction = menu.addAction( "Update" );\r
287   QAction* selectedAction = menu.exec( evt->screenPos( ) );\r
288 \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
293 }\r
294 \r
295 // eof - $RCSfile$\r