]> Creatis software - cpPlugins.git/blob - lib/cpPipelineEditor/Block.cxx
First dump for version 0.1.0
[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::Editor* cpPipelineEditor::Block::\r
66 editor( )\r
67 {\r
68   return( this->m_Editor );\r
69 }\r
70 \r
71 // -------------------------------------------------------------------------\r
72 const cpPipelineEditor::Editor* cpPipelineEditor::Block::\r
73 editor( ) const\r
74 {\r
75   return( this->m_Editor );\r
76 }\r
77 \r
78 // -------------------------------------------------------------------------\r
79 void cpPipelineEditor::Block::\r
80 setEditor( cpPipelineEditor::Editor* editor )\r
81 {\r
82   this->m_Editor = editor;\r
83 }\r
84 \r
85 // -------------------------------------------------------------------------\r
86 void cpPipelineEditor::Block::\r
87 setNamePort( const QString& txt )\r
88 {\r
89   if( this->m_NamePort == NULL )\r
90     this->m_NamePort = new NamePort( this );\r
91   this->m_NamePort->setName( txt );\r
92   this->_configPort( this->m_NamePort );\r
93 }\r
94 \r
95 // -------------------------------------------------------------------------\r
96 cpPipelineEditor::InputPort* cpPipelineEditor::Block::\r
97 addInputPort( const QString& txt )\r
98 {\r
99   InputPort* ip = new InputPort( this );\r
100   ip->setExtendedName(\r
101     (\r
102       txt.toStdString( ) +\r
103       std::string( "@" ) +\r
104       this->namePort( ).toStdString( )\r
105       ).c_str( )\r
106     );\r
107   ip->setName( txt );\r
108   this->m_InputPorts[ txt.toStdString( ) ] = ip;\r
109   this->_configPort( ip );\r
110   return( ip );\r
111 }\r
112 \r
113 // -------------------------------------------------------------------------\r
114 cpPipelineEditor::OutputPort* cpPipelineEditor::Block::\r
115 addOutputPort( const QString& txt )\r
116 {\r
117   OutputPort* op = new OutputPort( this );\r
118   op->setExtendedName(\r
119     (\r
120       txt.toStdString( ) +\r
121       std::string( "@" ) +\r
122       this->namePort( ).toStdString( )\r
123       ).c_str( )\r
124     );\r
125   op->setName( txt );\r
126   this->m_OutputPorts[ txt.toStdString( ) ] = op;\r
127   this->_configPort( op );\r
128   return( op );\r
129 }\r
130 \r
131 // -------------------------------------------------------------------------\r
132 cpPipelineEditor::InputPort* cpPipelineEditor::Block::\r
133 inputPort( const QString& txt )\r
134 {\r
135   auto i = this->m_InputPorts.find( txt.toStdString( ) );\r
136   if( i != this->m_InputPorts.end( ) )\r
137     return( i->second );\r
138   else\r
139     return( NULL );\r
140 }\r
141 \r
142 // -------------------------------------------------------------------------\r
143 cpPipelineEditor::OutputPort* cpPipelineEditor::Block::\r
144 outputPort( const QString& txt )\r
145 {\r
146   auto o = this->m_OutputPorts.find( txt.toStdString( ) );\r
147   if( o != this->m_OutputPorts.end( ) )\r
148     return( o->second );\r
149   else\r
150     return( NULL );\r
151 }\r
152 \r
153 // -------------------------------------------------------------------------\r
154 QString cpPipelineEditor::Block::\r
155 namePort( ) const\r
156 {\r
157   return( this->m_NamePort->name( ) );\r
158 }\r
159 \r
160 // -------------------------------------------------------------------------\r
161 const cpPipelineEditor::InputPort* cpPipelineEditor::Block::\r
162 inputPort( const QString& txt ) const\r
163 {\r
164   auto i = this->m_InputPorts.find( txt.toStdString( ) );\r
165   if( i != this->m_InputPorts.end( ) )\r
166     return( i->second );\r
167   else\r
168     return( NULL );\r
169 }\r
170 \r
171 // -------------------------------------------------------------------------\r
172 const cpPipelineEditor::OutputPort* cpPipelineEditor::Block::\r
173 outputPort( const QString& txt ) const\r
174 {\r
175   auto o = this->m_OutputPorts.find( txt.toStdString( ) );\r
176   if( o != this->m_OutputPorts.end( ) )\r
177     return( o->second );\r
178   else\r
179     return( NULL );\r
180 }\r
181 \r
182 // -------------------------------------------------------------------------\r
183 void cpPipelineEditor::Block::\r
184 paint(\r
185   QPainter* painter, const QStyleOptionGraphicsItem* option, QWidget* widget\r
186   )\r
187 {\r
188   Q_UNUSED( option );\r
189   Q_UNUSED( widget );\r
190 \r
191   if( this->isSelected( ) )\r
192   {\r
193     painter->setPen( QPen( Qt::darkYellow ) );\r
194     painter->setBrush( Qt::yellow );\r
195   }\r
196   else\r
197   {\r
198     painter->setPen( QPen( Qt::darkGreen ) );\r
199     painter->setBrush( Qt::green );\r
200 \r
201   } // fi\r
202   painter->drawPath( this->path( ) );\r
203 }\r
204 \r
205 // -------------------------------------------------------------------------\r
206 QVariant cpPipelineEditor::Block::\r
207 itemChange( GraphicsItemChange change, const QVariant& value )\r
208 {\r
209   return( value );\r
210 }\r
211 \r
212 // -------------------------------------------------------------------------\r
213 void cpPipelineEditor::Block::\r
214 _setTypeInfo( const QString& txt )\r
215 {\r
216   this->setToolTip( txt );\r
217 }\r
218 \r
219 // -------------------------------------------------------------------------\r
220 void cpPipelineEditor::Block::\r
221 _configPort( Port* port )\r
222 {\r
223   port->setBlock( this );\r
224 \r
225   QFontMetrics fm( this->scene( )->font( ) );\r
226   this->m_Width = 0;\r
227   foreach( QGraphicsItem* i, this->children( ) )\r
228   {\r
229     Port* p = dynamic_cast< Port* >( i );\r
230     if( p == NULL )\r
231       continue;\r
232     int w = fm.width( p->name( ) ) + ( 4 * p->radius( ) );\r
233     if( w > this->m_Width - this->m_HorzMargin )\r
234       this->m_Width = w + this->m_HorzMargin;\r
235 \r
236   } // rof\r
237   int h = fm.height( );\r
238   this->m_Height = this->m_InputPorts.size( ) + this->m_OutputPorts.size( );\r
239   this->m_Height += 3;\r
240   this->m_Height *= h;\r
241 \r
242   QPainterPath pth;\r
243   pth.addRoundedRect(\r
244     -this->m_Width / 2,\r
245     -this->m_Height / 2,\r
246     this->m_Width,\r
247     this->m_Height, 5, 5\r
248     );\r
249   this->setPath( pth );\r
250 \r
251   int y = -this->m_Height / 2 + this->m_VertMargin + port->radius( );\r
252   foreach( QGraphicsItem* i, this->children( ) )\r
253   {\r
254     Port* p = dynamic_cast< Port* >( i );\r
255     if( p == NULL )\r
256       continue;\r
257 \r
258     if( dynamic_cast< NamePort* >( i ) != NULL )\r
259     {\r
260       i->setPos( -this->m_Width / 2 + port->radius( ), y );\r
261       y += h;\r
262     }\r
263     else if( dynamic_cast< InputPort* >( i ) != NULL )\r
264       i->setPos( -this->m_Width / 2 - 2 * port->radius( ), y );\r
265     else if( dynamic_cast< OutputPort* >( i ) != NULL )\r
266       i->setPos( this->m_Width / 2, y );\r
267     y += h;\r
268 \r
269   } // rof\r
270 }\r
271 \r
272 // -------------------------------------------------------------------------\r
273 void cpPipelineEditor::Block::\r
274 mouseReleaseEvent( QGraphicsSceneMouseEvent* evt )\r
275 {\r
276   if( this->m_Filter != NULL )\r
277     this->m_Filter->SetViewCoords(\r
278       this->scenePos( ).x( ), this->scenePos( ).y( )\r
279       );\r
280   this->Superclass::mouseReleaseEvent( evt );\r
281 }\r
282 \r
283 // -------------------------------------------------------------------------\r
284 void cpPipelineEditor::Block::\r
285 contextMenuEvent( QGraphicsSceneContextMenuEvent* evt )\r
286 {\r
287   QMenu menu;\r
288   QAction* configureAction = menu.addAction( "Configure" );\r
289   QAction* updateAction = menu.addAction( "Update" );\r
290   QAction* selectedAction = menu.exec( evt->screenPos( ) );\r
291 \r
292   if( selectedAction == configureAction )\r
293   {\r
294     auto dlg = this->m_Filter->CreateQtDialog( );\r
295     dlg->exec( );\r
296   }\r
297   else if( selectedAction == updateAction )\r
298     this->m_Editor->updateFilter( this->namePort( ).toStdString( ) );\r
299 }\r
300 \r
301 // eof - $RCSfile$\r