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