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