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