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