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