]> Creatis software - cpPlugins.git/blob - lib/cpBaseQtApplication/Pipeline/Port.cxx
f5b0b010b184ad9cf48379055618db664f01db34
[cpPlugins.git] / lib / cpBaseQtApplication / Pipeline / Port.cxx
1 #include <cpBaseQtApplication/Pipeline/Port.h>\r
2 #include <cpBaseQtApplication/Pipeline/Connection.h>\r
3 #include <cpBaseQtApplication/Pipeline/Block.h>\r
4 \r
5 #include <QGraphicsScene>\r
6 #include <QGraphicsSceneContextMenuEvent>\r
7 #include <QFontMetrics>\r
8 #include <QMenu>\r
9 #include <QPainter>\r
10 #include <QPen>\r
11 \r
12 // -------------------------------------------------------------------------\r
13 cpBaseQtApplication::Pipeline::Port::\r
14 Port( QGraphicsItem* parent, QGraphicsScene* scene )\r
15   : QObject( ),\r
16     Superclass( parent, scene ),\r
17     m_Radius( 5 ),\r
18     m_Margin( 2 )\r
19 {\r
20   this->m_Label = new QGraphicsTextItem( this );\r
21   this->m_ExtendedLabel = new QGraphicsTextItem( this );\r
22   this->setExtend( false );\r
23 \r
24   QPainterPath p;\r
25   p.addEllipse( 0, 0, 2 * this->m_Radius, 2 * this->m_Radius );\r
26 \r
27   this->setPath( p );\r
28   this->setPen( QPen( Qt::darkRed ) );\r
29   this->setBrush( Qt::red );\r
30   this->setFlag( QGraphicsItem::ItemSendsScenePositionChanges );\r
31 }\r
32 \r
33 // -------------------------------------------------------------------------\r
34 cpBaseQtApplication::Pipeline::Port::\r
35 ~Port( )\r
36 {\r
37 }\r
38 \r
39 // -------------------------------------------------------------------------\r
40 void cpBaseQtApplication::Pipeline::Port::\r
41 setBlock( Block* b )\r
42 {\r
43   this->m_Block = b;\r
44 }\r
45 \r
46 // -------------------------------------------------------------------------\r
47 void cpBaseQtApplication::Pipeline::Port::\r
48 setName( const QString& n )\r
49 {\r
50   this->m_Label->setPlainText( n );\r
51   this->_updateLabels( );\r
52 }\r
53 \r
54 // -------------------------------------------------------------------------\r
55 void cpBaseQtApplication::Pipeline::Port::\r
56 setExtendedName( const QString& n )\r
57 {\r
58   this->m_ExtendedLabel->setPlainText( n );\r
59   this->_updateLabels( );\r
60 }\r
61 \r
62 // -------------------------------------------------------------------------\r
63 void cpBaseQtApplication::Pipeline::Port::\r
64 setExtend( bool extend )\r
65 {\r
66   // Do nothing!\r
67   this->m_IsExtended = false;\r
68   this->m_ExtendedLabel->setVisible( false );\r
69 }\r
70 \r
71 // -------------------------------------------------------------------------\r
72 void cpBaseQtApplication::Pipeline::Port::\r
73 paint(\r
74   QPainter* painter,\r
75   const QStyleOptionGraphicsItem* option,\r
76   QWidget* widget\r
77   )\r
78 {\r
79   Q_UNUSED( option );\r
80   Q_UNUSED( widget );\r
81 \r
82   if( this->isExtended( ) )\r
83   {\r
84     painter->setPen( QPen( Qt::darkBlue ) );\r
85     painter->setBrush( Qt::blue );\r
86   }\r
87   else\r
88   {\r
89     painter->setPen( QPen( Qt::darkRed ) );\r
90     painter->setBrush( Qt::red );\r
91 \r
92   } // fi\r
93   painter->drawPath( this->path( ) );\r
94 }\r
95 \r
96 // -------------------------------------------------------------------------\r
97 cpBaseQtApplication::Pipeline::NamePort::\r
98 NamePort( QGraphicsItem* parent, QGraphicsScene* scene )\r
99   : Superclass( parent, scene )\r
100 {\r
101 }\r
102 \r
103 // -------------------------------------------------------------------------\r
104 cpBaseQtApplication::Pipeline::NamePort::\r
105 ~NamePort( )\r
106 {\r
107 }\r
108 \r
109 // -------------------------------------------------------------------------\r
110 bool cpBaseQtApplication::Pipeline::NamePort::\r
111 isConnected( Port* other )\r
112 {\r
113   return( false );\r
114 }\r
115 \r
116 // -------------------------------------------------------------------------\r
117 void cpBaseQtApplication::Pipeline::NamePort::\r
118 _updateLabels( )\r
119 {\r
120   QFont font( this->scene( )->font( ) );\r
121   font.setBold( true );\r
122   this->m_Label->setFont( font );\r
123   this->m_ExtendedLabel->setFont( font );\r
124   this->setPath( QPainterPath( ) );\r
125 }\r
126 \r
127 // -------------------------------------------------------------------------\r
128 cpBaseQtApplication::Pipeline::InfoPort::\r
129 InfoPort( QGraphicsItem* parent, QGraphicsScene* scene )\r
130   : Superclass( parent, scene )\r
131 {\r
132 }\r
133 \r
134 // -------------------------------------------------------------------------\r
135 cpBaseQtApplication::Pipeline::InfoPort::\r
136 ~InfoPort( )\r
137 {\r
138 }\r
139 \r
140 // -------------------------------------------------------------------------\r
141 bool cpBaseQtApplication::Pipeline::InfoPort::\r
142 isConnected( Port* other )\r
143 {\r
144   return( false );\r
145 }\r
146 \r
147 // -------------------------------------------------------------------------\r
148 void cpBaseQtApplication::Pipeline::InfoPort::\r
149 _updateLabels( )\r
150 {\r
151   QFont font( this->scene( )->font( ) );\r
152   font.setBold( false );\r
153   this->m_Label->setFont( font );\r
154   this->m_ExtendedLabel->setFont( font );\r
155   this->setPath( QPainterPath( ) );\r
156 }\r
157 \r
158 // -------------------------------------------------------------------------\r
159 cpBaseQtApplication::Pipeline::InputPort::\r
160 InputPort( QGraphicsItem* parent, bool multiple, QGraphicsScene* scene )\r
161   : Superclass( parent, scene ),\r
162     m_IsMultiple( multiple )\r
163 {\r
164 }\r
165 \r
166 // -------------------------------------------------------------------------\r
167 cpBaseQtApplication::Pipeline::InputPort::\r
168 ~InputPort( )\r
169 {\r
170    this->m_Connection.clear( );\r
171 }\r
172 \r
173 // -------------------------------------------------------------------------\r
174 void cpBaseQtApplication::Pipeline::InputPort::\r
175 _updateLabels( )\r
176 {\r
177   QFontMetrics fm( this->scene( )->font( ) );\r
178   this->m_Label->setPos( this->m_Radius * 2, -fm.height( ) / 2 );\r
179   this->m_ExtendedLabel->setPos(\r
180     -fm.width( this->extendedName( ) ) - this->m_Radius * 2,\r
181     -fm.height( ) / 2\r
182     );\r
183 }\r
184 \r
185 // -------------------------------------------------------------------------\r
186 void cpBaseQtApplication::Pipeline::InputPort::\r
187 setExtend( bool extend )\r
188 {\r
189   if( this->m_Connection.size( ) == 0 )\r
190   {\r
191     this->m_IsExtended = extend;\r
192     this->m_ExtendedLabel->setVisible( extend );\r
193   }\r
194   else\r
195     this->Superclass::setExtend( false );\r
196 }\r
197 \r
198 // -------------------------------------------------------------------------\r
199 bool cpBaseQtApplication::Pipeline::InputPort::\r
200 isConnected( Port* other )\r
201 {\r
202   bool conn = false;\r
203   auto i = this->m_Connection.begin( );\r
204   for( ; i != this->m_Connection.end( ); ++i )\r
205     conn |= ( ( *i )->port1( ) == other && ( *i )->port2( ) == this );\r
206   return( conn );\r
207 }\r
208 \r
209 // -------------------------------------------------------------------------\r
210 void cpBaseQtApplication::Pipeline::InputPort::\r
211 setConnection( Connection* c )\r
212 {\r
213   if( this->m_IsMultiple || this->m_Connection.size( ) == 0 )\r
214     this->m_Connection.push_back( c );\r
215 }\r
216 \r
217 // -------------------------------------------------------------------------\r
218 void cpBaseQtApplication::Pipeline::InputPort::\r
219 removeConnection( Connection* c )\r
220 {\r
221   auto i = std::find(\r
222     this->m_Connection.begin( ),\r
223     this->m_Connection.end( ),\r
224     c\r
225     );\r
226   if( i != this->m_Connection.end( ) )\r
227   {\r
228     *i = NULL;\r
229     this->m_Connection.erase( i );\r
230 \r
231   } // fi\r
232 }\r
233 \r
234 // -------------------------------------------------------------------------\r
235 QVariant cpBaseQtApplication::Pipeline::InputPort::\r
236 itemChange( GraphicsItemChange change, const QVariant& value )\r
237 {\r
238   if( change == ItemScenePositionHasChanged )\r
239   {\r
240     for(\r
241       auto i = this->m_Connection.begin( );\r
242       i != this->m_Connection.end( );\r
243       ++i\r
244       )\r
245     {\r
246       ( *i )->updatePosFromPorts( );\r
247       ( *i )->updatePath( );\r
248 \r
249     } // fi\r
250 \r
251   } // fi\r
252   return( value );\r
253 }\r
254 \r
255 // -------------------------------------------------------------------------\r
256 cpBaseQtApplication::Pipeline::OutputPort::\r
257 OutputPort( QGraphicsItem* parent, QGraphicsScene* scene )\r
258   : Superclass( parent, scene )\r
259 {\r
260 }\r
261 \r
262 // -------------------------------------------------------------------------\r
263 cpBaseQtApplication::Pipeline::OutputPort::\r
264 ~OutputPort( )\r
265 {\r
266   foreach( Connection* conn, this->m_Connections )\r
267     delete conn;\r
268 }\r
269 \r
270 // -------------------------------------------------------------------------\r
271 void cpBaseQtApplication::Pipeline::OutputPort::\r
272 _updateLabels( )\r
273 {\r
274   QFontMetrics fm( this->scene( )->font( ) );\r
275   this->m_Label->setPos(\r
276     -fm.width( this->name( ) ) - this->m_Radius * 2, -fm.height( ) / 2\r
277     );\r
278   this->m_ExtendedLabel->setPos( this->m_Radius * 2, -fm.height( ) / 2 );\r
279 \r
280 }\r
281 \r
282 // -------------------------------------------------------------------------\r
283 void cpBaseQtApplication::Pipeline::OutputPort::\r
284 removeConnection( Connection* c )\r
285 {\r
286   auto i = std::find(\r
287     this->m_Connections.begin( ),\r
288     this->m_Connections.end( ),\r
289     c\r
290     );\r
291   if( i != this->m_Connections.end( ) )\r
292   {\r
293     *i = NULL;\r
294     this->m_Connections.erase( i );\r
295 \r
296   } // fi\r
297 }\r
298 \r
299 // -------------------------------------------------------------------------\r
300 void cpBaseQtApplication::Pipeline::OutputPort::\r
301 setExtend( bool extend )\r
302 {\r
303   this->m_IsExtended = extend;\r
304   this->m_ExtendedLabel->setVisible( extend );\r
305 }\r
306 \r
307 // -------------------------------------------------------------------------\r
308 bool cpBaseQtApplication::Pipeline::OutputPort::\r
309 isConnected( Port* other )\r
310 {\r
311   auto i = this->m_Connections.begin( );\r
312   bool conn = false;\r
313   for( ; i != this->m_Connections.end( ) && !conn; ++i )\r
314     conn |= ( ( *i )->port1( ) == this && ( *i )->port2( ) == other );\r
315   return( conn );\r
316 }\r
317 \r
318 // -------------------------------------------------------------------------\r
319 QVariant cpBaseQtApplication::Pipeline::OutputPort::\r
320 itemChange( GraphicsItemChange change, const QVariant& value )\r
321 {\r
322   if( change == ItemScenePositionHasChanged )\r
323   {\r
324     foreach( Connection* conn, this->m_Connections )\r
325     {\r
326       conn->updatePosFromPorts( );\r
327       conn->updatePath( );\r
328 \r
329     } // rof\r
330 \r
331   } // fi\r
332   return( value );\r
333 }\r
334 \r
335 // -------------------------------------------------------------------------\r
336 void cpBaseQtApplication::Pipeline::OutputPort::\r
337 contextMenuEvent( QGraphicsSceneContextMenuEvent* evt )\r
338 {\r
339   if( this->m_Block == NULL )\r
340     return;\r
341   \r
342   QMenu menu;\r
343   QAction* showAction = menu.addAction( "Show" );\r
344   QAction* hideAction = menu.addAction( "Hide" );\r
345   QAction* selectedAction = menu.exec( evt->screenPos( ) );\r
346 \r
347   if( selectedAction == showAction || selectedAction == hideAction )\r
348   {\r
349     std::stringstream str;\r
350     str\r
351       << this->name( ).toStdString( ) << "@"\r
352       << this->m_Block->filter( )->GetName( );\r
353     emit viewData( str.str( ), ( selectedAction == showAction ) );\r
354 \r
355   } // fi\r
356 }\r
357 \r
358 // eof - $RCSfile$\r