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