]> Creatis software - cpPlugins.git/blob - lib/cpBaseQtApplication/Port.cxx
...
[cpPlugins.git] / lib / cpBaseQtApplication / Port.cxx
1 #include <cpBaseQtApplication/Port.h>\r
2 #include <cpBaseQtApplication/Connection.h>\r
3 #include <cpBaseQtApplication/Block.h>\r
4 #include <cpBaseQtApplication/Editor.h>\r
5 \r
6 #include <QGraphicsScene>\r
7 #include <QGraphicsSceneContextMenuEvent>\r
8 #include <QFontMetrics>\r
9 #include <QMenu>\r
10 #include <QPainter>\r
11 #include <QPen>\r
12 \r
13 // -------------------------------------------------------------------------\r
14 cpBaseQtApplication::Port::\r
15 Port( QGraphicsItem* parent, QGraphicsScene* scene )\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::Port::\r
35 ~Port( )\r
36 {\r
37 }\r
38 \r
39 // -------------------------------------------------------------------------\r
40 void cpBaseQtApplication::Port::\r
41 setBlock( Block* b )\r
42 {\r
43   this->m_Block = b;\r
44 }\r
45 \r
46 // -------------------------------------------------------------------------\r
47 void cpBaseQtApplication::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::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::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::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::NamePort::\r
98 NamePort( QGraphicsItem* parent, QGraphicsScene* scene )\r
99   : Superclass( parent, scene )\r
100 {\r
101 }\r
102 \r
103 // -------------------------------------------------------------------------\r
104 cpBaseQtApplication::NamePort::\r
105 ~NamePort( )\r
106 {\r
107 }\r
108 \r
109 // -------------------------------------------------------------------------\r
110 void cpBaseQtApplication::NamePort::\r
111 _updateLabels( )\r
112 {\r
113   QFont font( this->scene( )->font( ) );\r
114   font.setBold( true );\r
115   this->m_Label->setFont( font );\r
116   this->m_ExtendedLabel->setFont( font );\r
117   this->setPath( QPainterPath( ) );\r
118 }\r
119 \r
120 // -------------------------------------------------------------------------\r
121 bool cpBaseQtApplication::NamePort::\r
122 isConnected( Port* other )\r
123 {\r
124   return( false );\r
125 }\r
126 \r
127 // -------------------------------------------------------------------------\r
128 cpBaseQtApplication::InputPort::\r
129 InputPort( QGraphicsItem* parent, bool multiple, QGraphicsScene* scene )\r
130   : Superclass( parent, scene ),\r
131     m_IsMultiple( multiple )\r
132 {\r
133 }\r
134 \r
135 // -------------------------------------------------------------------------\r
136 cpBaseQtApplication::InputPort::\r
137 ~InputPort( )\r
138 {\r
139    this->m_Connection.clear( );\r
140 }\r
141 \r
142 // -------------------------------------------------------------------------\r
143 void cpBaseQtApplication::InputPort::\r
144 _updateLabels( )\r
145 {\r
146   QFontMetrics fm( this->scene( )->font( ) );\r
147   this->m_Label->setPos( this->m_Radius * 2, -fm.height( ) / 2 );\r
148   this->m_ExtendedLabel->setPos(\r
149     -fm.width( this->extendedName( ) ) - this->m_Radius * 2,\r
150     -fm.height( ) / 2\r
151     );\r
152 }\r
153 \r
154 // -------------------------------------------------------------------------\r
155 void cpBaseQtApplication::InputPort::\r
156 setExtend( bool extend )\r
157 {\r
158   if( this->m_Connection.size( ) == 0 )\r
159   {\r
160     this->m_IsExtended = extend;\r
161     this->m_ExtendedLabel->setVisible( extend );\r
162   }\r
163   else\r
164     this->Superclass::setExtend( false );\r
165 }\r
166 \r
167 // -------------------------------------------------------------------------\r
168 bool cpBaseQtApplication::InputPort::\r
169 isConnected( Port* other )\r
170 {\r
171   bool conn = false;\r
172   auto i = this->m_Connection.begin( );\r
173   for( ; i != this->m_Connection.end( ); ++i )\r
174     conn |= ( ( *i )->port1( ) == other && ( *i )->port2( ) == this );\r
175   return( conn );\r
176 }\r
177 \r
178 // -------------------------------------------------------------------------\r
179 void cpBaseQtApplication::InputPort::\r
180 setConnection( Connection* c )\r
181 {\r
182   if( this->m_IsMultiple || this->m_Connection.size( ) == 0 )\r
183     this->m_Connection.push_back( c );\r
184 }\r
185 \r
186 // -------------------------------------------------------------------------\r
187 QVariant cpBaseQtApplication::InputPort::\r
188 itemChange( GraphicsItemChange change, const QVariant& value )\r
189 {\r
190   if( change == ItemScenePositionHasChanged )\r
191   {\r
192     for(\r
193       auto i = this->m_Connection.begin( );\r
194       i != this->m_Connection.end( );\r
195       ++i\r
196       )\r
197     {\r
198       ( *i )->updatePosFromPorts( );\r
199       ( *i )->updatePath( );\r
200 \r
201     } // fi\r
202 \r
203   } // fi\r
204   return( value );\r
205 }\r
206 \r
207 // -------------------------------------------------------------------------\r
208 cpBaseQtApplication::OutputPort::\r
209 OutputPort( QGraphicsItem* parent, QGraphicsScene* scene )\r
210   : Superclass( parent, scene )\r
211 {\r
212 }\r
213 \r
214 // -------------------------------------------------------------------------\r
215 cpBaseQtApplication::OutputPort::\r
216 ~OutputPort( )\r
217 {\r
218   foreach( Connection* conn, this->m_Connections )\r
219     delete conn;\r
220 }\r
221 \r
222 // -------------------------------------------------------------------------\r
223 void cpBaseQtApplication::OutputPort::\r
224 _updateLabels( )\r
225 {\r
226   QFontMetrics fm( this->scene( )->font( ) );\r
227   this->m_Label->setPos(\r
228     -fm.width( this->name( ) ) - this->m_Radius * 2, -fm.height( ) / 2\r
229     );\r
230   this->m_ExtendedLabel->setPos( this->m_Radius * 2, -fm.height( ) / 2 );\r
231 \r
232 }\r
233 \r
234 // -------------------------------------------------------------------------\r
235 void cpBaseQtApplication::OutputPort::\r
236 setExtend( bool extend )\r
237 {\r
238   this->m_IsExtended = extend;\r
239   this->m_ExtendedLabel->setVisible( extend );\r
240 }\r
241 \r
242 // -------------------------------------------------------------------------\r
243 bool cpBaseQtApplication::OutputPort::\r
244 isConnected( Port* other )\r
245 {\r
246   auto i = this->m_Connections.begin( );\r
247   bool conn = false;\r
248   for( ; i != this->m_Connections.end( ) && !conn; ++i )\r
249     conn |= ( ( *i )->port1( ) == this && ( *i )->port2( ) == other );\r
250   return( conn );\r
251 }\r
252 \r
253 // -------------------------------------------------------------------------\r
254 QVariant cpBaseQtApplication::OutputPort::\r
255 itemChange( GraphicsItemChange change, const QVariant& value )\r
256 {\r
257   if( change == ItemScenePositionHasChanged )\r
258   {\r
259     foreach( Connection* conn, this->m_Connections )\r
260     {\r
261       conn->updatePosFromPorts( );\r
262       conn->updatePath( );\r
263 \r
264     } // rof\r
265 \r
266   } // fi\r
267   return( value );\r
268 }\r
269 \r
270 // -------------------------------------------------------------------------\r
271 void cpBaseQtApplication::OutputPort::\r
272 contextMenuEvent( QGraphicsSceneContextMenuEvent* evt )\r
273 {\r
274   if( this->m_Block == NULL )\r
275     return;\r
276   \r
277   QMenu menu;\r
278   QAction* showAction = menu.addAction( "Show" );\r
279   QAction* hideAction = menu.addAction( "Hide" );\r
280   QAction* propertiesAction = menu.addAction( "Properties" );\r
281   QAction* selectedAction = menu.exec( evt->screenPos( ) );\r
282 \r
283   if( selectedAction == showAction )\r
284   {\r
285     this->m_Block->editor( )->showData(\r
286       this->m_Block->namePort( ).toStdString( ),\r
287       this->name( ).toStdString( )\r
288       );\r
289   }\r
290   else if( selectedAction == hideAction )\r
291   {\r
292     this->m_Block->editor( )->hideData(\r
293       this->m_Block->namePort( ).toStdString( ),\r
294       this->name( ).toStdString( )\r
295       );\r
296   }\r
297   else if( selectedAction == propertiesAction )\r
298   {\r
299     this->m_Block->editor( )->dataProperties(\r
300       this->m_Block->namePort( ).toStdString( ),\r
301       this->name( ).toStdString( )\r
302       );\r
303 \r
304   } // fi\r
305 }\r
306 \r
307 // eof - $RCSfile$\r